Tom*_*unn 5 python webforms mechanize
我正在尝试使用Python和Mechanize登录网站,但是,当我试图让POST数据按照我的意愿行事时,我遇到了麻烦.
基本上我想使用mechanize和Python来复制它:
wget --quiet --save-cookies cookiejar --keep-session-cookies --post-data "action=login&login_nick=USERNAME&login_pwd=PASSWORD" -O outfile.htm http://domain.com/index.php
Run Code Online (Sandbox Code Playgroud)
表单如下所示:
<login POST http://domain.com/index.php application/x-www-form-urlencoded
<TextControl(login_nick=USERNAME)>
<PasswordControl(login_pwd=PASSWORD)>
<CheckboxControl(login_auto=[1])>
<SubmitButtonControl(<None>=) (readonly)>>
Run Code Online (Sandbox Code Playgroud)
设置适当的值并提交表单不是问题,但是省略了"action = login"-part.
response = self.browser.open(self.url+"/index.php")
self.browser.select_form(name="login")
self.browser["login_nick"] = self.encoded_username
self.browser["login_pwd"] = self.encoded_password
self.browser.method = "POST"
response = self.browser.open(self.browser.submit())
print (response.read())
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我该如何添加action=login零件?
编辑:好的,所以我添加了一个名为action的隐藏字段并将值设置为login.使用Wireshark分析TCP流,POST数据确实按照应有的方式构建.然而,似乎机械化正在弄乱我的urlencoding(我已经为网站使用的charset专门编写了值).例如,我的用户名包含Å - 我已将其urlencoded为%C5.但是,当它与机械化一起发送时,它显示为%25C5. 如何通过更改字符串来停止机械化?
编辑:我意识到,在发送机器人之前,我可能不会对我的字符串进行urlencode.案件结案.
无论如何,Mechanize似乎都会对字符串进行urlencode,所以没有必要对抗它.这是最终的解决方案(显然在语法上没有效果,但希望你能得到这个想法).
import mechanize
self.browser = mechanize.Browser()
self.browser.open(self.url)
self.browser.select_form(name="login")
self.browser["login_nick"] = self.username
self.browser["login_pwd"] = self.password
self.browser.new_control("HIDDEN", "action", {})
control = self.browser.form.find_control("action")
control.readonly = False
self.browser["action"] = "login"
self.browser.method = "POST"
self.browser.action = self.url
response = self.browser.submit()
Run Code Online (Sandbox Code Playgroud)