自动签到脚本
从来没有接触过Python,昨天为了实现自动签到,在c74的带领下,找到一个人人的自动签到脚本,于是照葫芦画瓢,改成班级网站的自动签到。
人人:
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报文。
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分钟电脑是开的并且是联网的,就能自动签到了。
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天你就什么都不会了。
转载请注明出处http://www.cnblogs.com/chenyg32/