效果展示:

0

GitHub仓库地址:

前言

之前写了个Python调用有道翻译api实现翻译功能,但是回过头想想,这样翻译好像更麻烦了,不如直接上有道翻译的官网。今天突发奇想,把这个功能封装成一个简陋的QQ机器人,只需要发消息就能实现翻译功能。

准备工作

go-cqhttp下载

首先前往官网下载与你电脑对应版本的go-cqhttp。

然后解压缩,解压缩之后双击go-cqhttp.exe,选择HTTP通信。

1

然后配置config.yml,这里只挑最重要的几项配置。

具体配置也可以翻阅官方文档

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
# go-cqhttp 默认配置文件、

# 配置你的QQ账号与密码

account: # 账号相关
uin: 12345678 # QQ账号
password: '********' # 密码为空时使用扫码登录



# 配置监听地址和服务器地址

# 连接服务列表
servers:
# 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
#- http: # http 通信
#- ws: # 正向 Websocket
#- ws-reverse: # 反向 Websocket
#- pprof: #性能分析服务器

- http: # HTTP 通信设置
address: 127.0.0.1:5700 # HTTP监听地址
timeout: 5 # 反向 HTTP 超时时间, 单位秒,<5 时将被忽略
long-polling: # 长轮询拓展
enabled: false # 是否开启
max-queue-size: 2000 # 消息队列大小,0 表示不限制队列大小,谨慎使用
middlewares:
<<: *default # 引用默认中间件
post: # 反向HTTP POST地址列表
# - url: http://127.0.0.1:5701 # 地址
# secret: '' # 密钥
# max-retries: 3 # 最大重试,0 时禁用
# retries-interval: 1500 # 重试时间,单位毫秒,0 时立即
- url: http://127.0.0.1:5701/ # 地址
secret: '' # 密钥
max-retries: 10 # 最大重试,0 时禁用
retries-interval: 1000 # 重试时间,单位毫秒,0 时立即

配置完成之后再次启动go-cqhttp,扫描二维码登录即可。

2

不要退出,继续接下来的步骤。

Python和IDE的配置

我使用的环境为Python3.10IDEpycharm,这部分的准备工作就不赘述了。

Python实现消息的接收

首先创建一个简易flask服务器,用来监听go-cqhttp接受的消息。

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request

app = Flask(__name__)

@app.route('/', methods=["POST"])
def post_data():
print(request.get_json())


if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=5701) # 此处的 host和 port对应上面 yml文件的设置

然后用你自己的QQ号给作为Bot的QQ号随便发一条消息。可以看到我们搭建的简易服务器打印了这么一段JSON格式的数据。

这段数据有我们需要的数据

消息的类型

发送者的QQ号

消息的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
'post_type': 'message',
'message_type': 'private',
'time': 1663675962,
'self_id': 448704574,
'sub_type': 'friend',
'message': 'hello',
'raw_message': 'hello',
'font': 0,
'sender': {
'age': 0,
'nickname': 'TSUKI',
'sex': 'unknown',
'user_id': 652240843},
'message_id': 910594747,
'user_id': 652240843,
'target_id': 448704574
}

然后我们需要做的就是将这段JSON格式的数据解析然后传到我们的处理代码。

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
from flask import Flask, request
from send import * # 发送消息的模块,后面会讲

app = Flask(__name__)


@app.route('/', methods=["POST"])
def post_data():
if request.get_json().get('message_type') == 'private': # 私聊信息
print(request.get_json())
uid = request.get_json().get('sender').get('user_id') # 获取信息发送者的 QQ号码
message = request.get_json().get('raw_message') # 获取原始信息
get_res("private", uid, message) # 将 Q号和原始信息传到我们的后台

if request.get_json().get('message_type') == 'group': # 如果是群聊信息
gid = request.get_json().get('group_id') # 获取群号
uid = request.get_json().get('sender').get('user_id') # 获取信息发送者的 QQ号码
message = request.get_json().get('raw_message') # 获取原始信息
get_res("group", uid, message) # 将 Q号和原始信息传到我们的后台

return "None"


if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=5701) # 此处的 host和 port对应上面 yml文件的设置

实现消息的发送

消息的发送很简单,只需要用request对接口进行get请求即可。

用浏览器访问

1
http://127.0.0.1:5700/send_group_msg?group_id=[你的QQ号]&message=[消息]

即可发送成功。

新建一个send.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
from trans_api import trans_api #翻译的接口,后面会提到
import requests


def send_msg(res):
msg_type = resp_dict["msg_type"] # 回复类型(群聊/私聊)
number = resp_dict["number"] # 回复账号(群号/好友号)
msg = res["msg"] # 要回复的消息
# 将字符中的特殊字符进行url编码
msg = msg.replace(" ", "%20")
msg = msg.replace(" ", "%0a")
if msg_type == "group":
payload = "http://127.0.0.1:5700/send_group_msg?group_id=" + str(
number) + "&message=" + msg
elif msg_type == "private":
payload = "http://127.0.0.1:5700/send_private_msg?user_id=" + str(
number) + "&message=" + msg
print("发送" + payload)
requests.get(payload)
return 0


def get_res(type, qid, msg):
if msg[0:2] == "翻译": # 获取接收消息的关键词
trans_obj = trans_api() # 实例化翻译对象
result = trans_obj.translate(msg[2:])
res = {"msg_type": type, "number": qid, "msg": result}
send_msg(res) # 发送

调用翻译API

就是把之前的代码封装成一个对象,更详细可以看Python调用有道翻译api实现翻译功能。这里就不多介绍了,欢迎指正。

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
44
45
46
47
48
49
50
51
52
import requests
import random
import hashlib
import time


class trans_api:
word = "hello"

def __int__(self):
self.word = None

def salt_sign(self):
navigator_appVersion = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
t = hashlib.md5(navigator_appVersion.encode("utf-8")).hexdigest()
r = str(int(time.time() * 1000))
i = r + str(random.randint(1, 10))
return {
"ts": r,
"bv": t,
"salt": i,
"sign": hashlib.md5(
str("fanyideskweb" + self.word + i + "Ygy_4c=r#e#4EX^NUGUc5").encode("utf-8")).hexdigest()
}

def translate(self, word):
self.word = word
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
r = self.salt_sign()
data = {
"i": self.word,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": r["salt"],
"sign": r["sign"],
"lts": r["ts"],
"bv": r["bv"],
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}
headers = {
"Cookie": "OUTFOX_SEARCH_USER_ID=-286220249@10.108.160.17;",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
}
res = requests.post(url=url, data=data, headers=headers).json()
result = self.word + "的译文:" + res['translateResult'][0][0]['tgt'] + "\n" + "用法:" + res['smartResult']['entries'][1]
return result

完成

大功告成,之后就可以把玩你的机器人或者实现更多功能了。

3

总结

利用这个,这个机器人应该还可以完成更多功能,等我再看看。

各位也可以翻看官方文档,欢迎各位大佬指正。