0

サーバーに接続してメッセージを読み取ることができるチャットボットを作成しました。現在、メッセージを送信する必要があり、リクエスト ペイロードが必要です (Google Chrome の [開発者ツール] の [ネットワーク] タブによる)。私のオープナーは、次のものだけで構成されています。

import urllib
import urllib2
from cookielib import CookieJar
self.cj = CookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))

接続を維持してメッセージを読むために、私は次のことを行います。

def connect(self,settings,xhr):
    xhr_polling = self.get_code(xhr)
    data = self.opener.open("http://chat2-1.wikia.com:80/socket.io/1/xhr-polling/" + xhr_polling + "?name=HairyBot&key=" + 
        settings['chatkey'] + "&roomId=" + str(settings['room']) + "&t=" + timestamp())
    return data.read()

roomId と chatkey からなる設定。タイムスタンプ関数は、サーバーが必要とするものに従ってタイムスタンプを作成します (この質問では知る必要はありません)。質問に戻りますが、オープナーにペイロードを追加して、チャットにメッセージを送信するにはどうすればよいでしょうか?

4

2 に答える 2

0

「ペイロード」の意味はわかりませんが、おそらくそれは。という名前の別のフォーム変数ですpayload。その場合、他のフォーム変数と同じ方法で送信し、すでに大量の<code>roomIdtなどを送信しています。

フォーム変数を送信する1つの方法は、それらをURLエンコードし、クエリ文字列に追加して、GETリクエストを送信することです。それがあなたが今していることです。urllib(文字列の連結と一緒にハッキングするのではなく、適切なメソッドを使用する方がよいでしょうが、最終的な結果は同じです。)

もう1つの方法は、POST本文を送信することです。urllib2ドキュメントにはこれを行う方法が説明されており、オンラインには良い例がたくさんありますが、基本的にはurllib.urlencode()、名前と値のペアを呼び出し、その結果を2番目の引数(またはという名前のキーワード引数data)としてに渡すだけです。open呼び出し。

言い換えれば、このようなもの:

data = self.opener.open("http://chat2-1.wikia.com:80/socket.io/1/xhr-polling/" + xhr_polling,
                        urllib.urlencode(("name", "HairyBot"),
                                         ("key", settings['chatkey']),
                                         ("roomId", str(settings['room']),
                                         ("key", settings['chatkey']),
                                         ("t", timestamp()),
                                         ("payload", payload)))

または、必要に応じて、ほとんどのサーバーでクエリ文字列の一部のパラメーターとPOSTデータのその他のパラメーターを送信できるため、既存のコードをそのままにして、1つの変更を加えるだけで済みます。

data = self.opener.open("http://chat2-1.wikia.com:80/socket.io/1/xhr-polling/" + xhr_polling + "?name=HairyBot&key=" + 
    settings['chatkey'] + "&roomId=" + str(settings['room']) + "&t=" + timestamp(),
    urllib.urlencode(("payload", payload)))
于 2013-01-04T01:52:32.677 に答える
0

提案として、 Requestsライブラリを使用することをお勧めします。これにより、このことが非常に簡単になります。

import requests

session = requests.session()  # For connection pooling

def connect(self,settings,xhr):
    xhr_polling = self.get_code(xhr)
    request = session.get('http://chat2-1.wikia.com:80/socket.io/1/xhr-polling/' + xhr_polling, params={
        'name': 'HairyBot',
        'key': settings['chatkey'],
        'roomId': settings['room'],
        't': timestamp()
    })

    return request.text

代わりに POST リクエストを送信する場合は、データを変更getpostて追加するだけです。

def connect(self,settings,xhr):
    xhr_polling = self.get_code(xhr)
    request = session.post('http://chat2-1.wikia.com:80/socket.io/1/xhr-polling/' + xhr_polling, params={
        'name': 'HairyBot',
        'key': settings['chatkey'],
        'roomId': settings['room'],
        't': timestamp()
    }, data={
        'key': 'value'
    })

    return request.text
于 2013-01-04T01:57:48.703 に答える