赞
踩
图书馆自动预约微信登录问题
笔者心血来潮想做一个基于Python图书馆自动预约的项目,无奈笔者学校的图书馆预约只能在微信公众号上预约,而在其他地方查阅的方法都是找到了官网预约入口。笔者尝试找了很久还是没找到.
笔者思绪万千,打开了编译器,导入了requests 库,刚想尝试下访问下图书馆才发现我还没有网站啊.
笔者在学校公众号上找不到图书馆的链接,所以笔者登陆PC端微信尝试打开预约的链接,成功获取到了链接,上代码:
import requests
url = "http://***.cn/wxindex.aspx?orgid=gh_2b221cae200e&unitid=1" #手动打码
html1 = requests.get(url)
print(html1.text)
运行结果:
后来得知电脑端不能直接访问,要修改 headers .
即:
html1 = requests.get(url,headers=headers)
为了获取头部信息,笔者几经辗转,最后找到了IOS端的一个强大的抓包软件Stream,APPStore可以直接下.(不理解抓包的读者自行查阅)
进入软件点击抓包,走一下预约的流程,Stream里查看记录
笔者抓包截图(已打码):
从你有操作开始,点击其中一个包进入(已打码):
里面已经帮你分好是POST请求还是GET请求,整个请求头部就是你要写进headers的内容.
其中User-Agent简称UA就是你的设备信息,你的headers里改了UA代表你电脑伪装成你的手机访问了公众号,成功解决了“请在微信客户端打开”的问题
其中最关键的就是Cookie(不了解的自行查阅),如果你刚进入公众号不操作是没有Cookie的,所以如果找不到Cookie就翻后面几个包.
可以看到笔者抓取到的Cookie中有三部分:cookie_unit_name,dt_cookie_user_name_remember,ASP.NET_SessionId,笔者发现前两个是不变的,可能带有的就是你的账户信息,可第三个参数是隔段时间动态变化的。
可有意思的是,笔者删去了第三个元素依然能正常访问图书馆(难道是我们图书馆不行?).笔者查询了有关ASP.NET_SessionId的知识,了解到 如果你不携带ASP.NET_SessionId访问网址,系统会自动分配给你一个ASP.NET_SessionId,但是如果你写进headers的ASP.NET_SessionId不规范,就会访问错误。
那咱就不带! 附参考代码:
代码如下(示例):
import requests url= "http://wx.lib.***"#其中一个网站 headers = { 'Host': 'wx.lib.hunnu.edu.cn', 'Accept': '', 'X-Requested-With': '', 'Accept-Language': '', 'Accept-Encoding': '', 'Content-Type': '', 'Origin': '', 'User-Agent': '', 'Connection': '', 'Referer': '', 'Content-Length': '', 'Cookie': "" } html1 = requests.get(url,headers=headers) print(html1.text)
既然ASP.NET_SessionI不用写进,那代表抓取的Cookie是通用的,那就代表着你写的这个headers可以在微信公众号里的各个界面畅通无阻.
直接找到有关预约的包,即带有表单的包,或者你可查看响应找到.
表单里的信息就是你要POST进去的date,有关date里的参数因学校而异就需要自己分析了
附参考代码:
import requests url= "http://wx.lib.***" #最后预约的url headers = { 'Host': 'wx.lib.hunnu.edu.cn', 'Accept': '', 'X-Requested-With': '', 'Accept-Language': '', 'Accept-Encoding': '', 'Content-Type': '', 'Origin': '', 'User-Agent': '', 'Connection': '', 'Referer': '', 'Content-Length': '', 'Cookie': "" } date="复制你表单里的date(完整复制)" html1 = requests.get(url,headers=headers,date=date) print(html1.text)
最后运行看结果就知道是否成功了,附笔者结果:
最后,你可以自己设计输入,再将输入结果转为date信息,基操自己尝试.
为了能实现自动预约,自己算好开始预约的时间,利用time库的sleep函数达到倒计时的目的,
import time
time.sleep(300)
300表示300秒即5分钟.
最后在写个while语句或者if语句,如果没抢到就就继续抢.为了不给学校图书馆服务器增加负担,建议在循环里加个 time.sleep(1) 停顿一下,视情况而定.
总体而言还是很简单的.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。