六道佩奇 发表于 2020-5-5 01:35

【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 15:36

萌虎乖乖 发表于 2020-5-5 08:02
??大佬我也是机械的   刚学到爬虫你说的这些要看什么呀我只知道基础语法……

有基础语法就看你主要想学习什么了,去学习那些库的使用方法,上面优Nonebot的官网,看了就会了

小非凡 发表于 2020-5-6 03:39

78007488 发表于 2020-5-5 01:42

同福建的 给你加分啦正想学习PYTHON

六道佩奇 发表于 2020-5-5 01:44

78007488 发表于 2020-5-5 01:42
同福建的 给你加分啦正想学习PYTHON

哈哈,谢谢啦,加油~

萌虎乖乖 发表于 2020-5-5 08:02

六道佩奇 发表于 2020-5-5 01:44
哈哈,谢谢啦,加油~

??大佬我也是机械的   刚学到爬虫你说的这些要看什么呀我只知道基础语法……

vethenc 发表于 2020-5-5 08:22

感谢分享

yjn866y 发表于 2020-5-5 09:11

为兴趣而学习的人点赞。。。

x123355492 发表于 2020-5-5 09:12

我就是我不一样的烟火

ciker_li 发表于 2020-5-5 21:48

感谢分享

萌虎乖乖 发表于 2020-5-5 22:34

六道佩奇 发表于 2020-5-5 15:36
有基础语法就看你主要想学习什么了,去学习那些库的使用方法,上面优Nonebot的官网,看了就会了

{:1_909:}哎……无聊爬爬妹子图练手一天都搞不定……心好累哦?
页: [1] 2
查看完整版本: 【Python】用Nonebot编写实时疫情查询机器人插件