CQHTTP 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/CQHTTP.gemspec +24 -0
- data/Gemfile +6 -0
- data/README.en.md +33 -0
- data/README.md +33 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/gen_api_list +7 -0
- data/bin/setup +8 -0
- data/lib/CQHTTP/API.md +429 -0
- data/lib/CQHTTP/api.rb +133 -0
- data/lib/CQHTTP/network.rb +79 -0
- data/lib/CQHTTP/qq.rb +45 -0
- data/lib/CQHTTP/version.rb +3 -0
- data/lib/CQHTTP.rb +8 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: de2676b9e75e72384e908cd5e024390ed4c34b7a
|
4
|
+
data.tar.gz: 21b512289cf71ea8842d5eed659fc0f7e03c522a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6c9a2c6fae74f7cee911b84f50b85f0e78995d4c92ec578a9c2483937b223b56a06fa157dacea534a1797414e600222c6c1fbfe1a97fdd6c41801557388c921b
|
7
|
+
data.tar.gz: b501e2bf245e422d41dfada6e17427501790ee8023d6c4c746667c27cf59a44e99945f2e4fe1b817cf34c7ae0185e940d982a35ca3c84810a9217f5e6ef11a93
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/CQHTTP.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'CQHTTP/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'CQHTTP'
|
7
|
+
spec.version = CQHTTP::VERSION
|
8
|
+
spec.authors = ['71e6fd52']
|
9
|
+
spec.email = ['DAStudio.71e6fd52@gmail.com']
|
10
|
+
|
11
|
+
spec.summary = 'CoolQ HTTP API ruby bind'
|
12
|
+
spec.homepage = 'https://github.com/71e6fd52/cqhttp-ruby'
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
15
|
+
f.match(%r{^(test|spec|features)/})
|
16
|
+
end
|
17
|
+
spec.bindir = 'exe'
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
|
+
end
|
data/Gemfile
ADDED
data/README.en.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# CQHTTP ([中文](/README.md))
|
2
|
+
|
3
|
+
This gem can make you use [richardchien/coolq-http-api](https://github.com/richardchien/coolq-http-api) in ruby.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's `Gemfile`:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'CQHTTP'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install CQHTTP
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Development
|
26
|
+
|
27
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
28
|
+
|
29
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
30
|
+
|
31
|
+
## Contributing
|
32
|
+
|
33
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/71e6fd52/cqhttp-ruby
|
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# CQHTTP ([English](/README.en,md))
|
2
|
+
|
3
|
+
在 ruby 中使用 [richardchien/coolq-http-api](https://github.com/richardchien/coolq-http-api)。
|
4
|
+
|
5
|
+
## 安装
|
6
|
+
|
7
|
+
在你的应用的 `Gemfile` 加入这行:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'CQHTTP'
|
11
|
+
```
|
12
|
+
|
13
|
+
然后运行:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
或者你自己安装
|
18
|
+
|
19
|
+
$ gem install CQHTTP
|
20
|
+
|
21
|
+
## 使用
|
22
|
+
|
23
|
+
TODO: 写使用说明
|
24
|
+
|
25
|
+
## 开发
|
26
|
+
|
27
|
+
检出这个仓库后,运行 `bin/setup` 来安装依赖关系。然后,运行 `rake spec` 来运行测试。 您还可以运行 `bin/console` 启动交互式提示符(`irb`),让您进行实验。
|
28
|
+
|
29
|
+
要将此 gem 安装到本机上,请运行 `bundle exec rake install`。 要释出新版本,请在 `version.rb` 中更新版本号,然后运行 `bundle exec rake release`,该版本将为该版本创建一个 git 标签,并推送 git 提交和标签,然后将 `.gem` 文件提交到 [rubygems.org](https://rubygems.org)。
|
30
|
+
|
31
|
+
## 贡献
|
32
|
+
|
33
|
+
欢迎来 [GitHub](https://github.com/71e6fd52/cqhttp-ruby) 上发起 issues 和 pull requests
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "CQHTTP"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/gen_api_list
ADDED
data/bin/setup
ADDED
data/lib/CQHTTP/API.md
ADDED
@@ -0,0 +1,429 @@
|
|
1
|
+
# API 描述
|
2
|
+
|
3
|
+
## 请求方式
|
4
|
+
|
5
|
+
所有 API 都同时支持 GET 和 POST 两种请求方式,参数可通过 URL 参数、表单或 JSON 传入,后两者分别对应 Content-Type `application/x-www-form-urlencoded` 和 `application/json`。如果使用 JSON 传入,参数要放在根级别的 JSON 对象中,且参数的数据类型必须符合 API 列表中给出的每个参数所要求的数据类型,大致如下:
|
6
|
+
|
7
|
+
```json
|
8
|
+
{"user_id": 123456, "message": "hello"}
|
9
|
+
```
|
10
|
+
|
11
|
+
API 描述中没有给出默认值的参数均为必填项。
|
12
|
+
|
13
|
+
如果配置文件中填写了 token,则每次请求需要在请求头中加入验证头,如:
|
14
|
+
|
15
|
+
```http
|
16
|
+
GET /send_private_msg?user_id=123456&message=hello HTTP/1.1
|
17
|
+
Authorization: token kSLuTF2GC2Q4q4ugm3
|
18
|
+
```
|
19
|
+
|
20
|
+
`kSLuTF2GC2Q4q4ugm3` 换成你填写的 token。
|
21
|
+
|
22
|
+
从 2.1.3 版本开始支持以 query 参数 `access_token` 的形式传入 token,以便在无法修改请求头的情况下使用,例如:
|
23
|
+
|
24
|
+
```http
|
25
|
+
GET /send_private_msg?access_token=kSLuTF2GC2Q4q4ugm3&user_id=123456&message=hello HTTP/1.1
|
26
|
+
```
|
27
|
+
|
28
|
+
## 响应说明
|
29
|
+
|
30
|
+
对于任何请求:
|
31
|
+
|
32
|
+
- 如果请求方式不支持,状态码为 405;
|
33
|
+
- 如果 token 不符合,状态码为 401;
|
34
|
+
- 如果 POST 请求的 Content-Type 不正确,状态码为 400;
|
35
|
+
- 如果 API 不存在,状态码为 404;
|
36
|
+
- 剩下的所有情况,无论操作失败还是成功,状态码都是 200。
|
37
|
+
|
38
|
+
响应内容为 JSON 格式,基本结构如下:
|
39
|
+
|
40
|
+
```json
|
41
|
+
{
|
42
|
+
"status": "ok",
|
43
|
+
"retcode": 0,
|
44
|
+
"data": {
|
45
|
+
"id": 123456,
|
46
|
+
"nickname": "滑稽"
|
47
|
+
}
|
48
|
+
}
|
49
|
+
```
|
50
|
+
|
51
|
+
`status` 字段如果是 `ok` 则表示操作成功,同时 `retcode` (返回码)会等于 0,即酷 Q 函数返回了 0,也就是酷 Q 认为成功了,但实际上有某些情况下其实是没有成功的,比如向没有加入的群发送消息,返回码是 0,日志里也没有提示发送失败,但显然是发送不了的。这一点在酷 Q 的 [官方文档](https://d.cqp.me/Pro/%E5%BC%80%E5%8F%91/Error) 也说明了:
|
52
|
+
|
53
|
+
> 需要指出的是,某些接口暂未进行错误代码的处理,此时即使发生错误,仍返回0。
|
54
|
+
|
55
|
+
`status` 字段如果是 `failed` 则表示操作失败,此时 `retcode` 有两种情况,当大于 0 时,表示是 HTTP API 插件判断出的失败,这个目前有如下情况:
|
56
|
+
|
57
|
+
| 返回码 | 说明 |
|
58
|
+
| ------- | ---------------------------------------- |
|
59
|
+
| 100 | 默认的错误码,通常是因为没有传入必要参数,某些接口中也可能因为参数明显无效,比如传入的 QQ 号小于等于 0,此时无需调用酷 Q 函数即可确定失败 |
|
60
|
+
| 102 | 酷 Q 函数返回的数据无效,一般是因为传入参数有效但没有权限,比如试图获取没有加入的群组的成员列表 |
|
61
|
+
|
62
|
+
另外一种情况是 `retcode` 小于 0,此时即为调用酷 Q 函数的返回码,具体含义直接参考 [Pro/开发/Error](https://d.cqp.me/Pro/%E5%BC%80%E5%8F%91/Error) 和酷 Q 的日志。
|
63
|
+
|
64
|
+
`data` 字段为 API 返回数据的内容,对于发送消息、踢人等不需要返回数据的操作,这里为 null,对于获取群成员信息这类操作,这里为所获取的数据的对象,具体的数据内容将会在相应的 API 描述中给出。
|
65
|
+
|
66
|
+
后面的 API 描述中将只给出 `data` 字段的内容,放在「响应数据」标题下。
|
67
|
+
|
68
|
+
## 发送消息格式
|
69
|
+
|
70
|
+
从 2.0.0 版本开始发送消息格式有了较大变化(向下兼容),具体请查看 [消息格式](https://richardchien.github.io/coolq-http-api/#/Message)。
|
71
|
+
|
72
|
+
后面提到消息的地方(`message` 字段),将不再具体解释其格式。
|
73
|
+
|
74
|
+
## API 列表
|
75
|
+
|
76
|
+
### `/get_login_info` 获取登录号信息
|
77
|
+
|
78
|
+
#### 参数
|
79
|
+
|
80
|
+
无
|
81
|
+
|
82
|
+
#### 响应数据
|
83
|
+
|
84
|
+
| 字段名 | 数据类型 | 说明 |
|
85
|
+
| ----- | ------- | --- |
|
86
|
+
| `user_id` | number | QQ 号 |
|
87
|
+
| `nickname` | string | QQ 昵称 |
|
88
|
+
|
89
|
+
### `/send_private_msg` 发送私聊消息
|
90
|
+
|
91
|
+
#### 参数
|
92
|
+
|
93
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
94
|
+
| ----- | ------- | ----- | --- |
|
95
|
+
| `user_id` | number | - | 对方 QQ 号 |
|
96
|
+
| `message` | string/array | - | 要发送的内容 |
|
97
|
+
| `is_raw` | bool | false | 消息内容是否作为纯文本发送(即不解析 CQ 码),`message` 数据类型为 `array` 时无效 |
|
98
|
+
|
99
|
+
#### 响应数据
|
100
|
+
|
101
|
+
无
|
102
|
+
|
103
|
+
### `/send_group_msg` 发送群消息
|
104
|
+
|
105
|
+
#### 参数
|
106
|
+
|
107
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
108
|
+
| ----- | ------- | ----- | --- |
|
109
|
+
| `group_id` | number | - | 群号 |
|
110
|
+
| `message` | string/array | - | 要发送的内容 |
|
111
|
+
| `is_raw` | bool | false | 消息内容是否作为纯文本发送(即不解析 CQ 码),`message` 数据类型为 `array` 时无效 |
|
112
|
+
|
113
|
+
#### 响应数据
|
114
|
+
|
115
|
+
无
|
116
|
+
|
117
|
+
### `/send_discuss_msg` 发送讨论组消息
|
118
|
+
|
119
|
+
#### 参数
|
120
|
+
|
121
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
122
|
+
| ----- | ------- | ----- | --- |
|
123
|
+
| `discuss_id` | number | - | 讨论组 ID(正常情况下看不到,需要从讨论组消息上报的数据中获得) |
|
124
|
+
| `message` | string/array | - | 要发送的内容 |
|
125
|
+
| `is_raw` | bool | false | 消息内容是否作为纯文本发送(即不解析 CQ 码),`message` 数据类型为 `array` 时无效 |
|
126
|
+
|
127
|
+
#### 响应数据
|
128
|
+
|
129
|
+
无
|
130
|
+
|
131
|
+
### `/send_like` 发送好友赞
|
132
|
+
|
133
|
+
#### 参数
|
134
|
+
|
135
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
136
|
+
| ----- | ------- | ----- | --- |
|
137
|
+
| `user_id` | number | - | 对方 QQ 号 |
|
138
|
+
| `times` | number | 1 | 赞的次数,每个好友每天最多 10 次 |
|
139
|
+
|
140
|
+
#### 响应数据
|
141
|
+
|
142
|
+
无
|
143
|
+
|
144
|
+
### `/set_group_kick` 群组踢人
|
145
|
+
|
146
|
+
#### 参数
|
147
|
+
|
148
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
149
|
+
| ----- | ------- | ----- | --- |
|
150
|
+
| `group_id` | number | - | 群号 |
|
151
|
+
| `user_id` | number | - | 要踢的 QQ 号 |
|
152
|
+
| `reject_add_request` | bool | `false` | 拒绝此人的加群请求 |
|
153
|
+
|
154
|
+
#### 响应数据
|
155
|
+
|
156
|
+
无
|
157
|
+
|
158
|
+
### `/set_group_ban` 群组单人禁言
|
159
|
+
|
160
|
+
#### 参数
|
161
|
+
|
162
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
163
|
+
| ----- | ------- | ----- | --- |
|
164
|
+
| `group_id` | number | - | 群号 |
|
165
|
+
| `user_id` | number | - | 要禁言的 QQ 号 |
|
166
|
+
| `duration` | number | `30 * 60` | 禁言时长,单位秒,0 表示取消禁言 |
|
167
|
+
|
168
|
+
#### 响应数据
|
169
|
+
|
170
|
+
无
|
171
|
+
|
172
|
+
### `/set_group_anonymous_ban` 群组匿名用户禁言
|
173
|
+
|
174
|
+
#### 参数
|
175
|
+
|
176
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
177
|
+
| ----- | ------- | ----- | --- |
|
178
|
+
| `group_id` | number | - | 群号 |
|
179
|
+
| `flag` | string | - | 要禁言的匿名用户的 flag(需从群消息上报的数据中获得) |
|
180
|
+
| `duration` | number | `30 * 60` | 禁言时长,单位秒,无法取消匿名用户禁言 |
|
181
|
+
|
182
|
+
#### 响应数据
|
183
|
+
|
184
|
+
无
|
185
|
+
|
186
|
+
### `/set_group_whole_ban` 群组全员禁言
|
187
|
+
|
188
|
+
#### 参数
|
189
|
+
|
190
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
191
|
+
| ----- | ------- | ----- | --- |
|
192
|
+
| `group_id` | number | - | 群号 |
|
193
|
+
| `enable` | bool | `true` | 是否禁言 |
|
194
|
+
|
195
|
+
#### 响应数据
|
196
|
+
|
197
|
+
无
|
198
|
+
|
199
|
+
### `/set_group_admin` 群组设置管理员
|
200
|
+
|
201
|
+
#### 参数
|
202
|
+
|
203
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
204
|
+
| ----- | ------- | ----- | --- |
|
205
|
+
| `group_id` | number | - | 群号 |
|
206
|
+
| `user_id` | number | - | 要设置管理员的 QQ 号 |
|
207
|
+
| `enable` | bool | `true` | true 为设置,false 为取消 |
|
208
|
+
|
209
|
+
#### 响应数据
|
210
|
+
|
211
|
+
无
|
212
|
+
|
213
|
+
### `/set_group_anonymous` 群组匿名
|
214
|
+
|
215
|
+
#### 参数
|
216
|
+
|
217
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
218
|
+
| ----- | ------- | ----- | --- |
|
219
|
+
| `group_id` | number | - | 群号 |
|
220
|
+
| `enable` | bool | `true` | 是否允许匿名聊天 |
|
221
|
+
|
222
|
+
#### 响应数据
|
223
|
+
|
224
|
+
无
|
225
|
+
|
226
|
+
### `/set_group_card` 设置群名片(群备注)
|
227
|
+
|
228
|
+
#### 参数
|
229
|
+
|
230
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
231
|
+
| ----- | ------- | ----- | --- |
|
232
|
+
| `group_id` | number | - | 群号 |
|
233
|
+
| `user_id` | number | - | 要设置的 QQ 号 |
|
234
|
+
| `card` | string | 空 | 群名片内容,不填或空字符串表示删除群名片 |
|
235
|
+
|
236
|
+
#### 响应数据
|
237
|
+
|
238
|
+
无
|
239
|
+
|
240
|
+
### `/set_group_leave` 退出群组
|
241
|
+
|
242
|
+
#### 参数
|
243
|
+
|
244
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
245
|
+
| ----- | ------- | ----- | --- |
|
246
|
+
| `group_id` | number | - | 群号 |
|
247
|
+
| `is_dismiss` | bool | `false` | 是否解散,如果登录号是群主,则仅在此项为 true 时能够解散 |
|
248
|
+
|
249
|
+
#### 响应数据
|
250
|
+
|
251
|
+
无
|
252
|
+
|
253
|
+
### `/set_group_special_title` 设置群组专属头衔
|
254
|
+
|
255
|
+
#### 参数
|
256
|
+
|
257
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
258
|
+
| ----- | ------- | ----- | --- |
|
259
|
+
| `group_id` | number | - | 群号 |
|
260
|
+
| `user_id` | number | - | 要设置的 QQ 号 |
|
261
|
+
| `special_title` | string | 空 | 专属头衔,不填或空字符串表示删除专属头衔 |
|
262
|
+
| `duration` | number | `-1` | 专属头衔有效期,单位秒,-1 表示永久,不过此项似乎没有效果,可能是只有某些特殊的时间长度有效,有待测试 |
|
263
|
+
|
264
|
+
#### 响应数据
|
265
|
+
|
266
|
+
无
|
267
|
+
|
268
|
+
### `/set_discuss_leave` 退出讨论组
|
269
|
+
|
270
|
+
#### 参数
|
271
|
+
|
272
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
273
|
+
| ----- | ------- | ----- | --- |
|
274
|
+
| `discuss_id` | number | - | 讨论组 ID(正常情况下看不到,需要从讨论组消息上报的数据中获得) |
|
275
|
+
|
276
|
+
#### 响应数据
|
277
|
+
|
278
|
+
无
|
279
|
+
|
280
|
+
### `/set_friend_add_request` 处理加好友请求
|
281
|
+
|
282
|
+
#### 参数
|
283
|
+
|
284
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
285
|
+
| ----- | ------- | ----- | --- |
|
286
|
+
| `flag` | string | - | 加好友请求的 flag(需从上报的数据中获得) |
|
287
|
+
| `approve` | bool | `true` | 是否同意请求 |
|
288
|
+
| `remark` | string | 空 | 添加后的好友备注(仅在同意时有效) |
|
289
|
+
|
290
|
+
#### 响应数据
|
291
|
+
|
292
|
+
无
|
293
|
+
|
294
|
+
### `/set_group_add_request` 处理加群请求/邀请
|
295
|
+
|
296
|
+
#### 参数
|
297
|
+
|
298
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
299
|
+
| ----- | ------- | ----- | --- |
|
300
|
+
| `flag` | string | - | 加好友请求的 flag(需从上报的数据中获得) |
|
301
|
+
| `type` | string | - | `add` 或 `invite`,请求类型(需要和上报消息中的 `sub_type` 字段相符) |
|
302
|
+
| `approve` | bool | `true` | 是否同意请求/邀请 |
|
303
|
+
| `reason` | string | 空 | 拒绝理由(仅在拒绝时有效) |
|
304
|
+
|
305
|
+
#### 响应数据
|
306
|
+
|
307
|
+
无
|
308
|
+
|
309
|
+
### `/get_group_list` 获取群列表
|
310
|
+
|
311
|
+
#### 参数
|
312
|
+
|
313
|
+
无
|
314
|
+
|
315
|
+
#### 响应数据
|
316
|
+
|
317
|
+
响应内容为 JSON 数组,每个元素如下:
|
318
|
+
|
319
|
+
| 字段名 | 数据类型 | 说明 |
|
320
|
+
| ----- | ------- | --- |
|
321
|
+
| `group_id` | number | 群号 |
|
322
|
+
| `group_name` | string | 群名称 |
|
323
|
+
|
324
|
+
### `/get_group_member_info` 获取群成员信息
|
325
|
+
|
326
|
+
#### 参数
|
327
|
+
|
328
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
329
|
+
| ----- | ------- | ----- | --- |
|
330
|
+
| `group_id` | number | - | 群号 |
|
331
|
+
| `user_id` | number | - | QQ 号(不可以是登录号) |
|
332
|
+
| `no_cache` | bool | `false` | 是否不使用缓存(使用缓存可能更新不及时,但响应更快) |
|
333
|
+
|
334
|
+
#### 响应数据
|
335
|
+
|
336
|
+
| 字段名 | 数据类型 | 说明 |
|
337
|
+
| ----- | ------- | --- |
|
338
|
+
| `group_id` | number | 群号 |
|
339
|
+
| `user_id` | number | QQ 号 |
|
340
|
+
| `nickname` | string | 昵称 |
|
341
|
+
| `card` | string | 群名片/备注 |
|
342
|
+
| `sex` | string | 性别,`male` 或 `female` 或 `unknown` |
|
343
|
+
| `age` | number | 年龄 |
|
344
|
+
| `area` | string | 地区 |
|
345
|
+
| `join_time` | number | 加群时间戳 |
|
346
|
+
| `last_sent_time` | number | 最后发言时间戳 |
|
347
|
+
| `level` | string | 成员等级 |
|
348
|
+
| `role` | string | 角色,`owner` 或 `admin` 或 `member` |
|
349
|
+
| `unfriendly` | bool | 是否不良记录成员 |
|
350
|
+
| `title` | string | 专属头衔 |
|
351
|
+
| `title_expire_time` | number | 专属头衔过期时间戳 |
|
352
|
+
| `card_changeable` | bool | 是否允许修改群名片 |
|
353
|
+
|
354
|
+
### `/get_group_member_list` 获取群成员列表
|
355
|
+
|
356
|
+
#### 参数
|
357
|
+
|
358
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
359
|
+
| ----- | ------- | ----- | --- |
|
360
|
+
| `group_id` | number | - | 群号 |
|
361
|
+
|
362
|
+
#### 响应数据
|
363
|
+
|
364
|
+
响应内容为 JSON 数组,每个元素的内容和上面的 `/get_group_member_info` 接口相同,但对于同一个群组的同一个成员,获取列表时和获取单独的成员信息时,某些字段可能有所不同,例如 `area`、`title` 等字段在获取列表时无法获得,具体应以单独的成员信息为准。
|
365
|
+
|
366
|
+
### `/get_stranger_info` 获取陌生人信息
|
367
|
+
|
368
|
+
#### 参数
|
369
|
+
|
370
|
+
| 字段名 | 数据类型 | 默认值 | 说明 |
|
371
|
+
| ----- | ------- | ----- | --- |
|
372
|
+
| `user_id` | number | - | QQ 号(不可以是登录号) |
|
373
|
+
| `no_cache` | bool | `false` | 是否不使用缓存(使用缓存可能更新不及时,但响应更快) |
|
374
|
+
|
375
|
+
#### 响应数据
|
376
|
+
|
377
|
+
| 字段名 | 数据类型 | 说明 |
|
378
|
+
| ----- | ------- | --- |
|
379
|
+
| `user_id` | number | QQ 号 |
|
380
|
+
| `nickname` | string | 昵称 |
|
381
|
+
| `sex` | string | 性别,`male` 或 `female` 或 `unknown` |
|
382
|
+
| `age` | number | 年龄 |
|
383
|
+
|
384
|
+
### `/get_cookies` 获取 Cookies
|
385
|
+
|
386
|
+
#### 参数
|
387
|
+
|
388
|
+
无
|
389
|
+
|
390
|
+
#### 响应数据
|
391
|
+
|
392
|
+
| 字段名 | 数据类型 | 说明 |
|
393
|
+
| ----- | ------- | --- |
|
394
|
+
| `cookies` | string | Cookies |
|
395
|
+
|
396
|
+
### `/get_csrf_token` 获取 CSRF Token
|
397
|
+
|
398
|
+
#### 参数
|
399
|
+
|
400
|
+
无
|
401
|
+
|
402
|
+
#### 响应数据
|
403
|
+
|
404
|
+
| 字段名 | 数据类型 | 说明 |
|
405
|
+
| ----- | ------- | --- |
|
406
|
+
| `token` | number | CSRF Token |
|
407
|
+
|
408
|
+
### `/get_version_info` 获取酷 Q 及 HTTP API 插件的版本信息
|
409
|
+
|
410
|
+
#### 参数
|
411
|
+
|
412
|
+
无
|
413
|
+
|
414
|
+
#### 响应数据
|
415
|
+
|
416
|
+
| 字段名 | 数据类型 | 说明 |
|
417
|
+
| ----- | ------- | --- |
|
418
|
+
| `coolq_edition` | string | 酷 Q 版本,`air` 或 `pro` |
|
419
|
+
| `plugin_version` | string | HTTP API 插件版本,例如 `2.1.3` |
|
420
|
+
|
421
|
+
## 获取 `data` 目录中的文件的接口
|
422
|
+
|
423
|
+
2.1.0 版本开始提供一个简单的静态文件获取服务,请求方式只支持 GET,URL 路径为 `/data/` 加上要请求的文件相对于酷 Q `data` 目录的路径。例如,假设酷 Q 主目录在 `C:\Apps\CQA`,则要获取 `C:\Apps\CQA\data\image\ABCD.jpg.cqimg` 的话,只需请求 `/data/image/ABCD.jpg.cqimg`,响应内容即为要请求的文件。
|
424
|
+
|
425
|
+
和上面的其它请求一样,如果配置文件中指定了 token,则每次请求需要在请求头中加入验证头 `Authorization: token your-token`。
|
426
|
+
|
427
|
+
另外,请求的路径中不允许出现 `..`,即上级目录的标记,以防止恶意或错误的请求到系统中的其它文件。
|
428
|
+
|
429
|
+
本功能默认情况下不开启,在配置文件中将 `serve_data_file` 设置为 `yes` 或 `true` 即可开启,见 [配置文件说明](https://richardchien.github.io/coolq-http-api/#/Configuration)。
|
data/lib/CQHTTP/api.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
module CQHTTP
|
2
|
+
# All API
|
3
|
+
class API
|
4
|
+
attr_reader :func_list
|
5
|
+
|
6
|
+
# init
|
7
|
+
#
|
8
|
+
# host: String: API address, like 'http://localhost:5700'
|
9
|
+
# type: Symbol or String, 'get', 'form' or 'json;
|
10
|
+
def initialize(host = 'http://localhost:5700', way = :get)
|
11
|
+
@func_list = {}
|
12
|
+
gen
|
13
|
+
@func_list.freeze
|
14
|
+
@network = CQHTTP::Network.gen way, host
|
15
|
+
end
|
16
|
+
|
17
|
+
def respond_to_missing?(method, include_private = false)
|
18
|
+
@func_list.include?(method) || super
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(name, *user_args)
|
22
|
+
return super unless respond_to_missing? name
|
23
|
+
|
24
|
+
args = gen_args name, user_args
|
25
|
+
args.freeze
|
26
|
+
return super if args.nil?
|
27
|
+
return super if args.value? nil
|
28
|
+
call_network name, args
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
####################################################################
|
34
|
+
# api_call #
|
35
|
+
####################################################################
|
36
|
+
|
37
|
+
def gen_args(name, user_args)
|
38
|
+
args = @func_list[name.to_sym]
|
39
|
+
return {} if args == {}
|
40
|
+
return hash_to_args(args, user) if user_args[0].class == {}.class
|
41
|
+
array_to_args(args, user_args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def hash_to_args(default, user)
|
45
|
+
return unless user.size == 1
|
46
|
+
default.merge(user[0].delete_if { |key, _value| !default.key? key })
|
47
|
+
end
|
48
|
+
|
49
|
+
def array_to_args(default, user)
|
50
|
+
return if user.size > default.size
|
51
|
+
it = default.each_key
|
52
|
+
args = user.each_with_object({}) { |value, obj| obj[it.next] = value }
|
53
|
+
hash_to_args default, [args]
|
54
|
+
end
|
55
|
+
|
56
|
+
def call_network(name, args)
|
57
|
+
url = '/' + name.to_s
|
58
|
+
@network.call(url, args)
|
59
|
+
end
|
60
|
+
|
61
|
+
####################################################################
|
62
|
+
# gen #
|
63
|
+
####################################################################
|
64
|
+
|
65
|
+
def skip_head(file)
|
66
|
+
until file.gets.chomp == '## API 列表'; end
|
67
|
+
end
|
68
|
+
|
69
|
+
def skip_to_next_api(file)
|
70
|
+
while (line = file.gets)
|
71
|
+
return nil if line =~ /^## /
|
72
|
+
return line.gsub(%r{^### `\/(.+)`.*$}, '\1').chomp if line =~ /^### /
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def skip_to_args(file)
|
77
|
+
until file.gets.chomp == '#### 参数'; end
|
78
|
+
file.gets
|
79
|
+
file.gets.chomp
|
80
|
+
end
|
81
|
+
|
82
|
+
def skip_to_table_head(file)
|
83
|
+
until file.gets =~ /^\|\s*-+\s*\|\s*-+\s*\|\s*-+\s*\|\s*-+\s*\|$/; end
|
84
|
+
end
|
85
|
+
|
86
|
+
def non_arg_check(name, line)
|
87
|
+
return unless line == '无'
|
88
|
+
@func_list[name.to_sym] = {}
|
89
|
+
true
|
90
|
+
end
|
91
|
+
|
92
|
+
def get_default(str)
|
93
|
+
str.sub!(/^`(.+)`$/, '\1')
|
94
|
+
return str.to_i if str =~ /^[+-]?\d+$/
|
95
|
+
return true if str == 'true'
|
96
|
+
return false if str == 'false'
|
97
|
+
m = str.match(/^\s*(\d+)\s*\*\s*(\d+)\s*/)
|
98
|
+
return m[1].to_i * m[2].to_i if m
|
99
|
+
str
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_args(file)
|
103
|
+
args = {}
|
104
|
+
until (line = file.gets) =~ /^$/
|
105
|
+
m = line.match(/^\|\s*`(\w+)`\s*\|\s+.+?\s+\|\s+(.+?)\s+\|/)
|
106
|
+
args[m[1].to_sym] = case m[2]
|
107
|
+
when '空' then ''
|
108
|
+
when '-' then nil
|
109
|
+
else get_default m[2]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
args
|
113
|
+
end
|
114
|
+
|
115
|
+
def add_to_func_list(name, file)
|
116
|
+
return if non_arg_check(name, skip_to_args(file))
|
117
|
+
skip_to_table_head file
|
118
|
+
@func_list[name.to_sym] = get_args file
|
119
|
+
end
|
120
|
+
|
121
|
+
def gen
|
122
|
+
File.open File.join(File.dirname(__FILE__), 'API.md') do |f|
|
123
|
+
skip_head f
|
124
|
+
|
125
|
+
loop do
|
126
|
+
name = skip_to_next_api f
|
127
|
+
return @func_list unless name
|
128
|
+
add_to_func_list name, f
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module CQHTTP
|
2
|
+
# get, post
|
3
|
+
#
|
4
|
+
# Example:
|
5
|
+
# get = Network.gen :get, 'http://localhost:5700'
|
6
|
+
# json = get.call '/get_login_info'
|
7
|
+
module Network
|
8
|
+
# gen lambda
|
9
|
+
#
|
10
|
+
# type: Symbol or String, 'get', 'form' or 'json;
|
11
|
+
# host: String: API address, like 'http://localhost:5700'
|
12
|
+
def self.gen(type, host) # => lambda
|
13
|
+
case type.to_sym
|
14
|
+
when :get then ->(url, param = nil) { Network.get URI(host + url), param }
|
15
|
+
when :form then ->(url, body) { Network.post_form URI(host + url), body }
|
16
|
+
when :json then ->(url, body) { Network.post_json URI(host + url), body }
|
17
|
+
else raise type
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# get url
|
22
|
+
#
|
23
|
+
# uri: URI
|
24
|
+
# params (optional): Hash, url query
|
25
|
+
def self.get(uri, params = nil) # => Hash
|
26
|
+
puts 'GET URL:', uri if $DEBUG
|
27
|
+
uri.query = URI.encode_www_form params if params
|
28
|
+
error Net::HTTP.get_response(uri)
|
29
|
+
end
|
30
|
+
|
31
|
+
# post to url by form
|
32
|
+
#
|
33
|
+
# uri: URI
|
34
|
+
# body: Hash, post body
|
35
|
+
def self.post_form(uri, body) # => Hash
|
36
|
+
puts 'POST URL:', uri if $DEBUG
|
37
|
+
error Net::HTTP.post_form(uri, body)
|
38
|
+
end
|
39
|
+
|
40
|
+
# post to url by json
|
41
|
+
#
|
42
|
+
# uri: URI
|
43
|
+
# body: Hash, post body
|
44
|
+
def self.post_json(uri, body)
|
45
|
+
puts 'POST URL:', uri if $DEBUG
|
46
|
+
error Net::HTTP.post(
|
47
|
+
uri,
|
48
|
+
body.to_json,
|
49
|
+
'Content-Type' => 'application/json'
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
private_class_method
|
54
|
+
|
55
|
+
def self.error(res)
|
56
|
+
coolq_error http_error res
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.http_error(res)
|
60
|
+
case res.code.to_i
|
61
|
+
when 200 then return JSON.parse res.body
|
62
|
+
when 405 then raise '请求方式不支持'
|
63
|
+
when 401 then raise 'token 不符合'
|
64
|
+
when 400 then raise 'POST 请求的 Content-Type 不正确'
|
65
|
+
when 404 then raise 'API 不存在'
|
66
|
+
end
|
67
|
+
raise res.code.to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.coolq_error(json)
|
71
|
+
case json['retcode'].to_i
|
72
|
+
when 0 then return json
|
73
|
+
when 100 then raise '参数错误'
|
74
|
+
when 102 then raise '没有权限'
|
75
|
+
end
|
76
|
+
raise json['retcode'].to_s
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/CQHTTP/qq.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
class QQ
|
3
|
+
include QQAPI
|
4
|
+
attr_reader :json
|
5
|
+
|
6
|
+
def initialize(hostname: '0.0.0.0', port: 9455)
|
7
|
+
@server = TCPServer.new(hostname, port)
|
8
|
+
@event_method = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def bind(func)
|
12
|
+
@event_method << func
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
loop do
|
17
|
+
socket = @server.accept
|
18
|
+
|
19
|
+
head socket
|
20
|
+
|
21
|
+
socket.print "HTTP/1.1 204\r\nContent-Type: application/json\r\n\r\n"
|
22
|
+
data = socket.gets
|
23
|
+
@json = JSON.parse data
|
24
|
+
|
25
|
+
@event_method.each { |func| func.call self }
|
26
|
+
|
27
|
+
socket.close
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def head(socket)
|
34
|
+
puts 'head'
|
35
|
+
while (line = socket.gets) != "\r\n"
|
36
|
+
put line
|
37
|
+
end
|
38
|
+
puts 'end'
|
39
|
+
end
|
40
|
+
|
41
|
+
def put(text)
|
42
|
+
print ' '
|
43
|
+
puts text
|
44
|
+
end
|
45
|
+
end
|
data/lib/CQHTTP.rb
ADDED
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: CQHTTP
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- 71e6fd52
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
- DAStudio.71e6fd52@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- CQHTTP.gemspec
|
65
|
+
- Gemfile
|
66
|
+
- README.en.md
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- bin/console
|
70
|
+
- bin/gen_api_list
|
71
|
+
- bin/setup
|
72
|
+
- lib/CQHTTP.rb
|
73
|
+
- lib/CQHTTP/API.md
|
74
|
+
- lib/CQHTTP/api.rb
|
75
|
+
- lib/CQHTTP/network.rb
|
76
|
+
- lib/CQHTTP/qq.rb
|
77
|
+
- lib/CQHTTP/version.rb
|
78
|
+
homepage: https://github.com/71e6fd52/cqhttp-ruby
|
79
|
+
licenses: []
|
80
|
+
metadata: {}
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
require_paths:
|
84
|
+
- lib
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubyforge_project:
|
97
|
+
rubygems_version: 2.6.13
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: CoolQ HTTP API ruby bind
|
101
|
+
test_files: []
|