吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10734|回复: 38
收起左侧

[Python 转载] 北京医院预约挂号平台,python 自动监控程序

  [复制链接]
alinwan0922 发表于 2020-9-27 17:20
本帖最后由 alinwan0922 于 2020-10-10 16:26 编辑

朋友 想挂北京人民医院的号,无奈一直无号,故而我简单写了一个 0.1版的自动刷新监控固定科室的程序

我是渣渣水平 python  刚学一两天。 大佬想做个好的,记得给我用用~~~~~
上代码
[Python] 纯文本查看 复制代码
from time import sleep

from selenium import webdriver

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender = '写自己的'    # 发件人邮箱账号
my_pass = '写自己的'              # 发件人邮箱密码(当时申请smtp给的口令)
my_user = ['1391@qq.com', 'Aig@163.com']      # 收件人邮箱账号,我这边发送给自己


def mail():
    ret = True
    try:
        msg = MIMEText('监测到号了,赶紧去挂噢!小可爱', 'plain', 'utf-8')
        msg['From'] = formataddr(["你的二狗子", my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
        # 括号里的对应收件人邮箱昵称、收件人邮箱账号
        msg['To'] = ",".join(my_user)
        msg['Subject'] = "监测到号了,赶紧去挂噢!小可爱"                # 邮件的主题,也可以说是标题

        server = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP服务器,端口是465
        server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码
        # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
        server.sendmail(my_sender, my_user, msg.as_string())
        server.quit()  # 关闭连接
    except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
        ret = False
    return ret


driver = webdriver.Chrome()  # 需要 下载 对应浏览器 驱动到 python 安装目录
driver.get("https://www.114yygh.com/hospital/142/75fec1a900e3d4c238cf384556de46de/200051666/source")  # 刷新网址     填写你要监控的网站

while True:
    driver.refresh()  # 刷新网页
    sleep(30)  # 五秒一次
    el = driver.find_elements_by_class_name("calendar-list-wrapper")
    if(len(el) > 0):
        if("有号" in el[0].text):
            mail()
            # divlist = driver.find_elements_by_class_name("calendar-item")
            # for div in divlist:     # 第一个实例
            #     div.click()
            #     try:
            #         button = driver.find_elements_by_class_name("v-button")
            #         if(len(button) > 0):
            #             for bt in button:     # 第一个实例
            #                 if("剩余" in bt.text):
            #                     bt.click()
            #                     gh = driver.find_elements_by_class_name("v-button")
            #                     gh.click()

            #     except IOError:
            #         print("1")
            #     else:
            #         print("1")

免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
金牌韭菜 + 1 我很赞同!
未来老中医 + 1 + 1 谢谢@Thanks!
chao8709 + 1 + 1 热心回复!
www.52pojie.cn + 1 + 1 变相晒女票,枪毙五分钟

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

天黑我隐身 发表于 2020-9-27 21:35
本帖最后由 天黑我隐身 于 2020-9-27 22:25 编辑

有点意思,我也来一份手机验证码登录代码

# Created by 咸鱼 at 2020/9/27 8:48 下午
"""
    requirement:
        httpx==0.15.4
        pycrypto==2.6.1
"""
import os
import time
import base64
import asyncio
from datetime import datetime
from Crypto.Cipher import AES
from httpx import AsyncClient
from typing import Coroutine, Optional
from http.cookiejar import MozillaCookieJar

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
    'Referer': 'https://www.114yygh.com/',
    'Request-Source': 'PC',
    'Origin': 'https://www.114yygh.com',
    'Host': 'www.114yygh.com',
    'Content-Type': 'application/json;charset=UTF-8'
}

def encrypt(text: str) -> str:
    """AES加密"""
    key = 'hyde2019hyde2019'
    BS = AES.block_size
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    encryptor = AES.new(key, AES.MODE_ECB)
    text = encryptor.encrypt(pad(text))
    text = base64.b64encode(text).decode('utf8')
    text = text.replace('+', '-').replace('/', '_')
    return text

async def check_status(client: AsyncClient) -> bool:
    """检查用户登录状态
    :param client:
    :return:
    """
    url = f'https://www.114yygh.com/web/user/info?_time={int(time.time() * 1000)}'
    r = await client.get(url, headers=headers)
    r = r.json()
    if r.get('resCode') == 0 and r.get('data'):
        return True
    return False

async def login(username: str) -> AsyncClient:
    """手机号登录114"""
    cookies = MozillaCookieJar(f'{username}.ck')
    if os.path.exists(f'{username}.ck'):
        cookies.load()
    client = AsyncClient(cookies=cookies)
    if await check_status(client):
        return client
    await client.get('https://www.114yygh.com/')
    url = 'https://www.114yygh.com/web/common/verify-code/get?_time' \
          f'={int(time.time() * 1000)}&mobile={username}&smsKey=LOGIN'
    await client.get(url, headers=headers)
    code = input(f'{username}手机验证码: ')
    url = f'https://www.114yygh.com/web/login?_time={int(time.time() * 1000)}'
    payload = {
        'mobile': encrypt(username),
        'code': encrypt(code)
    }
    res = await client.post(url, data=str(payload), headers=headers)
    res = res.json()
    if res.get('resCode') != 0:
        raise RuntimeError(res.get('msg', ''))
    cookies.save()
    return client

async def check_order(client: AsyncClient, firstDeptCode: str,
                      hosCode: str, secondDeptCode: str) -> None:
    """检查是否有号
    :param client:
    :param firstDeptCode: 科室一级代码?
    :param hosCode: 医院代码?
    :param secondDeptCode: 科室二级代码?
    :return:
    """
    url = f'https://www.114yygh.com/web/product/list?_time={int(time.time() * 1000)}'
    payload = {
        'firstDeptCode': firstDeptCode,
        'hosCode': hosCode,
        'secondDeptCode': secondDeptCode,
        'week': 1
    }
    r = await client.post(url, data=str(payload), headers=headers)
    for data in r.json().get('data', {}).get('calendars', []):
        if data.get('status') == 'AVAILABLE':
            # TODO call mail()
            pass
            break
    print(f'{datetime.now().strftime("%X")} success call check_order')

def listen_event(cors: Coroutine, args: tuple = (),
                 interval: Optional[float] = None) -> None:
    """向事件循环添加回调函数,实现定时任务
    :param cors: 协程
    :param args: 协程参数
    :param interval: 非None时为定时事件
    :return:
    """
    loop = asyncio.get_event_loop()
    loop.create_task(cors(*args))
    if interval:
        loop.call_later(interval, listen_event, cors, args, interval)

async def main():
    # for m in ['手机号1', '手机号2', ]:
    #     client = await login(m)
    #     listen_event(
    #         check_order,
    #         (client, '75fec1a900e3d4c238cf384556de46de', '142', '200051666'),
    #         interval=30
    #     )
    client = await login('155xxxxx609')
    listen_event(
        check_order,
        (client, '75fec1a900e3d4c238cf384556de46de', '142', '200051666'),
        interval=30
    )

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(main())
    loop.run_forever()

忽然想到,我没有女朋友,还高高兴兴写个鸡儿代码?

ggogg928 发表于 2020-9-27 17:22
djhdj 发表于 2020-9-27 17:26
名字全被注册啦 发表于 2020-9-27 17:44
不是,刚学一两天就能写出这种程序吗,我哭了
付国兵123 发表于 2020-9-27 17:46
看样哥们是北京的,以后挂号不用排那么长时间队了。
刘统宝 发表于 2020-9-27 17:59
哇塞楼主太牛了,佩服啊
初夏的蒲公英 发表于 2020-9-27 18:00
膜拜大佬,不过还是推荐手动挂号。。。
华少哥 发表于 2020-9-27 18:30
这个真是不错
q137100856 发表于 2020-9-27 18:54
抢手的号,等你收到通知已经被挂了.
抓包把接口抓出来.模拟请求接口进行挂号更快
flow_one 发表于 2020-9-27 19:19
两天!!!!   卧槽!!!  这是激起我们的斗志嘛
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表