使用urllib打开URL时添加有效负载

时间:2013-01-04 01:42:53

标签: python chat bots

我创建了一个连接到服务器并可以读取消息的聊天机器人,现在我正处于需要发送消息的位置,需要请求有效负载(根据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的设置。时间戳功能根据服务器需要创建时间戳(对于此问题,不需要知道)。回到问题,如何将有效负载添加到开启者以向聊天发送消息?

2 个答案:

答案 0 :(得分:0)

我不确定“有效载荷”是什么意思,但可能只是另一个名为payload的表单变量。如果是这样,您发送它的方式与执行任何其他表单变量的方式相同,并且您已经发送了一堆 - roomIdt等。

发送表单变量的一种方法是对它们进行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