使用请求lib(python)发布到论坛

时间:2013-01-22 17:18:43

标签: python forms post python-requests phpbb3

我正在尝试使用Requests将消息发布到phpBB3论坛。它是一个更大的项目的一部分,这部分应该用数据库中的几千个帖子填充论坛。我也在浏览论坛时使用lxml来解析页面。

我的问题实际上是在论坛中发帖。首先我登录:

payload = {'username':'user', 'password':'password', 'login':'login', 
            'redirect':'index.php''}
url = 'http://test.com/test_forum'
q = s.post('http://test.com/test_forum/ucp.php?mode=login', data=payload)
a = s.get('http://test.com/test_forum')

在此之后,我可以看到我的脚本已登录。然后我使用lxml遍历论坛到我要发布的主题/主题,我使用请求获取发布页面,之后我再次使用lxml从页面获取<input>值并将它们放在字典中。然后我尝试POST,这与我登录时的方式类似,没有任何反应:

#This is after traversing the forum using lxml to get to the post page.
a = s.get('%s%s' % (url, links[0][1:]))
#a contains the response (posting page)

tree = html.fromstring(a.text)
#collect values from inputs in the form to submit along with message
form_token = tree.xpath('//input[@name="form_token"]/attribute::value')
subject = tree.xpath('//input[@name="subject"]/attribute::value')
topic_cur_post_id = tree.xpath('//input[@name="topic_cur_post_id"]/attribute::value')
lastclick = tree.xpath('//input[@name="lastclick"]/attribute::value')
creation_time = tree.xpath('//input[@name="creation_time"]/attribute::value')
fileupload = tree.xpath('//input[@name="fileupload"]/attribute::value')

data = {'form_token':form_token, 'subject':subject, 
'topic_cur_post_id':topic_cur_post_id, 'lastclick':lastclick, 
'creation_time':creation_time,
        'fileupload':fileupload, 'message':'TEST MESSAGE 2'}

q = s.post('http://vaultlog.frih.net/test_forum/posting.php?mode=reply&f=9&t=4',
             data=data)

当我使用print q.text检查加载了哪个页面时,我再次看到它是相同的发布页面。

我冒昧地使用WireShark查看数据包中的不同内容。首先,我的脚本的POST消息: http://pastebin.com/sRp9Zxme

使用Firefox发布时生成的消息: http://pastebin.com/QSNawBRM

主要区别在于,自然发布消息会为POST提供content-type: multipart/form-data;标题,而我的脚本标题为Content-Type: application/x-www-form-urlencoded

我想到的另一个想法是,我没有发布所有必填字段。我没有提交任何复选框等,但我提交了所有字段,包括隐藏的字段。这是表单字段的HTML:http://pastebin.com/U12BXZWF

如果要使用请求发布到论坛,我该怎么办?如果这会改变任何内容,我还必须将图像作为附件发布。

0 个答案:

没有答案