JsoupでTwitterにログインしてツイート取得
以前教えていただいたこちらのサイトを参考に、JsoupでログインしてformデータをPOST更新するプログラムを作成しています。
ログインして、ログイン後の各ページへ遷移してページのHTMLを取得することまではできました。
該当ページのformデータを抽出して、任意のデータを変更し、POSTしてデータを更新したいのですが、POSTがうまく実行できず、データが反映されません。
Java
1 2 String ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36 "; 3 4 // ログイン画面取得 5 Response res1 = Jsoup.connect("http://(とあるサイト)/") 6 .userAgent(ua) 7 .timeout(0) 8 .execute(); 9 10 Document doc = res1.parse(); 11 //System.out.println(doc); 12 13 //ログインPOST実行 14 Response res2 = Jsoup.connect("http://(ログイン用URL)") 15 .userAgent(ua) 16 .timeout(0) 17 .cookies(res1.cookies()) 18 .data("txt_account", "(ID)") 19 .data("txt_password", "(パスワード)") 20 .data("chk_save", "") 21 .data("login", "ログイン") 22 .method(Method.POST) 23 .execute(); 24 25 // イベント更新ページの表示 26 Response res3 = Jsoup.connect("http://(イベント登録用ページ)") 27 .userAgent(ua) 28 .timeout(0) 29 .cookies(res2.cookies()) 30 .method(Method.GET) 31 .execute(); 32 33 doc = res3.parse(); 34 35 //***** イベント更新用form情報の取得 ***** 36 Elements elements = new Elements(); 37 38 //***** start_yearの取得 ***** 39 elements = doc.getElementsByAttributeValue("name","start_year"); 40 String startYear = new String(); 41 for (Element element : elements) { 42 //System.out.println(element.outerHtml()); 43 startYear = element.outerHtml(); 44 } 45 //正規表現で「value=\"....\" selected」を検索 46 startYear = getPatternMatchFind(startYear,"value=\"....\" selected"); 47 //valueの抽出(前後の切り落とし) 48 startYear = getSplitFrontBack(startYear, "value=\"", "\" selected"); 49 //post形式に整形 50 startYear = "start_year=" + startYear; 51 System.out.println(startYear); 52 53 //***** start_monthの取得 ***** 54 elements = doc.getElementsByAttributeValue("name","start_month"); 55 String startMonth = new String(); 56 for (Element element : elements) { 57 //System.out.println(element.outerHtml()); 58 startMonth = element.outerHtml(); 59 } 60 //正規表現で「value=\"..\" selected」を検索 61 startMonth = getPatternMatchFind(startMonth,"value=\"..\" selected"); 62 //valueの抽出(前後の切り落とし) 63 startMonth = getSplitFrontBack(startMonth, "value=\"", "\" selected"); 64 //post形式に整形 65 startMonth = "start_month=" + startMonth; 66 System.out.println(startMonth); 67 68/***** 中略 *****/ 69 70 //***** イベントデータ更新POST ***** 71 Response res4 = Jsoup.connect("http://(POSTするURL)") 72 .userAgent(ua) 73 .timeout(0) 74 .cookies(res2.cookies()) 75 .data("start_year", startYear) 76 .data("start_month", startMonth) 77 .data("start_day", startDay) 78 /***** (残りのdataは省略) *****/ 79 .followRedirects(false) 80 .method(Method.POST) 81 .execute(); 82 83 doc = res4.parse(); 84 System.out.println(doc); 85 86 //POST後の更新ページをGET 87 Response res5 = Jsoup.connect("http://(イベント登録用ページ)") 88 .userAgent(ua) 89 .timeout(0) 90 .cookies(res2.cookies()) 91 .method(Method.GET) 92 .execute(); 93 94 doc = res5.parse(); 95 System.out.println(doc); 96 97
res4.parse()の出力結果は空のhtmlになっています。このことからPOST処理が失敗しているのではないかと考えています。
また、正しくPOSTできていればres5.parse()の出力結果で変更後のデータが確認できるはずですが、変更はされていませんでした。
(念のためブラウザから手動ログインでも確認しましたが、データは更新されていませんでした)
POSTする各属性と値(name=value)について抜けはないか?nameの表記ミスはないか?この点は確認しました。
このプログラムでPOSTが失敗する原因と対策について、ご助言いただけないでしょうか?
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。