ログインに成功した後、ログインしてフォームに入力して注文できるasp.net駆動のサイトがあります。これは、curl を使用してサーバーで行う必要があります。
ブラウザでこれを行うときはいつでも、特別なことは何もありません。
example.com/login.aspx にアクセスします。フィールドに入力して、返信してください。ログインしているユーザーのインデックス ページが返されます。この後、注文フォームへのリンクをクリックする必要があります。これを行うと、フォームが作成され、記入して送り返します。これにより、発注した注文の望ましい結果が得られます。ソースを分析すると、ページが JavaScript を介して送信されることが明らかになりましたが、サーバーは、リクエストが同一である場合、リクエストがどのように送信されたかを知ることができません。このプロセスの間、ブラウザから送信されたすべての投稿リクエストを追跡しました。
すべての投稿リクエストを受け取ったので、curl で同じことを行うコードをいくつか書きました。アルゴリズムは次のとおりです。
- get リクエストを送信して example.com/login.aspx ページを取得します
- 非表示フィールドの応答を解析します (ステートフル接続を模倣するために使用されるため)
- 状態と logindata を example.com/login.aspx に投稿します
- 送り返された状態を解析して更新する
- 注文フォームを入手する
- 状態を再度解析して更新する
- ブラウザが送信した状態と同じ投稿データを投稿します
- STDERR の代わりに情報をファイルに出力する
プロセス中、cookie は curl で使用されます。
最後の POST まですべてがスムーズに進みます。「成功」または「失敗」の結果の代わりに、検証エラーが言及されていない元のフォームが返されます。わざと意味不明な内容を入力したり、ブラウザーで空のままにしたりすると、検証エラーが表示されます。
私はasp.netの経験がなく、ここで完全に立ち往生しているので、この質問が具体的すぎる場合はご容赦ください。
質問:
ヘッダーと投稿データがブラウザーからのものとまったく同じである場合、curl 操作の結果がどのように異なるのでしょうか?
完全を期すために:
ブラウザからの投稿:
POST /DataEntry.aspx HTTP/1.1
ホスト: www.iftin.co
ユーザーエージェント: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0
受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip、デフレート
接続: キープアライブ
リファラー: https://www.iftin.co/DataEntry.aspx
クッキー: ASP.NET_SessionId=SomethingX; .hawAuth=何かY
コンテンツ タイプ: application/x-www-form-urlencoded
コンテンツの長さ: 10111
Curl による投稿送信:
POST /DataEntry.aspx HTTP/1.1
ユーザーエージェント: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0
ホスト: www.iftin.co
リファラー: https://www.iftin.co/DataEntry.aspx
Cookie:.hawAuth=SomethingZ; ASP.NET_SessionId=何かW
受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip、デフレート
接続: キープアライブ
コンテンツの長さ: 25236
予想: 100-継続
Content-Type: application/x-www-form-urlencoded;boundary=----------------------------5bb8ec4e5ecc
誰かがコードを見たい場合は、私に知らせてください。これを読んで時間を割いてくれてありがとう。
これを書いた後、curl リクエストの Content-Length がブラウザのリクエストよりも大幅に大きいことに気付きました。ブラウザの Post の本文にあるすべてのパラメータを自分のコードにコピーし、配列で curl に渡しました。
そのため、curl はデフォルトでリクエストにデータを追加する必要があります。これは事実ですか?
ページが SSL を使用している間、CURLOPT_SSL_VERIFYPEER は false に設定されます。これでしょうか?なんで?