【Python】用Nonebot编写实时疫情查询机器人插件
本帖最后由 六道佩奇 于 2020-5-5 01:44 编辑### 前言
**刚刚发了个爬取实时疫情数据保存到Excel的帖子:[【Python】爬取实时疫情数据并保存到Excel](https://www.52pojie.cn/thread-1171782-1-1.html),有朋友说让把机器人实时查询疫情的插件代码给发一下,本来是因为这个插件需要配合Nonebot+酷Q(如果是曾经那个网页QQ和网页微信登录没被和谐的时候,倒是简单不少,可惜凉凉了,所有依靠这个开发的库也随之凉凉),一句两句也说不清楚,单独发代码没法运行才不想发的,既然有人想要了解,这里就简单介绍一下。**
**无图无真相,先看效果:**
![效果图](https://gitee.com/daisf666/blogimage/raw/master/img/yiqing.gif)
### Nonebot介绍
**官方介绍:[传送门](https://nonebot.cqp.moe/guide/),内含使用教程,非常全面。**
**NoneBot 是一个基于 酷Q 的 Python 异步 QQ 机器人框架,它会对 QQ 机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功能。**
**除了起到解析消息的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制,尤其对于命令处理器,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。**
**NoneBot 在其底层与 酷Q 交互的部分使用 python-aiocqhttp 库,后者是 CQHTTP 插件 的一个 Python 异步 SDK,在 Quart 的基础上封装了与 CQHTTP 插件的网络交互。**
**得益于 Python 的 asyncio 机制,NoneBot 处理消息的吞吐量有了很大的保障,再配合 CQHTTP 插件可选的 WebSocket 通信方式(也是最建议的通信方式),NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。**
**需要注意的是,NoneBot 仅支持 Python 3.7+ 及 CQHTTP 插件 v4.8+(但是我用Python3.6。5也没出啥问题。。。)**
**酷Q就不要介绍了吧,直接百度官网点进去下载就好了,就一普通软件。**
### 代码
**部署教程我就不写了,上面给了官网地址,里面的教程写得非常详细了,从安装到基本的使用再到进阶教程,都有,跟着一步一步走,小白也能成功的~下面直接给代码:**
```python
# -*- coding: gb2312 -*-
# Author : Daisf
# Date : 2020/4/30 22:45
import json
import re
import requests
from nonebot import on_command, CommandSession
from nonebot import on_natural_language, NLPSession, IntentCommand
@on_command('福建今日疫情', aliases=('福建今日疫情'))
async def yiqing(session: CommandSession):
results = []
alist = []
url = "https://gwpre.sina.cn/interface/fymap2020_data.json?_=1588258367647&callback=dataAPIData"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.163 Safari/537.36"}
r = requests.get(url, timeout=30, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
data = re.search("\(+([^)]*)\)+", r.text).group(1)
hjson = json.loads(data)
a = hjson['data']['list']
for i in a:
if i['ename'] == 'fujian':
city = i['city']
for j in city:
name = j['name']# 城市名称
value = j['conNum']# 累计确诊
econNum = j['econNum']# 现存确诊
conadd = j['conadd']# 今日确诊
deathNum = j['deathNum']# 累计死亡人数
cureNum = j['cureNum']# 累计治愈
zerodays = j['zerodays']# 零增长天数
single_str = [name + '\n' + "累计确诊:" + value + '\n' + "现存确诊:" + econNum + '\n' +
"今日确诊:" + conadd + '\n' +"累计死亡人数:" + deathNum + '\n' + "累计治愈:" + cureNum +
'\n' +"零增长天数:" + zerodays + '\n']
results.append(single_str)
break
else:
continue
for i in range(len(results)):
alist = alist + results # 将列表里字符串的列表外壳去掉
await session.send(''.join(alist)) # 将列表里的字符串拼接并输出
```
### 拓展
**这个插件写得很粗糙呀,代码的功能只是当接收到“福建今日疫情”的命令返回事先确定好的爬取福建各城市疫情,但Nonebot的功能远远不止于此,这个代码只是作为一个简单案例演示分享一下,你可以写成通过获取你发送的城市去查询,而不是只能返回一个实现确定的省份,除此之外,还可以编写一下返回的session的格式,让它呈现的更像是一个表格,看起来会更加清楚和舒服。写得很浅,毕竟我是学机械的,对什么感兴趣就去了解一下,雨露均沾,我也才接触不久,大神勿喷~** 萌虎乖乖 发表于 2020-5-5 08:02
??大佬我也是机械的 刚学到爬虫你说的这些要看什么呀我只知道基础语法……
有基础语法就看你主要想学习什么了,去学习那些库的使用方法,上面优Nonebot的官网,看了就会了 同福建的 给你加分啦正想学习PYTHON 78007488 发表于 2020-5-5 01:42
同福建的 给你加分啦正想学习PYTHON
哈哈,谢谢啦,加油~ 六道佩奇 发表于 2020-5-5 01:44
哈哈,谢谢啦,加油~
??大佬我也是机械的 刚学到爬虫你说的这些要看什么呀我只知道基础语法…… 感谢分享 为兴趣而学习的人点赞。。。 我就是我不一样的烟火 感谢分享 六道佩奇 发表于 2020-5-5 15:36
有基础语法就看你主要想学习什么了,去学习那些库的使用方法,上面优Nonebot的官网,看了就会了
{:1_909:}哎……无聊爬爬妹子图练手一天都搞不定……心好累哦?
页:
[1]
2