0%

使用AI对话将内容部署到微信上

说明

最近闲来无事,在玩ESP32的时候看到了HTTP请求,从和风天气爬到了一些信息,当看到返回的Json的数据时还是非常兴奋的。就顺便想了下,觉得如果有AI对话,那肯定很有意思,那如果能够发到微信上面,那不是我女神每天早上的早安和晚安语录那不是也有了嘛?哈哈哈,说干就干,下面是每天早上七点半的早安语录示例,还要说明一下,这个小项目的话个人开源,代码在这里内容

代码分析

话不多说,直接上代码,首先是利用的库。如果没有的话请自行pip安装,linux用户记得使用pip3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- coding: utf-8 -*-
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
# *********************************************************
# 函数说明:青云客机器人的简单对话
# 函数输入:想要的对话(utf-8编码的)
# 函数输出:AI对话的结果
# *********************************************************
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"]
# msg = '武汉的天气怎么样'
# print("原话>>", msg)
# res = qingyunkeAI(msg)
# print("青云客>>", res)

腾讯闲聊的实现

首先去腾讯闲聊登录,第一选择肯定是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
# *********************************************************
# 函数说明:腾讯AI的简单对话
# 函数输入:想要的对话(utf-8编码的)
# 函数输出:AI对话的结果
# 备注: 腾讯闲聊机器人的凭证如下:
# App_ID: 123456
# App_Key: 123456
# *********************************************************
def tencentAI(msg):
APPID = "123456" #替换成自己申请的ID
APPKEY = "123456" #替换成自己申请的KEY
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):
# 键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8。quote默认大写。
sign_before += "{}={}&".format(key, urllib.parse.quote(params[key], safe=""))
# 将应用密钥以app_key为键名,拼接到字符串sign_before末尾
sign_before += "app_key={}".format(APPKEY)
# 对字符串sign_before进行MD5运算,得到接口请求签名
sign = hashlib.md5(sign_before.encode("UTF-8")).hexdigest().upper()
params["sign"] = sign
# print(params)
html = requests.post(url, data=params).json()
return html["data"]["answer"]
# msg= "讲一个笑话"
# print("原话>>", msg)
# res = tencentAI(msg)
# print("腾讯>>", res)

关于一言的获取

一言(Hitokoto)网创立于2016 年,隶属于萌创团队,目前网站主要提供一句话服务。不论在哪里,总有那么几个句子能穿透你的心。把这些句子汇聚起来,传递更多的心情。它也是可以免费和无KEY调用的,接口也是十分简单,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# *********************************************************
# 函数说明:获取一言接口的数据,并存储到全局的字符串OneWord中
# 函数输入:无
# 函数输出:True/False
# *********************************************************
def getOneWord():
# 1. 请求一言的接口
url = "https://v1.hitokoto.cn/"
response = requests.get(url)
# 2. 获取响应数据,并解析JSON,转化为python字典
result = response.json()
# 3. 打印结果中的"hitokoto"(想要的句子)
print(result["hitokoto"]) # Json解析

if response.status_code == 200 :
return result["hitokoto"]
else :
return ""
# getOneWord() # 测试获取一言数据

推送到微信端

微信端额推送服务我选择了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
# *********************************************************
# 函数说明:将一言数据发送到Server酱,即微信的提醒
# 函数输入:无
# 函数输出:无
# *********************************************************
def sendOneWord():
# 1. 获取sckey,具体请见:http://sc.ftqq.com/3.version
sckeyDC = "XXX"
sckeyLL = "XXX"
# 2. 拼接url并且发送请求,text为推送的title,desp为推送的描述
OneWord = getOneWord()
# print(OneWord)

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)
# sendOneWord() # 测试发送到Server酱

然后我发现这个消息好像不方便设置格式,而且既然是给女神发送的,格式不好看怎么能行。我看到了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
# *********************************************************
# 函数说明:把获取的结果保存到md文件中,方便发送
# 函数输入:无
# 函数输出:全部内容都在README.md文件中
# *********************************************************
def all2md():
with open("README.md", mode='w', encoding='utf-8') as f: # 'w'是写模式,会清空内容
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: # 'a'是追加模式
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: # 'a'是追加模式
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("ATestMessage.")
# svc.output_to_weixin_picture("http://sc.ftqq.com/static/image/bottom_logo.png")
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
# *********************************************************
# 函数说明:定时执行任务(schedule模块)
# 函数输入:无
# 函数输出:无
# 函数说明:schedule模块只能用于轻量的任务调度,务必保持执行的
# 时间小于任务调度时间
# *********************************************************
if __name__ == "__main__":
print(" main ")
# schedule.every(1).minutes.do(all2md)
# schedule.every().hour.do(all2md)
# schedule.every().day.at("07:30").do(all2md)
# schedule.every(5).to(10).days.do(all2md)
# schedule.every().monday.do(all2md)
# schedule.every().wednesday.at("13:15").do(all2md)

schedule.every().day.at("07:30").do(all2md)
while True:
schedule.run_pending()
time.sleep(1)

总结

好啦,程序总体就是这样,我个人觉得从功能上肯定还是有很多可以开发的内容,但是目前我就是仅仅是想发送一个早安语,目前的功能也差不多足够了。程序放到我的小猫盘上面跑,24小时待机还是美滋滋。对了,如果群辉上面运行有问题,请看我上一篇文章呀。

话说有一个自己的小服务器真的是很爽的啊~

-------------本文结束感谢您的阅读-------------