精华内容
下载资源
问答
  • csuLibraryBot 中南大学图书馆抢座脚本
  • 南京工程学院我去图书馆占座抢座 中签绝缘体!! 恢复个人娱乐和学习交流 大佬两年前就有反馈问题,至今仍未解决 本人非计算机相关专业,代码写的烂,变量起名不规范等别说嗷,只是积极使用python解决生活中所遇到的...
  • 因为要考研嘛,想去图书馆。我们学校是早上六点开抢,同学们太猛,每天5点50起床抢,都不太抢的到想要的座位,于是就花了...抢座原理的简述“我去图书馆”公众号实现抢座功能,肯定是通过与服务器进行交互完成的...

    因为要考研嘛,想去图书馆。我们学校是早上六点开抢,同学们太猛,我每天5点50起床抢,都不太抢的到想要的座位,于是我就花了个两三天琢磨着怎么用代码来实现这个抢座,目前已经完成,虽然因为微信的那个sessid更新的比较频繁,还是需要早起来拿写好的安卓软件传个cookie的数据,但至少每天都能抢到固定的座位了,心情就很舒畅。

    抢座原理的简述

    “我去图书馆”公众号实现抢座功能,肯定是通过与服务器进行交互完成的。通过抓包可以发现,最终完成抢座这一步的,是一个get请求,那么我们通过模拟手机来向服务器发送这样一个get请求,就能实现抢座。这个get请求的url格式为:“http://wechat.v2.traceint.com/index.php/reserve/get/libid={所抢阅览室的id号}&{一段莫名其妙的编码}={该阅览室座位号对应的编码}&yzm=”。这个get请求的请求头的信息如下所示。

    ```

    {

    'Accept': 'application/json, text/javascript, */*; q=0.01',

    'X-Requested-With': 'XMLHttpRequest',

    'User-Agent': '{随便找个手机抓个包扒拉下来放这就行}',

    'Sec-Fetch-Mode': 'cors',

    'Sec-Fetch-Site': 'same-origin',

    'Referer': 'http://wechat.v2.traceint.com/index.php/reserve/layout/libid={所抢阅览室的id号}.html&{所在学校的代码}',

    'Accept-Encoding': 'gzip, deflate,br',

    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',

    'Cookie': {实时抓包抓到的cookie值}

    }

    ```

    PS:b站不支持markdown也没法添加代码块,小伙伴们将就着看吧。

    上面用大括号括起来的部分都是在应用中需要改变的部分,包括:

    1、所抢阅览室的id号;

    2、一段莫名其妙的编码;

    3、该阅览室座位号对应的编码;

    4、所在学校的代码;

    5、实时抓包抓到的cookie值。

    其中,1和4都是可以通过抓包轻而易举地得到的。关于抓包,学习起来难度很低,如果不会的小伙伴可以通过搜索一些文章轻松地完成学习。5是需要每天起早抓包得到并放入程序运行的内容,承载着用户信息,也很容易获取到。真正需要进行一些操作去获取的是2和3。将这些内容填入到get请求中,通过代码模拟手机发送get请求,就能够完成抢座。

    获取座位号对应的编码

    在使用“我去图书馆”公众号进行抢座的时候,在进行抢座前我们都会进入一个页面,选定要选的座位之后点击抢座。通过分析网页源码,很容易定位座位元素的代码,座位元素的模板如下所示。

    ```

    {显示的座位号}

    ```

    知道了座位号和编码是如何映射的,只要从页面中爬取数据就可以了,代码如下所示。

    ```

    from bs4 import BeautifulSoup

    bs = BeautifulSoup(html, 'html.parser') #html是爬取到的网页的文本

    zw = dict() #创建一个字典,用来存放座位号和编码的映射

    div_tags = bs.find_all('div', {'class': 'grid_cell'})

    for tag in div_tags:

    zwid = tag.contents[1].string

    if zwid != None and zwid != '窗' and zwid != '柱':

    zw[zwid] = tag.get('data-key')

    ```

    通过这样一个映射的获取,我们就可以方便地通过座位号获取到其对应的编码了。

    如何获取那一段莫名其妙的编码

    在编写代码的过程中,我对抢座位这个过程进行的多次的抓包观察,发现在座位号前面的那个query字符串是一个看不出什么规律的编码。解析这个query是在后端进行解析,但既然发get请求你要在页面上发,那这个代码必然在前端是有迹可循的。这个编码的答案就在页面底部的js链接中,通过运行那一段js代码就可以搞定这个编码,从而拼凑起这最后一块拼图。

    感谢各位能够看完这篇文章,如果有什么不理解的地方或者需要我的一些帮助,可以私信我

    展开全文
  • 运行以后会一直帮你,需要手动停止 即使遇到更强的脚本自动帮抢下一个座位 实现 首先解决登录问题,通过F12找出登录请求包,分析对比一下包可以发现一般只有用户名和密码这个参数是变化的,然后用requests....
  • 许多图书馆支持网上预约,图书馆预约不到座位的现象也时常发生,本脚本主要作用为辅助预约。
  • Python脚本-学校图书馆自动抢座

    万次阅读 多人点赞 2019-11-17 19:02:21
    因为最近经常跑图书馆,然后要很早预约就预约不到,所以心生一计,写个Python脚本,因为以前从来没有写过,所以这次也遇到很多困难,但是最后做出来了! 1.微信关注湖南师范大学图书馆服务号,进入微服务大厅。...

    因为最近经常跑图书馆,然后要很早预约就预约不到,所以心生一计,写个Python脚本,因为以前从来没有写过,所以这次也遇到很多困难,但是最后做出来了!
    在这里插入图片描述

    1.微信关注图书馆服务号,进入微服务大厅。
    2.座位预约——按图预约——选择日期教室座位号。
    3.手机stream抓包。
    4.分析订座包参数。
    5.实现自动化抢座。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    师大的服务提供网址wx.lib.hunnu.edu.cn是不能够分享页面的,我在每个界面都查看过了,每个界面都没有分享的选项,所以我们不能借助电脑抓包软件,只能用手机抓包软件,博主ios端,用的是一个免费的软件叫stream实现手机端抓包。

    如下图
    在这里插入图片描述

    部分代码如下

    
    import requests
    import time
    
    
    def library(alltime, seatno, seatdate):
    	# 模仿手机端访问公众号
    
    
    def unix_time(dt):
        # 转换成时间数组
        timeArray = time.strptime(dt, "%Y-%m-%d %H:%M:%S")
        # 转换成时间戳
        timestamp = int(time.mktime(timeArray))
        return timestamp
    
    if __name__ == "__main__":
        print("请输入抢座位时间,格式如: 2019-11-17 06:00:00")
        start_time = input()
        # print(time.asctime(time.localtime(time.time())))
        print("请输入全部时间")
        alltime = input()
        print("请输入座位号,格式如:2-202")
        seatno = input()
        print("请输入日期:格式2019-11-18")
        seatdate = input()
        start_time = unix_time(start_time) - int(time.time())
        print("等待" + str(start_time) + "秒后开始抢座")
        time.sleep(start_time)
    
        while True:
            # 2019-04-03 14:40
            a = library(alltime, seatno, seatdate)
            if a == "预约成功!":
                print("抢座成功")
                break
            print(a)
            print("抢座中")
            time.sleep(5)
    
    

    因为担心传播开来的话是否违反校纪啊之类的,所以本博客代码仅作学习记录之用,不对外传播,运行如下图。

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 我去图书馆-抢座助手

    万次阅读 多人点赞 2018-04-09 19:28:37
    某天觉得这个 ’我去图书馆图书馆定座系统体验很不好,抓包简单分析发现它的数据传输没有加密,于是尝试用py模拟手动抢座 正文 就是个简单的 python借用requests模块,设置好headers、cookies,直接get就可以...

    2019.07.22 文章已更新:

    [igtl-again] 我去图书馆-抢座主逻辑详解-https://blog.csdn.net/RenjiaLu9527/article/details/96843605

    写在前面

    github项目地址

    某天觉得这个 ’ 我去图书馆 ’ 图书馆定座系统体验很不好,抓包简单分析发现它的数据传输没有加密,于是尝试用py模拟手动抢座

    正文##

    就是个简单的 python借用requests模块,设置好headers、cookies,直接get就可以了。主要的py文件如下

    RSmain.py

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    #@filename:RSmain.py
    #@user: wheee/RenjiaLu
    #@time:20180408
    #@illustration:  reserve a seat 
    
    import ConfigParser
    import json
    import time
    import random
    import os,sys
    import requests
    from datetime import date, datetime
    reload(sys) 
    sys.setdefaultencoding('utf-8')
    
    
    
    #配置信息
    # anum = int(time.mktime(time.strptime("2018-04-07 23:09:30", "%Y-%m-%d %H:%M:%S")  ))
    # ymd_hms = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(1523113200))
    
    FLG_AGAIN = "AGAIN"
    FLG_NEXTSEAT = "NEXTSEAT"
    CONFIG_NAME = "RSconf.ini"
    #section标签为:[openIdConf_2018-04-08]
    
    RUNTIME =  int(time.mktime(time.strptime(time.strftime('%Y-%m-%d',time.localtime(time.time())) \
    			+" 20:00:00", "%Y-%m-%d %H:%M:%S")  ))   #"2018-03-05 11:39:19" 
    READYTIME = RUNTIME - 30 #提前 0.5 分钟准备
    delayTime = 10
    
    mheaders =  {
    'Host':	'wechat.v2.traceint.com',
    'User-Agent':	'Mozilla/5.0 (Linux; Android 7.0; MI 5 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043909 Mobile Safari/537.36 MicroMessenger/6.6.5.1280(0x26060536) NetType/WIFI Language/zh_CN',
    'Accept':	'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,image/wxpic,image/sharpp,image/apng,*/*;q=0.8',
    'Accept-Encoding':	'gzip, deflate',
    'Accept-Language':	'zh-CN,en-US;q=0.8'
    }
    mcookies = dict(FROM_TYPE="weixin" ,wechatSESS_ID="your_sessionid",
    	Hm_lvt_7ecd21a13263a714793f376c18038a87="1521332626,1521734275",
    	Hm_lpvt_7ecd21a13263a714793f376c18038a87=str(int(time.time())))
    
    #=========
    	
    #类
    class GlobalValue :
    
    	#[座位标号:坐标],不同学校的座位表不同
    	R1_SEATTABLE={
    	#第一自习室座位编码 		252 个
    	 '1':'39,20','10':'37,23','100':'7,21','101':'8,21','102':'10,21','103':'10,20','104':'8,20','105':'7,20','106':'5,20','107':'7,13','108':'8,12','109':'9,11','11':'36,23','110':'10,10','111':'11,9','112':'16,6','113':'16,8','114':'16,9','115':'16,11','116':'16,12','117':'16,14','118':'17,14','119':'17,12','12':'34,23','120':'17,11','121':'17,9','122':'17,8','123':'17,6','124':'19,6','125':'19,8','126':'19,9','127':'19,11','128':'19,12','129':'19,14','13':'34,24','130':'20,14','131':'20,12','132':'20,11','133':'20,9','134':'20,8','135':'20,6','136':'22,6','137':'22,8','138':'22,9','139':'22,11','14':'36,24','140':'22,12','141':'22,14','142':'23,14','143':'23,12','144':'23,11','145':'23,9','146':'23,8','147':'23,6','148':'25,6','149':'25,8','15':'37,24','150':'25,9','151':'25,11','152':'25,12','153':'25,14','154':'26,14','155':'26,12','156':'26,11','157':'26,9','158':'26,8','16':'39,24','160':'31,20','161':'29,20','162':'28,20','163':'26,20','164':'25,20','165':'23,20','166':'22,20','167':'20,20','168':'17,20','169':'15,20','17':'39,26','170':'14,20','171':'12,20','172':'12,21','173':'14,21','174':'15,21','175':'17,21','176':'20,21','177':'22,21','178':'23,21','179':'25,21','18':'37,26','180':'26,21','181':'28,21','182':'29,21','183':'31,21','184':'31,23','185':'29,23','186':'28,23','187':'26,23','188':'25,23','189':'23,23','19':'36,26','190':'22,23','191':'20,23','192':'17,23','193':'15,23','194':'14,23','195':'12,23','196':'12,24','197':'14,24','198':'15,24','199':'17,24','2':'37,20','20':'34,26','200':'20,24','201':'22,24','202':'23,24','203':'25,24','204':'26,24','205':'28,24','206':'29,24','207':'31,24','208':'31,26','209':'29,26','21':'34,27','210':'28,26','211':'26,26','212':'25,26','213':'23,26','214':'22,26','215':'20,26','216':'17,26','217':'15,26','218':'14,26','219':'12,26','22':'36,27','220':'12,27','221':'14,27','222':'15,27','223':'17,27','224':'20,27','225':'22,27','226':'23,27','227':'25,27','228':'26,27','229':'28,27','23':'37,27','230':'29,27','231':'31,27','232':'31,29','233':'29,29','234':'28,29','235':'26,29','236':'25,29','237':'23,29','238':'22,29','239':'20,29','24':'39,27','240':'17,29','241':'15,29','242':'14,29','243':'12,29','244':'14,30','245':'15,30','246':'17,30','247':'20,30','248':'22,30','249':'23,30','25':'39,29','250':'25,30','251':'26,30','252':'28,30','253':'29,30','26':'37,29','27':'36,29','28':'34,29','29':'34,30','3':'36,20','30':'36,30','31':'37,30','32':'39,30','33':'37,37','34':'36,38','35':'35,39','36':'34,40','37':'33,41','38':'26,44','39':'26,42','4':'34,20','40':'26,41','41':'26,39','42':'25,39','43':'25,41','44':'25,42','45':'25,44','46':'23,44','47':'23,42','48':'23,41','49':'23,39','5':'34,21','50':'22,39','51':'22,41','52':'22,42','53':'22,44','54':'20,44','55':'20,42','56':'20,41','57':'20,39','58':'19,39','59':'19,41','6':'36,21','60':'19,42','61':'19,44','62':'17,44','63':'17,42','64':'17,41','65':'17,39','66':'16,39','67':'16,41','68':'16,42','69':'16,44','7':'37,21','70':'11,41','71':'10,40','72':'9,39','73':'8,38','74':'7,37','75':'5,30','76':'7,30','77':'8,30','78':'10,30','79':'10,29','8':'39,21','80':'8,29','81':'7,29','82':'5,29','83':'5,27','84':'7,27','85':'8,27','86':'10,27','87':'10,26','88':'8,26','89':'7,26','9':'39,23','90':'5,26','91':'5,24','92':'7,24','93':'8,24','94':'10,24','95':'10,23','96':'8,23','97':'7,23','98':'5,23','99':'5,21'
    	}
    	R2_SEATTABLE={
    		#第二自习室座位编码		203  个 
    		'1':'33,24','10':'29,25','100':'9,30','101':'9,31','102':'7,24','103':'7,25','104':'7,26','105':'7,27','106':'7,28','107':'7,29','108':'7,30','109':'7,31','11':'29,26','110':'4,28','111':'3,28','112':'3,26','113':'4,26','114':'4,24','115':'3,24','116':'3,22','117':'4,22','118':'4,20','119':'3,20','12':'29,27','120':'3,18','121':'4,18','122':'7,20','123':'7,19','124':'7,18','125':'7,17','126':'7,16','127':'7,15','128':'9,15','129':'9,16','13':'29,28','130':'9,17','131':'9,18','132':'9,19','133':'9,20','134':'11,20','135':'11,19','136':'11,18','137':'11,17','138':'11,16','139':'11,15','14':'29,29','140':'13,15','141':'13,16','142':'13,17','143':'13,18','144':'13,19','145':'13,20','146':'19,20','147':'19,19','148':'19,18','149':'19,17','15':'29,30','150':'19,16','151':'19,15','152':'19,14','153':'19,13','154':'19,12','155':'19,11','156':'21,11','157':'21,12','158':'21,13','159':'21,14','16':'29,31','160':'21,15','161':'21,16','162':'21,17','163':'21,18','164':'21,19','165':'21,20','166':'23,20','167':'23,19','168':'23,18','169':'23,17','17':'29,32','170':'23,16','171':'23,15','172':'23,14','173':'23,13','174':'23,12','175':'23,11','176':'25,11','177':'25,12','178':'25,13','179':'25,14','18':'29,33','180':'25,15','181':'25,16','182':'25,17','183':'25,18','184':'25,19','185':'25,20','186':'27,20','187':'27,19','188':'27,18','189':'27,17','19':'27,33','190':'27,16','191':'27,15','192':'29,15','193':'29,16','194':'29,17','195':'29,18','196':'29,19','197':'29,20','198':'31,20','199':'31,19','2':'33,25','20':'27,32','200':'33,19','201':'33,20','202':'21,24','203':'19,24','21':'27,31','22':'27,30','23':'27,29','24':'27,28','25':'27,27','26':'27,26','27':'27,25','28':'27,24','29':'25,24','3':'33,28','30':'25,25','31':'25,26','32':'25,27','33':'25,28','34':'25,29','35':'25,30','36':'25,31','37':'25,32','38':'25,34','39':'25,35','4':'33,29','40':'23,35','41':'23,34','42':'23,33','43':'23,32','44':'23,31','45':'23,30','46':'23,29','47':'23,28','48':'23,27','49':'23,26','5':'31,29','50':'23,25','51':'23,24','52':'21,25','53':'21,26','54':'21,27','55':'21,28','56':'21,29','57':'21,30','58':'21,31','59':'21,32','6':'31,28','60':'21,33','61':'21,34','62':'21,35','63':'19,35','64':'19,34','65':'19,33','66':'19,32','67':'19,31','68':'19,30','69':'19,29','7':'31,25','70':'19,28','71':'19,27','72':'19,26','73':'19,25','74':'13,24','75':'13,25','76':'13,26','77':'13,27','78':'13,28','79':'13,29','8':'31,24','80':'13,30','81':'13,31','82':'13,32','83':'13,33','84':'11,33','85':'11,32','86':'11,31','87':'11,30','88':'11,29','89':'11,28','9':'29,24','90':'11,27','91':'11,26','92':'11,25','93':'11,24','94':'9,24','95':'9,25','96':'9,26','97':'9,27','98':'9,28','99':'9,29'
    	}
    	#[自习室编号:服务器代号]
    	DICT_ROOM_KV={"ROOM_1":"323","ROOM_2":"324"}
    
    	def __init__(self):
    		pass
    
    
    #订座函数
    def reserveSeatFunc(mheaders,mcookies,roomId,seatId):
    
    	gv = GlobalValue()
    	roomValue = gv.DICT_ROOM_KV["ROOM_1" if roomId == "1" else "ROOM_2" ]
    	seatValue = (gv.R1_SEATTABLE if roomId == "1" else gv.R1_SEATTABLE)[seatId]
    
    	url_zuowei ="http://wechat.v2.traceint.com/index.php/reserve/index.html?f=wechat"
    	url_dixzixishi = "http://wechat.v2.traceint.com/index.php/reserve/layout/libid=%s.html&1523076408"%(roomValue)
    	url_querenxuanzuo = "http://wechat.v2.traceint.com/index.php/reserve/get/libid=%s&key=%s&yzm="%(roomValue,seatValue)
    	url_mingriyuyue_dixzixishi = "http://wechat.v2.traceint.com/index.php/reserve/layoutApi/action=prereserve_event&libid=%s"%(roomValue)
    	url_mingriyuyue_querenxuanzuo = "http://wechat.v2.traceint.com/index.php/prereserve/save/libid=%s&key=%s&yzm="%(roomValue,seatValue)
    
    	requests.adapters.DEFAULT_RETRIES = 5
    	rs = requests.Session()
    	rs.keep_alive = False
    	#点击【座位】进入首页
    	try:
    		#当日即时预定
    		respone=rs.get(url_zuowei,timeout=1,headers=mheaders,cookies=mcookies)
    		#明日预约
    		#respone=rs.get(url_mingriyuyue_dixzixishi,timeout=1,headers=mheaders,cookies=mcookies)
    	except Exception as e:
    		print(u"[E]: 进入自习室出错 %s"%repr(e))
    		#return ""
    	else:
    		if (respone.status_code == 200 ) and ((respone.text.find("出入口")>0 or (respone.text.find("自习室")))):
    			print(u"[I]: 进入自习室成功-状态码:%5d"% respone.status_code+"\n")
    		else:
    			print(u"[I]: 进入自习室失败-状态码:%5d"% respone.status_code+"\n")
    	#print(respone.content)
    
    	#选择自习室
    	
    	#点击【确认选座】确认选座
    	try:
    		#当日即时预定
    		respone=rs.get(url_querenxuanzuo,timeout=1,headers=mheaders,cookies=mcookies)
    		#明日预约
    		#respone=rs.get(url_mingriyuyue_querenxuanzuo,timeout=1,headers=mheaders,cookies=mcookies)
    	except Exception as e:
    		print(u"[E]: 确认选座出错 %s"%repr(e))
    	else:
    		#是预定成功 而不是 预订成功
    		if (respone.status_code == 200) and ((respone.text.find("预定成功") > 0) or (respone.text.find("预定座位成功")>0)) :
    			print(u"[I]: 第 %s 自习室 %s 号位置抢座成功!-状态码:%5d"% (roomId,seatId,respone.status_code)+"\n")
    		else:
    			if respone.text.find(u"已经预定") > 0:
    				print(u"[I]: 第 %s 自习室 %s 号位置抢座失败!你已经预定了其他座位!-状态码:%5d"% (roomId,seatId,respone.status_code)+"\n")
    			elif respone.text.find("被人预定") > 0:
    				print(u"[I]: 第 %s 自习室 %s 号位置抢座失败!该座位已经被人预定了!-状态码:%5d"% (roomId,seatId,respone.status_code)+"\n")
    			else:
    				print(u"[I]: 第 %s 自习室 %s 号位置抢座失败!未知原因-状态码:%5d"% (roomId,seatId,respone.status_code)+"\n")
    				print(respone.text)
    				print(respone.url)
    			return FLG_NEXTSEAT #继续抢下一个座位
    	return ""
    
    #判断当前时间处于的阶段 READY/RUN ,修改delay时长
    def howAboutNow():
    	global delayTime,RUNTIME,READYTIME
    	ticks = int(time.time())
    	
    	if ticks >= RUNTIME :
    		return "T_RUN"
    	elif ticks >= READYTIME :
    		delayTime = 0.2 if RUNTIME - ticks < 15  else  8
    		return "T_READY"
    	else :
    		howlong = RUNTIME - ticks
    		if howlong < 7200 :
    			delayTime = 0.2 if howlong < 15  else ( 10 if howlong < 300  else ( 200 if howlong < 3600 else 2400))
    		else :
    			delayTime = 7200 if howlong > 10800 else 4800
    
    		print(u"[I]: 当前时间 %s ,  %s 分钟后进入准备阶段"%\
    			(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ticks)),str((READYTIME-ticks)/60)))
    		return ""
    #开始
    if __name__ == '__main__':
    	
    	print(u"[I]: 图书馆抢座助手已启动...\n")
    	todaySection = "openIdConf_%s"%time.strftime('%Y-%m-%d',time.localtime(time.time()))
    
    	dict_openID_SESSID = {}
    	isFirstReady = 1 # 1 是第一次准备,2 不是第一次则不再准备
    	while True :
    
    		nowflg = howAboutNow() 
    		if "T_READY" == nowflg:
    			if isFirstReady != 1 :
    				continue
    			print(u"[I]: 开始准备")
    			try:
    				#准备时间-读取配置文件
    				conf = ConfigParser.ConfigParser()
    				conf.read(CONFIG_NAME)       # 文件路径
    				list_tmp = conf.items(todaySection)# 返回openId_wechatSESS_ID标签项下面的键值对 list
    				dict_openID_SESSID = dict(list_tmp)#openid = qlsqge7nr1m92npjcngukeghf5 , 1,23,2,188,1,187
    
    				isFirstReady = 2 #不再是第一次准备
    			except Exception as e:
    				print(u"[E]: 读取配置文件出错 %s"%repr(e))
    
    		#到达预定时间-开始抢座
    		elif "T_RUN" == nowflg :
    			print(u"[I]: 开始抢座 ")
    			for v in dict_openID_SESSID.values():
    				try:
    					listv = v.split(",")
    					mylen = len(listv)
    					mcookies["wechatSESS_ID"] = listv[0].strip()
    
    					returnValue = FLG_NEXTSEAT
    					key_i = 1
    					value_i = key_i + 1
    					#限制每个人备选抢座号的数量 2个
    					mylen = 5 if mylen >= 5 else mylen
    					while value_i < mylen and returnValue == FLG_NEXTSEAT:
    						t_roomid = listv[key_i].strip()
    						t_seatid = listv[value_i].strip()
    						key_i = key_i + 2
    						value_i = key_i + 1
    
    						#抢座!!!
    						returnValue = reserveSeatFunc(mheaders,mcookies,t_roomid,t_seatid)
    
    				except Exception as e:
    					print(u"[E]: 抢座出错 %s"%repr(e))
    			#只运行一次 抢座模块 
    			break
    
    		else :
    			print(u"[I]: %s 秒后继续监听..."%delayTime)
    			time.sleep(delayTime)
    

    然后我将其上传服务器接到一个公众号的后台,测试可行。详情可扫
    这里写图片描述
    [为了学习]


    结束,有什么想说的请留言

    展开全文
  • 因为要考研嘛,想去图书馆。我们学校是早上六点开抢,同学们太猛,每天5点50起床抢,都不太抢的到想要的座位,于是就花了...抢座原理的简述“我去图书馆”公众号实现抢座功能,肯定是通过与服务器进行交互完成的...

    因为要考研嘛,想去图书馆。我们学校是早上六点开抢,同学们太猛,我每天5点50起床抢,都不太抢的到想要的座位,于是我就花了个两三天琢磨着怎么用代码来实现这个抢座,目前已经完成,虽然因为微信的那个sessid更新的比较频繁,还是需要早起来拿写好的安卓软件传个cookie的数据,但至少每天都能抢到固定的座位了,心情就很舒畅。

    抢座原理的简述

    “我去图书馆”公众号实现抢座功能,肯定是通过与服务器进行交互完成的。通过抓包可以发现,最终完成抢座这一步的,是一个get请求,那么我们通过模拟手机来向服务器发送这样一个get请求,就能实现抢座。这个get请求的url格式为:“http://wechat.v2.traceint.com/index.php/reserve/get/libid={所抢阅览室的id号}&{一段莫名其妙的编码}={该阅览室座位号对应的编码}&yzm=”。这个get请求的请求头的信息如下所示。

    {

    'Accept': 'application/json, text/javascript, */*; q=0.01',

    'X-Requested-With': 'XMLHttpRequest',

    'User-Agent': '{随便找个手机抓个包扒拉下来放这就行}',

    'Sec-Fetch-Mode': 'cors',

    'Sec-Fetch-Site': 'same-origin',

    'Referer': 'http://wechat.v2.traceint.com/index.php/reserve/layout/libid={所抢阅览室的id号}.html&{所在学校的代码}',

    'Accept-Encoding': 'gzip, deflate,br',

    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',

    'Cookie': {实时抓包抓到的cookie值}

    }

    上面用大括号括起来的部分都是在应用中需要改变的部分,包括:

    1、所抢阅览室的id号;

    2、一段莫名其妙的编码;

    3、该阅览室座位号对应的编码;

    4、所在学校的代码;

    5、实时抓包抓到的cookie值。

    其中,1和4都是可以通过抓包轻而易举地得到的。关于抓包,学习起来难度很低,如果不会的小伙伴可以通过搜索一些文章轻松地完成学习。5是需要每天起早抓包得到并放入程序运行的内容,承载着用户信息,也很容易获取到。真正需要进行一些操作去获取的是2和3。将这些内容填入到get请求中,通过代码模拟手机发送get请求,就能够完成抢座。

    获取座位号对应的编码

    在使用“我去图书馆”公众号进行抢座的时候,在进行抢座前我们都会进入一个页面,选定要选的座位之后点击抢座。通过分析网页源码,很容易定位座位元素的代码,座位元素的模板如下所示。

    {显示的座位号}

    知道了座位号和编码是如何映射的,只要从页面中爬取数据就可以了,代码如下所示。

    from bs4 import BeautifulSoup

    bs = BeautifulSoup(html, 'html.parser') #html是爬取到的网页的文本

    zw = dict() #创建一个字典,用来存放座位号和编码的映射

    div_tags = bs.find_all('div', {'class': 'grid_cell'})

    for tag in div_tags:

    zwid = tag.contents[1].string

    if zwid != None and zwid != '窗' and zwid != '柱':

    zw[zwid] = tag.get('data-key')

    通过这样一个映射的获取,我们就可以方便地通过座位号获取到其对应的编码了。

    如何获取那一段莫名其妙的编码

    在编写代码的过程中,我对抢座位这个过程进行的多次的抓包观察,发现在座位号前面的那个query字符串是一个看不出什么规律的编码。解析这个query是在后端进行解析,但既然发get请求你要在页面上发,那这个代码必然在前端是有迹可循的。这个编码的答案就在页面底部的js链接中,通过运行那一段js代码就可以搞定这个编码,从而拼凑起这最后一块拼图。

    感谢各位能够看完这篇文章,如果有什么不理解的地方或者需要我的一些帮助,可以私信我

    展开全文
  • 图书馆预约系统多线程多账号抢座脚本

    千次阅读 热门讨论 2019-11-27 19:24:44
    图书馆预约脚本,可破解任何验证码定时登录自动抢座 利昂系统 需要脚本的同学可以私聊一哈~
  • python实实现现图图书馆馆抢座座(自自动动预预约约)功功能能的的示示例例代代码码 这篇文章主要介绍了python实现图书馆抢座(自动预约)功能本文通过实例代码给大家介绍的非常详细对大家的 学习或工作具有一定的...
  • 爬虫——图书馆抢座

    千次阅读 多人点赞 2020-10-25 15:43:10
    文章目录python爬虫 -----图书馆抢座验证码识别分析登录请求信息用户登录获取请求信息尤其是cookie通过cookie获取验证码分析抢座请求信息利用保存的cookie会话发送post 以及get请求抢座成功结果图利用多线程并发给多...
  • python爬虫 -----图书馆抢座本人也是一位学子 奈何图书馆座位总抢不到 就利用学过的技术做了一个图书馆抢座系统。主要原理是利用提交post表单的形式进行抢座。对Python,爬虫感兴趣的可以和一起交流:点击链接加入...
  • 之前在图书馆约座,总是需要半夜十二点抢座,有时候还抢不到座位,带来了一些困扰,于是便萌生了写一个app可以自动约座。想到了之前学的python爬虫可以实现,但是不会移植到手机端,电脑端又不是很方便,于是便从...
  • 黑龙江大学校内图书馆自动预约抢座脚本~~

    万次阅读 热门讨论 2017-04-08 10:57:52
    黑龙江大学 校内图书馆抢座脚本 ~给学弟学妹们抢座的工具~~很简单的一个小脚本~~但是很实用~~ github代码 还支持发送邮箱哦 虽然很鸡肋~~
  • python实现图书馆抢座(自动预约)

    千次阅读 多人点赞 2020-09-27 20:21:02
    运行以后会一直帮你,需要手动停止 即使遇到更强的脚本自动帮抢下一个座位 实现 首先解决登录问题,通过F12找出登录请求包,分析对比一下包可以发现一般只有用户名和密码这个参数是变化的,然后用requests....
  • 对各高校图书馆使用的“来选座”系统,你怎么看?高校图书馆使用的来选座系统高校图书馆目前正大量上线使用预约选座系统,“来选座”系统的大致运行程序为:学生可以提前预约选座或者到管选座,选座分为随机选座或...
  • 这种座位预订系统能否通过程序实现自动化抢座? 学号和公众号绑定,取消关注公众号后就取消绑定了 这个图片是预约座位时提交的命令,还有一个录屏是座位预定过程     录屏:链接&#...
  • 图书馆助手

    2016-06-22 10:08:10
    自己写的android小软件,欢迎大家下载
  • seat-management:图书馆座位管理系统,任选,可签到
  • 能不能定制个每天中午12点自动约图书馆座位的,学校的图书馆中午12点放第二天的预约座位,现在很难 座位预约APP下载 http://mp.ahxtc.cn:9291/app/download_czxy.html
  • 项目简介因原gitee仓库无数据库文件且存在水印,...主要实现的功能有:用户管理、菜单管理、角色管理、权限管理、学生管理、教师管理、班级管理、图书馆阅览室管理、学生信用管理、预约占管理、发帖评论管理、违规...
  • 2019.07.22 文章已更新: [igtl-again] 我去图书馆-抢座主逻辑详解-https://zhuanlan.zhihu.com/p/74706139二叉树:[igtl-again]我去图书馆-抢座主逻辑详解​zhuanlan.zhihu.com写在前面项目地址: RenjiaLu9527/...
  • :office_building: WHU图书馆座位移动 :mobile_phone_with_arrow:武汉大学图书馆助手-移动端(Android) :toolbox: IOS解决方案: :laptop:桌面端: : :green_book:使用说明 文档地址 桌面端演示 :rocket:...
  • 这样需要验证码的该怎么做呢?求助
  • 初学Python实现学校图书馆座位自动抢座预约

    千次阅读 多人点赞 2020-09-15 22:03:54
    最近突然有个想利用python爬取学校图书馆预约的想法(因为图书馆单人的座位很难)可是没学过python,就草草了解下python基础语法然后找本《Python3网络爬虫实战》来啃了。 首先了解了一波urllib和request库,由于...
  • 2019.07.22 文章已更新:[igtl-again] 我去图书馆-抢座主逻辑详解-https://zhuanlan.zhihu.com/p/74706139二叉树:[igtl-again]我去图书馆-抢座主逻辑详解​zhuanlan.zhihu.com写在前面项目地址: RenjiaLu9527/...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

我去图书馆抢座脚本