用 Python 向企业微信群机器人推送天气信息

目标是每天早上让企业微信群里自动出现一条上海天气。做法:群里加一个自定义机器人,Python 抓天气网页、把描述文本 POST 到机器人的 webhook,再挂 crontab。

群里添加机器人

在群设置里添加自定义机器人,复制生成的 webhook 地址,后面脚本里的 webhook 就填它。

WeChat1

推送脚本

脚本从墨迹天气的城市页取 description meta 里的天气描述,作为 text 消息发给 webhook;mentioned_list 与 isAtAll 控制是否 @ 全体,不需要就去掉。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import re
import urllib.request
import json
import sys
import os
 
headers = {'Content-Type': 'application/json;charset=utf-8'}
##拷贝企业微信机器人生成的webhook
webhook = "企业微信机器人webhook"
def msg(text):
    message= {
     "msgtype": "text",
        "text": {
            "content": text, ##注意后面跟【逗号】
	    "mentioned_list":["@all"] ##@群里所有人,可以不加
        },
        "at": {
            "isAtAll": True
        }
    }
    print(requests.post(webhook,json.dumps(message),headers=headers).content)
url = "https://tianqi.moji.com/weather/china/shanghai/minhang-district"    ##要爬取天气预报的网址(china后面是各个省市的地址)
par = '(<meta name="description" content=")(.*?)(">)' 
 
opener = urllib.request.build_opener()
urllib.request.install_opener(opener)
html = urllib.request.urlopen(url).read().decode("utf-8")
 
##提取需要爬取的内容
data = re.search(par,html).group(2)
msg(data)

执行与结果

加执行权限跑一次,返回 errcode:0 即成功:

[root@localhost script]# chmod +x weather.py 
[root@localhost script]# ./weather.py 
b'{"errcode":0,"errmsg":"ok"}'

群里收到的消息效果:

WeChat2

之后用 crontab 定时执行就能做到每天自动发送。

只在工作日推送

更进一步:调节假日接口判断当天日期,工作日推送、节假日跳过。完整脚本如下,注意这个版本请求头的字符集改成了 gbk,年份变量按需要更新。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import re
import urllib.request
import json
import sys
import os
import time
import time,datetime
holiday_info = {}
CUR_YEAR = '2020'  #定义年份
##这里字符集改为了gbk
headers = {'Content-Type': 'application/json;charset=gbk'}
webhook = "企业微信机器人webhook"
url = "https://tianqi.moji.com/weather/china/shanghai/minhang-district" 
par = '(<meta name="description" content=")(.*?)(">)'
opener = urllib.request.build_opener()
urllib.request.install_opener(opener)
html = urllib.request.urlopen(url).read().decode("utf-8")
data = re.search(par,html).group(2)
def msg(text):
    message= {
     "msgtype": "text",
        "text": {
            "content": text,
            "mentioned_list":["@all"]
        }
    }
    print(requests.post(webhook,json.dumps(message),headers=headers).content)
def init_holiday_info():
    global holiday_info
    rep = requests.get('http://tool.bitefu.net/jiari/?d=' + CUR_YEAR)
    info_txt = rep.content.decode()
    holiday_info =  json.loads(info_txt)

def check_if_is_work_day():
    day_info = time.strftime("%m%d",time.localtime(time.time()))
    print(day_info)
    if day_info in holiday_info[CUR_YEAR]:
        return False
    week = datetime.datetime.now().weekday()
    if 0 <= week and 4 >= week:
        msg(data)   #调用期企业微信推送内容
    return False

if __name__ == "__main__":
     init_holiday_info()
     check_if_is_work_day()
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容