python抢票开发——设备预约助手实现

  女朋友是药学院的,做实验时需要在特定的网站上进行设备预约,由于预约人数过多,从而导致从浏览器登录不进去或者登录进去预约失败等情况,所以我用python帮她写了一个抢位助手,让程序自动去进行位置预定,实测表明,程序的设备预定运行结果十分理想,可以预约到自己想要预约的时间段以及设备。下面分享我是如何编写该软件助手的。

  首先,在浏览器开发者工具上查看浏览器和设备预定服务器的交互信息,找出关键的信息,如登录页的URL,登录信息提交页的URL,post提交的数据,Cookies信息等。这个过程不涉及编程操作。

  在浏览器上,经过了登录,一系列的跳转和点击后,就到了设备预约提交页面,然后点击提交按钮之后,设备预约就成功了,在网络调试窗口中,发现点击提交按钮之后,浏览器向后台页面http://222.200.178.***/Appointment/Appointment 发起了POST 请求,查看POST请求参数后,发现参数信息含有预约时间,预约设备ID等信息,POST参数如下:

POST参数
SubjectId=2e5f5627-3bbf-4aae-ac2b-b5cc586f4d70
SubjectProjectId
SampleNo
SampleCount
SampleStuff
SampleSize
Target
UseNature=0
ExperimentationContent
isSelectTimeScope=false
beginTime=2019-05-26 8:0
endTime=2019-05-26 8:0
userId
AppointmentStep=15
AppointmentTimes=2019-05-27 12:30:00,2019-05-27 12:45:00
EquipmentId=17ee43c4-bb30-4e43-8e6b-b82de698e20b
EquipmentPartIds
ChangeAppointmentId
VirtualEquipmentBindId
AppointmentFeeTips=false

  现在,基本可以明确进行设备预约需要向后台提交的数据以及提交的地址了。为了测试该POST请求正确,我把POST请求的内容复制为curl 字段了,然后在Linux shell下运行该curl字段,

curl "http://222.200.178.***/Appointment/Appointment" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:67.0) Gecko/20100101 Firefox/67.0" -H "Accept: */*" -H "Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2" --compressed -H "Referer: http://222.200.178.58/Admin?CenterBoxUrl=/Equipment/AppointmentBoxIndex"%"3Fid"%"3D17ee43c4-bb30-4e43-8e6b-b82de698e20b"%"26time"%"3D424" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "X-Requested-With: XMLHttpRequest" -H "Connection: keep-alive" -H "Cookie: ASP.NET_SessionId=yn2ot2upq03e2fssruvambif; .ASPXAUTH=43CAFF53FC7CC0B81B29369AAA24B3DB9BAB78E5E52FC467BE9CB3728B82AD0E0C55F5C92F077AE302C15F9C730018E4690E8705C18EF602A34BE70988E617710376CDC6C44C0472F8028F54B4EF5BF7E7B8DD72748C249578473E3E56CC1035FA86E765179B392276AC9DB0D098227F7BBFDE954136B1BB0EB39C4B0B1F3D25" --data "SubjectId=2e5f5627-3bbf-4aae-ac2b-b5cc586f4d70&SubjectProjectId=&SampleNo=&SampleCount=&SampleStuff=&SampleSize=&Target=&UseNature=0&ExperimentationContent=&isSelectTimeScope=false&beginTime=2019-05-26 8:0&endTime=2019-05-26 8:0&userId=&AppointmentStep=15&AppointmentTimes=2019-05-27 12:30:00,2019-05-27 12:45:00&EquipmentId=17ee43c4-bb30-4e43-8e6b-b82de698e20b&EquipmentPartIds=&ChangeAppointmentId=&VirtualEquipmentBindId=&AppointmentFeeTips=false"

  返回的结果是提示我设备预约成功。到了这一步,可以理出一个基本的编程实现思路:构造POST请求参数,向指定的URL提交POST请求,用python实现就是import requests, requests.post(url,postdata),很简单,对不对。嗯嗯~,是不是我们的设备预约助手到这里就可以结束呢,回头再看一下curl 字段的内容,发现了下面的cookies 信息

Cookie: 
ASP.NET_SessionId=yn2ot2upq03e2fssruvambif;
.ASPXAUTH=43CAFF53FC7CC0B81B29369AAA24B3DB9BAB78E5E52FC467BE9CB3728B82AD0E0C55F5C92F077AE302C15F9C730018E4690E8705C18EF602A34BE70988E617710376CDC6C44C0472F8028F54B4EF5BF7E7B8DD72748C249578473E3E56CC1035FA86E765179B392276AC9DB0D098227F7BBFDE954136B1BB0EB39C4B0B1F3D25

   既然存在cookie信息,我们每次和服务器进行交互时,就得把cookie值带上,cookie有两个,一个是ASP.NET_SessionId,另一个是.ASPXAUTH。那么服务器是什么时候把这两个cookie值提交过来的呢?我还是在浏览器上做尝试。重新返回登录界面,打开调试窗口,找到cookie参数项,发现了ASP.NET_SessionId 值,但却没看到.ASPXAUTH 值,输入账号密码之后,验证通过之后,可以看cookie参数项存在.ASPXAUTH ,至此,两个cookie值可以拿到了。

  现在,可以重新理一下编程的思路了:先访问登录界面url,获取ASP.NET_SessionId 值,然后向后台登录链接发送POST请求,验证成功之后就可以获取到.ASPXAUTH cookie值,接着就是构造POST请求参数,向指定的预约URL提交POST请求,至此,整个预约助手的工作流程就明朗了。

  下面是源代码:

#!/bin/bash/python3
#coding:utf-8
#实验设备抢位助手,开发by linjunji in SYSU 2019-05-27
import requests
from datetime import datetime,timedelta
import hashlib
import sys
import time
import configparser
import re
import base64
import logging
import webbrowserlogging.basicConfig(level=logging.INFO,format='%(asctime)s: %(message)s')#定义登录提交URL以及预约请求URL
login_url="http://222.200.178.***/Account/Login"  #登录界面url
vaild_url="http://222.200.178.***/Account/LoginSubmit"  #账号密码提交验证URL
appointment_url="http://222.200.178.***/Appointment/Appointment"  #预约请求提交页面#定义头部信息
user_agent="Mozilla/5.0 (Windows NT 10.0; WOW64; rv:67.0) Gecko/20100101 Firefox/67.0"
referer="http://222.200.178.***/Admin?CenterBoxUrl=/Equipment/AppointmentBoxIndex%3Fid%3D17ee43c4-bb30-4e43-8e6b-b82de698e20b%26time%3D424"
Content_Type="application/x-www-form-urlencoded"
header={'User-Agent':user_agent,'Referer':referer,'Content-Type':Content_Type}#密码MD5计算
def get_password_md5(password):password_bin=password.encode("utf-8")m=hashlib.md5()m.update(password_bin)return m.hexdigest()#用户名base64编码
def get_base64_loginname(name):name_b = base64.b64encode(name.encode("utf-8"))return name_b.decode("utf-8")postdata={'SubjectId':'2e5f5627-3bbf-4aae-ac2b-b5cc586f4d70','SubjectProjectId':'','SampleNo':'','SampleCount':'','SampleStuff':'','SampleSize':'','Target':'','UseNature':'0','ExperimentationContent':'','isSelectTimeScope':'false','beginTime':'2019-05-27 8:0', #该字段是否会改变'endTime':'2019-05-27 8:0','userId':'','AppointmentStep':'15','AppointmentTimes':'2019-05-28 21:30:00,2019-05-28 21:45:00',   #请求时间'EquipmentId':'17ee43c4-bb30-4e43-8e6b-b82de698e20b',           #设备ID号'EquipmentPartIds':'','ChangeAppointmentId':'','VirtualEquipmentBindId':'','AppointmentFeeTips':'false'
}
#设备ID和名称对应表
device_msg={"819a7b77-dc03-40f8-b1ef-1824ea8e4683":"400M核磁共振谱仪1","17ee43c4-bb30-4e43-8e6b-b82de698e20b":"400M核磁共振谱仪2 (AvanceIII)","6a7f349d-6295-4a53-817d-413f35be07bb":"500M超导核磁共振波谱仪-3"
}
pattern_title=re.compile('<div class="a_center f_bold">(.+)</div>') #匹配标题 ['您的预约已提交,请在预约时间前24小时登录确认!您当前的预约时间如下:']
pattern_head=re.compile('<th>(.+?)</th>')   #匹配行数 ['开始时间', '结束时间', '时长']
pattern_time=re.compile('<td>([^//td<>]+?)</td>')  #['2019年05月28 21时30分', '2019年05月28 22时00分', '0.5', '</td><td>', '共:0.5']if __name__=="__main__":#读取配置文件,从配置文件读取登录名,密码,预订时间,设备信息cf=configparser.ConfigParser()  #读取配置文件try:cf.read('config.ini')user_name = cf.get('user', 'name')user_password = cf.get('user','password')time1 = cf.get('time1','time')time2 = cf.get('time2', 'time')time3 = cf.get('time3', 'time')time4 = cf.get('time4', 'time')device_id=cf.get('device','device_id')except Exception as e:logging.info('【respone】配置文件读取异常,请检查!,程序两秒钟后退出')logging.info(e)time.sleep(2)sys.exit()logging.info("【respone】成功加载配置文件")logging.info("【respone】{},欢迎您进入自动预订系统".format(user_name))nextday=(datetime.now()+timedelta(days=1)).strftime('%Y-%m-%d')booking_time=[time1,time2,time3,time4]time_str=[' '.join([nextday,t]) for t in booking_time if len(t)>0]booking_time_str=','.join(time_str)begin_time="{} 8:0".format(nextday)end_time=begin_time#定义post提交数据postdata["beginTime"] = begin_timepostdata['endTime'] = end_timepostdata['AppointmentTimes'] = booking_time_strpostdata['EquipmentId'] = device_idlogging.info("【respone】你将要预约的时间是:{}".format(booking_time_str))logging.info("【respone】你将要预订的设备是:{}".format(device_msg[device_id]))s = requests.Session()  # session会话会自动把cookie带进去# post提交登录信息data = {"LoginName": get_base64_loginname(user_name), 'LoginPassword': get_password_md5(user_password),'date': ''}r = s.post(vaild_url, headers=header, data=data, allow_redirects=True)# 打印出cookies信息for cookies in r.cookies.keys():logging.debug(cookies+':'+r.cookies.get(cookies))r.encoding = "utf-8"logging.debug(r.text)if (r.text.find("true") > 0):logging.info("【respone】你已经成功登录设备预约系统...正在等待系统开放预约操作 ")else:logging.info("【respone】登录失败,请重新运行程序尝试,按任意字符退出")sys.exit()logging.info("【respone】提醒:程序将于21点59分55秒进行设备预订,请勿关闭本程序")while(True):now = datetime.now()hour = now.hour  # 小时minutes = now.minute  #second = now.second  #if hour == 21 and minutes == 59 and second > 45:logging.info("【respone】10s后开始进行设备预定")for i in range(10):time.sleep(1)logging.info("【respone】{}s...".format(10 - i))breaklogging.info("【respone】开始进行设备预约")try:r=s.post(appointment_url,data=postdata,headers=header,timeout=10)r.encoding='utf-8'rst=r.textfilename="booking_result.html"f=open(filename,'w',encoding="utf-8")f.write("<head>")f.write("<meta charset='UTF-8'>")f.write("<title>预订结果如下</title>")f.write("</head>")f.write(r.text)f.close()logging.info("【respone】预订结果在浏览器在浏览器查看")webbrowser.open(filename)except Exception as e:logging.info("【respone】本次预约可能失败,请用网页登进系统查看")logging.info(e)

 程序运行结果如下,到时间之后就会开始预约请求,请求结果将会在浏览器中显示。

转载于:https://www.cnblogs.com/mangojun/p/10945412.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618715.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

春节Python抢票神器,支持候补抢票真的无敌了

想要回家的小伙伴们,大概经历了一波抢票大战。 一年一度春运着实让人难熬 这次顺便把一个Python抢票工具,送到了GitHub趋势榜第一。 项目名很干脆,就是12306,来自名叫文贤平的程序员。 这很可能是全GitHub最德高望重的购票小助手了,功能一直在更新,且现已支持Python …

Java IO流动(实战操作)

目录 1 IO流原理2 IO流的分类3 输入、输出流代码示例4 小结5 文件在前后台之间传递 在Java中&#xff0c;IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据&#xff0c;平日开发中在文件读写&#xff0c;网络通信&#xff0c;特定场景的数据库…

老话题,火车票抢票助手,简化版 (漏洞已经失效^_^)

用了“二杠”兄弟的工具测试了抢票&#xff0c;先举个大拇指。牛&#xff01;可是我实在看不惯他画的界面&#xff0c;而且需要认证和访问他服务器上的wcf服务。看到许多园友都号称“破解”了。我也请出"Reflector"神器&#xff0c;尝试了下。发现把源exe文件作为app…

python模拟火车订票系统_如何用python编写火车抢票助手

前几天跟朋友说打算写一个抢票助手&#xff0c;最后由于某些原因念头打消了。 可就在昨天晚上&#xff0c;才隐约记起一年前的自己曾经说过&#xff1a;一年后我一定要写一个12306的抢票助手&#xff01;瞬间激情澎湃&#xff0c;甚至已经是快临近凌晨时便开始动工&#xff0c;…

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

Yolo系列-yolov3

YOLO-V3 这张图讲道理真的过分了&#xff01;&#xff01;&#xff01;我不是针对谁&#xff0c;在座的各位都是 终于到V3了&#xff0c;最大的改进就是网络结构&#xff0c;使其更适合小目标检测特征做的更细致&#xff0c;融入多持续特征图信息来预测不同规格物体 先验框更丰…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp &#xff0c;适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

游戏服务器架构通识

前言 这节讲座里&#xff0c;我们将从游戏服务器发展的简单历程出发&#xff0c;鸟瞰一下目前大多数的游戏服务器架构。 这里尽可能的避免陷入细节的技术问题&#xff0c;而是从技术进化的结果状态&#xff0c;反推原始问题是什么。希望能通过这个过程&#xff0c;解释清楚游戏…

游戏服务器架构设计整理

文章目录 前言一、单进程多线程的服务器设计模式&#xff0c;只有一个进程&#xff0c;但一个进程包好多个线程二、多进程单线程的服务器设计模式&#xff0c;多个进程&#xff0c;每个进程只有一个线程1.早期的MMORPG服务器结构2.中期-用户分离集群式3.中后期数据分离集群式4.…

游戏服务器被攻击了怎么办?

随着互联网的发展&#xff0c;网民数量激增&#xff0c;电子游戏的普及&#xff0c;庞大的玩家数量必然推动游戏市场发展。游戏受到攻击是游戏开发者的痛点&#xff0c;DDOS攻击是流量攻击的一个总称&#xff0c;还包括SYN Flood、ACK Flood、UDP Flood、TCP Flood、ICMP Flood…

经典游戏服务器端架构

文章目录 一、 讨论的背景二、 游戏服务器架构的要素三、核心的三个架构四、 游戏服务器模型的进化历程五、分服模型1.模型描述2.调度架构1.单进程游戏服务器2.多进程游戏服务器 3.内存架构1.动态内存2.预分配内存 4.进程间通讯手段1.Socket通讯2.消息队列3.远程调用 5.容灾和扩…

哪家的云游戏服务器好?如何选择云游戏服务器?

现如今&#xff0c;不少行业领域都对云服务器有不少的需求&#xff0c;尤其是游戏行业&#xff0c;需要专门的云游戏服务器。目前市场上的云游戏服务器有很多种类型&#xff0c;那么&#xff0c;哪家的云游戏服务器好呢&#xff1f;如何选择云游戏服务器&#xff1f;下面就跟着…

游戏开发商如何租用合适稳定的游戏服务器?

随着互联网的快速发展&#xff0c;网络游戏的发展令人目不暇接。有些游戏开发商在开发游戏时&#xff0c;对游戏服务器的要求非常高&#xff0c;毕竟一款游戏最重要的是流畅度。如果大量用户在玩游戏&#xff0c;而游戏直接因为服务器的宕机而崩溃&#xff0c;这种体验可能会直…

游戏服务器开发

1 2-课程概述 https://www.bilibili.com/video/BV1Ks41177oi?fromsearch&seid5543458349378694564nodejs lua STL IO 语言方面 精简 不像Python 无统一 游戏服务器 工作量 不是 网络连接 是 逻辑的 实现 定义 一个 struct 有两个成员 指针 和 值 …

从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

目录 引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试 总结 引言 由于现在java web太卷了&#xff0c;所以各位同行可以考虑换一个赛道&#xff0c;做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识&#xff0c;给新人们一些…

鹅厂公开课:游戏服务器,了解一下?

讲师简介&#xff1a;张正&#xff0c;腾讯互娱北极光工作室群专家工程师&#xff0c;拥有12年游戏后台开发经验&#xff0c;主导和参与了《天涯明月刀》、《轩辕传奇》等自研大型MMORPG项目的后台开发&#xff0c;现担任《天涯明月刀》项目后台技术总监&#xff0c;北极光后台…

游戏服务器的那些事儿

游戏程序开发有两个大方向&#xff0c;包括前端和后端。其中&#xff0c;前端是指客户端方面&#xff0c;包括PC、手机和平板上面的可视化图形技术。后端则偏向于服务器&#xff0c;即用户不可见的部分。本文将通过游戏服务器的起源、功能特点、分类和发展历史&#xff0c;以及…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

通达信形态匹配选股,不会编写指标公式也可以形态选股

编写指标公式匹配技术形态难度比较高&#xff0c;公式也很复杂&#xff0c;新手往往难以掌握&#xff0c;即使是老手也常常感到困难。之前编写了N字形态、W底&#xff08;双底&#xff09;、头肩底&#xff0c;虽然成功完成&#xff0c;但工作量巨大&#xff0c;公式理解起来也…

python函数学习

def add(num1,num2):resultnum1num2print(f"函数add输出的结果是{result}")return result resultadd(int(num1), int(num2)) print(f"调用def add(num1,num2):这个函数最终返回的结果是: {result}")# 函数返回值 ②无返回值&#xff08;也就是说是返回值类…