作者 | 阿文
来源 | 程序人生(ID: coder_life)
我什么要做这个事情
去年单位体检查出问题来,经过穿刺手术确诊是个慢性肾脏病2期, IGA 肾病三期,可能大家对于这个病并不是很了解,但是另外一个词可能大家都听过,叫"尿毒症"。
慢性肾脏病分五期,终末期就是尿毒症。慢性肾脏病非常隐秘,并且病情进展缓慢,一般到尿毒症需要0-20年时间,如果不是体检化验尿液看里面的隐血和尿蛋白指标,根本没任何感觉。
三甲医院人满为患,挂号跟春运买火车票一样的,很麻烦。所以我打算用程序员的方式来解决挂号这件事。
实现自动挂号代码
于是就自己通过 Charles 抓包分析了医院的 App 的请求,这里是分析浙江大学第一附属医院的 App,然后用 Python 写了个脚本去模拟登录医院的 App 然后去挂号,具体代码如下:
import requestsimport jsonimport timeimport datetimefrom dateutil.relativedelta import relativedelta# 登录获取session_iddef login(username,password):
url = "https://zyyy.zwjk.com/api/exec.htm"
data = {
"api_Channel":"1","client_version":"3.6.6","app_id":"zyyy_android","app_key":"xxxx","user_type":"0","client_mobile":"863008041030718","api_name":"api.user.user.login.info","params":{
"phone":username, # 账号"psw":password}, # 密码
}
headers = {
'Content-Type': "application/x-www-form-urlencoded",'User-Agent': "health",'Host': "zyyy.zwjk.com",'Connection': "Keep-Alive",'Accept': "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",'cache-control': "no-cache",
}
response = requests_session.post( url, data={
"requestData":json.dumps(data)}, headers=headers)if response.status_code != 200:return False
resp_json = response.json()
session_id = resp_json['return_params']['user_model']['session_id']return session_id# 获取挂号信息def get_doctor_info(session_id,appointment_date):
url = "https://zyyy.zwjk.com/api/exec.htm"
payload = {
"api_Channel":"1","client_version":"3.6.6","app_id":"zyyy_android","app_key":"xxxx","user_type":"0","client_mobile":"863008041030718","api_name":"api.yygh.expert.schedule.list","params":{
"type_id":1,"source_id":"12","dept_id":26,"page_no":1,"page_size":2147483647
},"session_id":session_id}
headers = {
'Content-Type': "application/x-www-form-urlencoded",'User-Agent': "health",'Host': "zyyy.zwjk.com",'Connection': "Keep-Alive",'Accept': "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",'cache-control': "no-cache",
}
response = requests_session.post(url, dat