1

我正在编写一个小工具来监控学校的开课情况。

我编写了一个 python 脚本,每隔几分钟就会从每个部门获取当前可用的课程。

该脚本运行正常,直到 uni 的网站开始返回:

SIS Server is not available at this time 

Uni一定是屏蔽了我的服务器吧?好吧,并不是因为这是我直接从其他 PC 转到 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 更改为我的 localbox,并且 apache 收到的帖子数据似乎很好。

如果您想查看系统的实际运行情况,请转到https://s4.its.unc.edu/SISMisc/browser/student_pass_z.jsp并单击“以访客身份进入”按钮,然后查找“课程可用性” . (现在你知道我为什么要建造这个了!)

最奇怪的是这一直工作到上午 11 点!我以前也遇到过同样的错误,但只持续了几分钟。这告诉我,与 uni 对我的服务器的任何阻塞相比,这在某处更成问题。

更新 根据建议,我尝试使用更合法的推荐人/用户代理。结果相同。这是我尝试过的:

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

2 回答 2

2

这篇文章不会尝试修复您的代码,而是建议使用调试工具。

曾几何时,我正在编写一个程序来为我填写在线表格。为了准确了解我的浏览器是如何处理 POST、cookie 等等的,我安装了 WireShark ( http://www.wireshark.org/ ),一个网络嗅探器。这个应用程序允许我逐块查看在 IP 和硬件级别上发送和接收的数据。

您可以考虑尝试类似的程序并比较网络流量。这可能会突出您的浏览器正在执行的操作与您的脚本正在执行的操作之间的差异。

于 2009-04-08T04:20:00.410 回答
0

在看到来自奇怪的非浏览器用户代理字符串的多个请求后,它们可能会阻止未从站点引用的用户。例如,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)

请参阅httplib上的 python 文档以获取更多参考和示例。

于 2009-04-08T01:42:34.623 回答