Einloggen in die Webseite per Skript

1792
Tommy Brunn

Ich versuche, die Extraktion einiger Informationen von einer Website zu automatisieren, für die ich mich zuerst anmelden muss. Ich habe dies vor (vor Jahren) mit wget getan, aber diese Methode scheint nicht mehr zu funktionieren - und ich auch nicht weiß warum.

Ich habe es so gemacht:

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 

Wenn ich jetzt versuche, das auszuführen, werde ich einfach zur Hauptseite zurückgeschickt (also füge ich nicht nur das falsche Passwort ein. Wenn ich das getan hätte, würde ich andere Markierungen erhalten).

Ich habe es auch in Python mit mechanize versucht (dies wäre wget vorzuziehen), aber ich scheine das gleiche Ergebnis zu erhalten. Es verblüfft mich einfach, warum das nicht funktioniert. Dies ist der Teil der Website, der sich mit dem Formular befasst. Um das vollständige Markup anzuzeigen, gehen Sie einfach zu 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> 

Wenn mir jemand sagen könnte, warum das nicht funktioniert, wäre ich unendlich dankbar.

EDIT: Ich habe gerade mein eigenes kleines Webformular (genau wie das auf der Website strukturiert) eingerichtet, und es hat gut funktioniert. Nun, was zum Teufel könnten sie tun, was dazu führt, dass ich mich weder mit wget noch mit mechanize anmelden kann?

3
Diese Frage ist möglicherweise besser für stackoverflow.com geeignet. Tim S. Van Haren vor 13 Jahren 2
Tim S. Van Haren: Wirklich? Ich wollte es dort posten, aber ich war mir sicher, dass sie mich hierher überweisen würden. Tommy Brunn vor 13 Jahren 0
Haben Sie versucht, die User-Agent-Zeichenfolge auf etwas zu setzen, das die Website erwartet? Manchmal lösen Web-Logins Verbindungen zu bestimmten UAs, weil sie wissen, dass ihre Site gerippt wird (automatisch von keinem Benutzer gelesen). RobotHumans vor 13 Jahren 0
Ich habe versucht, die Benutzer-Agent-Zeichenfolge auf dieselbe Weise wie mein Browser festzulegen. Kein Glück. Tommy Brunn vor 13 Jahren 0

1 Antwort auf die Frage

2
Gareth Davidson
  1. Laden Sie Wireshark herunter.
  2. Nehmen Sie einen echten Browser auf, der auf die Website trifft.
  3. Stellen Sie Ihren Filter auf tcp.port == 80und finden Sie die gerade angeforderte Anforderung.
  4. Klicken Sie mit der rechten Maustaste auf ein Paket und wählen Sie Follow TCP Streamden Text aus, und speichern Sie ihn irgendwo.

Jetzt haben Sie die vollständige, funktionierende Konversation von Ihrem Webbrowser zu der Website, die Sie abtasten möchten.

Wiederholen Sie den Vorgang für Ihr Skript und finden Sie heraus, wo sie sich unterscheiden. Nehmen Sie dann die entsprechenden Änderungen vor, um das Problem zu beheben. Sobald sie identisch sind, kann die Site den Unterschied zwischen Ihnen und Ihrem Skript nicht erkennen.

Wenn Sie mehr Flexibilität benötigen, empfiehlt es sich, ein einfaches Python-Skript zu schreiben, anstatt es zu verwenden wget.

Es stellte sich heraus, dass sie die Verschlüsselung des Benutzernamens und / oder Passworts irgendwie geändert hatten. Beim Vergleich der Protokolle zeigte sich, dass mein Benutzername etwas anders codiert wurde, was dazu führte, dass die Anmeldung fehlschlug. Tommy Brunn vor 13 Jahren 1