Я пишу небольшой инструмент для контроля за открытием занятий в моей школе.
Я написал скрипт на 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()