Author: wangxianglong Date: 2016/6/23 8:39:43
背景
我们图书馆其实书更新的挺快,各方面都还可以的,但是没有过期提醒的功能,导致我多次超期罚现,很不爽,是时候来个脚本搞定他了
写脚本
之前关注了学习的官方微信公众号,介个可以查询信息,好就从这里入手,在浏览器中打开开始分析网页的运行情况,来提取出API
chrome浏览器F12
->Network
,其实分析这些API真的需要耐心,多试试。忘了截图了T_T
看代码吧:
#!/usr/bin/env python#coding: utf-8import urllib2import urllibimport cookielibfrom ast import literal_evalfrom time import localtimeimport datetimeimport smtplib from email.mime.text import MIMEText url = "https://api.xiyoumobile.com/xiyoulibv2/user/login" #登录API, 求求不要攻击我们学校API!!! rent_url = "https://api.xiyoumobile.com/xiyoulibv2/user/rent" #借书信息查询APIuser_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"headers = {"User-Agent": user_agent, "Referer": "https://lib.xiyoumobile.com/" } #创建头部,以防有防盗链给拒了mailto_list = ["xxxxxx@qq.com"] #通知邮箱mail_host = "smtp.163.com" mail_user = "xxxxxxxx@163.com" #发件邮箱mail_pass = "xxxxxxx" #发件邮箱密码def main(): try: cookies = cookielib.CookieJar() request_data = urllib.urlencode({ #提交的数据, 方式居然是GET,呵呵 'username': 'student_ID', 'password': 'password' }) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies)) #创建opener request = urllib2.Request(url=url, data=request_data, headers=headers) response = opener.open(request) rst = response.read().decode('utf-8') rst = literal_eval(rst.replace('true','True').replace('false','False')) #得到sessionID和path路径,玩的小把戏吧 status, detail = rst["Result"], rst["Detail"] #返回来是status,和上面说的sessionID和path if status: data = urllib.urlencode({"session": detail}) #拿到sessionID就可以直接请求了 request = urllib2.Request(rent_url, data) response = urllib2.urlopen(request) rent_info = response.read().decode('utf-8') #请求之后就会返回借书的信息,做些处理就OK了 rent_info = literal_eval(rent_info.replace('true','True').replace('false','False')) status_rent, rent_detail = rent_info["Result"], rent_info["Detail"] if status_rent: send_info = '' now_time = localtime() now_date = datetime.date(now_time.tm_year, now_time.tm_mon, now_time.tm_mday) for book in rent_detail: d = book['Date'] deadline = datetime.date(int(d[:4]), int(d[4:6]), int(d[6:])) delta = (deadline - now_date).days if delta <= 2: send_info += book['Title'] if book['CanRenew']: send_info += ' 可以续借 ' else: send_info += ' 不可续借 ' if delta >= 0: send_info += ' 剩余:' + str(delta) + " 天" else: send_info += ' 超期了' send_info += '\n\n' if send_info: print send_info send_mail(mailto_list, '图书馆借书信息', send_info) #快超期就发邮件提示 else: print "书都好着呢" else: print "可能接口出问题了。。。" else: print "学号或者密码错误" except urllib2.URLError, e: if hasattr(e, "code"): print e.code if hasattr(e, "reason"): print e.reason def send_mail(to_list, sub, content): me = "图书馆借书信息"+"<"+mail_user+">" msg = MIMEText(content, _subtype='plain', _charset='utf-8') msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: server = smtplib.SMTP() server.connect(mail_host) server.login(mail_user, mail_pass) server.sendmail(me, to_list, msg.as_string()) server.close() print "发送成功" return True except Exception, e: print str(e) print "发送失败" return Falseif __name__ == "__main__": main()
计划执行
首先我云主机没钱的,所以crontab
没法用了,哎怎么办呢, 嗯Window计划任务貌似可以,试试。可以让脚本在联网的时候就检查一遍。
- 打开: window键-> 控制面板 -> 计划任务(搜索一下)
- 创建任务 -> 起个名 -> 定义触发器 -> 定义动作
- 看图说话
在脚本执行的时候,有的会有黑窗口,类型交互界面一样,不要!
定义触发器,其中10000
表示网络连接的事件ID
定义脚本,注意程序默认执行的程序是python.exe
在任务网络连接的时候,都记录事件