说明
最近闲来无事,在玩ESP32的时候看到了HTTP请求,从和风天气爬到了一些信息,当看到返回的Json的数据时还是非常兴奋的。就顺便想了下,觉得如果有AI对话,那肯定很有意思,那如果能够发到微信上面,那不是我女神每天早上的早安和晚安语录那不是也有了嘛?哈哈哈,说干就干,下面是每天早上七点半的早安语录示例,还要说明一下,这个小项目的话个人开源,代码在这里。。
代码分析
话不多说,直接上代码,首先是利用的库。如果没有的话请自行pip安装,linux用户记得使用pip3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import os import re import json import time import string import random import urllib import hashlib import requests import schedule import datetime from urllib.parse import quote from pyserverchan import pyserver
|
然后就是我用到的AI机器人,刚刚开始的时候我都想试试,最后确定了两个我觉得挺好用的,这里都分享出来,分别是青云客的AI对话和腾讯闲聊的AI对话。下面我都会对这两个进行简单的分析。
下面呢我还是对这两个AI对话做一个简单的介绍吧,首先是青云客,我选择的理由非常简单,不用注册,不用申请key,直接拿来立马就可以用,而且实现超级简单,功能如下:完全免费,支持功能:天气、翻译、藏头诗、笑话、歌词、计算、域名信息/备案/收录查询、IP查询、手机号码归属、人工智能聊天;
其次是腾讯闲聊AI对话:腾讯闲聊服务基于AI Lab领先的NLP引擎能力、数据运算能力和千亿级互联网语料数据的支持,同时集成了广泛的知识问答能力,可实现上百种自定义属性配置,以及男、女不同的语言风格及说话方式,从而让聊天变得更睿智、简单和有趣。而且有一个非常好用的点事可以接入微信公众号,实现简单的AI对话,如果有需求的话实现会很简单。
做一个简单的对比吧,青云客的机器人使用简单,但是速度相对较慢,一般发言一次可能需要5-6秒才能恢复;腾讯的AI对话使用较为麻烦,还需要注册和申请key,但是作为国内的巨头之一,速度真的是非常快,感觉1-2秒就能返回想要的数据。好了,下面是具体的代码解析。
青云客的实现
1 2 3 4 5 6 7 8 9 10 11 12 13
|
def qingyunkeAI(msg): url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg={}'.format(urllib.parse.quote(msg)) html = requests.get(url) return html.json()["content"]
|
腾讯闲聊的实现
首先去腾讯闲聊登录,第一选择肯定是QQ登录,他默认也是会使用QQ登录的,然后直接),然后就可以拿到APPID和APPKEY。
然后就可以愉快的调用下面的代码啦(在仓库里面还有一个单独的TencentAI.py文件,也是用来解析的,那个使用控制台进行的对话):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
def tencentAI(msg): APPID = "123456" APPKEY = "123456" url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat" params = { "app_id": APPID, "time_stamp": str(int(time.time())), "nonce_str": "".join(random.choice(string.ascii_letters + string.digits) for x in range(16)), "session": "10000".encode("utf-8"), "question": msg.encode("utf-8") } sign_before = "" for key in sorted(params): sign_before += "{}={}&".format(key, urllib.parse.quote(params[key], safe="")) sign_before += "app_key={}".format(APPKEY) sign = hashlib.md5(sign_before.encode("UTF-8")).hexdigest().upper() params["sign"] = sign html = requests.post(url, data=params).json() return html["data"]["answer"]
|
关于一言的获取
一言(Hitokoto)网创立于2016 年,隶属于萌创团队,目前网站主要提供一句话服务。不论在哪里,总有那么几个句子能穿透你的心。把这些句子汇聚起来,传递更多的心情。它也是可以免费和无KEY调用的,接口也是十分简单,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
def getOneWord(): url = "https://v1.hitokoto.cn/" response = requests.get(url) result = response.json() print(result["hitokoto"])
if response.status_code == 200 : return result["hitokoto"] else : return ""
|
推送到微信端
微信端额推送服务我选择了Server酱。没有别的原因,就是主页的那句话我很喜欢,是的是的,有很多的客户端都可以做到这个功能,比如Slack。那为什么我还要写一个呢?因为它们总是给得太多,我只是要一个简简单单的消息接收器而已。这也成为了「Server酱」的设计目标:功能越少越好。
,就凭这句话,我觉得不需要多少话来介绍了,使用起来只需要授权GitHub账号,并且绑定微信,就能得到一个Key,就能很快的实现消息的推送。下面我还是简单介绍自己用法,首先是我最开始用的将一言的数据发送到微信:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
def sendOneWord(): sckeyDC = "XXX" sckeyLL = "XXX" OneWord = getOneWord()
if(OneWord == ""): print(" 不好啦,服务器疯了: 未能正确获取一言的数据") requests.get("https://sc.ftqq.com/%s.send?text=不好啦,服务器崩了!&desp=未能正确获取一言的数据"%sckeyLL) requests.get("https://sc.ftqq.com/%s.send?text=不好啦,服务器崩了!&desp=未能正确获取一言的数据"%sckeyDC) else: url = "https://sc.ftqq.com/%s.send?text=程序的测试&desp=%s" % (sckeyLL, OneWord) requests.get(url) url = "https://sc.ftqq.com/%s.send?text=程序的测试&desp=%s" % (sckeyDC, OneWord) requests.get(url)
|
然后我发现这个消息好像不方便设置格式,而且既然是给女神发送的,格式不好看怎么能行。我看到了Server酱是支持Markdown格式的,而且我的这么多博客都是Markdown格式,如果能够简单排版的话效果肯定会好很多,于是我又开始寻找怎么发送Markdown格式。官网上面说,两个空格就是换行,但是我发送字符串,怎么都不行,最后我就google查了一下,还真的查到了一些,我新建一个.md
文件,然后使用Python对文件进行读写,将爬到的数据写入这个文本,然后使用函数就能直接发送Markdown格式的文件了,真的是太有才了!具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
def all2md(): with open("README.md", mode='w', encoding='utf-8') as f: f.write("# 知心一言\n") f.write(" " + getOneWord() + "\n\n") f.close()
msg = "武汉的天气怎么样" print("原话>>", msg) res = qingyunkeAI(msg) print("青云客>>", res) with open("README.md", mode='a', encoding='utf-8') as f: f.write("# 最近天气\n") f.write(" " + re.sub('{br}', '\n ', res) + "\n\n") f.close()
msg = "讲一个笑话" print("原话>>", msg) res = tencentAI(msg) print("腾讯>>", res)
with open("README.md", mode='a', encoding='utf-8') as f: f.write("# 每日笑话\n") f.write(" " + res + "\n\n") f.close()
sckeyDC = "XXX" sckeyLL = "XXX"
user_URL = 'https://sc.ftqq.com/' + sckeyLL + '.send' svc = pyserver.ServerChan(user_URL) svc.output_to_weixin_markdown("README.md", title='****早安呀╰(*°▽°*)╯')
user_URL = 'https://sc.ftqq.com/' + sckeyDC + '.send' svc = pyserver.ServerChan(user_URL) svc.output_to_weixin_markdown("README.md", title='***早安呀╰(*°▽°*)╯')
|
定时任务
定时任务我是用的是轻量级的schedule模块,他的特点是就是非常方便,但是只能用于轻量的任务调度,务必保持执行的时间小于任务调度时间,否则会调用越来越多的资源直至崩溃。具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
if __name__ == "__main__": print(" main ") schedule.every().day.at("07:30").do(all2md) while True: schedule.run_pending() time.sleep(1)
|
总结
好啦,程序总体就是这样,我个人觉得从功能上肯定还是有很多可以开发的内容,但是目前我就是仅仅是想发送一个早安语,目前的功能也差不多足够了。程序放到我的小猫盘上面跑,24小时待机还是美滋滋。对了,如果群辉上面运行有问题,请看我上一篇文章呀。
话说有一个自己的小服务器真的是很爽的啊~