Coder Social home page Coder Social logo

igotolibrary's Introduction

igotolibrary-抢座助手

language license


声明

我去图书馆 对爬虫的防护较弱且更新不及时, 网络上已经开始流传收费的抢座助手; 这些对正常抢座的普通同学不公平;

  1. igotolibrary 无意侵犯任务组织或个人的权益, 仅作学习交流;
  2. igotolibrary 已经三次向 我去图书馆 反馈了抢座漏洞的问题, 但没有得到积极的反馈和有效的响应, 反馈截图;
  3. igotolibrary 开源, 供大家公平使用; 欢迎有兴趣的同学一起维护更新, 直到修复漏洞为止;
  4. 希望大家不要二次开发后用来提供收费服务.

简介

一个简单的 Python 爬虫,通过 Charles 抓包分析公众号《我去图书馆》、《来选座》的服务通信协议,获取自习室和座位表信息,使用Python+requests库模拟预定座位的流程,实现定时预订/实时捡漏自动抢座。


抓包过程分析


项目结构

分为两个部分

  • mainloop 抢座任务执行部分
  • mhandle_content 指令解析验证储存部分

如图:

igtl_again

  • 有疑问可提交 Issues
  • 有修改可提交到 dev 分支后 Pull requests

接下来可改进的地方 TODOLIST

  1. 一些细节: TODOLIST.md;
  2. reserve.py 模块弃用线程, 改用协程, 节约资源, 增大并发任务量;
  3. 尝试换成 pyv8库执行js; 加快 hex_code 字段的计算;
  4. 开发一个极速版 personal_reserve, 去掉冗余的参数信息只保留核心的步骤, 最大可能的加速抢座;
  5. ...(待补充)

部署demo

我已将工程部署到了微信 《为了学习》公众号,欢迎测试,服务启动中...

weilexuexi_gzh


致谢

有问题可留言 或 联系公众号管理员

AppreciationCode

AppreciationCode.png

igotolibrary's People

Contributors

eixhq avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

igotolibrary's Issues

现在还能用吗

请教一下,请在微信客户端打开链接是怎么解决的?

成功了一次定时抢座

成功了一次定时抢座,原来之前是mainloop没运行,但是现在还是有问题如果task里有捡漏的任务(就算是以前布置的)
也会导致error,而且不管是抢座成功或失败一直都有这个错
Traceback (most recent call last):
File "/root/igotolibrary/utils.py", line 34, in wrapper
return func(*args, **kwargs)
File "/root/igotolibrary/utils.py", line 1072, in get_value
result = self.client.get(key=key, default=default)
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 534, in get
return self._fetch_cmd(b'get', [key], False).get(key, default)
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 899, in _fetch_cmd
self._connect()
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 336, in _connect
sock.connect(sockaddr)
ConnectionRefusedError: [Errno 111] Connection refused

所以现在感觉功能很不稳定的样子o(╥﹏╥)o😭
如下是mainloop的日志:

SELECT * FROM today_task WHERE (task_kind='realtime' AND open_time < '19:39:30') OR ( open_time >= '19:36:30' AND open_time < '19:39:30' ) ; [{'id': 4, 'task_id': 22226, 'userid': 'zi', 'task_kind': 'realtime', 'wechat_sess_id': 'wechatSESS_ID=46c21bcccca7f1d157d5bb20df73f66d9c334ab96e84053b', 'succ_failed': '', 'detail_info': '', 'others_result_info': '', 'user_name': '子', 'school_name': '江汉大学', 'schl_abbr': 'jhun', 'open_time': '14:40:51', 'classroom_name1': '二楼报刊阅览室 (2楼)', 'libid1': 20027, 'seat_num1': 0, 'coordinate1': '0', 'classroom_name2': '二楼报刊阅览室 (2楼)', 'libid2': 20027, 'seat_num2': 0, 'coordinate2': '0', 'serverid': 'b9fc7bd86d2eed91b23d7347e0ee995e|1602830449|1570361133', 'comment_info': '', 'submit_time': '2020-10-16 14:40:51', 'pattern': 'TODAY', 'platform': 'IGTL', 'others_info': '{"all_lib_clssrm": {"20027": "\u4e8c\u697c\u62a5\u520a\u9605\u89c8\u5ba4 (2\u697c)", "10158": "\u4e09\u697c\u5927\u5385 (3\u697c)", "115599": "304\u4e09\u697c\u4eba\u6587\u793e\u4f1a\u79d1\u5b66\u9605\u89c8\u5ba4\uff08\u4e09 \uff09 (3\u697c)", "116299": "301\u4e09\u697c\u4eba\u6587\u793e\u4f1a\u79d1\u5b66\u9605\u89c8\u5ba4\uff08\u4e00\uff09 (3\u697c)", "10156": "\u56db\u697c\u5927\u5385 (4\u697c)", "115578": "401\u5916\u6587\u6587\u732e\u9605\u89c8\u5ba4 (4)", "117895": "405\u5916\u6587\u8fc7\u520a\u9605\u89c8\u5ba4 (4\u697c)", "10154": "503\u4eba\u6587\u793e\u4f1a\u79d1\u5b66\u6587\u732e\u5178\u85cf\u9605\u89c8\u5ba4\uff08\u4e8c\uff09 (5\u697c)", "20030": "505\u81ea\u79d1\u5178\u85cf (5\u697c)", "115564": "501\u793e\u79d1\u6587\u732e\u5178\u85cf\u9605\u89c8\u5ba4 (5)", "115571": "\u4e94\u697c\u5927\u5385 (5)"}}'}]
----#2020.10.16_19:36:31.086|[run] realtime_1_22226_22226 thread start run
----#2020.10.16_19:36:31.087|[ERROR-BREAK]:func_name=get_value
Traceback (most recent call last):
File "/root/igotolibrary/utils.py", line 34, in wrapper
return func(*args, **kwargs)
File "/root/igotolibrary/utils.py", line 1072, in get_value
result = self.client.get(key=key, default=default)
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 534, in get
return self._fetch_cmd(b'get', [key], False).get(key, default)
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 899, in _fetch_cmd
self._connect()
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 336, in _connect
sock.connect(sockaddr)
ConnectionRefusedError: [Errno 111] Connection refused

----#2020.10.16_19:36:31.087|[ERROR-BREAK]:func_name=run
Traceback (most recent call last):
File "/root/igotolibrary/utils.py", line 34, in wrapper
return func(*args, **kwargs)
File "/root/igotolibrary/reserve.py", line 551, in run
if task['task_id'] == tmp_mc_trace['task_id']:
TypeError: string indices must be integers

部署在aliyun服务器成功了2次定时抢座

之前的服务器上失败是因为node.js没有安装,安装后成功了两次,但是这速度实在是不忍直视,29秒才预定成功
---#2020.10.16_21:59:09.551|[run] realtime_1_22226_22226 delaytime= 20
----#2020.10.16_21:59:29.571|[task_ending] trace_dct_ls= [{'exe_time': '2020.10.16_21:59:00.103', 'libid': '10156', 'clssrm': '四楼大厅 (4楼)', 'seat_num': '210', 'cordinate': '13,8', 'code': 0, 'msg': '预定成功', 'completed_flag': 'completed'}]
啊这,每天早上位置可是1秒就无了,实在是不知道原因(为什么这么慢),希望作者大大看到能回复一下我😭,中间还delaytime了20秒,就算不delay,9秒也太慢了。同时pymemcache的错误依然英魂不散。求解决!!!!!

以下是log:

wechatSESS_ID=3e4f1dddb623cbc13f747e1931a31aa1b261122a6b863b58', 'succ_failed': '', 'detail_info': '', 'others_result_info': '', 'user_name': '子', 'school_name': '江汉大学', 'schl_abbr': 'jhun', 'open_time': '21:59:00', 'classroom_name1': '四楼大厅 (4楼)', 'libid1': 10156, 'seat_num1': 210, 'coordinate1': '13,8', 'classroom_name2': '四楼大厅 (4楼)', 'libid2': 10156, 'seat_num2': 0, 'coordinate2': '0', 'serverid': 'd3936289adfff6c3874a2579058ac651|1602856638|1570361133', 'comment_info': '', 'submit_time': '2020-10-16 21:57:19', 'pattern': 'TODAY', 'platform': 'IGTL', 'others_info': '{"all_lib_clssrm": {"20027": "\u4e8c\u697c\u62a5\u520a\u9605\u89c8\u5ba4 (2\u697c)", "10158": "\u4e09\u697c\u5927\u5385 (3\u697c)", "10156": "\u56db\u697c\u5927\u5385 (4\u697c)", "115571": "\u4e94\u697c\u5927\u5385 (5)"}}', 'open_time_ts': 1602856740, 'task_result': 'school:江汉大学-jhun\ntask_id:22226\n任务提交:2020-10-16 21:57:19\n\n'}
----#2020.10.16_21:57:31.096|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 20.0 s, threadID= 2
----#2020.10.16_21:57:51.107|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 20.0 s, threadID= 2
----#2020.10.16_21:58:11.115|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 20.0 s, threadID= 2
----#2020.10.16_21:58:31.118|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 5.0 s, threadID= 2
----#2020.10.16_21:58:36.123|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 5.0 s, threadID= 2
----#2020.10.16_21:58:41.126|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 5.0 s, threadID= 2
----#2020.10.16_21:58:46.132|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 5.0 s, threadID= 2
----#2020.10.16_21:58:51.137|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 5.0 s, threadID= 2
----#2020.10.16_21:58:56.137|[run] realtime_1_22226_22226 task-start=21:59:00 delay= 3.863 s, threadID= 2
----#2020.10.16_21:59:00.003|[run] realtime_1_22226_22226 try 候选一:[四楼大厅 (4楼)]的[210]号座位:
----#2020.10.16_21:59:00.003|[r_s] thread=realtime_1_22226_22226| lib_seat_info= 候选一:[四楼大厅 (4楼)]的[210]号座位: libid 10156 coordinate 13,8
----#2020.10.16_21:59:00.003|[r_s] thread=realtime_1_22226_22226| ||candidate libid= [('10156', '四楼大厅 (4楼)')]
----#2020.10.16_21:59:03.188|[r_s] thread=realtime_1_22226_22226| ||candidate seat= [('210', '13,8')]
----#2020.10.16_21:59:03.243|[r_s] thread=realtime_1_22226_22226| REG_HEXCODE_URL= https://static\.wechat\.v2\.traceint\.com/template/theme2/cache/layout/.+?
----#2020.10.16_21:59:03.247|[r_s] thread=realtime_1_22226_22226| hexch_js_url= https://static.wechat.v2.traceint.com/template/theme2/cache/layout/2cG4ASKi8GMEbees.js ts= 3.2438379287719727
----#2020.10.16_21:59:03.360|[r_s] thread=realtime_1_22226_22226| ajax_url= "https://wechat.v2.traceint.com/index.php/reserve/get/"+"libid="+e+"&"+s.dec("UACzzAeCGn61")+"="+h+"&yzm="+t ts= 3.3567777633666993
----#2020.10.16_21:59:06.411|[r_s] thread=realtime_1_22226_22226| http_hexch_seatinfo= https://wechat.v2.traceint.com/index.php/reserve/get/libid=10156&EhyWdt=13,8&yzm= ts= 6.408551549911499
----#2020.10.16_21:59:09.415|[r_s] thread=realtime_1_22226_22226| request, tmp_trace_dct= {'exe_time': '2020.10.16_21:59:00.103', 'libid': '10156', 'clssrm': '四楼大厅 (4楼)', 'seat_num': '210', 'cordinate': '13,8', 'code': '', 'msg': '没有合适的'}
----#2020.10.16_21:59:09.551|[r_s] thread=realtime_1_22226_22226| reserve response= {"code":0,"msg":"\u9884\u5b9a\u6210\u529f","token":"23876133-5f2670f17719dcd34cce103d6e7cf73a","url":"https://wechat.v2.traceint.com/index.php/success/23876133-5f2670f17719dcd34cce103d6e7cf73a.html"}
----#2020.10.16_21:59:09.551|[run] realtime_1_22226_22226 delaytime= 20
----#2020.10.16_21:59:29.571|[task_ending] trace_dct_ls= [{'exe_time': '2020.10.16_21:59:00.103', 'libid': '10156', 'clssrm': '四楼大厅 (4楼)', 'seat_num': '210', 'cordinate': '13,8', 'code': 0, 'msg': '预定成功', 'completed_flag': 'completed'}]
task= {'id': 6, 'task_id': 22226, 'userid'
----#2020.10.16_21:59:29.577|[task_ending] refersh memchcae, key= reserve_zi
----#2020.10.16_21:59:29.578|[ERROR-BREAK]:func_name=set_value
Traceback (most recent call last):
File "/root/igotolibrary/utils.py", line 34, in wrapper
return func(*args, **kwargs)
File "/root/igotolibrary/utils.py", line 1063, in set_value
self.client.set(key=key, value=value, expire=expire_second)
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 379, in set
flags=flags)[key]
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 968, in _store_cmd
self._connect()
File "/usr/local/lib/python3.6/site-packages/pymemcache/client/base.py", line 336, in _connect
sock.connect(sockaddr)
ConnectionRefusedError: [Errno 111] Connection refused

cookies中wechatSESS_ID问题

发现wechatSESS_ID在变化,上午测试和下午测试的不一样,请问wechatSESS_ID变化周期你清楚吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.