昨天,我做了一个爬取最新疫情信息的爬虫程序,一个小伙伴和我说,“仙草哥哥,你这个功能还是只有新增,一点都不清晰。我需要回家,肯定是要知道哪些地区是风险区啊,你应该能够直接告诉我们哪些地方是风险区。”
我觉得这个小伙伴说的很对,这个功能确实也没什么困难的,只要在昨天的基础上进行简单的修改就可以了。不过呢,之前我还做了一期程序结果推送到邮箱上的文章,评论区有一位小伙伴和我说,他不用邮箱,希望我能够做一个能推送到微信上的程序,今天我们也帮助这位小伙伴一起来实现一下
实现分析我们需要做的事情有两个,第一是爬取风险区域,第二是为微信推送信息,我们应该分别来解决这两个问题
怎么爬取风险区域呢?昨天的json信息中实际上已经包括了这部分内容,只是没有提取出来。首先通过循环,找到哪些地方有风险区域,如果有,就添加保存,如果没有就跳过不管,只要这样就可以完成了
# 添加地区的循环
for case in r["component"][0]["caseList"]:
# 添加地区的风险区域的循环
for d in case["subList"]:
# 如果存在风险区
if d["dangerousAreas"]["subList"]:
danger_list.append(d["dangerousAreas"]["subList"])
那么剩下的问题就在于,如何实现将程序的结果推送到微信上了
传统微信推送按照传统的方式,给微信发送消息,可以通过测试号的模板接口,首先我们要获得一个微信公众号的测试号
注册一个公众号的测试号应该不是什么困难的问题,进入地址注册一下就行了,这里就不多做介绍了,相信看我文章的小伙伴不会对这个有问题的,然后就是查阅腾讯给我们留的开发文档了
在开发文档的公众号页面,基础消息能力篇章中,有一个模板信息接口,里面有详细的使用方法。正常来说,在正式的公众号中,模板信息也是不可以乱发的,不过在测试号中相对而言就没有那么多限制,你可以比较随意的编辑你要发送的消息
除了需要在地址中填写的access_token以外,还需要在post请求中保存几个关键的参数
参数touser:这个参数要填写接受者的openid,这个在公众平台的后台添加了用户以后,就可以拿到openid
参数template_id:这个参数是要在正式使用的时候选择一个模板,用于发送信息
参数data:这个参数就是用于填写你要发送的数据了,通过post请求把data数据带上,就能够将信息发送给对应的用户了
第三方微信推送当然,以上的传统方式只是简单介绍一下而已,由于对于个人来说,为了推送一个消息,还要专门去注册一个测试号,然后去调用模板消息还是有一点麻烦了,使用起来也不是很方便,因此,更容易的办法是直接使用第三方的消息推送服务,只要简单的调用接口,就可以完成消息推送了,比如说,非常知名的server酱服务
注意:这不是广告啊,提到它单纯是因为其比较好用,出现的次数也很多,如果你喜欢其他服务的话,也可以选择
使用方法也是很简单的,说明也只有短短几句话而已
简单来说就是,注册账号就可以拿到一个sendkey,然后通过其留下的接口地址,直接发送一个请求,就可以完成功能了
至于这个接口呢,也比刚才更容易使用,不再需要post请求了,只需要发送一个get请求就可以了,正常来说应该是这么配置的
import requests
send_key = "" # 此处用于配置注册账号后的send_key
title = "" # 推送通知的标题
desp = "" # 需要推送通知的内容
url = f"https://sctapi.ftqq.com/{send_key}.send?title={title}&desp={desp}"
r = requests.get(url) # 如果不出意外的话,消息就已经推送成功了
比起自己使用微信的模板消息,直接使用现成的第三方服务确实是容易了很多
完整代码展示以下是代码的第一部分,没有配置推送通知的
import requests
import re
import json
import base64
base_url = "aHR0cHM6Ly92b2ljZS5iYWlkdS5jb20vYWN0L25ld3BuZXVtb25pYS9uZXdwbmV1bW9uaWEv"
url = base64.b64decode(base_url)
headers = {"user-agent": "Mozilla/5.0"}
r = requests.get(url, headers=headers, timeout=10)
res = re.search('', r.text)
assert(res)
r = json.loads(res.group(1))
text = "数据更新时间:"
text += r["component"][0]["mapLastUpdatedTime"]
text += "nn"
for case in r["component"][0]["caseList"]:
tmp = case["area"]
for d in case["subList"]:
if d["dangerousAreas"]["subList"]:
text += tmp
text += "-"
text += d["city"]
text += "n"
for a in d["dangerousAreas"]["subList"]:
text += a["area"]
text += "("
text += a["level"]
text += ")"
text += "n"
text += "n"
print(text) # 注意,如果你不打算配置微信通知,那么到这里就可以结束了
以下是代码的第二部分,如果你需要配置推送通知,那么需要根据上边的注释,合理的配置信息,就可以完成消息推送
send_key = "" # 你自己的send_key
title = "" # 推送通知的标题,你也可以写一段代码,发送当前的时间
# 此处的内容是之前代码中获取到的风险区域
url = f"https://sctapi.ftqq.com/{send_key}.send?title={title}&desp={text}"
r = requests.get(url)
print(r.text)
由于该代码运行后会出现具体的地名和区域,我就不在此展示代码的运行结果了,你可以自行运行代码查看结果
完整代码展示中的第一部分,是任何时候都可以直接运行的,而代码的第二部分需要配置你自己的账号信息才能使用,因此不能直接复制,需要进行简单的修改
如需使用,直接将第二段代码复制到第一段之后即可



