从来没有接触过Python,昨天为了实现自动签到,在c74的带领下,找到一个人人的自动签到脚本,于是照葫芦画瓢,改成班级网站的自动签到。
人人:
![](https://image.shishitao.com:8440/aHR0cHM6Ly9pbWFnZXMuY25ibG9ncy5jb20vT3V0bGluaW5nSW5kaWNhdG9ycy9Db250cmFjdGVkQmxvY2suZ2lm.gif?w=700&webp=1)
import urllib.request class renren: def __init__(self): self.operate=\'\' try: self.opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor()) urllib.request.install_opener(self.opener) except Exception as e: print(str(e)) def login(self,email,pwd): print(\'login.....\') user_agent = \'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)\' headers = { \'User-Agent\' : user_agent} params={\'domain\':\'renren.com\',\'origURL\':\'http://www.renren.com/indexcon\',\'email\':email,\'password\':pwd} params=urllib.parse.urlencode(params) params=params.encode(\'ISO-8859-1\') req=urllib.request.Request(\'http://www.renren.com/PLogin.do\',params,headers) self.operate=self.opener.open(req) print(self.operate.geturl())#这里可以根据返回的url判断是否登录成功 email=\'\'#登录邮箱 pwd=\'\'#密码 rr=renren() data=rr.login(email,pwd)
模拟报文,可以用chrome去查看原来的报文长什么样。在登陆的时候看看发送了什么东西给服务器,一般是一个POST报文或GET报文。
![](https://image.shishitao.com:8440/aHR0cHM6Ly9pbWFnZXMuY25ibG9ncy5jb20vT3V0bGluaW5nSW5kaWNhdG9ycy9Db250cmFjdGVkQmxvY2suZ2lm.gif?w=700&webp=1)
import urllib.request import urllib.parse import re class renren: def __init__(self): self.operate=\'\' try: self.opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor()) urllib.request.install_opener(self.opener) except Exception as e: print(str(e)) def login(self,login,username,passward): print(\'login.....\') user_agent = \'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22\' headers = { \'User-Agent\' : user_agent} params={\'login\':login,\'username\':username,\'password\':password} params=urllib.parse.urlencode(params) params=params.encode(\'utf8\') req=urllib.request.Request(\'http://sysucs.org/login.php\',params,headers) self.operate=self.opener.open(req) print(self.operate.geturl())#这里可以根据返回的url判断是否登录成功 while True: fp = urllib.request.urlopen(\'http://sysucs.org/mission.php\') mystr = fp.info() #mystr = mybytes.decode("utf8") print(mystr) username=\'\'#登录邮箱 password=\'\'#密码 login = \'0\' rr=renren() data=rr.login(login,username,password)
后来觉得不妥,总是这样循环请求会增加服务器的负担,况且大班长已经加入了检测循环请求的功能,限制了每秒访问页面的次数。
所以想起计网中说的,报文。虽然在班级网站上屏蔽了时间,但是你模拟一个报文给服务器的时候,服务器就会返回一个响应报文,响应报文里面就会有服务器时间的啦。
然后呢,从服务器返回的相应报文中提取时间。查了下Python文档,从报文类型里面查找时间的字符串,再进行处理就可以得到服务器时间啦。
接着调用一个睡眠函数,让程序睡够一定的时间再去请求签到页面。这样就能实现定时脚本签到。
因为有网络延迟,所以签到时间会00:00:00-00:00:01秒之间,网络太差的话还可能超过1秒。
然后写成一个bat,再利用win7的定时计划功能,每天晚上差不多12点的时候,自动运行这个bat.
只要在12点前的1、2分钟电脑是开的并且是联网的,就能自动签到了。
![](https://image.shishitao.com:8440/aHR0cHM6Ly9pbWFnZXMuY25ibG9ncy5jb20vT3V0bGluaW5nSW5kaWNhdG9ycy9Db250cmFjdGVkQmxvY2suZ2lm.gif?w=700&webp=1)
import urllib.request import urllib.parse import time import string class renren: def __init__(self): self.operate=\'\' try: self.opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor()) urllib.request.install_opener(self.opener) except Exception as e: print(str(e)) def login(self,login,username,passward): print(\'login.....\') user_agent = \'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22\' headers = { \'User-Agent\' : user_agent} params={\'login\':login,\'username\':username,\'password\':password} params=urllib.parse.urlencode(params) params=params.encode(\'utf8\') req=urllib.request.Request(\'http://www.sysucs.org/login.php\',params,headers) self.operate=self.opener.open(req) print(self.operate.geturl())#这里可以根据返回的url判断是否登录成功 #while True: fp = urllib.request.urlopen(\'http://www.sysucs.org/index.php\')#return http.client.HTTPResponse mystr = fp.info() date = mystr.get("Date") index = date.find("2013 ") times = date[index+5:index+13] print(times) mins = times[3:5] secs = times[6:8] count = 60-int(secs)+(59-int(mins))*60 print(count) time.sleep(count) fp2 = urllib.request.urlopen(\'http://www.sysucs.org/mission.php\')#return http.client.HTTPResponse print("End") username=\'\'#登录邮箱 password=\'\'#密码 login = \'0\' rr=renren() data=rr.login(login,username,password)
其实要是课内的东西能找到实践的平台,而不仅仅停留在考试上,那么计算机系出来的学生一定牛逼轰轰。
可惜绝大多数知识总是停留在考试理论层面。说实话,从小到大,已经厌倦了。
书扔掉过2天你就什么都不会了。