@narunblog

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【急募】pythonのrequestsライブラリで通信を保持する方法

解決したいこと

ECサイトの自動購入をhttp通信で行う際に、無効なブラウザになるのを回避したい。
requests.post(get)での通信を切断せず、そのまま維持したい。

条件

  • seleniumは使いたくないです。

行ったこと

成功バージョン

  • chromeブラウザを開く
  • 購入確定画面まで進める
  • 発行されたキーを元にrequests.postする
  • 購入できる

失敗バージョン

  • requests.getでブラウザ情報を取得する
  • 購入確定画面まで進める
  • 発行されたキーを元にrequests.postする
  • 購入できない

chromeブラウザで発行されたキーを元にrequests.postした場合は購入できたのですが、プログラムで発行したキーでは購入することができませんでした。

思ってること

プログラムの場合はキーを取得した瞬間に通信が終了してしまい、購入する時には無効なキーになっていると考えています。

もし、こんな方法があるよ!という方がいましたら、教えていただけないでしょうか。
よろしくお願いします。

0 likes

2Answer

requestsSessionというオブジェクトを作成することができ、getやpostを行うことができます。こうすることで原則的には同じTCPコネクションを再利用し、ログインなどで返されるCookieなども引継ぎます。

sess = requests.Session()
sess.post("https://server/login", json=json_data)
sess.get("https://server/user")

そのまま

requests.post("https://server/login", json=json_data)
requests.get("https://server/user")

とやってしまうと実は毎回内部で別のSessionオブジェクトを作成しているのでCookieを引き継がないのでGETリクエスト時にはログイン済みとサーバーから見なされません。

2Like

Comments

  1. @narunblog

    Questioner

    コメントありがとうございます!

    Sessionオブジェクトですね。
    ログイン必須のwebサイトなので同じように使っています。

    質問見返したらrequest.post/getになっていました。
    本当はses.post/getにしてます。

    cookieなどはchromeブラウザのnetworkタブを解析して使っています。
    headersとdataの部分を目的のECサイトに合わせています。

    sessionを使っても、購入できずクッキーの有効期限切れになるのは
    @oxlunaxoさんがコメントしてくれているようにwebsocketが使用されてないからでしょうか?
  2. それ以上はどこのサイトか分からないとなんとも言えません。基本的にはブラウザの開発者ツールで送っているリクエストのヘッダーやパラメータを調べてそれを真似すればいいはずです。
  3. @narunblog

    Questioner

    楽○です。

    現状ではrequests(session)でブラウザからコピペしたデータで購入はできています。

    購入の最後に購入確定ページで発行される使い捨てトークンのようなものをデータとしてPOSTしなければいけません。

    それがブラウザを開いている場合は、問題ないですが、pythonのみだけになると期限切れエラーで注文を確定できません。

    いろいろ調べた結果として、pythonだけだと通信が切断されるのでは?となりました。

    そこで通信を維持する方法を募集していました!

まずhttp通信の基礎から理解しないと今の考えで実装は難しいかと思います。
http通信であれば一度リクエストを送ってレスポンス(結果)を受け取れば要求は満たされているので通信は切断されます。

それだとリアルタイム性な処理(SNSの新着表示とか)が出来ないので、websocket,rest等の双方向通信プロトコルが生まれました。
http://wild-data-chase.com/index.php/2019/03/17/post-630/

双方向通信を行うなら、そのECサイトがWebAPI等を公表していれば一番良いのですが、場合によっては有償の利用契約結ばないとwebapiのリファレンスを開示(当然秘密保持契約が発生します)されないこともあります。
(契約者にしか開示しないのはwebapiを用いて負荷のあるアクセスが行われる危険があるためです。)
有償契約でしか開示されないAPIの場合は当然web上に情報が開示されることは無いので手探りでの調査にもなります。

※ちなみに私も今月より0知識からの双方向通信の実装を勉強しているので一部間違って認識している情報があるかもしれません。(その場合はご指摘お願いします)

1Like

Comments

  1. @narunblog

    Questioner

    コメントありがとうございます!

    webAPIなどはないため、websocketの勉強をして行こうと思います。

Your answer might help someone💌