转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]
目录
部署效果
背景介绍
安装步骤
使用示例
向Shamrock发请求
从Shamrock收请求
参考代码:类似于Qmsg
先看效果,可以感兴趣再往下。
这是私聊:
这是群聊:
官方原版Shamrock的作者已经删库跑路了,所以我们使用这个:OpenShamrock
文档在这里,但访问可能需要点魔法:快速开始指南
步骤也简单,这里以无Root的安卓机为例,其他的可以看上面的文档,支持这么多:
1、下载Shamrock apk(推荐xxx-all.zip的包):Releases · whitechi73/OpenShamrock · GitHub
2、下载Lspatch和QQ,最新版也可以使用。
3、登录完QQ后,再打开Shamrock就可以看到已经有hook信息了。
接口API说明在这里:请求与响应 | OpenShamrock
如果是在手机上运行,处理局域网直接有IP,那如果外网访问就需要内网穿透,教程可以看这个:
【教程】超详细安装和使用免费内网穿透软件Zerotier-One
https://xfxuezhang.blog.csdn.net/article/details/135761567
HTTP API调用有两种形式传参:post data 和 url encode
比如请求这样的(access_token是你在Shamrock设置的“鉴权Token”):
http://192.168.0.12:5700/get_login_info?access_token=xxxxx
就可以拿到Shamrock的返回信息:
这里就要用到“回调HTTP地址”功能了。在你的服务器上写个监听程序,然后Shamrock有消息的话就会给你的地址发消息。使用的是OneBot的API:OneBot API列表
比如使用flask写一个监听程序,端口为8888(如果是服务器,记得安全组里放行一下端口),接收post请求,并将data原样返回:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/', methods=['POST'])
def post_data():
# 获取请求体中的数据
data = request.get_json(force=True)
# 原样返回数据
return jsonify(data), 200
if __name__ == '__main__':
app.run(debug=True, port=8888, host="0.0.0.0")
注意,如果你要用回调,那必须要使用“magisk+lsposed”的方式!!!否则是不会有回调触发。
回调效果示例:
# https://whitechi73.github.io/OpenShamrock/api/message.html
import json
import os
import requests
from flask import Flask, request, jsonify, make_response
from time import sleep
import threading
from chatgpt_bot import *
from urllib.parse import quote
class QQBot:
def __init__(self, token):
self.addr = 'http://xxxxxx:5700/'
self.token = token
def sendMsg(self, url, data):
try:
res = requests.post(url, data=json.dumps(data)).json()
except Exception as e:
print(e)
return 0
if res['retcode'] == 0:
return res["data"]['message_id']
return 0
def sendMsgToGroup(self, group, msg):
msg_list = msg.split(r'\n')
msg_chain = [{"type": "text","data": {"text": m+'\n'}} for m in msg_list]
data = {
"group_id": group,
"message": msg_chain,
"token": self.token
}
url = self.addr + 'send_group_msg'
return self.sendMsg(url, data)
def sendFriendMessage(self, qq, msg):
msg_list = msg.split(r'\n')
msg_chain = [{"type": "text","data": {"text": m+'\n'}} for m in msg_list]
data = {
"user_id": qq,
"message": msg_chain,
"token": self.token
}
url = self.addr + 'send_private_msg'
return self.sendMsg(url, data)
bot = QQBot(token='xxxxxx')
app = Flask(__name__)
@app.route('/QQ/send/friend', methods=['GET'])
def qqListenMsgToFriend():
# 类似于Qmsg的功能
# flask做得接收HTTP请求转为QQ消息
qq = request.args.get('target', None)
msg = request.args.get('msg', None)
if qq is not None and msg is not None:
bot.sendFriendMessage(qq, msg)
response = make_response(jsonify({"msg": msg}))
response.headers["Connection"] = "close"
response.headers["Content-Type"] = "application/json"
return response
@app.route('/QQ/send/group', methods=['GET'])
def qqListenMsgToGroup():
# 类似于Qmsg的功能
# flask做得接收HTTP请求转为QQ消息
qq = request.args.get('target', None)
msg = request.args.get('msg', None)
if qq is not None and msg is not None:
bot.sendMsgToGroup(qq, msg)
response = make_response(jsonify({"msg": msg}))
response.headers["Connection"] = "close"
response.headers["Content-Type"] = "application/json"
return response
@app.route('/QQ/send/help', methods=['GET'])
def qqListenHelp():
return 'GET /QQ/send?target=<>&msg=<>\n \
GET /QQ/send/group?target=<>&msg=<>\n \
GET /QQ/send/friend?target=<>&msg=<>'
@app.route('/', methods=['GET', 'POST'])
def qqCallback():
print(request.json)
return {'code': 0}
if __name__ == '__main__':
app.run(port='9966', host='0.0.0.0')