python登录并校验是否成功
2007年六月11日 by 贝贝爸 Leave a reply »为了监控网站运行是否正常,写了一个脚本来检查网站运行的情况。
主要是自动登录并且校验登陆后的内容来判断网站web服务和数据库服务是否正常。
代码如下:
#!/usr/bin/env python
# -*- coding: gbk -*-
import urllib
import urllib2
import ClientCookie
import re
import string
import time
import socket
timeout = 10
server = " www.juyimeng.com "
loginurl = " http:// " + server + " /login.php "
v_account = [
{ " name " : " user1 " , " pass " : " pass1 " , " utype " : " 1 " , " vkey " : " 用户1 " },
{ " name " : " user2 " , " pass " : " pass2 " , " utype " : " 2 " , " vkey " : " 用户2 " }
]
def fes_write ( s ) :
'''
控制输出信息的显示
'''
print s
def get_response ( x ) :
'''
登录,取得登陆后的页面html代码,用来判断结果
'''
fes_write ( " login for " + x [ " name " ])
eform = { ' username ' : x [ " name " ] , ' password ' : x [ " pass " ] , ' usertype ' : x [ " utype " ] }
qstring = urllib . urlencode ( eform )
#print qstring
try :
request = urllib2 . Request ( loginurl , qstring )
response = ClientCookie . urlopen ( request )
return string . split ( response . read () , " \n " )
except Exception , e :
fes_write ( e )
return " error "
def verify_info ( k , l ) :
'''
校验信息是否正确
'''
for line in l :
if k . match ( line ) :
return True
break
return False
def verify_all () :
'''
主程序,进行校验
'''
if timeout != 0 :
socket . setdefaulttimeout ( timeout )
fes_write ( " socket time out: " + str ( socket . getdefaulttimeout ()))
success_num = len ( v_account )
for x in v_account :
vkey = re . compile ( ' .* ' + x [ " vkey " ] + ' .* ' )
if verify_info ( vkey , get_response ( x )) == True :
success_num = success_num - 1
fes_write ( x [ " name " ] + " login success! " )
else :
fes_write ( " error when " + x [ " name " ] + " login! " )
if success_num == 0 :
fes_write ( " all things runs well! " )
else :
e_notify ()
fes_write ( " some thing is wrong! " )
def e_notify () :
'''
出错之后的notify操作
'''
pass
if __name__ == ' __main__ ' :
verify_all ()
# -*- coding: gbk -*-
import urllib
import urllib2
import ClientCookie
import re
import string
import time
import socket
timeout = 10
server = " www.juyimeng.com "
loginurl = " http:// " + server + " /login.php "
v_account = [
{ " name " : " user1 " , " pass " : " pass1 " , " utype " : " 1 " , " vkey " : " 用户1 " },
{ " name " : " user2 " , " pass " : " pass2 " , " utype " : " 2 " , " vkey " : " 用户2 " }
]
def fes_write ( s ) :
'''
控制输出信息的显示
'''
print s
def get_response ( x ) :
'''
登录,取得登陆后的页面html代码,用来判断结果
'''
fes_write ( " login for " + x [ " name " ])
eform = { ' username ' : x [ " name " ] , ' password ' : x [ " pass " ] , ' usertype ' : x [ " utype " ] }
qstring = urllib . urlencode ( eform )
#print qstring
try :
request = urllib2 . Request ( loginurl , qstring )
response = ClientCookie . urlopen ( request )
return string . split ( response . read () , " \n " )
except Exception , e :
fes_write ( e )
return " error "
def verify_info ( k , l ) :
'''
校验信息是否正确
'''
for line in l :
if k . match ( line ) :
return True
break
return False
def verify_all () :
'''
主程序,进行校验
'''
if timeout != 0 :
socket . setdefaulttimeout ( timeout )
fes_write ( " socket time out: " + str ( socket . getdefaulttimeout ()))
success_num = len ( v_account )
for x in v_account :
vkey = re . compile ( ' .* ' + x [ " vkey " ] + ' .* ' )
if verify_info ( vkey , get_response ( x )) == True :
success_num = success_num - 1
fes_write ( x [ " name " ] + " login success! " )
else :
fes_write ( " error when " + x [ " name " ] + " login! " )
if success_num == 0 :
fes_write ( " all things runs well! " )
else :
e_notify ()
fes_write ( " some thing is wrong! " )
def e_notify () :
'''
出错之后的notify操作
'''
pass
if __name__ == ' __main__ ' :
verify_all ()
v_account定义了多个账户,因为用户可能不同,后台机制不一样,所以用多个用户来登录
request = urllib2.Request( loginurl , qstring ) 用的是post的方法,也可以用get的方法。
ClientCookie,一个python的扩展包,安装请参考这里
2个v_account里的vkey用来和登陆后的页面上的信息来验证是否正常登录的
socket.setdefaulttimeout用来设置建立socket连接的超时设置,原来没有设置,程序会一直等待回应(如果服务器端做了最长运行时间会好点),设置了10秒,如果一个登录程序10秒还没有成功,基本上就失败了。
e_notify:可以自己设置一些notify的方法,比如邮件,短消息等。
Popularity: 19%