0
我试图模仿填写使用Mechanize
一种形式。但是,这是一个ASP网页,即使我认为我正在处理doPostbacks,但我仍然收到错误信息,当我手动填写页面时工作正常(错误是页面说它正在进行日常维护',必须发生这种情况,因为我缺少必需的参数)。红宝石机械化ASP网页
当我提交表单手动这是向服务器发出的(如在Chrome检查工具的网络选项卡中找到)的请求:
Remote Address:209.67.234.13:80
Request URL:http://www.luckystarbus.com/Purchase.aspx
Request Method:POST
Status Code:302 Found
Request Headersview parsed
POST /Purchase.aspx HTTP/1.1
Host: www.luckystarbus.com
Connection: keep-alive
Content-Length: 3450
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://www.luckystarbus.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://www.luckystarbus.com/Purchase.aspx
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8,es;q=0.6
Cookie: ASP.NET_SessionId=2mw5a43zz43nemyj5e4glq45; _gat=1; _ga=GA1.2.181151250.1412747640
Form Dataview sourceview URL encoded
__EVENTTARGET:
__EVENTARGUMENT:
__LASTFOCUS:
__VIEWSTATE:/wEPDwUJMzcyMTg0Mjk0D2QWAmYPZBYCAgMPZBYGAgMPDxYCHgtOYXZpZ2F0ZVVybAUdL1B1cmNoYXNlLmFzcHg/TGFuZ3VhZ2U9ZXMtTVhkZAIGDw8WAh4EVGV4dAXmCDxhIGhyZWY9Ii9wcm9tby9OWW1hcC5wZGYiIHRhcmdldD1fYmxhbms+PHU+PEZPTlQgQ09MT1I9I0ZGMDAwMCBTSVpFPTU+QVRURU5USU9OISEgTkVXIFlPUksgVElDS0VUIENPVU5URVIgTE9DQVRJT04gSEFTIE1PVkVEIFRPIDE0NSBDQU5BTCBTVFJFRVQ8QlI+IA0KPEJSPllvdSBNVVNUIGNoZWNrIGluIGF0IDE0NSBDYW5hbCBTdHJlZXQgYmVmb3JlIGJvYXJkaW5nLiBCdXMgUElDS1VQIGFuZCBEUk9QT0ZGIGxvY2F0aW9uIHJlbWFpbnMgYXQgNTUgQ2hyeXN0aWUgU3QuIFRoYW5rIFlvdSEgLUNsaWNrIEhFUkUgdG8gc2VlIG1hcC48L0ZPTlQ+PC91PjwvYT48QlI+DQo8QlI+PEZPTlQgQ09MT1I9IzRDQzQxNyBTSVpFPTQ+WWVzISBMdWNreSBTdGFyIGlzIG9wZW4gYWdhaW4uIEJ1c2VzIGFyZSBydW5uaW5nIGZyb20gTmV3IFlvcmsgQ2hpbmF0b3duIHRvIEJvc3RvbiBDaGluYXRvd24gYW5kIEJvc3RvbiBDaGluYXRvd24gdG8gTmV3IFlvcmsgQ2hpbmF0b3duLjxCUj4gDQo8QlI+UGxlYXNlIHNlZSBvdXIgc2NoZWR1bGVzIGFuZCBib29rIHRpY2tldHMgb25saW5lLjwvRk9OVD48QlI+DQoNCjxCUj48Rk9OVCBDT0xPUj0jNzM2QUZGIFNJWkU9Mz5PdXIgTmV3IFlvcmsgbG9jYXRpb24gaGFzIGZyZWUgV0lGSSBhbmQgb3V0bGV0cyB0byBjaGFyZ2UgeW91ciBtb2JpbGUgZGV2aWNlcy4gV2UgYWxzbyBoYXZlIGEgVFYgc28geW91IGNhbiBjYXRjaCB1cCBvbiB0aGUgbGF0ZXN0IG5ld3MhPC9GT05UPjxCUj4NCiANCjxCUj48Rk9OVCBDT0xPUj0jMUY0NUZDIFNJWkU9Mz4qT25saW5lIHRpY2tldHMgbXVzdCBiZSBwdXJjaGFzZWQgYXQgbGVhc3QgMSBob3VyIGJlZm9yZSB0aGUgZGVwYXJ0dXJlIHRpbWUuIEFueXRpbWUgd2l0aGluIHRoaXMsIHlvdSBjYW4gcHVyY2hhc2Ugc2FtZSBkYXkgdGlja2V0cyBhdCBvdXIgY291bnRlcio8L0ZPTlQ+PEJSPg0KDQo8QlI+PEZPTlQgQ09MT1I9RkYwMDAwIFNJWkU9Mz4qRGlzY291bnQgVGlja2V0cyBhcmUgc3ViamVjdCB0byBvdXIgRGlzY291bnQgVGlja2V0IFBvbGljeS4gVGlja2V0IERhdGUgYW5kIFRpbWUgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgcHVyY2hhc2UgYW5kIHRoZXkgYXJlIG5vbnJlZnVuZGFibGUqPC9GT05UPg0KDQpkZAIHD2QWDAIBDxBkZBYBAgFkAgUPEGQQFSgBMQEyATMBNAE1ATYBNwE4ATkCMTACMTECMTICMTMCMTQCMTUCMTYCMTcCMTgCMTkCMjACMjECMjICMjMCMjQCMjUCMjYCMjcCMjgCMjkCMzACMzECMzICMzMCMzQCMzUCMzYCMzcCMzgCMzkCNDAVKAExATIBMwE0ATUBNgE3ATgBOQIxMAIxMQIxMgIxMwIxNAIxNQIxNgIxNwIxOAIxOQIyMAIyMQIyMgIyMwIyNAIyNQIyNgIyNwIyOAIyOQIzMAIzMQIzMgIzMwIzNAIzNQIzNgIzNwIzOAIzOQI0MBQrAyhnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZGQCCQ8QDxYCHgtfIURhdGFCb3VuZGdkDxYCAgECAhYCEAUKQm9zdG9uLCBNQQUKQm9zdG9uLCBNQWcQBRFOZXcgWW9yayBDaXR5LCBOWQURTmV3IFlvcmsgQ2l0eSwgTllnZGQCDQ8QDxYCHwJnZBAVARFOZXcgWW9yayBDaXR5LCBOWRUBATEUKwMBZ2RkAhUPDxYIHglCYWNrQ29sb3IKNB8BZR4HRW5hYmxlZGgeBF8hU0ICCGRkAh8PD2QPEBYBZhYBFgIeDlBhcmFtZXRlclZhbHVlBQpCb3N0b24sIE1BFgFmZGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFFmN0bDAwJE1haW5Db250ZW50JGJ0R29hbBSsBVNn5gBofKlBOku93mxXVw==
__VIEWSTATEGENERATOR:C7C53EDD
__EVENTVALIDATION:/wEWNwKs4av/BwLuseWwCgLV3sKgCwKn3JGKDQLJj5y8CgLIj5y8CgLLj5y8CgLKj5y8CgLNj5y8CgLMj5y8CgLPj5y8CgLej5y8CgLRj5y8CgLJj9y/CgLJj9C/CgLJj9S/CgLJj+i/CgLJj+y/CgLJj+C/CgLJj+S/CgLJj/i/CgLJj7y8CgLJj7C8CgLIj9y/CgLIj9C/CgLIj9S/CgLIj+i/CgLIj+y/CgLIj+C/CgLIj+S/CgLIj/i/CgLIj7y8CgLIj7C8CgLLj9y/CgLLj9C/CgLLj9S/CgLLj+i/CgLLj+y/CgLLj+C/CgLLj+S/CgLLj/i/CgLLj7y8CgLLj7C8CgLKj9y/CgKEqZSECQKEqZSECQKu98XRCAKppL+gBwKztP72DgKw7NHHAgLe4cH0AgLmvYqoAgLczuTwCAKkgd7NDALA6+GiC77wn7OOuuAuAIz5dzZgP6GxLs9S
ctl00$MainContent$rbTripType:One
ctl00$MainContent$numPassengers:1
ctl00$MainContent$ddDepartureCity:Boston, MA
ctl00$MainContent$ddArrivalCity:1
ctl00$MainContent$sd:10/17/2014
ctl00$MainContent$rbFareType:Lowest
ctl00$MainContent$btGo.x:64
ctl00$MainContent$btGo.y:13
所以,我试图使用模仿每个这些输入机械化:
def search
agent = Mechanize.new
url = "http://www.luckystarbus.com"
page = agent.get(url)
form = page.form("aspnetForm")
form.radiobutton_with(value: 'One').check
form.field_with(name: 'ctl00$MainContent$ddDepartureCity').options[1].select
form.add_field!('__EVENTARGUMENT', '')
form.add_field!('__EVENTTARGET', '')
form.add_field!('__LASTFOCUS', '')
form.add_field!('ctl00$MainContent$btGo.x',64)
form.add_field!('ctl00$MainContent$btGo.y',13)
form.field_with(name: 'ctl00$MainContent$sd').value = "10/24/2014"
form.radiobutton_with(value: 'Lowest').check
page = form.click_button
end
我也尝试发布的另一个建议SO回答PARAMS,但得到了同样的错误:
def search
agent = Mechanize.new
agent.post("http://www.luckystarbus.com/Purchase.aspx", {
'ctl00$MainContent$rbTripType'=>'One',
'ctl00$MainContent$numPassengers'=>'1',
'ctl00$MainContent$ddArrivalCity'=>'New%20York%2C+NY',
'ctl00$MainContent$ddDepartureCity'=>'Boston%2C+MA',
'ctl00$MainContent$sd'=>'10%2F24%2F2014',
'ctl00$MainContent$rbFareType'=>'Lowest',
'ctl00$MainContent$btGo.x'=>64,
'ctl00$MainContent$btGo.y'=>13,
'__EVENTARGUMENT'=>'',
'__EVENTTARGET'=>'',
'__LASTFOCUS'=>''
})
end
我试图找回的页面应该有标题'Choose Schedule'。直接以这种方式提交参数时是否存在缺少的方法?每次输入带有doPostback的输入时,我是否应该执行form.click_button
?
我试过,但它不是有它的窗体上的特定输入doPostBack形式本身。所以,当选择往返选项时,它会执行doPostback,以及选择出发城市时。在浏览器中,当我设置这些内容时,页面会自动提交,但使用Mechanize时,它似乎不会执行页面重新加载,而且我无法将EVENTTARGET设置两次,因为它会覆盖之前的值。 – kittyminky 2014-10-12 21:48:54
无论最后的doPostBack是什么值应该是。尝试使用像charles或fiddler这样的调试代理来查看这些值是什么。 – pguardiario 2014-10-12 22:40:03
使用Chrome的Inspector工具我可以看到发送到服务器的请求和标头,我为这些值中的每一个提供了值,并且表单仍然返回错误。 – kittyminky 2014-10-12 23:09:28