2009-04-08 2 views
1

Ich schreibe ein kleines Werkzeug, um Klassenöffnungen an meiner Schule zu überwachen.Python/urllib hört plötzlich auf, richtig zu funktionieren

Ich schrieb ein Python-Skript, das die aktuelle Verfügbarkeit von Klassen aus jeder Abteilung alle paar Minuten holt.

Das Skript wurde ordnungsgemäß funktionieren, bis die Website der Uni begann Rückkehr dies:

SIS Server is not available at this time 

Uni meine Server direkt blockiert haben muss? Nun, nicht wirklich, denn das ist die Ausgabe, die ich bekomme, wenn ich die URL direkt von anderen PCs bekomme. Aber wenn ich das Zwischenformular auf der Seite von uni durchführe, die einen POST macht, bekomme ich diese Nachricht nicht.

Die URL Ich bin anfordernden ist https://s4.its.unc.edu/SISMisc/SISTalkerServlet

Das, was Code meine Python ist wie folgt aussieht:

data = urllib.urlencode({"progname" : "SIR033WA", "SUBJ" : "busi", "CRS" : "", "TERM" : "20099"}) 
f = urllib.urlopen("https://s4.its.unc.edu/SISMisc/SISTalkerServlet", data) 
s = f.read() 
print (s) 

ich wirklich bin ratlos! Es scheint, als würde Python keine korrekte Anfrage senden. Zuerst dachte ich, es würde keine richtigen Post-Daten senden, aber ich änderte die URL zu meiner lokalen Box und die Post-Daten Apache erhalten schien gut.

Wenn Sie möchten, dass das System tatsächlich funktioniert, gehen Sie zu https://s4.its.unc.edu/SISMisc/browser/student_pass_z.jsp und klicken Sie auf die Schaltfläche "Als Gast eingeben" und suchen Sie nach "Kursverfügbarkeit". (Jetzt wissen Sie, warum ich das hier baue!)

Das Seltsamste ist, dass es bis 11 Uhr funktionierte! Ich hatte den gleichen Fehler zuvor, aber es dauerte nur wenige Minuten. Das sagt mir, dass es eher ein Problem ist als irgendein Blockieren meines Servers durch die Uni.

Update Auf Vorschlag habe ich versucht, mit einem legit referer/User-Agent zu spielen. Gleiches Ergebnis. Das ist, was ich versuchte:

import httplib 
import urllib 
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4',"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain","Referrer": "https://s4.its.unc.edu/SISMisc/SISTalkerServlet"} 
data = urllib.urlencode({"progname" : "SIR033WA", "SUBJ" : "busi", "CRS" : "", "TERM" : "20099"}) 
c = httplib.HTTPSConnection("s4.its.unc.edu",443) 
c.request("POST", "/SISMisc/SISTalkerServlet",data,headers) 
r = c.getresponse() 
print r.read() 
+0

Ich kann Ihnen nicht helfen, aber jetzt weiß jeder, in welche Klasse Sie zielen und wird es eilig haben, um es vor Ihnen zu bekommen! –

Antwort

0

Nach mehreren Anfragen von einem ungeraden Nicht-Browser-User-Agenten-String zu sehen, es ist möglich, dass sie Benutzer blockieren nicht von der Website verwiesen wird. Zum Beispiel hat PHP eine Funktion namens $_SERVER['HTTP_REFERRER'] IIRC, die die Seite überprüft, die den Benutzer an die aktuelle verwiesen hat. Da Ihr Programm keinen Eintrag in der User-Agent-Zeichenfolge enthält (Sie versuchen, direkt darauf zuzugreifen), ist es sehr wahrscheinlich, dass sie den Zugriff darauf basierend verhindern. Fügen Sie den Kopfzeilen Ihrer HTTP-Anfrage einen Referrer hinzu und sehen Sie, wie es geht. (vorzugsweise eine Seite, die mit der verlinkten Seite verknüpft ist)

http://whatsmyuseragent.com/ kann Ihnen beim Aufbau Ihres gefälschten Benutzeragenten helfen.

Sie dann Header bauen wie so ...

headers = {"Content-type": "application/x-www-form-urlencoded", 
"Accept": "text/plain"} 

und sie dann als zusätzliche Parameter mit Httpconnection Anfrage senden ...

conn.request("POST", "/page/on/site", params, headers) 

die Python-doc für weiter httplib sehen Referenz und Beispiele.

+0

Nein gehen. Ich füge den Code ein, den ich in OP probiert habe, da das Kommentarfeld nicht mehr als 300 Zeichen erlaubt. –

+0

Das beste, was ich vorschlagen kann, ist zu versuchen, den Code im Formular auf der tatsächlichen vorhergehenden Seite zu replizieren. Sehen Sie, was es veröffentlicht, möglicherweise versteckte Werte. Alternativ könntest du zuerst auf diese Seite gehen und der URL folgen, die du von dort aus erreichen willst. –

+0

Danke. Einschließlich einiger versteckter Felder (dank Tamper Data) + Wechsel zu wget über urllib funktionierte. Das Rätsel bleibt jedoch, warum es bis Nachmittag gut ging. Wir werden sehen, ob dies eine einmalige Änderung am Ende oder ein größeres Problem war. –

2

Dieser Post versucht nicht, Ihren Code zu reparieren, sondern schlägt ein Debugging-Tool vor.

Es war einmal ein Programm zum Ausfüllen von Online-Formularen für mich. Um genau zu erfahren, wie mein Browser die POSTs und Cookies gehandhabt hat und was nicht, installierte ich WireShark (http://www.wireshark.org/), einen Netzwerk-Sniffer. Mit dieser Anwendung konnte ich die Daten, die auf IP- und Hardwareebene gesendet und empfangen wurden, Stück für Stück anzeigen.

Sie könnten ein ähnliches Programm ausprobieren und den Netzwerkfluss vergleichen. Dies kann Unterschiede zwischen dem, was Ihr Browser tut, und dem Skript hervorheben.