尝试使用python登录到一个简单的课程网站

尝试使用python登录到一个简单的课程网站,python,python-2.7,web-scraping,web-crawler,python-requests,Python,Python 2.7,Web Scraping,Web Crawler,Python Requests,我正在尝试使用python登录我的一个课程页面 我使用httpFox来检测登录页面和post数据。我不知道为什么,但我总是说: 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

我正在尝试使用python登录我的一个课程页面

我使用httpFox来检测登录页面和post数据。我不知道为什么,但我总是说:

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为我检测到的,我认为这是实际的登录链接。但当我试图在浏览器中访问该url时,我得到了如下结果:

SE 3X03/CS 4X03错误-login.cpp

内部错误11


这可能是我的代码不起作用的原因吗?

你可以看到
login.cpp
是在引擎盖下使用的

有趣的部分是
内部错误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

使用有效的凭证,您将进入。

您可以实际看到在引擎盖下使用的login.cpp,它可以在线访问。-哈哈,这真是太可怕了。@ReutSharabani他们非常安全,耶:)“你可以看到在引擎盖下使用的login.cpp。”。我不明白这个部分。您是如何找到cpp文件的?“我自己也在试着去。”杰克,你应该告诉那里的负责人,任何人都可以使用他想要的任何密码进入。如果您使用@alecxe put here链接,您将获得
login.cpp
文件。。。但是你几乎得到了所有的东西。一般来说,网站的配置不正确。我给管理员发了封邮件,他应该更改一些配置。现在这个网站被破坏了,任何人都可以抓取所有成员的密码。更具体地说:该站点只显示服务器上重新设置的任何文件,所有内容(以及密码和代码)都在一个文件中。