我尝试使用python登录我的某个课程页面。
我使用httpFox来检测登录页面和发布数据。我不知道为什么,但我不断收到错误说:
SE 3X03 / CS 4X03错误
SE 3X03 / CS 4X03错误 - login.cpp
内部错误3
这是我的代码:
import requests
s = requests.session()
login_data = {
'sno':'xxxxxxx',
'p1':'xxxxxxx',
'login':'OK'
}
reqheader = {
'Host' :'www.cas.mcmaster.ca',
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0',
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' : 'en-US,en;q=0.5',
'Accept-Encoding' : 'gzip, deflate',
'Referer' : 'http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/startlogin.cgi',
'Connection' : 'keep-alive',
'Content-Type' : 'application/x-www-form-urlencoded',
'Content-Length' : '33'
}
myurl = 'http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/login.cgi'
r = s.post(myurl, data = login_data, headers = reqheader)
print r.text
任何人都可以给我一个关于我做错的地方的暗示吗?我很感激。
修改
在页面源代码中有一行:
<form name="passwd" action="http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/login.cgi"
method="post">
这是httpFox为我检测到的内容,我认为这是实际的登录链接。但是当我尝试在浏览器中访问该网址时,我会这样:
SE 3X03 / CS 4X03错误 - login.cpp
内部错误11
这可能是我的代码无效的原因吗?
答案 0 :(得分:2)
您实际上可以看到引擎盖下使用的login.cpp
,它是available online。
有趣的部分是Internal Error 3
发生的地方:
p=line;
if (strncmp(p,"sno=",4)==0) {
p += 4; // eat 'sno='
if (*p=='&') { // no sno value
p++; // eat &
}else{
q=p+1;
while(! (*q=='&' || *q=='\0')) q++;
if (*q=='\0') error("Internal error 2");
*q='\0';
if (strlen(p)>99) error("Internal error 3");
translate(snobuf,p);
p=q+1; // eat '.....&'
}
如您所见,HTTP参数是从原始字符串手动解析的。假设&
是参数分隔符。
所以你需要做的就是传递它想要传递的东西。而且不需要提供任何特殊的标题或处理cookie:
import requests
s = requests.Session()
data = 'sno={sno}&p1={p1}&login=+OK+'.format(sno=1234567, p1='Password')
myurl = 'http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/login.cgi'
r = s.post(myurl, data=data)
print r.content
由于1234567
和Password
无效,我收到的HTML代码内有错误:
Student number not found, please re-enter
使用有效的凭据,您就可以进入。