HTTP-API: CoolQ/QQLight/QY Extensioin
扩展你的QQ/微信机器人用途,提供跨框架平台的PHP/Java/Python/NodeJS等编程语言SDK。
HTTP-API简介
HTTP-API是一款主要通过HTTP协议(另外也包含使用webSocket、socket等协议)与机器人进行通信的插件,主要提供PHP/Java/Python/NodeJS等编程语言SDK,以便将机器人用于WEB、大数据、机器学习等领域,尽可能地提现数据的价值。
目前插件主要支持酷Q、QQLight、契约机器人框架,开发者可以通过使用SDK非常方便地对机器人进行操作,比如控制机器人发送消息、公告,获取机器人群列表、好友列表,通过及监听获取近一个月、或者几年的聊天记录。开发者可通过简单的操作完成一些小程序、小应用对的开发,亦可应用于大型应用中。
此外,通过配合使用WEB管理平台,开发者可将自己开发的应用发布到应用商店中,通过用户安装的方式获得收入、使用数据等。用户可直接通过WEB平台安装、管理应用,以及可以批量管理机器人在线状态、收发消息等,让用户用最少的时间完成尽可能多的事。
注:以下表格描述中QQLight简称QL,CoolQ(酷Q)简称CQ,契约简称QY
交流群:(QQ群,用户加入)537419179
开发群:(QQ群,开发者加入)598629636
管理平台:http://work.ksust.com
版本分布(来源)
名称 | 最新版本 | 协议版本 | 状态 | 来源 | 备注 | Demo地址 |
---|---|---|---|---|---|---|
HTTP-API For CleverQQ | 2.3.0 | 2.3.0 | 已跑路 | 标准插件 | HTTP-API CleverQQ DLL插件 | 插件下载 |
HTTP-API For CoolQ | 2.3.4 | 2.3.4 | 已发布 | 标准插件 | HTTP-API 酷Q cpk插件 | 插件下载 |
HTTP-API For QQLight | 2.3.4 | 2.3.4 | 已发布 | 标准插件 | HTTP-API QQLight 3.x插件 | 插件下载 |
HTTP-API For QY | 2.3.4 | 2.3.4 | 已发布 | 标准插件 | HTTP-API 契约多Q/单Q版 | 插件下载 |
HTTP-API PHP SDK | 2.3.0 | 2.3.0 | 已发布 | 标准SDK | PHP SDK | PHP Demo |
HTTP-API Java SDK | 2.3.0 | 2.3.0 | 已发布(Maven) | 标准SDK | Java SDK | Java Demo |
HTTP-API Python SDK | 2.3.0 | 2.3.0 | 已发布(Pypi) | 标准SDK | Python SDK | Python Demo |
HTTP-API NodeJS SDK | 2.3.0 | 2.3.0 | 已发布(npm) | 标准SDK | NodeJS SDK | NodeJS Demo |
HTTP-API Cloud API | v1 | 2.3.0 | 已发布 | 标准 | REST API | 在线文档 |
SDK Name | SDK版本 | HTTP-API协议版本 | 完成状态... | 来源,其他GITHub仓库 | 开发者备注 | - |
功能介绍
本插件主要包含三种工作机制,即提交返回、主动推送、消息转发,第一种为被动接受,后两种为主动操作,其中提交返回包括HTTP方式、webSocket方式,主动推送使用HTTP方式,消息转发目前仅公开使用HTTP方式,几种方式中HTTP提交返回最常用也最通用。
下面将简单介绍插件的几种工作方式,相关配置请结合插件进行(页底使用引导)。
提交返回
提交返回是最常用的一种工作方式,其原理为:机器人插件作为客户端(做网页请求),开发者开发WEB服务端;在工作时,插件将收到的消息(如QQ消息)经过协议封装后发送到开发者的WEB服务,该服务队发送过来的数据进行处理并返回给插件一些操作命令(如发送消息)。至此,一次简单的工作流程结束。
显然,该工作流程是被动的,开发者的WEB服务必须等待插件访问才能执行相关逻辑,在这种机制下某些操作不能完成。于是,本插件引入WEB回调,即WEB服务向插件发送回调指令(当然得插件先访问WEB服务),表达自己想要的数据(如获取群列表),插件再收到回调指令后会立即将相关数据封装(如群列表)后发送到WEB服务。
在具体开发中,常用的协议为HTTP,即在插件中填入http://...的地址,将程序部署到WEB服务器上;另外,为了更便于双向通信,同时提供了webSocket支持,只需在相关位置填入类似ws://...地址即可。
主动推送
主动推送是通过HTTP协议对机器人插件进行相关操作的一种方式。其原理为:插件作为HTTP服务器,开发者的应用(使用SDK)作为客户端,开发者可直接主动地操作插件(如主动发送消息、主动获取群列表等)。
此方式的相关操作均为主动操作,一般结合提交返回进行使用,并一般要求插件所在服务器/电脑有固定的公网IP(该条件限制太大,如果没有公网IP,下述消息转发是一种可用的替代方式)。
消息转发
消息转发解决了无公网IP以及不能主动操作的问题,原则上开发者不需要服务器也能获得提交返回、主动推送的功能,并且更加便捷。其原理为:除插件和开发者外,存在若干的转发服务器(转发服务器集群),这些服务器对开发者的操作以及插件产生的消息进行转发,以达到开发者与插件通信的目的。
目前本方式只开放HTTP方式,即只能完成上述主动推送的任务(但是不要求有公网IP)。开发者只需要直到机器人的QQ、授权码即可对机器人进行主动操作,任意一方均不要求有公网IP。
快速开始
以下将使用提供的PHP/Java/Python/NodeJS编程语言SDK开发Demo,以便开发者快速入门。
以下操作建立在配置好插件基础上,相关步骤参考请到跳转到页面底部了解。Demo中使用的SDK均可在本项目GITHUB上下载到,Demo适配的最低版本为2.2.2。 所示Demo包含本插件三大功能(提交返回[包含webSocket]、HTTP主动推送、消息转发推送),相关demo可在本项目demo中下载。
PHP Demo
SDK安装方式
1.通过composer安装:composer require ksust/http-api-sdk 2.直接下载PHP文件
提交返回
<?php //插件的提交返回地址中配为本文件的访问地址 error_reporting(0); header("Content-Type:text/html;Charset=utf8");//设置编码,必需 include 'HTTPSDK.php'; $sdk = HTTPSDK::httpGet(); $msg = $sdk->getMsg();//插件发送过来的消息 $sdk->sendPrivateMsg($msg['QQ'], '你发送了这样的消息:' . $msg['Msg']);//逻辑代码,向发送者回消息 echo $sdk->toJsonString();//命令返回
webSocket(结合使用workman)
<?php //websocket(结合使用workman),插件的提交返回地址中配为相关地址(websocket://0.0.0.0:2346),命令行中启动本文件(php demo-ws.php restart) //workman下载地址:https://www.workerman.net/download/workermanzip header("Content-type:text/html;charset=utf-8"); require_once __DIR__ . '/workman/Autoloader.php'; use Workerman\Worker; require_once 'HTTPSDK.php'; // Create a Websocket server $ws_worker = new Worker("websocket://0.0.0.0:2346"); // 4 processes $ws_worker->count = 4; // Emitted when new connection come $ws_worker->onConnect = function ($connection) { echo "New connection\n"; }; // Emitted when data received $ws_worker->onMessage = function ($connection, $data) { $json = json_decode(urldecode(urldecode($data)), true); if (isset($json['type']) && $json['type'] == 'init') { $connection->send('{"type":"success"}'); } else { //消息操作 $sdk = HTTPSDK::webSocket($data); $msg = $sdk->getMsg(); if ($msg['Msg'] == 'demo') { $sdk->sendPrivateMsg($msg['QQ'], '你发送了这样的消息:' . $msg['Msg']);//逻辑代码,向发送者回消息 } //echo $sdk->toJsonString(); $connection->send($sdk->toJsonString()); } }; // Emitted when connection closed $ws_worker->onClose = function ($connection) { echo "Connection closed\n"; }; // Run worker Worker::runAll();
HTTP推送
<?php header("Content-Type:text/html;Charset=utf8");//设置编码,必需 include 'HTTPSDK.php'; //插件中开启推送,并设置端口为8080 $push = HTTPSDK::httpPush('http://127.0.0.1:8080'); var_dump($push->getLoginQQ());//获取登录的QQ var_dump($push->sendPrivateMsg('QQ', 'hello~'));//向QQ发送消息 var_dump($push->getFriendList());//获取好友列表
消息转发
<?php header("Content-Type:text/html;Charset=utf8");//设置编码,必需 include 'HTTPSDK.php'; //保证插件再2.2.2及以上并启动 $forward = HTTPSDK::msgForwardPush('QQ', 'code');//输入QQ和授权码(http://work.ksust.com) var_dump($forward->getLoginQQ());//获取登录的QQ var_dump($forward->sendPrivateMsg('QQ', 'hello~'));//向QQ发送消息 var_dump($forward->getFriendList());//获取好友列表
Java Demo
Java Demo项目地址:https://github.com/ksust/HTTP-API-Java-Demo
SDK引入方式
- Maven引入
Java SDK已经提交Maven中央仓库,直接在pom文件中配置。在pom中加入如下代码即可:
<dependencies> <dependency> <groupId>com.ksust.qq</groupId> <artifactId>http-api-sdk</artifactId> <version>2.3.0.RELEASE</version> </dependency> </dependencies>
- jar包引入(需要手动解决依赖)
可直接使用jar包(包名如:http-api-sdk-2.2.2.jar),在项目中下载即可,需要手动解决依赖。所需要的依赖及版本如下:(另外可以直接使用3提供的独立jar包,不用解决依赖问题)
<properties> <okttp.version>3.8.1</okttp.version> <validator.version>4.2.0.Final</validator.version> <lombok.version>1.16.10</lombok.version> <fastjson.version>1.2.31</fastjson.version> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${validator.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>${okttp.version}</version> </dependency> </dependencies>
- jar包引入(包含所需依赖,独立jar包)
包含后缀-with-dependencies的jar包中已经包含依赖,如http-api-sdk-2.2.2-jar-with-dependencies.jar
提交返回
//本样例基于SpringBoot,可运行的Demo在项目中可直接下载。主要代码如下: @RestController public class HTTPSDKDemo { @GetMapping("/test") public String test() { return "success"; } private void test(MessageGet msg) { System.out.println(JSON.toJSONString(msg)); } //提交返回演示:外部地址(插件中填的请求地址):http://yourIP:9999/ip @PostMapping(value = "/qq") public String qq(@RequestBody String data) throws Exception { //外部消息通过这个方法进入,请求地址即为 POST host:port/qq //开始演示:发送消息回复(点赞等),并且演示通过提交返回获取群列表 HTTPSDK httpsdk = HTTPSDK.httpGet(data); //插件发来的消息 MessageGet msg = httpsdk.getMsg(); test(msg); if (httpsdk.getMsg().getType() == TypeEnum.FRIEND.getCode() && !httpsdk.isCallback()) { //私聊消息 //点赞、抖窗、回复 httpsdk.sendLike(msg.getQQ(), 2); httpsdk.sendShake(msg.getQQ()); httpsdk.sendPrivateMsg(msg.getQQ(), "Hello,这里是HTTP-API演示程序,你发送的消息为:" + msg.getMsg() + "。我还给你点了两个赞哦~"); //发起获取群列表的请求(提交请求下不能立即得到),待下一次请求时携带消息 httpsdk.getGroupList(); } //接收 WEB回调消息。 if (httpsdk.isCallback()) { //打印群列表 if (msg.getType() == TypeEnum.GET_GROUP_LIST.getCode()) { for (Group group : httpsdk.getGroupList()) { System.out.println(group.getGroupName() + "," + group.getGroupId()); } } } //必须!!!向插件回复消息并清空当前对象待发送消息 return httpsdk.toJsonString(); } }
webSocket
//与PHP版本类似,传入获取的字符串即可。取决于用什么框架,和上述提交返回使用方法基本相同,这里不再赘述。
HTTP推送
//推送测试代码如下,插件中开启推送,并设置端口为8080 public class HTTPSDKPushDemo { public static void main(String[] args) { //首先擦创建对象,支持加密。详情请查看文档 HTTPSDK httpsdkPush = HTTPSDK.httpPush("http://127.0.0.1:8080", null, null); //引号中为测试QQ号 String qq = "1402549575"; //发送消息 httpsdkPush.sendPrivateMsg(qq, "Hello World[ksust,at_all:qq=all][ksust,music:name=明天]"); httpsdkPush.sendGroupMsg("244510218", "hello[ksust,at_all:qq=all][ksust,music:name=明天]"); //点赞 httpsdkPush.sendLike(qq, 1); //查看点赞数量 System.out.println(httpsdkPush.getLikeCount(qq)); //查看机器人当前状态 System.out.println(JSON.toJSONString(httpsdkPush.getQQRobotInfo())); } }
消息转发
//保证插件再2.2.2及以上并启动 public class MsgForwardDemo { public static void main(String[] args) throws IOException { HTTPSDK forwardPush = HTTPSDK.msgForwardPush("QQ", "code");//输入QQ和授权码 System.out.println(forwardPush.getLoginQQ()); System.out.println(forwardPush.sendPrivateMsg("QQ", "hello")); List<GroupMember> groupMemberList = forwardPush.getGroupMemberList("群号"); for (GroupMember groupMember : groupMemberList) { System.out.println(groupMember.getName() + "," + groupMember.getQq()); } } }
Python Demo
安装(Python2/3):pip install http-api-sdk
提交返回
# 独立demo:https://github.com/ksust/http_api_django_demo
webSocket
#原理同提交返回,取决于使用什么外部框架。
HTTP推送
#!/usr/bin/env python # -*-coding:utf-8-*- """ Demo Push HTTP-API Python SDK(Python2、python3) * Created by PyCharm. * User: yugao * version 2.2.2 * Note: HTTPSDK for Python(适用于版本2.2.2插件):用于解析插件消息、构造返回数据,以及HTTP推送(发起HTTP请求) * Contact: 开发者邮箱 admin@ksust.com * 安装:pip install http-api-sdk """ from httpapi.HTTPSDK import * if sys.version_info.major == 2: reload(sys) # python2请配置相应编码 sys.setdefaultencoding('utf8') sys.setdefaultencoding('gb18030') push = HTTPSDK.httpPush("http://127.0.0.1:8080") print(push.getGroupList()) print(push.sendPrivdteMsg('QQ', '你好')) forward = HTTPSDK.msgForwardPush('QQ', '授权码') print(forward.getGroupList()) print(forward.getLoginQQ()) print(forward.sendPrivdteMsg('QQ', '你好')) print(forward.getQQRobotInfo())
消息转发
#上述推送中包含消息转发(forward)
NodeJS Demo
安装依赖:npm install http-api-sdk
引用包:如 const HTTPSDK = require('http-api-sdk');
提交返回
/** * Demo * User: yugao * Date: 2019/2/27 * version 2.2.2 * Note: HTTPSDK for NodeJS(适用于版本2.2.2插件):用于解析插件消息、构造返回数据,以及HTTP推送(发起HTTP请求) * Contact: 开发者邮箱 admin@ksust.com * 安装SDK:npm install http-api-sdk */ const http = require('http'); const HTTPSDK = require('http-api-sdk'); const server = http.createServer((req, res) => { req.on('data', function (data) { let sdk = HTTPSDK.httpGet(data.toString()); //console.log(sdk.getMsg());//获取到的消息 sdk.sendPrivateMsg(sdk.getMsg()['QQ'], '你发送了这样的消息:' + sdk.getMsg()['Msg']); sdk.getLoginQQ(); //回调演示,提交返回获取群列表、登录QQ等 if (sdk.isCallback() && parseInt(sdk.getMsg()['Type']) === HTTPSDK.TYPE_GET_LOGIN_QQ) { console.log('Login QQ:' + sdk.getLoginQQ()); } res.end(sdk.toJsonString()); }); }); server.on('clientError', (err, socket) => { socket.end('HTTP/1.1 400 Bad Request\r\n\r\n'); }); server.listen(8000);
webSocket()
//与PHP版本类似,传入获取的字符串即可。取决于用什么框架,和上述提交返回使用方法基本相同,这里不再赘述。
HTTP推送
/** * Demo * User: yugao * Date: 2019/2/27 * version 2.2.2 * Note: HTTPSDK for NodeJS(适用于版本2.2.2插件):用于解析插件消息、构造返回数据,以及HTTP推送(发起HTTP请求) * Contact: 开发者邮箱 admin@ksust.com * 安装SDK:npm install http-api-sdk */ const HTTPSDK = require('http-api-sdk'); //推送演示,需要配置推送 push = HTTPSDK.httpPush('http://127.0.0.1:8080') push.getGroupList().data(function (data) { console.log('push ' + data) }); push.getLoginQQ().data(function (data) { console.log('push ' + data) }); push.sendPrivateMsg('QQ', 'Hello').data(function (data) { console.log('push ' + data) }); //消息转发演示,插件在线即可用 let forward = HTTPSDK.msgForwardPush('QQ', '授权码'); forward.getLoginQQ().data(function (data) { console.log('forward ' + data); }); forward.getGroupList().data(function (data) { console.log('forward ' + data); }); forward.sendPrivateMsg('QQ', 'Hello').data(function (data) { console.log('forward' + data) });
消息转发
//上述推送中包含消息转发(forward)
SDK参考见Github:https://github.com/ksust/HTTP--API
插件最新版下载见附件
-
ksust 2020-1-172楼
2.3.4 发布(QQLight、酷Q、契约同步发布)
1.全平台版本支持消息数、在线时间统计;
2.HTTP-API核心优化。
在线更新或者到综合平台下载:https://my.ksust.com/thread-4.htm -
ksust 2020-2-153楼2.3.5 发布(QQLight、酷Q、契约同步发布)
1.修复新版酷Q公告收发问题;
2.HTTP-API核心优化 -
ksust 2020-2-254楼2.3.6 发布(QQLight、酷Q、契约同步发布)
1.规范化QQLight、QY群文件接收格式(统一JSON);
2.QQLight:增加转发群文件标签:[ksust,qqlight_group_file_forward:src=,dst_group=,guid=]
3.QY:增加上传群文件标签:[ksust,qy_group_file:group=,group_path=,file_url=,name=]
4.HTTP-API核心优化