2013-01-04 63 views
0

打开URL时,我创建了一个连接到服务器,可以读取消息的聊天机器人,现在我在这里,我需要发送邮件的问题,需要根据开发者网络标签请求负载(谷歌浏览器上的工具)。我的揭幕战由无非是以下几点:添加有效载荷与urllib的

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的。时间戳函数根据服务器需要创建一个时间戳(这不需要知道这个问题)。回到问题中,如何将有效载荷添加到开叫器中以向聊天发送消息?

+1

请求负载?你的意思是POST请求吗? – Blender

+0

啊,是的,POST请求。我误解了Chrome向我展示的内容。 – Hairr

回答

0

我不知道你所说的“有效载荷”的意思,但据推测它只是命名​​另一种形式的变量。如果是这样,你发送它的方式与其他任何形式变量一样,并且你已经发送了一堆 - 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))) 
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 
+0

我很确定这不会处理他的cookiejar。这并不是说用'requests'做这件事很困难,但是他已经有了'urllib2'中的代码,他现在想做的事情在'urllib2'中比在'requests'中更难。 – abarnert

+0

@abarnert:请求默认处理cookie,所以实际上没有必要手动设置CookieJar。 – Blender

+0

啊,我没有意识到他只是使用默认的cookiejar,而不是加载一个明确的cookiejar。在那种情况下,是的,他不需要做任何事情。但是,这里的代码并没有太大的不同。 'requests'可以让你跳过'urllib.urlencode()'和显式cookiejar; 'urllib2'可以让你跳过显式的'post',否则,它们几乎完全相同。 – abarnert