qqbot 0.1.5 → 0.1.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc4be48d8011645a38f44ce1056624619b16294c
4
- data.tar.gz: 7bf2fbd4124cc06e692f79ff707254db4f7f3258
3
+ metadata.gz: 3705c7042139eb9057765efc1a752e5832178078
4
+ data.tar.gz: bb2fe5f03e6f22448fa1c94bb4c5a43e190e2f23
5
5
  SHA512:
6
- metadata.gz: 6b61d633683f6123f5648a7294e5aea8d872ac8c66209affb8fa1f8c344085884cb2912a74a160ac8e6e6b9946d85e3f829e027175ea4f777491f8cec30e59e4
7
- data.tar.gz: 8c507e50bead3f036f1cdb81ba5e973ce62ad17347f5ba15028085c894d4b7aee6fbdb39fa8da05e26df6d476bb9d80b2e304d57d430125ea03a917942f52ee8
6
+ metadata.gz: 03fd72b1f4d26abecb697a71bda74f1a4ebb7387c190a93011c0a8eb7b261f838ed4351e05055e01320216f49d1fb5b95f0c4da5a9c72edde09cecf42b7fce49
7
+ data.tar.gz: fbb384a8f99e5b078035ca346c8271d2f17060a06e55625d49a36c423c0d636163025a55ec428e426311218330ec35165a94479a097fd36f418836a138d53728
data/.gitignore CHANGED
@@ -1,15 +1,15 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
-
11
- lib/qqbot/qrcode.png
12
-
13
- qqbot-0.1.0.gem
14
-
15
- *.gem
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ lib/qqbot/qrcode.png
12
+
13
+ qqbot-0.1.0.gem
14
+
15
+ *.gem
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://ruby.taobao.org'
2
-
3
- # Specify your gem's dependencies in qqbot.gemspec
4
- gemspec
1
+ source 'https://ruby.taobao.org'
2
+
3
+ # Specify your gem's dependencies in qqbot.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -1,84 +1,84 @@
1
- # QQBot
2
-
3
- 基于 Smart QQ(Web QQ)的 QQ 机器人
4
-
5
- ### 使用方法
6
-
7
- 安装这个 Gem :
8
-
9
- ```
10
- gem install qqbot
11
- ```
12
-
13
- `require 'qqbot'`并编写自己的业务逻辑,例如:
14
-
15
- ```
16
- require 'qqbot'
17
-
18
- qqbot = QQBot.new
19
-
20
- # 在这里需要扫描二维码登录
21
-
22
- # 打印出好友列表
23
- qqbot.get_friend_list_with_category.each do |category|
24
- puts category.name
25
- category.friends.each do |friend|
26
- puts "———— #{friend.nickname}"
27
- end
28
- end
29
- ```
30
-
31
- ### 示例代码
32
-
33
- [在控制台打印接收到的所有消息][1]
34
-
35
- 效果:
36
-
37
- ![Console][2]
38
-
39
- [通过 Tuling123 的 Api 实现自动回复功能][3]
40
-
41
- 效果:
42
-
43
- ![Tuling][4]
44
-
45
-
46
- [1]: https://gist.github.com/ScienJus/f1ba1e5b1611cca662cc
47
- [2]: http://www.scienjus.com/wp-content/uploads/2015/12/console.png
48
- [3]: https://gist.github.com/ScienJus/26a341fda25d009acea1
49
- [4]: http://www.scienjus.com/wp-content/uploads/2015/12/tuling.jpg
50
-
51
- ### Api 列表
52
-
53
- - [x] 登录
54
- - [x] 拉取消息
55
- - [x] 获取群列表
56
- - [x] 获取好友列表
57
- - [x] 获取讨论组列表
58
- - [x] 发送私聊消息
59
- - [x] 发送群消息
60
- - [x] 发送讨论组消息
61
- - [x] 发送临时消息
62
- - [x] 好友详细信息
63
- - [x] 群详细信息
64
- - [x] 讨论组详细信息
65
- - [x] 获取在线好友
66
- - [x] 获取最近会话
67
- - [x] 获取登录用户信息
68
- - [x] 查询用户 QQ 号
69
- - [ ] 退出登录
70
-
71
-
72
- ### 拓展功能列表
73
-
74
- - [x] 登录时保存二维码到本地
75
- - [x] 登录时通过网页查看二维码
76
- - [ ] 登录时发送二维码到指定邮箱
77
- - [ ] 登录时将二维码打印到控制台
78
- - [x] 掉线时尝试重新登录
79
- - [ ] 登录失效后邮件推送信息
80
-
81
-
82
- ### 反馈
83
-
84
- 有问题或是建议可以提 Issues ,或是发邮件联系我,我的邮箱:`i@scienjus.com`
1
+ # QQBot
2
+
3
+ 基于 Smart QQ(Web QQ)的 QQ 机器人
4
+
5
+ ### 使用方法
6
+
7
+ 安装这个 Gem :
8
+
9
+ ```
10
+ gem install qqbot
11
+ ```
12
+
13
+ `require 'qqbot'`并编写自己的业务逻辑,例如:
14
+
15
+ ```
16
+ require 'qqbot'
17
+
18
+ qqbot = QQBot.new
19
+
20
+ # 在这里需要扫描二维码登录
21
+
22
+ # 打印出好友列表
23
+ qqbot.get_friend_list_with_category.each do |category|
24
+ puts category.name
25
+ category.friends.each do |friend|
26
+ puts "———— #{friend.nickname}"
27
+ end
28
+ end
29
+ ```
30
+
31
+ ### 示例代码
32
+
33
+ [在控制台打印接收到的所有消息][1]
34
+
35
+ 效果:
36
+
37
+ ![Console][2]
38
+
39
+ [通过 Tuling123 的 Api 实现自动回复功能][3]
40
+
41
+ 效果:
42
+
43
+ ![Tuling][4]
44
+
45
+
46
+ [1]: https://gist.github.com/ScienJus/f1ba1e5b1611cca662cc
47
+ [2]: http://www.scienjus.com/wp-content/uploads/2015/12/console.png
48
+ [3]: https://gist.github.com/ScienJus/26a341fda25d009acea1
49
+ [4]: http://www.scienjus.com/wp-content/uploads/2015/12/tuling.jpg
50
+
51
+ ### Api 列表
52
+
53
+ - [x] 登录
54
+ - [x] 拉取消息
55
+ - [x] 获取群列表
56
+ - [x] 获取好友列表
57
+ - [x] 获取讨论组列表
58
+ - [x] 发送私聊消息
59
+ - [x] 发送群消息
60
+ - [x] 发送讨论组消息
61
+ - [x] 发送临时消息
62
+ - [x] 好友详细信息
63
+ - [x] 群详细信息
64
+ - [x] 讨论组详细信息
65
+ - [x] 获取在线好友
66
+ - [x] 获取最近会话
67
+ - [x] 获取登录用户信息
68
+ - [x] 查询用户 QQ 号
69
+ - [ ] 退出登录
70
+
71
+
72
+ ### 拓展功能列表
73
+
74
+ - [x] 登录时保存二维码到本地
75
+ - [x] 登录时通过网页查看二维码
76
+ - [ ] 登录时发送二维码到指定邮箱
77
+ - [ ] 登录时将二维码打印到控制台
78
+ - [x] 掉线时尝试重新登录
79
+ - [ ] 登录失效后邮件推送信息
80
+
81
+
82
+ ### 反馈
83
+
84
+ 有问题或是建议可以提 Issues ,或是发邮件联系我,我的邮箱:`i@scienjus.com`
@@ -1,46 +1,46 @@
1
- require 'logger'
2
- require 'qqbot/version'
3
-
4
- module QQBot
5
-
6
- class Logger < Logger
7
-
8
- def info(*args)
9
- super && false if info?
10
- end
11
-
12
- def debug(*args)
13
- super && false if debug?
14
- end
15
- end
16
-
17
- LOGGER = QQBot::Logger.new(STDOUT)
18
- LOGGER.datetime_format = '%Y-%m-%d %H:%M:%S'
19
- LOGGER.level = Logger::INFO
20
-
21
- CLIENT_ID = 53999199
22
-
23
- autoload :Cookie, 'qqbot/cookie'
24
- autoload :Client, 'qqbot/client'
25
- autoload :Api, 'qqbot/api'
26
- autoload :Bot, 'qqbot/bot'
27
- autoload :Group, 'qqbot/model'
28
- autoload :Friend, 'qqbot/model'
29
- autoload :Category, 'qqbot/model'
30
- autoload :Discuss, 'qqbot/model'
31
- autoload :Message, 'qqbot/model'
32
- autoload :Font, 'qqbot/model'
33
- autoload :UserInfo, 'qqbot/model'
34
- autoload :Birthday, 'qqbot/model'
35
- autoload :Recent, 'qqbot/model'
36
- autoload :Online, 'qqbot/model'
37
- autoload :GroupInfo, 'qqbot/model'
38
- autoload :GroupMember, 'qqbot/model'
39
- autoload :DiscussInfo, 'qqbot/model'
40
- autoload :DiscussMember, 'qqbot/model'
41
- autoload :Error, 'qqbot/error'
42
-
43
- def self.new
44
- QQBot::Bot.new
45
- end
46
- end
1
+ require 'logger'
2
+ require 'qqbot/version'
3
+
4
+ module QQBot
5
+
6
+ class Logger < Logger
7
+
8
+ def info(*args)
9
+ super && false if info?
10
+ end
11
+
12
+ def debug(*args)
13
+ super && false if debug?
14
+ end
15
+ end
16
+
17
+ LOGGER = QQBot::Logger.new(STDOUT)
18
+ LOGGER.datetime_format = '%Y-%m-%d %H:%M:%S'
19
+ LOGGER.level = Logger::INFO
20
+
21
+ CLIENT_ID = 53999199
22
+
23
+ autoload :Cookie, 'qqbot/cookie'
24
+ autoload :Client, 'qqbot/client'
25
+ autoload :Api, 'qqbot/api'
26
+ autoload :Bot, 'qqbot/bot'
27
+ autoload :Group, 'qqbot/model'
28
+ autoload :Friend, 'qqbot/model'
29
+ autoload :Category, 'qqbot/model'
30
+ autoload :Discuss, 'qqbot/model'
31
+ autoload :Message, 'qqbot/model'
32
+ autoload :Font, 'qqbot/model'
33
+ autoload :UserInfo, 'qqbot/model'
34
+ autoload :Birthday, 'qqbot/model'
35
+ autoload :Recent, 'qqbot/model'
36
+ autoload :Online, 'qqbot/model'
37
+ autoload :GroupInfo, 'qqbot/model'
38
+ autoload :GroupMember, 'qqbot/model'
39
+ autoload :DiscussInfo, 'qqbot/model'
40
+ autoload :DiscussMember, 'qqbot/model'
41
+ autoload :Error, 'qqbot/error'
42
+
43
+ def self.new
44
+ QQBot::Bot.new
45
+ end
46
+ end
@@ -1,314 +1,314 @@
1
- require 'uri'
2
-
3
- module QQBot
4
- class Api
5
-
6
- def initialize
7
- @client = QQBot::Client.new
8
- @msg_id = 1_000_000
9
- end
10
-
11
- def auth_options=(options = {})
12
- @options = options
13
- end
14
-
15
- def get_qrcode
16
- uri = URI('https://ssl.ptlogin2.qq.com/ptqrshow');
17
- uri.query =
18
- URI.encode_www_form(
19
- appid: 501004106,
20
- e: 0,
21
- l: :M,
22
- s: 5,
23
- d: 72,
24
- v: 4,
25
- t: 0.1,
26
- )
27
- @client.get(uri)
28
- end
29
-
30
- def verify_qrcode
31
- uri = URI('https://ssl.ptlogin2.qq.com/ptqrlogin');
32
- uri.query =
33
- URI.encode_www_form(
34
- webqq_type: 10,
35
- remember_uin: 1,
36
- login2qq: 1,
37
- aid: 501004106,
38
- u1: 'http://Fw.qq.com/proxy.html?login2qq=1&webqq_type=10',
39
- ptredirect: 0,
40
- ptlang: 2052,
41
- daid: 164,
42
- from_ui: 1,
43
- pttype: 1,
44
- dumy: '',
45
- fp: 'loginerroralert',
46
- action: '0-0-157510',
47
- mibao_css: 'm_webqq',
48
- t: 1,
49
- g: 1,
50
- js_type: 0,
51
- js_ver: 10143,
52
- login_sig: '',
53
- pt_randsalt: 0,
54
- )
55
- @client.get(uri)
56
- end
57
-
58
- def get_ptwebqq(url)
59
- uri = URI(url);
60
- code, body = @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
61
- return code, @client.get_cookie('ptwebqq')
62
- end
63
-
64
- def get_vfwebqq(ptwebqq)
65
- uri = URI('http://s.web2.qq.com/api/getvfwebqq');
66
- uri.query =
67
- URI.encode_www_form(
68
- ptwebqq: ptwebqq,
69
- clientid: QQBot::CLIENT_ID,
70
- psessionid: '',
71
- t: 0.1,
72
- )
73
- @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
74
- end
75
-
76
- def get_psessionid_and_uin(ptwebqq)
77
- uri = URI('http://d1.web2.qq.com/channel/login2');
78
- r = JSON.generate(
79
- ptwebqq: ptwebqq,
80
- clientid: QQBot::CLIENT_ID,
81
- psessionid: '',
82
- status: 'online'
83
- )
84
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
85
- end
86
-
87
- def self.hash(uin, ptwebqq)
88
- n = Array.new(4, 0)
89
- ptwebqq.chars.each_index { |i| n[i % 4] ^= ptwebqq[i].ord }
90
- u = ['EC', 'OK']
91
- v = Array.new(4)
92
- v[0] = uin >> 24 & 255 ^ u[0][0].ord;
93
- v[1] = uin >> 16 & 255 ^ u[0][1].ord;
94
- v[2] = uin >> 8 & 255 ^ u[1][0].ord;
95
- v[3] = uin & 255 ^ u[1][1].ord;
96
- u = Array.new(8)
97
- (0...8).each { |i| u[i] = i.odd? ? v[i >> 1] : n[i >> 1] }
98
- n = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
99
- v = ''
100
- u.each do |i|
101
- v << n[(i >> 4) & 15]
102
- v << n[i & 15]
103
- end
104
- v
105
- end
106
-
107
- def poll
108
- uri = URI('http://d1.web2.qq.com/channel/poll2')
109
- r = JSON.generate(
110
- ptwebqq: @options[:ptwebqq],
111
- clientid: QQBot::CLIENT_ID,
112
- psessionid: @options[:psessionid],
113
- key: ''
114
- )
115
- begin
116
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
117
- rescue
118
- retry
119
- end
120
- end
121
-
122
- def get_group_list
123
- uri = URI('http://s.web2.qq.com/api/get_group_name_list_mask2')
124
- r = JSON.generate(
125
- vfwebqq: @options[:vfwebqq],
126
- hash: hash
127
- )
128
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
129
- end
130
-
131
- def hash
132
- self.class.hash(@options[:uin], @options[:ptwebqq])
133
- end
134
-
135
- def get_friend_list
136
- uri = URI('http://s.web2.qq.com/api/get_user_friends2')
137
- r = JSON.generate(
138
- vfwebqq: @options[:vfwebqq],
139
- hash: hash
140
- )
141
- @client.post(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1', r: r)
142
- end
143
-
144
- def get_discuss_list
145
- uri = URI('http://s.web2.qq.com/api/get_discus_list')
146
- uri.query =
147
- URI.encode_www_form(
148
- clientid: QQBot::CLIENT_ID,
149
- psessionid: @options[:psessionid],
150
- vfwebqq: @options[:vfwebqq],
151
- t: 0.1
152
- )
153
- @client.get(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2')
154
- end
155
-
156
- def send_to_friend(friend_id, content)
157
- uri = URI('http://d1.web2.qq.com/channel/send_buddy_msg2')
158
- r = JSON.generate(
159
- to: friend_id,
160
- content: self.class.build_message(content),
161
- face: 522,
162
- clientid: QQBot::CLIENT_ID,
163
- msg_id: msg_id,
164
- psessionid: @options[:psessionid]
165
- )
166
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
167
- end
168
-
169
- def send_to_group(group_id, content)
170
- uri = URI('http://d1.web2.qq.com/channel/send_qun_msg2')
171
- r = JSON.generate(
172
- group_uin: group_id,
173
- content: self.class.build_message(content),
174
- face: 522,
175
- clientid: QQBot::CLIENT_ID,
176
- msg_id: msg_id,
177
- psessionid: @options[:psessionid]
178
- )
179
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
180
- end
181
-
182
- def send_to_discuss(discuss_id, content)
183
- uri = URI('http://d1.web2.qq.com/channel/send_discu_msg2')
184
- r = JSON.generate(
185
- did: discuss_id,
186
- content: self.class.build_message(content),
187
- face: 522,
188
- clientid: QQBot::CLIENT_ID,
189
- msg_id: msg_id,
190
- psessionid: @options[:psessionid]
191
- )
192
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
193
- end
194
-
195
- def send_to_sess(sess_id, content)
196
- uri = URI('http://d1.web2.qq.com/channel/send_sess_msg2')
197
- r = JSON.generate(
198
- to: sess_id,
199
- content: self.class.build_message(content),
200
- face: 522,
201
- clientid: QQBot::CLIENT_ID,
202
- msg_id: msg_id,
203
- psessionid: @options[:psessionid]
204
- )
205
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
206
- end
207
-
208
- def get_account_info
209
- uri = URI('http://s.web2.qq.com/api/get_self_info2')
210
- uri.query =
211
- URI.encode_www_form(
212
- t: 0.1
213
- )
214
-
215
- @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
216
- end
217
-
218
- def get_recent_list
219
- uri = URI('http://d1.web2.qq.com/channel/get_recent_list2')
220
- r = JSON.generate(
221
- vfwebqq: @options[:vfwebqq],
222
- clientid: QQBot::CLIENT_ID,
223
- psessionid: ''
224
- )
225
- @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
226
- end
227
-
228
- def get_qq_by_id(id)
229
- uri = URI('http://s.web2.qq.com/api/get_friend_uin2')
230
- uri.query =
231
- URI.encode_www_form(
232
- tuin: id,
233
- type: 1,
234
- vfwebqq: @options[:vfwebqq],
235
- t: 0.1
236
- )
237
- @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
238
- end
239
-
240
- def get_online_friends
241
- uri = URI('http://d1.web2.qq.com/channel/get_online_buddies2')
242
- uri.query =
243
- URI.encode_www_form(
244
- vfwebqq: @options[:vfwebqq],
245
- clientid: QQBot::CLIENT_ID,
246
- psessionid: @options[:psessionid],
247
- t: 0.1
248
- )
249
- @client.get(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2')
250
- end
251
-
252
- def get_group_info(group_code)
253
- uri = URI('http://s.web2.qq.com/api/get_group_info_ext2')
254
- uri.query =
255
- URI.encode_www_form(
256
- gcode: group_code,
257
- vfwebqq: @options[:vfwebqq],
258
- t: 0.1
259
- )
260
- @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
261
- end
262
-
263
- def get_discuss_info(discuss_id)
264
- uri = URI('http://d1.web2.qq.com/channel/get_discu_info')
265
- uri.query =
266
- URI.encode_www_form(
267
- did: discuss_id,
268
- vfwebqq: @options[:vfwebqq],
269
- clientid: QQBot::CLIENT_ID,
270
- psessionid: @options[:psessionid],
271
- t: 0.1
272
- )
273
- @client.get(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2')
274
- end
275
-
276
- def get_friend_info(friend_id)
277
- uri = URI('http://s.web2.qq.com/api/get_friend_info2')
278
- uri.query =
279
- URI.encode_www_form(
280
- tuin: friend_id,
281
- vfwebqq: @options[:vfwebqq],
282
- clientid: QQBot::CLIENT_ID,
283
- psessionid: @options[:psessionid],
284
- t: 0.1
285
- )
286
- @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
287
- end
288
-
289
- def hash
290
- self.class.hash(@options[:uin], @options[:ptwebqq])
291
- end
292
-
293
- def msg_id
294
- @msg_id += 1
295
- end
296
-
297
- def self.build_message(content)
298
- JSON.generate(
299
- [
300
- content.force_encoding("UTF-8"),
301
- [
302
- 'font',
303
- {
304
- name: '宋体',
305
- size: 10,
306
- style: [0, 0, 0],
307
- color: '000000'
308
- }
309
- ]
310
- ]
311
- )
312
- end
313
- end
314
- end
1
+ require 'uri'
2
+
3
+ module QQBot
4
+ class Api
5
+
6
+ def initialize
7
+ @client = QQBot::Client.new
8
+ @msg_id = 1_000_000
9
+ end
10
+
11
+ def auth_options=(options = {})
12
+ @options = options
13
+ end
14
+
15
+ def get_qrcode
16
+ uri = URI('https://ssl.ptlogin2.qq.com/ptqrshow');
17
+ uri.query =
18
+ URI.encode_www_form(
19
+ appid: 501004106,
20
+ e: 0,
21
+ l: :M,
22
+ s: 5,
23
+ d: 72,
24
+ v: 4,
25
+ t: 0.1,
26
+ )
27
+ @client.get(uri)
28
+ end
29
+
30
+ def verify_qrcode
31
+ uri = URI('https://ssl.ptlogin2.qq.com/ptqrlogin');
32
+ uri.query =
33
+ URI.encode_www_form(
34
+ webqq_type: 10,
35
+ remember_uin: 1,
36
+ login2qq: 1,
37
+ aid: 501004106,
38
+ u1: 'http://Fw.qq.com/proxy.html?login2qq=1&webqq_type=10',
39
+ ptredirect: 0,
40
+ ptlang: 2052,
41
+ daid: 164,
42
+ from_ui: 1,
43
+ pttype: 1,
44
+ dumy: '',
45
+ fp: 'loginerroralert',
46
+ action: '0-0-157510',
47
+ mibao_css: 'm_webqq',
48
+ t: 1,
49
+ g: 1,
50
+ js_type: 0,
51
+ js_ver: 10143,
52
+ login_sig: '',
53
+ pt_randsalt: 0,
54
+ )
55
+ @client.get(uri)
56
+ end
57
+
58
+ def get_ptwebqq(url)
59
+ uri = URI(url);
60
+ code, body = @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
61
+ return code, @client.get_cookie('ptwebqq')
62
+ end
63
+
64
+ def get_vfwebqq(ptwebqq)
65
+ uri = URI('http://s.web2.qq.com/api/getvfwebqq');
66
+ uri.query =
67
+ URI.encode_www_form(
68
+ ptwebqq: ptwebqq,
69
+ clientid: QQBot::CLIENT_ID,
70
+ psessionid: '',
71
+ t: 0.1,
72
+ )
73
+ @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
74
+ end
75
+
76
+ def get_psessionid_and_uin(ptwebqq)
77
+ uri = URI('http://d1.web2.qq.com/channel/login2');
78
+ r = JSON.generate(
79
+ ptwebqq: ptwebqq,
80
+ clientid: QQBot::CLIENT_ID,
81
+ psessionid: '',
82
+ status: 'online'
83
+ )
84
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
85
+ end
86
+
87
+ def self.hash(uin, ptwebqq)
88
+ n = Array.new(4, 0)
89
+ ptwebqq.chars.each_index { |i| n[i % 4] ^= ptwebqq[i].ord }
90
+ u = ['EC', 'OK']
91
+ v = Array.new(4)
92
+ v[0] = uin >> 24 & 255 ^ u[0][0].ord;
93
+ v[1] = uin >> 16 & 255 ^ u[0][1].ord;
94
+ v[2] = uin >> 8 & 255 ^ u[1][0].ord;
95
+ v[3] = uin & 255 ^ u[1][1].ord;
96
+ u = Array.new(8)
97
+ (0...8).each { |i| u[i] = i.odd? ? v[i >> 1] : n[i >> 1] }
98
+ n = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
99
+ v = ''
100
+ u.each do |i|
101
+ v << n[(i >> 4) & 15]
102
+ v << n[i & 15]
103
+ end
104
+ v
105
+ end
106
+
107
+ def poll
108
+ uri = URI('http://d1.web2.qq.com/channel/poll2')
109
+ r = JSON.generate(
110
+ ptwebqq: @options[:ptwebqq],
111
+ clientid: QQBot::CLIENT_ID,
112
+ psessionid: @options[:psessionid],
113
+ key: ''
114
+ )
115
+ begin
116
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
117
+ rescue
118
+ retry
119
+ end
120
+ end
121
+
122
+ def get_group_list
123
+ uri = URI('http://s.web2.qq.com/api/get_group_name_list_mask2')
124
+ r = JSON.generate(
125
+ vfwebqq: @options[:vfwebqq],
126
+ hash: hash
127
+ )
128
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
129
+ end
130
+
131
+ def hash
132
+ self.class.hash(@options[:uin], @options[:ptwebqq])
133
+ end
134
+
135
+ def get_friend_list
136
+ uri = URI('http://s.web2.qq.com/api/get_user_friends2')
137
+ r = JSON.generate(
138
+ vfwebqq: @options[:vfwebqq],
139
+ hash: hash
140
+ )
141
+ @client.post(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1', r: r)
142
+ end
143
+
144
+ def get_discuss_list
145
+ uri = URI('http://s.web2.qq.com/api/get_discus_list')
146
+ uri.query =
147
+ URI.encode_www_form(
148
+ clientid: QQBot::CLIENT_ID,
149
+ psessionid: @options[:psessionid],
150
+ vfwebqq: @options[:vfwebqq],
151
+ t: 0.1
152
+ )
153
+ @client.get(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2')
154
+ end
155
+
156
+ def send_to_friend(friend_id, content)
157
+ uri = URI('http://d1.web2.qq.com/channel/send_buddy_msg2')
158
+ r = JSON.generate(
159
+ to: friend_id,
160
+ content: self.class.build_message(content),
161
+ face: 522,
162
+ clientid: QQBot::CLIENT_ID,
163
+ msg_id: msg_id,
164
+ psessionid: @options[:psessionid]
165
+ )
166
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
167
+ end
168
+
169
+ def send_to_group(group_id, content)
170
+ uri = URI('http://d1.web2.qq.com/channel/send_qun_msg2')
171
+ r = JSON.generate(
172
+ group_uin: group_id,
173
+ content: self.class.build_message(content),
174
+ face: 522,
175
+ clientid: QQBot::CLIENT_ID,
176
+ msg_id: msg_id,
177
+ psessionid: @options[:psessionid]
178
+ )
179
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
180
+ end
181
+
182
+ def send_to_discuss(discuss_id, content)
183
+ uri = URI('http://d1.web2.qq.com/channel/send_discu_msg2')
184
+ r = JSON.generate(
185
+ did: discuss_id,
186
+ content: self.class.build_message(content),
187
+ face: 522,
188
+ clientid: QQBot::CLIENT_ID,
189
+ msg_id: msg_id,
190
+ psessionid: @options[:psessionid]
191
+ )
192
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
193
+ end
194
+
195
+ def send_to_sess(sess_id, content)
196
+ uri = URI('http://d1.web2.qq.com/channel/send_sess_msg2')
197
+ r = JSON.generate(
198
+ to: sess_id,
199
+ content: self.class.build_message(content),
200
+ face: 522,
201
+ clientid: QQBot::CLIENT_ID,
202
+ msg_id: msg_id,
203
+ psessionid: @options[:psessionid]
204
+ )
205
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
206
+ end
207
+
208
+ def get_account_info
209
+ uri = URI('http://s.web2.qq.com/api/get_self_info2')
210
+ uri.query =
211
+ URI.encode_www_form(
212
+ t: 0.1
213
+ )
214
+
215
+ @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
216
+ end
217
+
218
+ def get_recent_list
219
+ uri = URI('http://d1.web2.qq.com/channel/get_recent_list2')
220
+ r = JSON.generate(
221
+ vfwebqq: @options[:vfwebqq],
222
+ clientid: QQBot::CLIENT_ID,
223
+ psessionid: ''
224
+ )
225
+ @client.post(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2', r: r)
226
+ end
227
+
228
+ def get_qq_by_id(id)
229
+ uri = URI('http://s.web2.qq.com/api/get_friend_uin2')
230
+ uri.query =
231
+ URI.encode_www_form(
232
+ tuin: id,
233
+ type: 1,
234
+ vfwebqq: @options[:vfwebqq],
235
+ t: 0.1
236
+ )
237
+ @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
238
+ end
239
+
240
+ def get_online_friends
241
+ uri = URI('http://d1.web2.qq.com/channel/get_online_buddies2')
242
+ uri.query =
243
+ URI.encode_www_form(
244
+ vfwebqq: @options[:vfwebqq],
245
+ clientid: QQBot::CLIENT_ID,
246
+ psessionid: @options[:psessionid],
247
+ t: 0.1
248
+ )
249
+ @client.get(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2')
250
+ end
251
+
252
+ def get_group_info(group_code)
253
+ uri = URI('http://s.web2.qq.com/api/get_group_info_ext2')
254
+ uri.query =
255
+ URI.encode_www_form(
256
+ gcode: group_code,
257
+ vfwebqq: @options[:vfwebqq],
258
+ t: 0.1
259
+ )
260
+ @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
261
+ end
262
+
263
+ def get_discuss_info(discuss_id)
264
+ uri = URI('http://d1.web2.qq.com/channel/get_discu_info')
265
+ uri.query =
266
+ URI.encode_www_form(
267
+ did: discuss_id,
268
+ vfwebqq: @options[:vfwebqq],
269
+ clientid: QQBot::CLIENT_ID,
270
+ psessionid: @options[:psessionid],
271
+ t: 0.1
272
+ )
273
+ @client.get(uri, 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2')
274
+ end
275
+
276
+ def get_friend_info(friend_id)
277
+ uri = URI('http://s.web2.qq.com/api/get_friend_info2')
278
+ uri.query =
279
+ URI.encode_www_form(
280
+ tuin: friend_id,
281
+ vfwebqq: @options[:vfwebqq],
282
+ clientid: QQBot::CLIENT_ID,
283
+ psessionid: @options[:psessionid],
284
+ t: 0.1
285
+ )
286
+ @client.get(uri, 'http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1')
287
+ end
288
+
289
+ def hash
290
+ self.class.hash(@options[:uin], @options[:ptwebqq])
291
+ end
292
+
293
+ def msg_id
294
+ @msg_id += 1
295
+ end
296
+
297
+ def self.build_message(content)
298
+ JSON.generate(
299
+ [
300
+ content.force_encoding("UTF-8"),
301
+ [
302
+ 'font',
303
+ {
304
+ name: '宋体',
305
+ size: 10,
306
+ style: [0, 0, 0],
307
+ color: '000000'
308
+ }
309
+ ]
310
+ ]
311
+ )
312
+ end
313
+ end
314
+ end