android 预约挂号代码_告别排队!用Python定时自动挂号和快捷查询化验报告

e9df08aad56f75475aa102e83e62c295.png

作者 | 阿文

来源 | 程序人生(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, data={"requestData":json.dumps(payload)}, headers=headers)if response.status_code != 200:return False
    resp_json = response.json()
    return_params = resp_json['return_params']['list']for key in return_params:if int(key['date']) == int(appointment_date):
            doctor_info  = key['doctor']for i in doctor_info:if i['id'] == 1960 and i['schedulList'][0]['am_pm_flag'] == "1":return Truedef get_time(session_id):
    pre_date = (time_now + datetime.timedelta(days=7)).strftime("%Y-%m-%d")
    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.remain.num","params": {"sourceId": "12","planId": 9759,"orderDate": str(pre_date),"ampmFlag": "1"
    },"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, data={"requestData": json.dumps(payload)}, headers=headers)if response.status_code != 200:return False
    resp_json = response.json()
    regno = resp_json['return_params']['list'][0]['regno']
    timespan = resp_json['return_params']['list'][0]['timespan']return [regno,timespan]# 在指定时间挂号def set_doctor_number(session_id,pre_date,reg_no,timeregion):
    url = "https://zyyy.zwjk.com/api/exec.htm"
    payload = {"api_Channel": "1","client_version": "3.6.6","app_id": "zyyy_android","app_key": "Zxxxx","user_type": "0","client_mobile": "863008041030718","api_name": "api.yygh.expert.reservation","params": {"card_no": "x'x'x'x", # 社保卡号"doct_name": "华佗", # 专家名称"user_name": "xxx", # 你的姓名"id_card": "xxxxx", #  身份证号"phone": "xxxx",  # 电话"reg_id": "xxxx","reg_no": reg_no, # 预约号"dept_name": "科室","yuanqu_type": "1","type": "1","dept_id": 103060302,"pre_date": str(pre_date), #预约日期"week_day": "3", # 预约日期是星期几"plan_id": 9759,"fee": "14","pre_time_type": "1","doct_id": "1960","clinic_fee": "","clinic_time":timeregion
        },"session_id": str(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, data={"requestData": json.dumps(payload)}, headers=headers)if response.status_code != 200:return False
    resp_json = response.json()
    ret_info = resp_json['return_params']['ret_info']
    send_message_wchat("浙一预约挂号结果",ret_info)# 发送消息到微信def send_message_wchat(title, content):
    loging_datetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    url = "https://sc.ftqq.com/SCU9051Tc94a746xxxf1d559xxx5a545ff.send"
    querystring = {"text": title, "desp": str(loging_datetime) + str(content)}
    response = requests.request("GET", url, params=querystring)if response != 200:returnreturn Trueif __name__ == '__main__':
    requests_session = requests.Session()
    time_now = datetime.datetime.now()
    pre_date = (time_now+datetime.timedelta(days=7)).strftime("%Y%m%d")
    session_id = login('xxxx','xxxxxx')if get_doctor_info(session_id,pre_date):
        regno = get_time(session_id)[0]
        timespan = get_time(session_id)[1]
        set_doctor_number(session_id,pre_date,regno,timespan)else:
        send_message_wchat("浙一预约挂号结果","获取列表失败,可能原因:医生不在预约列表中或者医生门诊不在上午")

然后写个计划任务每个月的第一个周三去执行脚本:

0 15 1-7 * * if [ `date '+%w'` = "3" ]; then /usr/bin/python3 /opt/hospital/zheyi.py;fi

执行脚本后结果:

9db758be8d91ed4dbd0170681d1f4ff8.png

命令行式输出化验单到 markdown 文件中

我觉得查询化验报告的功能不好用,每次都要登录App 然后输入姓名和医嘱号才能查询。

我希望对自己的病情做个管理,把每次的化验结果都保存起来进行分析,于是就实现只要输入医嘱号,就自动输出 markdown 格式的文档里面包含一张表格,如图所示:

86429efca9159f60d66106a13dcfa2ef.png

代码如下:

import requestsimport json
requests_session = requests.Session()def 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":"ZW5sNWVWOWhibVJ5YjJsaw==","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_iddef get_huayan_save(session_id,username, barcode):
        url = "https://zyyy.zwjk.com/api/exec.htm"
        payload = {"api_Channel": "1","client_version": "3.6.6","app_id": "zyyy_android","app_key": "ZW5sNWVWOWhibVJ5YjJsaw==","user_type": "0","client_mobile": "863008041030718","api_name": "api.assay.report.socket","params": {"name": username,"barcode": barcode},"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, data={"requestData": json.dumps(payload)}, headers=headers)if response.status_code != 200:return False
        resp_json = response.json()if resp_json['return_params']['ret_code'] == -1:return resp_json['return_params']['ret_info']
        file_name =  resp_json['return_params']['assayreport']['test_name']
        username = resp_json['return_params']['assayreport']['name']
        sample_type = resp_json['return_params']['assayreport']['sample_type']
        report_barcode =  resp_json['return_params']['assayreport']['report_barcode']
        send_time = resp_json['return_params']['assayreport']['send_time']
        send_name = resp_json['return_params']['assayreport']['send_name']
        assayreportdetail = resp_json['return_params']['assayreportdetail']
        entry_time = resp_json['return_params']['assayreport']['entry_time']
        entry_name = resp_json['return_params']['assayreport']['entry_name']
        audit_name = resp_json['return_params']['assayreport']['audit_name']with open(username+file_name+"+"+report_barcode+".md","at") as f:
            f.write("|项目||||"+"\n")
            f.write("|---|---|---|---|"+"\n")
            f.write("|化验项目|"+sample_type+"|"+file_name+"||"+"\n")
            f.write("|接收时间|"+send_time+"|||"+"\n")
            f.write("|报告时间|"+entry_time+"|||"+"\n")
            f.write("|送检医生|"+send_name+"|||"+"\n")
            f.write("|报告医生|"+entry_name+"|||"+"\n")
            f.write("|审计医生|"+audit_name+"|||"+"\n")
            f.write("|医嘱号|"+report_barcode+"|||"+"\n")
            f.write("\n")
            f.write("|项目|单位|结果|参考范围|"+"\n")
            f.write("|---|---|---|---|"+"\n")for i in assayreportdetail:
                item_name_info = i['item_name']try:
                    result_unit_info = i['result_unit']
                    result_data_info = i['result_data']
                    ref_range_low_info = i['ref_range_low']except KeyError:passif result_unit_info:
                    f.write("|"+item_name_info+"|"+str(result_unit_info)+"|"+result_data_info+"|"+ref_range_low_info+"|"+"\n")else:
                    f.write("|"+item_name_info+"|"+"|"+result_data_info+"|"+ref_range_low_info+"|"+"\n")if __name__ == '__main__':
    session_id = login('xxxx','xxx')
    report_barcode = input("请输入医嘱号:")
    print(get_huayan_save(session_id,"阿文",report_barcode))

后面我可以把这些数据都导入Excel 之类的表格里面进行统计分析每次的指标变化。

最后

年纪越大身体经不起体检,希望新的一年里,能够早日康复,也希望所有人都能够健康。

现在我改掉了很多坏习惯,比如熬夜、喝饮料,不吃辣、不烧烤、不饮酒、不吃高盐油腻食品等,命比这些重要。最后提醒大家,为了自己也为了家人,一定要定期体检。

(本文为 AI科技大本营转载文章,转载请联系原作者)

征稿

83234c8e158fea82de210454badf724b.png

推荐阅读:

  • 近900000条if-then关系图谱,让神经网络“懂”常识推理

  • 你的红包狂欢夜,互联网巨头们的流量争夺战

  • 程序员给银行植入病毒,分 1300 次盗取 718 万,被判 10 年半!

  • 大厂必问的分布式究竟是什么鬼?

  • ProgPow:以太坊上浮世绘

  • 这4门AI网课极具人气,逆天好评!(附代码+答疑)

  • 给AI开发者的新年礼物,技术公开课大放送(附演讲PPT)

  • 如何用最强模型BERT做NLP迁移学习?

  • “百练”成钢:NumPy 100练

                             96f1b94bd0cf3b424f436cdf502db005.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

灵动思绪EF(Entity FrameWork)

很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的EF知识整理成一片文章。今天我就用CodeFirst和ModelFirst两种方式的简单案例将自己学习的EF知识做个总结。 在讲解EF之前,我们先来看下ORM ORM全称:(Object-Relatio…

json qbytearray 串 转_JSON数据采集网关,json转Modbus RTU串IO口RS485转4~20mA边缘计算智能终端...

JSON数据采集网关边缘计算智能终端是一种能够将各种传感器仪表仪器设备的数据采集后按照JSON格式上传服务器的网关,可以实现云边协同。JSON(JavaScript Object Notation)是java中的数据格式。例如{“Energy”:”100”, “time”:”22:22:15”}这样的格式&#xff0c…

ABP入门系列(3)——领域层定义仓储并实现

一、先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。 在ABP中,仓储类要实现IRepository接口,接口定义了常用的增删改查以及…

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路

XCIE-HUAWEI-PBR-MQC-引入形成的路由环路 首先来个测试 给你们选,答案选啥呢? 正确答案在结尾公布 正确答案是C 为什么呢? 首先,虽然ACL有一个齐总是拒绝的,但是呢,他两都是同一条路由 但是呢!&#x…

ABP入门系列(5)——展现层实现增删改查

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 这一章节将通过完善Controller、View、ViewModel,来实现展现层的增删改查。最终实现效果如下图: 展现层最终效果 一、定义Controller ABP对ASP.NET MVC Controlle…

限制会话id服务端不共享_不懂 Zookeeper?看完不懂你打我

高并发分布式开发技术体系已然非常的庞大,从国内互联网企业使用情况,可发现RPC、Dubbo、ZK是最基础的技能要求。关于Zookeeper你是不是还停留在Dubbo注册中心的印象中呢?还有它的工作原理呢?经典应用场景呢?对前面三个…

防抖与节流方案_前端ajax优化解决方案

伴随着前端ajax的应用场景越来越多,那就免不了一个整合的ajax优化解决方案了,自己优化太麻烦?没事,有它帮你解决:hajax 与当下比较热门的请求库 axios 和原生的 fetch相比,hajax有什么一些什么内容和特点呢…

ABP入门系列(6)——定义导航菜单

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了增删改查以及页面展示,这一节我们来为任务清单添加【导航菜单】。 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这…

ABP入门系列(7)——分页实现

ABP入门系列目录——学习Abp框架之实操演练源码路径:Github-LearningMpaAbp 完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊。 来来来,这一节咱们就来捋一捋如…

下载matlab安装包太慢_Matlab2017a软件安装包以及安装教程

安装步骤:1.如图所示,完整的安装包应该有13个压缩包,必须要全部下载完成才能解压。鼠标右击“thMWoMaR17a.part01.rar”压缩包,选择“解压到thMWoMaR17a”,然后等待解压完成2.打开“thMWoMaR17a”文件夹,解…

【转】ORM系列之Entity FrameWork详解

一. 谈情怀 从第一次接触开发到现在(2018年),大约有六年时间了,最初阶段连接数据库,使用的是【SQL语句ADO.NET】,那时候,什么存储过程、什么事务 统统不理解,生硬的将SQL语句传入SQL…

springcloud 微服务鉴权_Java微服务框架spring cloud

Spring Cloud是什么Spring Boot 让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,…

ABP入门系列(9)——权限管理

1.引言 完成了简单的增删改查和分页功能,是不是觉得少了点什么? 是的,少了权限管理。既然涉及到了权限,那我们就细化下任务清单的功能点: 登录的用户才能查看任务清单用户可以无限创建任务并分配给自己,但…

c#quartz触发_SpringBoot集成Quartz实现定时任务

1 需求在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计。我的设计是按天统计每种状态的比例。为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态。另外,考虑到学生的请…

ABP入门系列(10)——扩展AbpSession

一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Session是定义在Controller中的类型为HttpSessionStateBase的属性。 public HttpSessionStateBase Session { get; set; } 再来看看AbpSession是何须类也&#xff0c…

太吾绘卷第一世攻略_耽美推文-BL-仿佛在攻略一只河豚

目录:《全能攻略游戏》by公子如兰《无限升级游戏》by暗夜公主《无限游戏》BY SISIMO《请听游戏的话》by木兮娘《游戏,在线直播》by雨田君《最强游戏制作人》by木兰竹《在逃生游戏里撩宿敌》by临钥《游戏加载中》by龙柒《狩猎游戏》by砯涯《当异性参加逃生…

ABP入门系列(11)——编写单元测试

1. 前言 In computer programming, unit testing is a software testing method by which individual units of source code, sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures, are tested …

etl构建数据仓库五步法_带你了解数据仓库的基本架构

数据仓库的目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。其实数据仓库本身并不“生产”任何数据,同时自身也不需要“消费”任何的数据,数据来源于外部,并且开放给外部应用&a…

ABP入门系列(12)——如何升级Abp并调试源码

1. 升级Abp 本系列教程是基于Abp V1.0版本,现在Abp版本已经升级至V1.4.2,其中新增了New Feature,并对Abp做了相应的Enhancements,以及Bug fixs。现在我们就把它升级至最新版本,那如何升级呢? 下面就请按我…

聚类分析在用户行为中的实例_看完这篇,你还敢说不懂聚类分析?

点击上方蓝色字关注我们~大数据分析中的应用,最常用的经典算法之一就是聚类法,这是数据挖掘采用的起步技术,也是数据挖掘入门的一项关键技术。什么是聚类分析?聚类分析有什么用?聚类算法有哪些?聚类分析的应…