2016-05-05 6 views
1

私はRubyとHTTPartyを使ってWikiaのフォーラムに投稿しようとしています。このプロセスにはWikiaの内部APIが含まれているように思われるため、ドキュメントはありません。そのため、Chromeの開発ツールを使用してリクエストを確認しようとしています。HTTPartyとRubyを使ってWikiaのフォーラムに投稿する

私の知る限り、ユーザーはフォーラムでスレッドにコメントを投稿しようとしたときに、POSTリクエストが次のパラメータで.wikia.com/wikia.phpに送信されます。

  • コントローラ= WallExternal
  • 方法= replyToMessage
  • 親=(親スレッドID、例えば1036301)
  • トークン= edittoken *
  • "のメッセージが送信される" =
  • 体0

このプロセスには、通常のMediawiki APIを使用して取得する編集トークンが必要です。私が遭遇した問題は、
の回答を得ることです。

"ログインセッションに問題があるようですが、この操作はセッションハイジャックの予防策としてキャンセルされています。そのページを再試行してください。

エラーメッセージを使用したGoogleの検索では、通常ログインしようとしている人が表示されますが、これはこの状況では問題ではありません。

匿名の編集者が回答を投稿できるとは考えていないので、ユーザーのヘッダーがリクエストに設定されていないという問題が考えられました。 Mediawikiの文書では、ログインしていないユーザは "+ \"の編集トークンを取得するので、そうでないようです。

私が使用しようとしているコードは次のとおりです。

@api = MediaWiki::Gateway.new 'http://example.wikia.com/api.php' 
    @api.login('username', 'password') 
    @headers = { 
     'User-Agent' => 'example', 
     'Cookie' => @api.cookies.map { |k, v| "#{k}=#{v};" }.join(' ') 
    } 

    query = HTTParty.post('http://example.wikia.com/api.php', 
     :body => { 
     'action' => 'query', 
     'prop' => 'info|revisions', 
     'intoken' => 'edit', 
     'titles' => 'Thread:2219', 
     'format' => 'json' 
     }, 
     :headers => @headers 
    ) 

    token = JSON.parse(query.body) 
    token = token["query"]["pages"]["-1"]["edittoken"] 

    query = HTTParty.post('http://example.wikia.com/wikia.php', 
     :body => { 
     'controller' => 'WallExternal', 
     'method' => 'changeThreadStatus', 
     'format' => 'json', 
     'msgid' => '2219', 
     'newState' => 'close' 
     }, 
     :headers => @headers 
    ) 

ウィキアは、現在編集トークンを取得するための方法は、以前のバージョンである理由である、Mediawikiの1.19.24を使用しています。

これは主に趣味であり、私はあまり経験していません。私はこの質問をWikiaフォーラムで最初に尋ねました。そして、ユーザーは私にここに来るように勧めました。あなたが提供できるお手伝いをありがとう。

答えて

1

「トークン」を正しく使用できないため、CSRF(クロスサイトリクエスト偽造)に関するエラーが表示されます。

これはMediaWikiサイトの作成者が意図したものではないかと思われます。フォームが正しいHTMLページの原点から送信されていることを示す適切なトークンを渡さない限り、POSTを行うことはできません。このトークンはサーバーによって生成されたもので、HTTParty要求で使用するためにはそれを抽出するのが難しい場合があります。あなたはDOMの周りを見て、多分価値を見いだすことができます。

代わりにセレンを使用することをお勧めします。これは適切なブラウザインスタンスを使用するため、HTMLレスポンスの解析やカスタム投稿の作成に対処する必要はありません。代わりに、wikiaサイトにアクセスしてログインし、「新しい投稿」フォームを送信するコードを書くことができます。

ウェブサイトによっては、このように自動化されないように保護されていることがあります。これが起こった場合(たとえば、Seleniumを使用してログインできない場合)、セレンコードにブレークポイントを配置し、ブラウザをクリックしてブレークポイントを通過してより多くのコードを実行すると便利です。

MediaWiki APIがあるので、可能な限りそのインターフェイスを使用することをお勧めします。私。宝石があなたのニーズを満たすことができる場合、HTTPクライアントまたはヘッドレスブラウザを使用する必要はありません。

+0

お返事ありがとうございます。私は機会があればセレンを試してみる。あなたの最後の点に関しては、MediaWiki APIを使用してこれを達成する方法がないことはほとんど確信しています。なぜならフォーラムの拡張はWikiaによって行われたからです(私はそれをもっと明確にすべきでした)。 – Matt