Author: wangxianglong Date: 2016/6/23 8:39:43
背景
我们图书馆其实书更新的挺快,各方面都还可以的,但是没有过期提醒的功能,导致我多次超期罚现,很不爽,是时候来个脚本搞定他了
写脚本
之前关注了学习的官方微信公众号,介个可以查询信息,好就从这里入手,在浏览器中打开开始分析网页的运行情况,来提取出API
chrome浏览器F12
->Network
,其实分析这些API真的需要耐心,多试试。忘了截图了T_T
看代码吧:
#!/usr/bin/env python
#coding: utf-8
import urllib2
import urllib
import cookielib
from ast import literal_eval
from time import localtime
import datetime
import 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" #借书信息查询API
user_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 += '
'
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 False
if __name__ == "__main__":
main()
计划执行
首先我云主机没钱的,所以crontab
没法用了,哎怎么办呢, 嗯Window计划任务貌似可以,试试。可以让脚本在联网的时候就检查一遍。
- 打开: window键-> 控制面板 -> 计划任务(搜索一下)
- 创建任务 -> 起个名 -> 定义触发器 -> 定义动作
- 看图说话
在脚本执行的时候,有的会有黑窗口,类型交互界面一样,不要!
定义触发器,其中10000
表示网络连接的事件ID
定义脚本,注意程序默认执行的程序是python.exe
在任务网络连接的时候,都记录事件