1

私の学位論文の一部として、C でのプログラミングのコースの公式フォーラムをクロールし、返信を投稿するためによくある質問を検索する「ボット」を作成しました。適切な返信を投稿できるようにするには、ログインをシミュレートする必要があります。ログインフォームは以下の通りです。

!-- ログイン フォーム -- フォーム action="login.php?do=login" method="post" onsubmit="md5hash(vb_login_password, vb_login_md5password, vb_login_md5password_utf, 0)"> script type="text/javascript" src=" clientscript/vbulletin_md5.js?v=385"> テーブル cellpadding="0" cellspacing="3" border="0"> tr> td class="smallfont" style="空白: nowrap;">Όνομα χρήστη td >

td class="smallfont" nowrap="nowrap">Αυτόματη Σύνδεση /tr> tr> td class="smallfont">Κωδικός td> td> /tr> /table>

input type="hidden" name="s" value="" /> input type="hidden" name="securitytoken" value="guest" /> input type="hidden" name="do" value="login " /> input type="hidden" name="vb_login_md5password" /> input type="hidden" name="vb_login_md5password_utf" /> /form> !-- / ログインフォーム -->

パスワードをmd5ハッシュする必要があることを理解しましたが、ログインできません。私は投稿方法を使用し、次のことを行ってコンテンツを準備します。

content = "do=login&url=login.php" + "&vb_login_md5password=" + md5_pass+ "&vb_login_md5password_utf="+ md5_pass + "&s=&securitytoken=guest&vb_login_username=" + UserName + "&vb_login_password=" + PassWprd;

次に、次のようにして競合を送信します。

urlConnection = (HttpURLConnection)(new URL(targetUrl).openConnection());

        // Specifying that we intend to use this connection for input
        urlConnection.setDoInput(true);

        // Specifying that we intend to use this connection for output
        urlConnection.setDoOutput(true);

        // Specifying the method of HTTP request which is POST
        // throws ProtocolException
        urlConnection.setRequestMethod("POST");

        // Specifying the content type of our post
        urlConnection.setRequestProperty("Content-Type", POST_CONTENT_TYPE);
        urlConnection.setRequestProperty("Content-length",String.valueOf (content.length()));
       // urlConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");

        // Prepare an output stream for writing data to the HTTP connection
        // throws IOException
        dataOutputStream = new DataOutputStream(urlConnection.getOutputStream());
        dataOutputStream.writeBytes(content);

とはいえ、ログインできません。送信したフォームに何か問題があると思いますが、原因がわかりません。数日でプログラムを終了しなければならないので、助けていただければ幸いです。

4

2 に答える 2

1

手で HTTP リクエストを偽造しようとする代わりに、HtmlUnitのような仮想 Web クライアントに頼ることをお勧めします。これにより、より高いレベルに進むことができ、適切な要素を使用して HTTP クエリを偽造しようとする代わりに、「単に」フォームに正しい値を入力する必要があります。

于 2010-07-13T13:08:06.887 に答える
0

最初に、http リクエストが通常のログイン時にブラウザによって作成されたものと等しいかどうかを確認するのが最善だと思います。

これを行うには、Firefox にライブ HTTP ヘッダー アドオン ( https://addons.mozilla.org/de/firefox/addon/3829/ ) をインストールします。これにより、ブラウザーのログイン要求がどのように正確に表示されるかを確認できます。 .

Java 側では、toString() メソッドが上書きされ、完全なヘッダーが表示されるはずです。そうでない場合は、コンテンツ文字列を比較して、正しいヘッダーをすべて設定したことを確認してください。

于 2010-07-13T13:12:27.610 に答える