当前位置:   article > 正文

python实现图书馆抢座(自动预约)

python实现图书馆抢座(自动预约)

脚本功能

系统开放座位时快速预约指定位置

可以设置预约的时间段

运行以后会一直帮你抢,需要手动停止

即使遇到更强的脚本自动帮抢下一个座位

实现

首先解决登录问题,通过F12找出登录请求包,分析对比一下包可以发现一般只有用户名和密码这个参数是变化的,然后用requests.session()的实例化去请求登录接口,登录成功。

然后预约座位抓一下包,分析包找到变化的关键的参数,一般情况下关键参数只有座位id、开始时间、结束时间,其他的参数一股脑照搬就行了,接下来用刚刚登录成功的那个requests.session()实例去请求即可。

优化

既然是每天都帮抢那么一直去请求可不行,一是给服务器造成负担,二是如果有什么反爬策略容易被发现被封。所以每天到12点(系统预约开放时间)的时候发预约包就行。

万一脚本撞车了没抢到自己设定的座位怎么办,返回预约的结果,发现已经有人了自动预约下一个座位,也可以将自己心仪的座位写在列表里,这个抢不到抢下一个。

代码

(为了不给学校系统添加负担,代码仅供参考,无法直接运行)

  1. import requests
  2. from datetime import date
  3. from datetime import timedelta
  4. import json
  5. import getopt
  6. import sys
  7. import time
  8. global headers
  9. headers = {
  10. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
  11. 'Host': '',
  12. }
  13. #登录函数
  14. def login(id, pwd):
  15. l_params = {
  16. 'id': id,
  17. 'pwd': pwd,
  18. 'act': 'login',
  19. }
  20. #自己分析得到的接口,下同
  21. login_url = ''
  22. s = requests.session()
  23. re = s.post(url=login_url, headers=headers, params=l_params)
  24. #返回登录成功的实例
  25. return s
  26. #预约函数
  27. def yd(s, start, end, s_id):
  28. y_params = {
  29. "dialogid": "",
  30. #预定座位
  31. "dev_id": s_id,
  32. "room_id":"",
  33. "type":"dev",
  34. "prop":"",
  35. "number":"",
  36. "classkind":"",
  37. "test_name":"",
  38. "start": start,
  39. "end": end,
  40. "start_time": "800",
  41. "end_time": "2200",
  42. }
  43. y_url = ''
  44. re = s.get(url=y_url, headers=headers, params=y_params)
  45. print(re.text)
  46. res = json.loads(re.text)
  47. msg = res['msg']
  48. if msg == '操作成功!':
  49. print('success')
  50. return 1
  51. elif msg == '2020-09-11只能提前[1]天预约':
  52. return 0
  53. else:
  54. print('fail')
  55. return 2
  56. #脚本输入提示信息
  57. def useage():
  58. print(
  59. '''
  60. Usage:
  61. -i 学号(必填)
  62. -p 密码
  63. -s 座位id
  64. -b 开始时间,格式13:00,下同
  65. -e 结束时间
  66. ''')
  67. if __name__ == '__main__':
  68. id = pwd = None
  69. #不填默认抢这个这个时间段的这个座位
  70. s_id = '100458282'
  71. begin = '8:00'
  72. end = '22:00'
  73. #处理输入
  74. try:
  75. opts, args = getopt.getopt(sys.argv[1:], 'i:p:s:b:e:')
  76. for name, value in opts:
  77. if name == '-i':
  78. id = value
  79. if name == '-p':
  80. pwd = value
  81. if name == '-s':
  82. s_id = value
  83. if name == '-b':
  84. begin = value
  85. if name == '-e':
  86. end = value
  87. except getopt.GetoptError:
  88. useage()
  89. if not id:
  90. useage()
  91. sys.exit(3)
  92. if not pwd:
  93. pwd = id
  94. #先获取后天时间
  95. aftertomorrow = date.isoformat(date.today() + timedelta(days=2))
  96. while True:
  97. hour = int(time.strftime('%H',time.localtime(time.time())))
  98. m = int(time.strftime('%M', time.localtime(time.time())))
  99. #如果现在的明天等与之前的后天,即到了12点,开始抢座
  100. if date.isoformat(date.today() + timedelta(days=1)) == aftertomorrow:
  101. s = login(id, pwd)
  102. start = aftertomorrow + ' ' + begin
  103. endtime = aftertomorrow + ' ' + end
  104. result = yd(s, start, endtime, s_id)
  105. if result == 1:
  106. #预约成功
  107. aftertomorrow = date.isoformat(date.today() + timedelta(days=2))
  108. sleep_time = (23 - hour) * 3600 + (59 - m) * 60 + 35
  109. print('程序休眠{}s'.format(sleep_time))
  110. print(aftertomorrow)
  111. time.sleep(sleep_time)
  112. elif result == 2:
  113. #被预约,抢下一个id的座位
  114. s_id = str(int(s_id) - 1)
  115. continue
  116. else:
  117. continue
  118. else:
  119. sleep_time = (23 - hour) * 3600 + (59 - m) * 60
  120. time.sleep(sleep_time)

结语

不知道你们的学校图书馆预约系统是什么样的,但是一般学校也不会花太多钱去搞这个,所以系统比较垃圾,大部分可以按照这个思路来。而且有些学校跟我们学校用的几乎相同的系统,肯定是出自同一个公司或者同一个模板的。如果你们学校也是类似的系统,代码改一下就能用。

看完之后想自己动手但是又不知道怎么抓包分析?看看这篇

针对刚学习爬虫的小白,看完就懂

我学校的系统主页大概长这样

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/173964
推荐阅读
相关标签
  

闽ICP备14008679号