【Python】监控某几个城市是否有疫情-微信通知

2022-07-31 / 编程技术 / 511 阅读

因家人、亲友分布在不同城市,平时需要关注,某几个城市疫情情况,故使用Python3编写,城市疫情巡查代码;

将Python代码部署在linux服务器中,设置定时检测,某城市是否有疫情(本土,无症状),如果有则使用企业微信应用进行通知;

个人微信通过关注自建的应用,可实现个人微信通知
新建立的企业微信应用,如果想实现个人微信通知,使用个人微信关注一下,自己的应用的二维码:https://work.weixin.qq.com/wework_admin/frame#/profile/wxPlugin
个人微信效果消息详情板式;

请将代码中的以下几个参数,更改为您应用所属的相应参数。

  • corpid:为企业ID

  • corpsecret:为企业自建应用Secret

  • agentid:企业微信应用ID


暂时不支持区、地级市(后期空了,会增加区、地级市县的支持)
Python3代码如下


import requests
import json
import datetime
#人生短 行路难 日向晚 声声慢
 
get_haeders = {
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 MicroMessenger/7.0.4.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF'}
# 提醒模式,0为确认和本土新增不等于0均提醒,1为本土新增,就提醒
pattern = 0
#首都、直辖市
city_list = ['上海', '北京', '重庆']
 
#某省份具体城市-不包含区、地级市,县
province_list = [["浙江", "杭州"], ["浙江", "温州"],["江西","南昌"], ["江苏", "南京"], ["江苏", "苏州"], ["广东", "广州"], ["广东", "深圳"], ["湖北", "武汉"],
                 ["山东", "济南"], ["山东", "烟台"]]
remind_data_list = []
 
# 直辖市检索,例如北京、重庆
def trend(city):
    # 直辖市,例如北京、重庆
    trend_api = "https://voice.baidu.com/newpneumonia/getv2?from=mola-virus&stage=publish&target=trend&isCaseIn=1&area=%s&callback=jsonp_1658603969655_13080" % city
    try:
        # print('巡查城市:%s' % city)
        data = json.loads(requests.get(trend_api, headers=get_haeders).text[26:-2])
        # 新增确诊-改为无症状
        new_diagnosis_name = data['data'][0]["trend"]['list'][5]['name']
        new_diagnosis = data['data'][0]["trend"]['list'][5]['data'][-1]
        # 新增本土
        mainland_diagnosis_name = data['data'][0]["trend"]['list'][4]['name']
        mainland_diagnosis = data['data'][0]["trend"]['list'][4]['data'][-1]
 
        # 模式判断,本土新增和确诊都不等于0 并且模式开启为0
        if new_diagnosis > 0 or mainland_diagnosis > 0 and pattern == 0:
            city_data = "%s %s:%s %s:%s" % (
                city, new_diagnosis_name, new_diagnosis, mainland_diagnosis_name, mainland_diagnosis)
            remind_data_list.append(city_data)
 
        # 模式判断,本土新增不等于0 并且模式开启为1
        if mainland_diagnosis > 0 and pattern == 1:
            city_data = "%s:%s:%s" % (city, mainland_diagnosis_name, mainland_diagnosis)
            remind_data_list.append(city_data)
    except Exception as e:
        print(e)
 
 
# 省份城市检索,例如,湖北-武汉
def trendCity(trendCity_data):
    # 省份城市,例如,湖北-武汉
    province = trendCity_data[0]
    city = trendCity_data[1]
    trendCity_api = 'https://voice.baidu.com/newpneumonia/getv2?from=mola-virus&stage=publish&target=trendCity&area=%s-%s&callback=jsonp_1658605859355_94952' % (
        province, city)
    try:
        data = json.loads(requests.get(trendCity_api, headers=get_haeders).text[26:-2])
        # print(data['data'][0])
        # # 新增无症状
        new_diagnosis_name = data['data'][0]['trend']['list'][0]['name']
        new_diagnosis = data['data'][0]["trend"]['list'][0]['data'][-1]
 
        # # 新增本土
        mainland_diagnosis_name = data['data'][0]["trend"]['list'][1]['name']
        mainland_diagnosis = data['data'][0]["trend"]['list'][1]['data'][-1]
 
        # 模式判断,本土新增和新增无症状都不等于0 并且模式开启为0
        if new_diagnosis > 0 and mainland_diagnosis > 0 and pattern == 0:
            city_data = "%s %s:%s %s:%s" % (
                city, new_diagnosis_name, new_diagnosis, mainland_diagnosis_name, mainland_diagnosis)
            remind_data_list.append(city_data)
 
        # 模式判断,本土新增不等于0 并且模式开启为1
        if mainland_diagnosis > 0 and pattern == 1:
            city_data = "%s:%s:%s" % (city, mainland_diagnosis_name, mainland_diagnosis)
            remind_data_list.append(city_data)
 
    except Exception as e:
        print(e)
 
 
def work_wechat_access():
    # 企业微信应用生成access_token
    #企业ID,此连接查看:https://work.weixin.qq.com/wework_admin/frame#profile/enterprise
    corpid = '企业ID'
    #企业自建应用Secret,路径,企业微信pc端--应用管理--找到自建建立的应用--点击-在打开的页面会看到。获取企业自建应用Secret,需要登录企业微信app才可以看到
    corpsecret = '企业自建应用Secret'
    work_access_token_api = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (
        corpid, corpsecret)
    work_access_token_data = requests.get(work_access_token_api).json()
    work_access_token = work_access_token_data['access_token']
    return work_access_token
 
 
def work_message_send(content_data):
    # 企业微信应用发送消息,发个某用户,如果发全员则需要touser的值为[url=home.php?mod=space&uid=358033]@all[/url] ,多个用户用逗号隔开;
    access_token = work_wechat_access()
    message_api = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
    data = {
        "touser": "@all",#企业微信通讯录里面,点击某个成员资料,查看生成的成员帐号,一般情况为字母,此参数为@all则,应用可见范围的全员成员
        "msgtype": "text",
        "agentid": 123456789,#你的企业微信应用ID,类型int(数字),路径,企业微信pc端--应用管理--找到自建建立的应用--点击-在打开的页面会看到AgentId。
        "text": {"content": content_data},
        "safe": 0,
        "enable_id_trans": 0,
        "enable_duplicate_check": 0
    }
    requests.post(message_api, json=data)
 
 
def log_time():
    # 日志时间,格式:2022-7-26 4:32:25
    data_time = datetime.datetime.now()
    str_time = "%s-%s-%s %s:%s:%s" % (
        data_time.year, data_time.month, data_time.day, data_time.hour, data_time.minute, data_time.second)
    return str_time
 
 
# 启动省份-城市查询
for i in range(len(province_list)):
    trendCity(province_list[i])
# 启动直辖市查询
for i in range(len(city_list)):
    trend(city_list[i])
if len(remind_data_list) != 0:
    # 微信提醒标题需要编码,已废弃
    # remind_name=urllib.parse.quote('监控的城市,有疫情影响')
    remind_name = '监控的城市,有疫情影响'
    remind_data = ''
    # 如果监控的城市有疫情,则进行遍历,且进行微信提醒;
    for i in range(len(remind_data_list)):
        remind_data = remind_data + remind_data_list[i] + "\n"
    # 依托微信企业应用,实现个人微信提醒;
 
    work_message_data = remind_name + "\n" + remind_data + "日期:" + log_time() + "\n<a href=\"https://voice.baidu.com/act/newpneumonia/newpneumonia/\">点击查看全国疫情实时数据</a>"
    #如果没有提醒,请print下一行代码,如果返回的信息里面,有IP地址格式的东西
    # 请设置应用企业可信IP,路径,企业微信pc端--应用管理--找到自建建立的应用--点击-在打开的页面,最下面会看到企业可信IP设置。
    work_message_send(work_message_data)
 
print('疫情巡查结束' + log_time())


#免责声明#

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络收集整理,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!