Mechanize,双重认证:如何在表单内填写表单
我有一个脚本可以登录一个网站。现在的问题是,我在EC2上运行这个脚本,而网站要求我进行额外的验证,给我发送一个自定义的验证码。
我能立刻收到邮件,但我需要能够实时更新这个验证码的输入框。
这是我的脚本
import urllib2
import urllib2
import cookielib
import urllib
import requests
import mechanize
from bs4 import BeautifulSoup
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_refresh(False)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
# The site we will navigate into, handling it's session
br.open('https://www.website.com/login')
#select the first form
br.select_form(nr=0)
#user credentials
br['user_key'] = 'username@gmail.com'
br['user_password'] = 'somePassw0rd'
# Login
br.submit()
#enter verification code
input_var = raw_input("Enter something: ")
#put verification code in form
br['Verication'] = str(input_var)
#submit form
br.submit()
我遇到的挑战是,我总是收到一个错误提示:
AttributeError: mechanize._mechanize.Browser instance has no attribute __setitem__ (perhaps you forgot to .select_form()?)
我该怎么做才能让这个脚本正常运行呢?
1 个回答
1
在你调用 br.submit() 之后,你会直接进入
br['Verication'] = str(input_var)
这样做是不对的,因为使用 br.submit() 会导致你的浏览器不再选中任何表单。
提交之后,我建议你尝试:
for form in br.forms():
print form
看看是否还有其他表单可以选择。
查看登录网站的 HTML 代码,看看当你点击登录时到底发生了什么。你可能需要在同一页面上重新选择一个表单,然后把验证码分配给其中一个控件。