Вход на веб-страницу с помощью скрипта

1603
Tommy Brunn

Я пытаюсь автоматизировать извлечение некоторой информации с веб-сайта, который сначала требует, чтобы я вошел в систему. Я делал это в прошлом (несколько лет назад), используя wget, но этот метод больше не работает - и я не знаю, почему.

Я делал это так:

MY_USERNAME=username # needs to be urlencoded, this can be done at http://lajm.eu/emil/dump/stringfunctions.php. MY_PASSWORD=password # also has to be urlencoded  LOGIN_DATA="action=login&login_nick=$MY_USERNAME&login_pwd=$MY_PASSWORD"  wget --quiet --save-cookies cookiejar --keep-session-cookies --post-data $LOGIN_DATA --user-agent 'Firefox' -O um.htm http://ungdomar.se/index.php 

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

Я также пытался сделать это в Python с использованием mechanize (это было бы предпочтительнее, чем wget), но я, похоже, получил тот же результат. Просто уму непостижимо, почему это не сработает. Это часть сайта, которая имеет дело с формой. Чтобы увидеть полную разметку, просто перейдите на ungdomar.se .

<div id="loginLoginbox" style="display:none;"> <form name="login" method="post" action="/">  <table width="250" cellspacing="0" cellpadding="0" border="0">  <tr> <td colspan="2"> <span class="page_login_text">Användarnamn</span><br />  <input name="login_nick" type="text" style="width:250px;height:16px;line-height:10px;font-size:9px;" maxLength="30"> </td> </tr>  <tr> <td colspan="2"> <span class="page_login_text">Lösenord</span><br />  <input name="login_pwd" type="password" style="width:250px;height:16px;line-height:10px;font-size:9px;" maxLength="25"><br /> <img src="/gfx/1x1.gif" width="1" height="5" alt="" /> </td> </tr>  <tr> <td width="42%" valign="top"> <span style="vertical-align:super;" class="page_login_text"> <label for="login_auto">Kom ihåg mig</label> </span> &nbsp; <input name="login_auto" id="login_auto" type="checkbox" value="1" style="width:12px; height:12px;"> </td>  <td width="58%" align="right" valign="top"> <a class="page_login_text" href="/sendpwd.php">Glömt lösen?</a>  <button class="button_active" type="submit">Logga in</button> </td> </tr>  </table> </form> </div> 

Если бы кто-то мог сказать мне, почему это не сработало, я был бы вечно благодарен.

РЕДАКТИРОВАТЬ: Я просто создал свою собственную маленькую веб-форму (структурированную точно так же, как на сайте), и она работала просто отлично. Что, черт возьми, они могут делать, чтобы я не мог войти с помощью wget или механизировать?

3
Этот вопрос может быть лучше подходит для stackoverflow.com. Tim S. Van Haren 13 лет назад 2
Тим С. Ван Харен: Правда? Я собирался опубликовать это там, но я был уверен, что они направят меня сюда. Tommy Brunn 13 лет назад 0
Вы пытались установить строку user-agent на то, что ожидает веб-сайт? иногда веб-логины сбрасывают соединения с конкретными UA, потому что они знают, что их сайт разрывается (автоматически читается не человеком) RobotHumans 13 лет назад 0
Я попытался установить строку пользовательского агента так же, как мой браузер. Неудачно. Tommy Brunn 13 лет назад 0

1 ответ на вопрос

2
Gareth Davidson
  1. Скачать Wireshark.
  2. Запишите настоящий браузер, попавший на сайт.
  3. Установите фильтр tcp.port == 80и найдите только что сделанный запрос.
  4. Щелкните правой кнопкой мыши на пакете и выберите Follow TCP Streamи сохраните этот текст где-нибудь.

Теперь у вас есть полный рабочий разговор от вашего веб-браузера до веб-сайта, который вы хотите просмотреть.

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

Если вам нужна большая гибкость, я предлагаю писать простой скрипт на Python, а не использовать wget.

Оказывается, они как-то изменили кодировку имени пользователя и / или пароля. Сравнение журналов показало, что мое имя пользователя закодировано немного по-другому, что и привело к ошибке входа в систему. Tommy Brunn 13 лет назад 1

Похожие вопросы