0

我创建了一个连接到服务器并可以读取消息的聊天机器人,现在我需要发送消息,需要请求有效负载(根据谷歌浏览器上的开发人员工具中的网络选项卡)。我的开瓶器只包含以下内容:

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 组成的设置。timestamp 函数根据服务器的需要创建一个时间戳(对于这个问题不需要知道)。回到问题,如何将有效负载添加到开启程序以向聊天发送消息?

4

2 回答 2

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 回答
0

我不确定您所说的“有效负载”是什么意思,但大概它只是另一个名为payload. 如果是这样,您发送它的方式与发送任何其他表单变量的方式相同,并且您已经发送了一堆 - <code>roomId,t等。

发送表单变量的一种方法是对它们进行 URL 编码,将它们附加到查询字符串上,然后发送 GET 请求。这就是你现在正在做的事情。(最好使用适当的urllib方法,而不是将其与字符串连接一起破解,但最终结果是相同的。)

另一种方法是发送一个 POST 正文。urllib2文档解释了如何做到这一点,网上有很多很好的例子,但基本上你所要做的就是调用urllib.urlencode()你的名称-值对,然后将结果作为第二个参数(或作为名为的关键字参数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 数据中发送其他参数,因此您可以不理会现有代码,只需进行一项更改:

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 回答