如何使用WWW :: Mechanize提交HTML中没有的表单?

问题描述:

我想在WWW :: Mechanize中做一个脚本,它将在Hudson中构建一份工作。脚本是这样的:如何使用WWW :: Mechanize提交HTML中没有的表单?

$mech->post("$hudson_url/view/All/job/$job_name/build?delay=0sec", \%job_arguments); 

问题是,哈德森日志抱怨说,它预计表单提交。以下是从哈德森日志提取:

Caused by: java.lang.Error: This page expects a form submission 
    at org.kohsuke.stapler.RequestImpl.getSubmittedForm(RequestImpl.java:769) 
    at hudson.model.ParametersDefinitionProperty._doBuild(ParametersDefinitionProperty.java:116) 
    at hudson.model.AbstractProject.doBuild(AbstractProject.java:1531) 
    ... 69 more 

的问题是,在哈德森构建是参数化的,等等哈德森aparently生成使用JavaScript的形式。最终,哈德森将调用这个URL。我如何提出这个请求,让哈德森认为我正在发表一个表格?


更新:我有Chrome中显示的请求数据。这是什么在起作用:

Request URL:<url>/hudson/view/All/job/ReleaseThis/build?delay=0sec 
Request Method:POST 
Status Code:302 Moved Temporarily 
Request Headers 
Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Length:935 
Content-Type:application/x-www-form-urlencoded 
Cookie:screenResolution=1920x1080; JSESSIONID=B3F99F6C376318AB6331AE6F27917D52; screenResolution=1920x1080; __utmz=250097027.1291302888.1.1.utmcsr=...|utmccn=(referral)|utmcmd=referral|utmcct=/sig/Home.action; __utma=250097027.1666115034.1291302888.1291302888.1291302888.1 
Host:<hudson_url> 
Origin:<huson_url> 
Referer:https://<hudson_url>/hudson/view/All/job/ReleaseThis/build?delay=0sec 
User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.84 Safari/534.13 
Query String Parameters 
delay:0sec 
Form Data 
name:URL 
value:https://<url> 
value:1.12-SNAPSHOT 
name:RELEASE_VERSION 
value:1.12-TEST16 
name:UPDATE_MASTER_POM 
name:PROPERTY_NAME 
value: 
name:DEV_VERSION 
value: 
name:STABLE_VERSION 
value: 
json:{"parameter": [{"name": "URL", "value": <url>}, {"name": "SNAPSHOT_VERSION", "value": "1.12-SNAPSHOT"}, {"name": "RELEASE_VERSION", "value": "1.12-TEST16"}, {"name": "UPDATE_MASTER_POM", "value": false}, {"name": "PROPERTY_NAME", "value": ""}, {"name": "DEV_VERSION", "value": ""}, {"name": "STABLE_VERSION", "value": ""}]} 
Submit:Build 
Response Headers 
Connection:close 
Content-Length:0 
Content-Type:text/plain; charset=UTF-8 
Date:Fri, 04 Feb 2011 13:33:27 GMT 
Location:https://<hudson.url>/hudson/view/All/job/ReleaseThis/ 
Server:Apache-Coyote/1.1 
Via:1.1 <hudson.url>:8890 (Apache/2.2.3) 
+1

尝试采取交通的tcpdump的,这将然后让您确定数据以何种格式发送。 – 2011-02-04 15:54:45

有两种可能性,一种是有一个JavaScript生成的随机字符串作为的领域之一,为了从CSRF攻击,僵尸autosubmission保护。在这种情况下,您需要反转javascript算法来解析并发布字符串,或者使用WWW::Scripter,但是我没有测试过。

其次,我相信更可能的选择是脚本检查前面的引用者,在这种情况下,只需通过编辑头文件来设置引用者,并且您可能会很好。

还有一点需要注意的是,您在浏览器和perl脚本请求中具有完全相同的标题和Cookie;因此您可能首先使用表格的页面get,以获取Cookie设置,或者将它们自己设置在脚本中。

没有不能被绕过,供您使用的脚本,你只需要找到被测试采用哪一种单一的措施...

+0

我用referer头文件和参数之间的转换json(哈德逊似乎需要)。有效。谢谢! – Rafael 2011-02-04 19:41:02