2017-09-29 6 views
0

現在、IoTオブジェクトを制御するPythonスクリプトを使用してWebサイトを管理しようとしています。POST行ベースのテキストデータ:text/plain

私が発見したものから、コントロールが2倍にやっている:デバイスを制御するために必要なIDを取得するために

  • POSTメソッド、。 ID

最初のものが、このPythonスクリプトで動作しているとIDを使用して

  • POSTメソッドが応答して表示されます。第二のポスト

    import requests 
    url = 'http://local_IP/login.cgi' 
    payload = {'lgname': 'theLogin', 'lgpin': 'thePin'} 
    
    r = requests.post(url, data=payload) 
    

    (ユーザがログインしているときにデバイスを制御するために)、私はWiresharkのとコマンドを捕獲し、ここでの情報は、次のとおり

    POST /user/keyfunction.cgi HTTP /1.1\r\n

    のContent-Type:text/plainの;のcharset = UTF-8 \ Rを\ n

    リファラー:http://LOCAL_IP/login.cgi \ R \ nは

    、その後私は:

    ラインベースのテキストデータ:平文/

    のSES = IDReceivedWithTheFirstPOST & COMM = 80 &データ0 = 2 & DATA2 = 18 & DATA1 = 1

    基本的には、私はこの "行ベースのテキストデータ:text/plain"を使ってPythonでPOSTを行う方法が必要ですが、それに対処する方法はありません。それはいつの日か、誰を助けることができる場合は、ここに私の作業のコードは次のとおりです:

    import requests 
    from collections import OrderedDict 
    
    session = requests.Session() 
    
    url = 'http://LOCAL_IP/login.cgi' 
    payload = {'lgname': 'User', 'lgpin': 'Password'} 
    
    r_login = session.post(url, data=payload) 
    
    with open('data.txt', 'w') as output: 
        output.write(r_login.text) 
    
    text = 'function getSession(){return' 
    
    with open('./data.txt', 'rb') as f: 
         for line in f: 
           if line.find(text) == 1: 
             id = line.split()[2][1:17] 
             print(id) 
    
    data = OrderedDict() 
    data['sess']=id 
    data['comm']=80 
    data['data0']=2 
    data['data2']=1 
    data['data1']=16 
    
    url = 'http://LOCAL_IP/user/keyfunction.cgi' 
    
    r_keyfunction = session.post(url, data=data) 
    
    with open('data2.txt', 'w') as output: 
         output.write(r_keyfunction.text) 
    

    バティスト

    EDIT、ありがとう、あなたは私を助けることができるでしょうホープ

  • +0

    : 'プリント( "{} \ N {}" 形式(R。 .headers、r.content)) 'もしあなたがその出力を表示したら、私はあなたが望むPOSTリクエストをフォローアップすることができます。 –

    +0

    ありがとうございます。私はprint(r.text)から取得しました。 "function getSession(){return" randomNumber "}のような行です。後で抽出するために検索機能を実装しますが、それは問題ではありません。変数に一度持っていれば、2番目のPOSTを実行します。 –

    答えて

    0

    使用するOPの結果に基づいて更新requests.Session()

    usin g requests.Session()はすべてのクッキーを取得し、それ以降のリクエストで転送します。また、接続をプールし、他のクールなものをたくさんします。

    あなたが最初のGETでから `IDReceivedWithTheFirstPOST`を得ているが、あなたは` r`オブジェクトを印刷して調べることができますWHERE伝えるのは難しい
    import requests 
    
    session = requests.Session() 
    payload = {'lgname': 'theLogin', 'lgpin': 'thePin'} 
    
    
    r_login = session.post('http://local_IP/login.cgi', data=payload) 
    
    # Figure out the ID here somehow 
    
    id_thing = 'IDReceivedWithTheFirstPOST' 
    
    payload = { 
        'sess': id_thing, 
        'comm': 80, 
        'Data0': 2, 
        'data2': 18, 
        'data1': 1 
    } 
    
    r_keyfunction = session.post('http://local_IP/user/keyfunction.cgi', params=payload) 
    
    # do something here 
    
    +0

    それは動作していないようです。2番目のPOST応答は、ログイン/パスワードが間違っている場合の最初のPOSTと同じです。私は「切断されている」と思いますが、その理由はわかりません...ところで、もしそれが助けになるのであれば、2番目のPOSTでやりたいアクションを実行するWebページの「ボタン」はこれです:

    +0

    'requests.Session()'を使用する私の元の回答が更新されました。 Burpのようなプロキシを使って手動でログオンするなど、複雑な要件を持つサイトにプログラム的にアクセスする方法を見つけようとするときに私が通常行っていることです。しかし、他のすべてが失敗したら、セレンをチェックしてください。時には簡単なリクエストではそれができないので、正常にログインするには実際のブラウザ(またはより具体的にはjavascript VM)が必要です。 –

    +1

    これは動作しています!セッションは問題ではなかった、私はちょうどOrderedDict()を使用しなければならなかった。ペイロードの順序は尊重されていませんでしたが、現在はそうです。どうもありがとうございました。 –

    関連する問題