【教程】最新可用Shamrock搭建QQ机器人,附Qmsg代码

转载请注明出处:小锋学长生活大爆炸[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-Oneicon-default.png?t=N7T8https://xfxuezhang.blog.csdn.net/article/details/135761567

向Shamrock发请求

        HTTP API调用有两种形式传参:post data 和 url encode

        比如请求这样的(access_token是你在Shamrock设置的“鉴权Token”):

http://192.168.0.12:5700/get_login_info?access_token=xxxxx

        就可以拿到Shamrock的返回信息:

从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”的方式!!!否则是不会有回调触发。

        回调效果示例:

参考代码:类似于Qmsg

# 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')

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小锋学长生活大爆炸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值