2016-11-01 9 views
1

) ESPN의 환상적인 축구 경기에서 판타지 풋볼 통계를 긁어내는 애완 동물 프로젝트를 진행 중입니다. 내가 과거에 갈 수없는 문제는 내가 리그의 페이지를 요청하기 전에 필요한 로그인입니다.JSON 객체 POST POST 요청 (

내가 공격 URL은 GET보고

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

로 리디렉션 것 같습니다 요청 어느 immedi ately 나를 로그인 프롬프트 창으로 데려다줍니다. 로그인 할 때 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(); 

400 URL에 대한 : 다음과 같은 경우에 발생 또는 어떤 https://registerdisney.go.com/jgc/v5/client/ESPN-FANTASYLM-PROD/guest/login?langPref=en-US

모든 아이디어를 내가 현재 서버에서 다시 얻고 무엇을 올바른 궤도에있어 suming 것은 서버가

반환 된 HTTP 응답 코드 내가 여기서 완전히 잘못된 접근을하고 있니? JSoup를 사용하려고했지만 운이 없었고 JSoup 밑에서 HttpUrlConnection도 사용한다고 생각합니다.

GET 요청을 먼저 수행하고, 저장 한 다음 POST 요청을 수행해야합니까? 어떻게 작동해야합니까?

답변

0

JSoup을 사용하여 웹 브라우저의 동작을 에뮬레이트하려고합니다. 당신이 경험했듯이 이것은 매우 복잡하고 JSoup는 브라우저를 가장하는 목적으로 만들어진 것이 아닙니다. HTTP 헤더를 만드는 것으로 시작하면 다른 방법으로가는 것이 좋습니다.

문제의 해결책은 프로그래밍 방식으로 조작 할 수있는 브라우저를 사용하는 것입니다. Selenium은 Java의 기본 표준입니다.

셀렌 (Selenium)은 여러분이 좋아하는 브라우저 (Firefox, Chrome, ..)를 시작하여 자바 프로그램에서 제어하도록합니다. JSoup로 스크랩하기 위해 웹 페이지의 내용을 검색 할 수도 있습니다. Selenium에 대해서는 잘 문서화되어 있으므로, 필요한 문서/튜토리얼을 찾는 데 어려움이 없을 것입니다.

+0

UI 테스트를 자동화하기 위해 Selenium과 협력 해 왔지만 훌륭하게 작동합니다.하지만 실제로 여기있는 부분이 아닙니다. 내가 원했던/필요로하는 것은 브라우저를 시작하지 않고도 HTML을 검색 할 수 있다는 것입니다. –

+0

브라우저를 시작하지 않고도 복잡한 웹 사이트, 특히 사용자 상호 작용이있는 웹 사이트에서 HTML을 검색하는 것은 거의 불가능합니다. 하나의 상호 작용을 모방하려는 경우 프로그래밍 방식으로 진행될 수 있습니다 (쿠키 관리는 재미 없습니다). 그러나이 방법은 확장되지 않습니다. – Julien

0

귀하의 문제에 대한 또 다른 해답입니다. 문제를 재현하는 것이 불가능하지만 (축구 판타지 계정을 가지고 있지 않으며 만들 계획이 없습니다), 아직 방법론에 대한 도움을주기 위해 노력할 수 있습니다.

브라우저에서 네트워크 관리자를 사용하여 문제를 해결하고 브라우저와 서버 간의 모든 교환 파일을 복사하여 코드에서 재현 해 봅니다.

0

Authorization 헤더의 API 키 값은 제한된 시간 동안 만 재사용 할 수 있습니다. 만료되면 등록 응답 본문에 "API_KEY_INVALID"오류가 포함됩니다.