Python / urllib внезапно перестает работать должным образом - PullRequest
1 голос
/ 08 апреля 2009

Я пишу небольшой инструмент для контроля за открытием занятий в моей школе.

Я написал скрипт на python, который будет извлекать текущую доступность классов из каждого отдела каждые несколько минут.

Сценарий работал правильно, пока сайт универа не начал возвращать это:

SIS Server is not available at this time 

Uni должен был заблокировать мой сервер, верно? Ну, не совсем, потому что это вывод, который я получаю при переходе по URL-адресу непосредственно с других компьютеров. Но если я пройду через посредническую форму на сайте uni, которая выполняет POST, я не получу это сообщение.

URL, который я запрашиваю: https://s4.its.unc.edu/SISMisc/SISTalkerServlet

Вот как выглядит мой код Python:

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)

Я действительно в тупике! Похоже, что Python не отправляет правильный запрос. Сначала я подумал, что он не отправляет правильные данные поста, но я изменил URL на свой локальный ящик, и полученный апач данных поста выглядел просто отлично.

Если вы хотите, чтобы система действительно функционировала, перейдите к https://s4.its.unc.edu/SISMisc/browser/student_pass_z.jsp, нажмите кнопку «Войти как гость» и найдите «Доступность курса». (Теперь вы знаете, почему я это строю!)

Самое странное, что это работало до 11 утра! У меня была такая же ошибка раньше, но она длилась всего несколько минут. Это говорит мне, что это где-то большая проблема, чем любая блокировка моего сервера в универе.

обновление По предложению я попытался поиграть с более легальным реферером / пользовательским агентом. Тот же результат. Вот что я попробовал:

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()

Ответы [ 2 ]

2 голосов
/ 08 апреля 2009

Этот пост не пытается исправить ваш код, но предлагает инструмент отладки.

Однажды я писал программу для заполнения онлайн-форм. Чтобы точно узнать, как мой браузер обрабатывает сообщения POST, куки и все такое, я установил WireShark (http://www.wireshark.org/), сетевой анализатор. Это приложение позволило мне просматривать по частям данные, отправляемые и получаемые на уровне IP и оборудования.

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

0 голосов
/ 08 апреля 2009

После просмотра нескольких запросов из нечетной строки User-Agent, не являющейся браузером, возможно, что они блокируют пользователей, на которые не ссылаются с сайта. Например, PHP имеет функцию под названием $_SERVER['HTTP_REFERRER'] IIRC, которая будет проверять страницу, которая ссылается на текущую. Поскольку ваша программа не содержит ни одной в строке User-Agent (вы пытаетесь получить к ней прямой доступ), вполне возможно, что они препятствуют вам в доступе на основании этого. Попробуйте добавить реферер в заголовки вашего http-запроса и посмотрите, как он работает. (желательно страницу, которая ссылается на ту, к которой вы пытаетесь получить доступ)

http://whatsmyuseragent.com/ может помочь вам в создании вашего поддельного пользовательского агента.

тогда вы строите заголовки так ...

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

, а затем отправьте их в качестве дополнительного параметра с вашим запросом HTTPConnection ...

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

см. Документацию по Python по адресу httplib для получения дополнительной справки и примеров.

...