本文实际上是企业微信机器人 + 天气预报,但拆开有点短,所以组合到一起了

# 企业微信机器人

# 数据和模块准备

请求头:

head = {
    'Content-Type': 'application/json', # 声明为 json 类型
}

数据 (负载):

data = '''{
        "msgtype": "markdown",
        "markdown": {
            "content": "暂时留空"
         }'''

这里作者选用了 markdown 格式,markdown 语法可自行百度。

安装 requests 库:

pip install requests

# 定义 post 函数

使用 requests 自带的 post 函数,如果数据内有中文会无法编码,需要包装函数

代码如下:

import requests
def post(url, data=None, header=None):
    try:
        data = data.encode("utf-8")
        res = requests.post(url, data=data, headers=header, verify=False)
        return res
    except BaseException as error:
        print("post请求错误,错误原因:%s" % error)
        raise error

# 准备运行用代码

res = post("yourwebhook&debug=1",
           header=head, data=data)
print(res.json())

带上 &debug=1 参数是方便排查错误,如果你有信心可以不加

# 天气预报 API

本文选择和风天气 API 进行开发
本文为现在天气

# 发送 get 请求

请求内容不涉及中文,使用系统 get 函数即可

r = requests.get(yoururl)
r_dict = r.json()

<yoururl> 格式如下:

https://devapi.qweather.com/v7/weather/now?key=&location=

在 key 的等号后写入你的应用 key,location 查询见这篇文章

# 结果处理

返回格式应该如下

{
  "code": "200",
  "updateTime": "2022-03-18T09:27+08:00",
  "fxLink": "http://hfx.link/2bp1",
  "now": {
    "obsTime": "2022-03-18T09:13+08:00",
    "temp": "2",
    "feelsLike": "0",
    "icon": "104",
    "text": "阴",
    "wind360": "135",
    "windDir": "东南风",
    "windScale": "1",
    "windSpeed": "4",
    "humidity": "76",
    "precip": "0.0",
    "pressure": "1017",
    "vis": "8",
    "cloud": "100",
    "dew": "",-4""
  },
  "refer": {
    "sources": [
      "QWeather",
      "NMC",
      "ECMWF"
    ],
    "license": [
      "no commercial use"
    ]
  }
}

有可能是单引号的,但不影响使用

上面的 r_dict 变量已经是 dict 类型了,无需 eval()

# 发送到企业微信

import requests
def post(url, data=None, file=None, header=None, cookie=None):
    try:
        # data = json.dumps(data)
        data = data.encode("utf-8")
        res = requests.post(url, data=data, files=file, headers=header, cookies=cookie, verify=False)
        return res
    except BaseException as e:
        print("post请求错误,错误原因:%s" % e)
        raise e
def get(url, data=None, file=None, header=None, cookie=None):
    try:
        # data = json.dumps(data)
        data = data.encode("utf-8")
        res = requests.get(url, data=data, files=file, headers=header, cookies=cookie, verify=False)
        return res
    except BaseException as e:
        print("get请求错误,错误原因:%s" % e)
        raise e
head = {
    'Content-Type': 'application/json',
}
r = requests.get("https://devapi.qweather.com/v7/weather/now?key=&location=")
r_dict = r.json()
str1 = f"""
天气beta版 \n
>更新时间:**{r_dict["updateTime"]}**
>观测时间:**{r_dict["now"]["obsTime"]}**
>温度:**{r_dict["now"]["temp"]}**℃
>体感温度:**{r_dict["now"]["feelsLike"]}**℃
>天气:**{r_dict["now"]["text"]}**
>风向:**{r_dict["now"]["windDir"]}**
>风力:**{r_dict["now"]["windScale"]}**级
>湿度:**{r_dict["now"]["humidity"]}**%
>降水量:**{r_dict["now"]["precip"]}**mm
"""
print(str1)
data = '''{
        "msgtype": "markdown",
        "markdown": {
            "content": "%s"
         }'''% str1
bot = post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=any&debug=1",
           header=head, data=data)
print(bot.json())

这个就是完整代码了,建议使用 f-string 格式化,在 data 里必须使用 % 格式化
假如一切正常,运行完后会输出:

{
  "errcode": 0,
  "errmsg": "ok. Warning: wrong json format. "
}

企业微信里的机器人应该会正确的发出消息不正确多半是排版错误