效果展示:

GitHub仓库地址:
前言
之前写了个Python调用有道翻译api实现翻译功能,但是回过头想想,这样翻译好像更麻烦了,不如直接上有道翻译的官网。今天突发奇想,把这个功能封装成一个简陋的QQ机器人,只需要发消息就能实现翻译功能。
准备工作
go-cqhttp下载
首先前往官网下载与你电脑对应版本的go-cqhttp。
然后解压缩,解压缩之后双击go-cqhttp.exe
,选择HTTP通信。

然后配置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
|
account: uin: 12345678 password: '********'
servers:
- http: address: 127.0.0.1:5700 timeout: 5 long-polling: enabled: false max-queue-size: 2000 middlewares: <<: *default post: - url: http://127.0.0.1:5701/ secret: '' max-retries: 10 retries-interval: 1000
|
配置完成之后再次启动go-cqhttp,扫描二维码登录即可。

不要退出,继续接下来的步骤。
Python和IDE的配置
我使用的环境为Python3.10,IDE为pycharm,这部分的准备工作就不赘述了。
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)
|
然后用你自己的QQ号给作为Bot的QQ号随便发一条消息。可以看到我们搭建的简易服务器打印了这么一段JSON格式的数据。
这段数据有我们需要的数据
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') message = request.get_json().get('raw_message') get_res("private", uid, message)
if request.get_json().get('message_type') == 'group': gid = request.get_json().get('group_id') uid = request.get_json().get('sender').get('user_id') message = request.get_json().get('raw_message') get_res("group", uid, message)
return "None"
if __name__ == '__main__': app.run(debug=True, host='127.0.0.1', port=5701)
|
实现消息的发送
消息的发送很简单,只需要用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"] 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
|
完成
大功告成,之后就可以把玩你的机器人或者实现更多功能了。

总结
利用这个,这个机器人应该还可以完成更多功能,等我再看看。
各位也可以翻看官方文档,欢迎各位大佬指正。