我创建了一个连接到服务器并可以读取消息的聊天机器人,现在我正处于需要发送消息的位置,需要请求有效负载(根据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的设置。时间戳功能根据服务器需要创建时间戳(对于此问题,不需要知道)。回到问题,如何将有效负载添加到开启者以向聊天发送消息?
答案 0 :(得分:0)
我不确定“有效载荷”是什么意思,但可能只是另一个名为payload
的表单变量。如果是这样,您发送它的方式与执行任何其他表单变量的方式相同,并且您已经发送了一堆 - roomId
,t
等。
发送表单变量的一种方法是对它们进行URL编码,将它们添加到查询字符串中,然后发送GET请求。这就是你现在正在做的事情。 (最好使用正确的urllib
方法,而不是将其与字符串连接一起进行黑客攻击,但最终结果是相同的。)
另一种方法是发送POST正文。 urllib2
documentation解释了如何执行此操作,并且在线有很多好的示例,但基本上您只需要在名称 - 值对上调用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)))
答案 1 :(得分: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请求,只需将get
更改为post
并添加一些数据:
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