本文实际上是企业微信机器人 + 天气预报,但拆开有点短,所以组合到一起了
# 企业微信机器人
# 数据和模块准备
请求头:
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. " | |
} |
企业微信里的机器人应该会正确的发出消息不正确多半是排版错误