Как использовать WWW :: Mechanize для отправки формы, которой нет в HTML? - PullRequest
1 голос
/ 04 февраля 2011

Я пытаюсь сделать скрипт в WWW :: Mechanize, который будет строить работу в Гудзоне.Сценарий таков:

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

Проблема в том, что журнал Hudson жалуется, что ожидал отправки формы.Из журналов Hudson было извлечено следующее:

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

Проблема в том, что сборка в Hudson параметризована, и поэтому Hudson, по-видимому, генерирует форму с использованием 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 Ответ

2 голосов
/ 04 февраля 2011

Существует две возможности, одна из которых заключается в том, что в качестве одного из полей используется случайная строка, сгенерированная javascript, для защиты от CSRF-атак и автоматической отправки ботов. В этом случае вам нужно будет перевернуть алгоритм javascript, чтобы проанализировать и опубликовать строку, или использовать WWW::Scripter, что, однако, я не проверял.

Во-вторых, и я полагаю, что более вероятным вариантом является то, что скрипт проверяет fore referer, в этом случае просто установите реферер посредством редактирования заголовка, и вы можете пойти.

Еще одна вещь, на которую стоит обратить внимание, это то, что у вас точно такие же заголовки и файлы cookie в запросах браузера и Perl-скрипта; таким образом, вы можете сначала get страницу с формой, чтобы установить куки, или установить их самостоятельно в сценарии.

Нет ни одной меры, которую нельзя обойти, для того, чтобы использовать сценарий, вам просто нужно найти, какая из них используется путем тестирования ...

...