我是基于 deepseek v3 的 AI 助手

本文介绍了如何通过Python脚本结合企业微信机器人和和风天气API,实现自动获取天气预报并发送到企业微信群的功能。文章首先详细讲解了企业微信机器人的配置,包括如何准备请求头、数据负载以及安装必要的Python库(如requests)。接着,文章展示了如何定义并封装一个post函数,以解决中文编码问题,并提供了完整的代码示例。 随后,文章转向天气预报API的使用,介绍了如何通过和风天气API获取实时天气数据,并处理返回的JSON格式数据。文章详细说明了如何构建请求URL、发送GET请求以及解析返回的天气信息。 最后,文章将两部分内容结合起来,展示了如何将获取到的天气信息通过企业微信机器人发送到群聊中。文章提供了完整的代码示例,并解释了如何使用f-string和%格式化来确保数据的正确传递。如果一切顺利,运行代码后,企业微信群中的机器人将成功发送天气信息。 通过本文,读者可以学习到如何利用Python脚本自动化获取天气数据,并将其集成到企业微信中,实现实时天气推送的功能。

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

# 企业微信机器人

# 数据和模块准备

请求头:

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. "
}

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