2014-10-11 121 views
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

回答

2

是的,如果需要的话,您需要设置doPostBack值。 假设的形式有:

<form onsubmit="doPostback('foo', 'bar')"> 

然后为机械化,你会怎么做:

form['__EVENTTARGET'] = 'foo' 
form['__EVENTARGUMENT'] = 'bar' 

如果仍然不能得到它,让你的浏览器的请求,并从那里拉值:

page = @agent.get 'http://www.luckystarbus.com/' 
form = page.form 

form['ctl00$MainContent$rbTripType'] = 'One' 
form['ctl00$MainContent$numPassengers'] = '1' 
form['ctl00$MainContent$ddDepartureCity'] = 'Boston, MA' 
form['ctl00$MainContent$ddArrivalCity'] = '1' 
form['ctl00$MainContent$sd'] = '10/17/2014' 
form['ctl00$MainContent$rbFareType'] = 'Lowest' 

form['__EVENTTARGET'] = 'ctl00$MainContent$rbTripType$1' 
form['__EVENTARGUMENT'] = '' 
form['__VIEWSTATE'] = '/wEPDwUJMzcyMTg0Mjk0D2QWAmYPZBYCAgMPZBYGAgMPDxYCHgtOYXZpZ2F0ZVVybAUdL1B1cmNoYXNlLmFzcHg/TGFuZ3VhZ2U9ZXMtTVhkZAIGDw8WAh4EVGV4dAXmCDxhIGhyZWY9Ii9wcm9tby9OWW1hcC5wZGYiIHRhcmdldD1fYmxhbms+PHU+PEZPTlQgQ09MT1I9I0ZGMDAwMCBTSVpFPTU+QVRURU5USU9OISEgTkVXIFlPUksgVElDS0VUIENPVU5URVIgTE9DQVRJT04gSEFTIE1PVkVEIFRPIDE0NSBDQU5BTCBTVFJFRVQ8QlI+IA0KPEJSPllvdSBNVVNUIGNoZWNrIGluIGF0IDE0NSBDYW5hbCBTdHJlZXQgYmVmb3JlIGJvYXJkaW5nLiBCdXMgUElDS1VQIGFuZCBEUk9QT0ZGIGxvY2F0aW9uIHJlbWFpbnMgYXQgNTUgQ2hyeXN0aWUgU3QuIFRoYW5rIFlvdSEgLUNsaWNrIEhFUkUgdG8gc2VlIG1hcC48L0ZPTlQ+PC91PjwvYT48QlI+DQo8QlI+PEZPTlQgQ09MT1I9IzRDQzQxNyBTSVpFPTQ+WWVzISBMdWNreSBTdGFyIGlzIG9wZW4gYWdhaW4uIEJ1c2VzIGFyZSBydW5uaW5nIGZyb20gTmV3IFlvcmsgQ2hpbmF0b3duIHRvIEJvc3RvbiBDaGluYXRvd24gYW5kIEJvc3RvbiBDaGluYXRvd24gdG8gTmV3IFlvcmsgQ2hpbmF0b3duLjxCUj4gDQo8QlI+UGxlYXNlIHNlZSBvdXIgc2NoZWR1bGVzIGFuZCBib29rIHRpY2tldHMgb25saW5lLjwvRk9OVD48QlI+DQoNCjxCUj48Rk9OVCBDT0xPUj0jNzM2QUZGIFNJWkU9Mz5PdXIgTmV3IFlvcmsgbG9jYXRpb24gaGFzIGZyZWUgV0lGSSBhbmQgb3V0bGV0cyB0byBjaGFyZ2UgeW91ciBtb2JpbGUgZGV2aWNlcy4gV2UgYWxzbyBoYXZlIGEgVFYgc28geW91IGNhbiBjYXRjaCB1cCBvbiB0aGUgbGF0ZXN0IG5ld3MhPC9GT05UPjxCUj4NCiANCjxCUj48Rk9OVCBDT0xPUj0jMUY0NUZDIFNJWkU9Mz4qT25saW5lIHRpY2tldHMgbXVzdCBiZSBwdXJjaGFzZWQgYXQgbGVhc3QgMSBob3VyIGJlZm9yZSB0aGUgZGVwYXJ0dXJlIHRpbWUuIEFueXRpbWUgd2l0aGluIHRoaXMsIHlvdSBjYW4gcHVyY2hhc2Ugc2FtZSBkYXkgdGlja2V0cyBhdCBvdXIgY291bnRlcio8L0ZPTlQ+PEJSPg0KDQo8QlI+PEZPTlQgQ09MT1I9RkYwMDAwIFNJWkU9Mz4qRGlzY291bnQgVGlja2V0cyBhcmUgc3ViamVjdCB0byBvdXIgRGlzY291bnQgVGlja2V0IFBvbGljeS4gVGlja2V0IERhdGUgYW5kIFRpbWUgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgcHVyY2hhc2UgYW5kIHRoZXkgYXJlIG5vbnJlZnVuZGFibGUqPC9GT05UPg0KDQpkZAIHD2QWDAIBDxBkZBYAZAIFDxBkEBUoATEBMgEzATQBNQE2ATcBOAE5AjEwAjExAjEyAjEzAjE0AjE1AjE2AjE3AjE4AjE5AjIwAjIxAjIyAjIzAjI0AjI1AjI2AjI3AjI4AjI5AjMwAjMxAjMyAjMzAjM0AjM1AjM2AjM3AjM4AjM5AjQwFSgBMQEyATMBNAE1ATYBNwE4ATkCMTACMTECMTICMTMCMTQCMTUCMTYCMTcCMTgCMTkCMjACMjECMjICMjMCMjQCMjUCMjYCMjcCMjgCMjkCMzACMzECMzICMzMCMzQCMzUCMzYCMzcCMzgCMzkCNDAUKwMoZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2RkAgkPEA8WAh4LXyFEYXRhQm91bmRnZA8WAgIBAgIWAhAFCkJvc3RvbiwgTUEFCkJvc3RvbiwgTUFnEAURTmV3IFlvcmsgQ2l0eSwgTlkFEU5ldyBZb3JrIENpdHksIE5ZZ2RkAg0PEA8WAh8CZ2QQFQERTmV3IFlvcmsgQ2l0eSwgTlkVAQExFCsDAWdkZAIVDw8WCB4JQmFja0NvbG9yCjQfAWUeB0VuYWJsZWRoHgRfIVNCAghkZAIfDw9kDxAWAWYWARYCHg5QYXJhbWV0ZXJWYWx1ZQUKQm9zdG9uLCBNQRYBZmRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBRZjdGwwMCRNYWluQ29udGVudCRidEdvwbhqhkFFsrlXS0S0mNHMfZU317w=' 
form['__EVENTVALIDATION'] = '/wEWNwKf77e6AwLuseWwCgLV3sKgCwKn3JGKDQLJj5y8CgLIj5y8CgLLj5y8CgLKj5y8CgLNj5y8CgLMj5y8CgLPj5y8CgLej5y8CgLRj5y8CgLJj9y/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+GiC9RzJOOGhIrLnJW1ydqt1vZKIsKV' 
form['ctl00$MainContent$btGo.x'] = 0 
form['ctl00$MainContent$btGo.y'] = 0 

page = form.submit 

适合我。

+0

我试过,但它不是有它的窗体上的特定输入doPostBack形式本身。所以,当选择往返选项时,它会执行doPostback,以及选择出发城市时。在浏览器中,当我设置这些内容时,页面会自动提交,但使用Mechanize时,它似乎不会执行页面重新加载,而且我无法将EVENTTARGET设置两次,因为它会覆盖之前的值。 – kittyminky 2014-10-12 21:48:54

+0

无论最后的doPostBack是什么值应该是。尝试使用像charles或fiddler这样的调试代理来查看这些值是什么。 – pguardiario 2014-10-12 22:40:03

+0

使用Chrome的Inspector工具我可以看到发送到服务器的请求和标头,我为这些值中的每一个提供了值,并且表单仍然返回错误。 – kittyminky 2014-10-12 23:09:28