Get Mechanize для обработки файлов cookie с произвольного POST (для программного входа на веб-сайт) - PullRequest
1 голос
/ 08 апреля 2010

Я хочу войти в систему https://www.t -mobile.com / программно. Моей первой идеей было использовать Mechanize для отправки формы входа в систему:

альтернативный текст http://dl.dropbox.com/u/2792776/screenshots/2010-04-08_1440.png

Однако оказывается, что это даже не настоящая форма. Вместо этого, когда вы нажимаете «Войти», некоторые javascript собирают значения полей, динамически создают новую форму и отправляют ее.

Кнопка «Войти» HTML:

<button onclick="handleLogin(); return false;" class="btnBlue" id="myTMobile-login"><span>Log in</span></button>

Функция handleLogin():

function handleLogin() {
    if (ValidateMsisdnPassword()) { // client-side form validation logic
        var a = document.createElement("FORM");
        a.name = "form1";
        a.method = "POST";
        a.action = mytmoUrl; // defined elsewhere as https://my.t-mobile.com/Login/LoginController.aspx
        var c = document.createElement("INPUT");
        c.type = "HIDDEN";
        c.value = document.getElementById("myTMobile-phone").value; // the value of the phone number input field
        c.name = "txtMSISDN";
        a.appendChild(c);
        var b = document.createElement("INPUT");
        b.type = "HIDDEN";
        b.value = document.getElementById("myTMobile-password").value; // the value of the password input field
        b.name = "txtPassword";
        a.appendChild(b);
        document.body.appendChild(a);
        a.submit();
        return true
    } else {
        return false
    }
}

Я мог бы смоделировать отправку этой формы, поместив данные формы в https://my.t-mobile.com/Login/LoginController.aspx с помощью Net::HTTP#post_form, но я не знаю, как получить результирующий файл cookie в Mechanize, чтобы я мог продолжать очищать доступный интерфейс, когда авторизовался.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2010

Вы можете использовать что-то вроде этого, чтобы войти в систему и сохранить куки, чтобы вам не пришлось делать это снова. Конечно, вам нужно будет придумать свою собственную логику, чтобы публиковать ее напрямую, но именно так я использую встроенный в Cookie механизм cookie_jar для сохранения куки.

if !agent.cookie_jar.load('cookies.yml')
  page = agent.get('http://site.com')

  form = page.forms.last
  form.email = 'email'
  form.password = 'password'

  page = agent.submit(form)

  agent.cookie_jar.save_as('cookies.yml')
end
1 голос
/ 09 апреля 2010

Я бы избегал Net :: HTTP; попробуйте с:

post(url, query={}, headers={})

напрямую от Класс механизации .

1 голос
/ 09 апреля 2010

Я часто использую расширение FireFox HttpFox , чтобы выяснить, что именно происходит для такого рода проблем.

...