一直想用python做一个我们学校bbs的自动登录程序,可一直拖到现在,昨天才仔细研究了下。
首先,学校的bbs分为好几个框架,通过javascript加载,于是不能从首页着手。
查到他的左边登录的url,打开后查看源码。它post了一个表单,表单里有用户名和密码。在post前,用户名和密码通过下面的脚本做了验证,不过没有做变换。表单的action属性也是在这生成的,找到了action就知道往哪个地方投送用户名和密码了。
Net.Form={
check:function(a,c)
{
if(c=="login")
{
if(!a.id.value.match(/[A-Za-z0-9]{2,12}/))
{
alert("请输入正确的id");
a.id.focus();
return false
}
if(a.pw.value=="")
{
alert("请输入密码");
a.pw.focus();
return false
}
try
{
a.lasturl.value=Net.BBS.getUri($f("f3"))
}
catch(b)
{
}
a.action="/vd"+parseInt(Math.random()*100000)+"/bbslogin?type=2"
}
},
Net.BBS={
getUri:function(b)
{
var a=b.location.pathname.replace(/(//vd/d+//)/,"/").substr(1);
return(a.indexOf("bbsmain")==-1)?escape(a+b.location.search):""
},
escape:function(s)
{
return String(s).replace(/&/g,"&").replace(//g,">")
}
根据上面的处理,用python就很容易写出一个登录程序了
#login
userdir='/vd'+"%0d"%random.randint(0,100000)
logapp='/bbslogin?type=2'
url=baseurl+userdir+logapp
formvalues={'id':'userid','pw':'xxxx','lasturl':'bbs.nju.edu.cn/bbsmain'}
para=urllib.urlencode(formvalues)
req=urllib2.Request(url,para)
response=urllib2.urlopen(req)
the_page=response.read()
print the_page
登录成功后,返回一个页面,会设置cookie。如果之后要发文就必须设置cookie项,否则bbs认为没有登录。
设置cookie的代码如下:
setCookie:function(a)
{Net.Cookie.set("/x5F/x55/x5F/x4E/x55/x4D",parseInt(a,10)+2);
Net.Cookie.set("/x5F/x55/x5F/x55/x49/x44",a.substring(((parseInt(a,10)+2).toString(10)).length+1,a.indexOf("+")));
Net.Cookie.set("/x5F/x55/x5F/x4B/x45/x59",parseInt(a.substring(a.indexOf("+")+1),10)-2)
}}
set:function(a,b){
if(b==""){
document.cookie=a+'=""; expires="Thu, 01 Jan 1970 00:00:01 GMT"'
}else
{
document.cookie=a+"="+escape(b)
}
},
这里有几个问题要注意:
第一、"/x5F/x55/x5F/x4E/x55/x4D",这只是个普通的字符串,不过是用16进制的ASCII码表示
第二、知道cookie后的发送
cookie是http服务器用来在本地保存数据的方式,浏览器在发送http请求时作为头发送出。
urllib2.Request函数第三个参数就是http头,构造完cookie后传递给他即可。
cookie="_U_NUM=%d;_U_UID=%s;_U_KEY=%d;"%(num,ckk[1],key)
print cookie
header={"cookie":cookie}
postpage='/bbspst?board=test'
url=baseurl+userdir+postpage
print url
req=urllib2.Request(url,headers=header)
response=urllib2.urlopen(req)
the_page=response.read()
总结:
自动登录脚本主要要注意两个地方,第一是如何post用户名和密码,第二是如何生成cookie以保持登录状态,这两个弄明白后登录一个网站就不是什么大问题了。当然,有的网站要求输入验证码,如果绕不开的话就难喽。