2016-11-01 15 views
1

私はESPNの私自身のファンタジーリーグからファンタジーのサッカーの統計情報を掻き集めるペットプロジェクトに取り組んでいます。私が走っている問題は、過去のことができないように思える。私のリーグのページをリクエストする前にログインが必要だ。JSONオブジェクトを使用したPOSTのHTTPリクエスト

私はヒットURLが

http://games.espn.com/ffl/leaguesetup/ownerinfo?leagueId=123456&seasonId=2016

と私は

http://games.espn.com/ffl/signin?redir=http://games.espn.com/ffl/leaguesetup/ownerinfo?leagueId=123456&seasonId=2016

にリダイレクトように見えるGETリクエストを見ていますイミド私はログイン・プロンプト・ウィンドウを表示します。私がログインすると、私はPOSTリクエストを調べ、すべてのリクエストヘッダーを書き留めます。私が行ったリクエストヘッダおよびJSONオブジェクトを使用して

 {"loginValue":"myusername","password":"mypassword"} 

:POSTで要求されたURLは、私は反対し、次のJSONが渡される注意

さらに

https://registerdisney.go.com/jgc/v5/client/ESPN-FANTASYLM-PROD/guest/login?langPref=en-US

であるように見えます以下:

 String url = "http://games.espn.com/ffl/leaguesetup/ownerinfo?leagueId=123456&seasonId=2016"; 
     String rawData = "{\"loginValue\":\"myusername\",\"password\":\"mypassword\"}"; 
     URL obj = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 

     con.setRequestMethod("POST"); 
     con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
     con.setRequestProperty("Accept-Encoding", "gzip, deflate"); 
     con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
     con.setRequestProperty("Authorization", "APIKEY 8IYGqTgmpFTX51iF1ldp6MBtWrdQ0BxNUf8bg5/empOdV4u16KUSrnkJqy1DXy+QxV8RaxKq45o2sM8Omos/DlHYhQ=="); 
     con.setRequestProperty("Cache-Control", "no-cache"); 
     con.setRequestProperty("Content-Length", "52"); 
     con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     con.setRequestProperty("Expires", "-1"); 
     con.setRequestProperty("Host", "registerdisney.go.com"); 
     con.setRequestProperty("Origin", "https://cdn.registerdisney.go.com"); 
     con.setRequestProperty("Pragma", "no-cache"); 
     con.setRequestProperty("Referer", "https://cdn.registerdisney.go.com/v2/ESPN-ESPNCOM-PROD/en-US?include=config,l10n,js,html&scheme=http&postMessageOrigin=http%3A%2F%2Fwww.espn.com%2F&cookieDomain=www.espn.com&config=PROD&logLevel=INFO&topHost=www.espn.com&ageBand=ADULT&countryCode=US&cssOverride=https%3A%2F%2Fsecure.espncdn.com%2Fcombiner%2Fc%3Fcss%3Ddisneyid%2Fcore.css&responderPage=https%3A%2F%2Fwww.espn.com%2Flogin%2Fresponder%2Findex.html&buildId=157599bfa88"); 
     con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0"); 
     con.setRequestProperty("conversation-id", "5a4572f4-c940-454c-8f86-9af27345c894, adffddd3-8c31-41a0-84d7-7a0401cd2ad0"); 
     con.setRequestProperty("correlation-id", "4d9ddc78-b00e-4c5a-8eec-87622961fd34") 

     con.setDoOutput(true);`   
     OutputStreamWriter w = new OutputStreamWriter(con.getOutputStream(), "UTF-8"); 
     w.write(rawData); 
     w.close(); 

     int responseCode = con.getResponseCode(); 

     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 

     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 

As私は現在、戻ってサーバから取得しています、私は正しい軌道に乗ってるsumingすると、サーバである

は、HTTP応答コードが返されます。URLのための400:https://registerdisney.go.com/jgc/v5/client/ESPN-FANTASYLM-PROD/guest/login?langPref=en-US

任意のアイデア起こっ場合、またはされているものを私はここで完全に間違ったアプローチをとっていますか?私はJSoupを使用しようとしましたが運がなかったので、JSoupがHttpUrlConnectionも使用していると信じています。

何かGET要求を先に行う必要がありますか?何かを保存してからPOSTリクエストをしますか?どのように動作するのでしょうか?

答えて

0

JSoupでWebブラウザの動作をエミュレートしようとしています。あなたが経験したように、これはかなり複雑でJSoupはブラウザを偽装するために作られていません。 HTTPヘッダーを作成するときは、別の方法をとる方がよいでしょう。

問題の解決策は、プログラムで操作できるブラウザを使用することです。 Seleniumは多かれ少なかれJavaのデファクトスタンダードです。

お気に入りのブラウザ(Firefox、Chrome、..)を起動し、Javaプログラムから制御することができます。また、JSoupでスクラップするためにウェブページのコンテンツを取得することもできます。セレンは十分に文書化されているので、必要なドキュメンテーション/チュートリアルを見つけるのが難しくありません。

+0

私はUIテストを自動化するために以前からSeleniumと協力してきましたが、これはうまくいきますが、これは実際に私がここで行ったことではありません。私が欲しい/必要とするのは、ブラウザを起動しなくてもHTMLを取得できることです。 –

+0

ブラウザを起動することなく、複雑なWebサイト、特にユーザーとのやりとりを持つWebサイトからHTMLを取得することは、ほとんど不可能です。 1つのインタラクションをエミュレートする場合は、プログラム的に実行することができます(クッキーの管理は楽しいことではありません)。 – Julien

0

あなたの問題に対するもう1つの答え。あなたの問題を再現することは不可能ですが(サッカーファンタジーアカウントを持っていないし、私はそれを作成するつもりはありません)、私はまだいくつかの方法論の助けを与えることを試みることができます。

ブラウザからネットワークインスペクタを使用して問題を解決し、ブラウザとサーバー間のすべての交換をファイルにコピーし、コード内でこれを再現しようとします。

0

AuthorizationヘッダーのAPIキー値は、限られた時間だけ再利用できます。期限が切れている場合、登録応答本文には「API_KEY_INVALID」エラーが含まれます。

関連する問題