前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【教程】最新可用Shamrock搭建QQ机器人,附Qmsg代码

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

作者头像
小锋学长生活大爆炸
发布2024-05-25 09:29:48
6640
发布2024-05-25 09:29:48
举报
文章被收录于专栏:小锋学长生活大爆炸

转载请注明出处:小锋学长生活大爆炸[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

icon-default.png?t=N7T8
icon-default.png?t=N7T8

https://xfxuezhang.blog.csdn.net/article/details/135761567

向Shamrock发请求

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

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

代码语言:javascript
复制
http://192.168.0.12:5700/get_login_info?access_token=xxxxx

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

从Shamrock收请求

这里就要用到“回调HTTP地址”功能了。在你的服务器上写个监听程序,然后Shamrock有消息的话就会给你的地址发消息。使用的是OneBot的API:OneBot API列表

比如使用flask写一个监听程序,端口为8888(如果是服务器,记得安全组里放行一下端口),接收post请求,并将data原样返回:

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 部署效果
  • 背景介绍
  • 安装步骤
  • 使用示例
    • 向Shamrock发请求
      • 从Shamrock收请求
      • 参考代码:类似于Qmsg
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档