line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Webqq::Qun::Operate; |
2
|
1
|
|
|
1
|
|
6
|
use strict; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
30
|
|
3
|
1
|
|
|
1
|
|
4
|
use JSON; |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
11
|
|
4
|
1
|
|
|
1
|
|
2196578
|
use Encode; |
|
1
|
|
|
|
|
226017
|
|
|
1
|
|
|
|
|
80
|
|
5
|
1
|
|
|
1
|
|
8
|
use Webqq::Util qw(gen_url gen_url2); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
1516
|
|
6
|
|
|
|
|
|
|
my %levelname; |
7
|
|
|
|
|
|
|
sub get_token{ |
8
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
9
|
0
|
|
|
|
|
|
my $t = $self->search_cookie("skey"); |
10
|
0
|
|
|
|
|
|
my $n = 0; |
11
|
0
|
|
|
|
|
|
my $o=length($t); |
12
|
0
|
|
|
|
|
|
my $r; |
13
|
0
|
0
|
|
|
|
|
if($t){ |
14
|
0
|
|
|
|
|
|
for($r=5381;$o>$n;$n++){ |
15
|
0
|
|
|
|
|
|
$r += ($r<<5) + ord(substr($t,$n,1)); |
16
|
|
|
|
|
|
|
} |
17
|
0
|
|
|
|
|
|
$self->{token} = 2147483647 & $r; |
18
|
0
|
|
|
|
|
|
return $self->{token}; |
19
|
|
|
|
|
|
|
} |
20
|
|
|
|
|
|
|
} |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
sub get_self { |
24
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
25
|
0
|
|
|
|
|
|
my $api = 'http://cgi.find.qq.com/qqfind/myinfo'; |
26
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
27
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
28
|
0
|
|
0
|
|
|
|
my @query_string = ( |
29
|
|
|
|
|
|
|
callback => "jQuery18302889768735039979_1427194882987", |
30
|
|
|
|
|
|
|
ldw => $self->{token} || $self->get_token(), |
31
|
|
|
|
|
|
|
_ => time(), |
32
|
|
|
|
|
|
|
); |
33
|
0
|
|
|
|
|
|
my $res = $ua->get(gen_url($api,@query_string)); |
34
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
35
|
0
|
0
|
|
|
|
|
print $res->content,"\n" if $self->{debug}; |
36
|
0
|
|
|
|
|
|
my ($data) =$res->content=~ m/^jQuery18302889768735039979_1427194882987\((.*?)\);/; |
37
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($data); |
38
|
0
|
0
|
|
|
|
|
return if $json->{retcode}!=0; |
39
|
|
|
|
|
|
|
} |
40
|
0
|
|
|
|
|
|
return; |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
} |
43
|
|
|
|
|
|
|
sub get_qun { |
44
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
45
|
0
|
0
|
|
|
|
|
return if $self->{is_load_data}; |
46
|
0
|
|
|
|
|
|
my $api = 'http://qun.qq.com/cgi-bin/qun_mgr/get_group_list'; |
47
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
48
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
49
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ bkn => $self->{token} || $self->get_token() ]); |
50
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
51
|
|
|
|
|
|
|
#{"ec":0,"join":[{"gc":1299322,"gn":"perl技术","owner":4866832},{"gc":144539789,"gn":"PERL学习交流","owner":419902730},{"gc":213925424,"gn":"PERL","owner":913166583}],"manage":[{"gc":390179723,"gn":"IT狂人","owner":308165330}]} |
52
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
53
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
54
|
0
|
|
|
|
|
|
$self->{data} = []; |
55
|
0
|
|
|
|
|
|
for my $t (qw(join manage create)){ |
56
|
0
|
|
|
|
|
|
for(@{$json->{$t}}){ |
|
0
|
|
|
|
|
|
|
57
|
0
|
|
|
|
|
|
$_->{qun_name} = encode("utf8",$_->{gn}); |
58
|
0
|
|
|
|
|
|
$_->{qun_number} = $_->{gc}; |
59
|
0
|
0
|
|
|
|
|
$_->{qun_type} = $t eq "join"?"attend":$t; |
60
|
0
|
|
|
|
|
|
delete $_->{gn}; |
61
|
0
|
|
|
|
|
|
delete $_->{gc}; |
62
|
0
|
|
|
|
|
|
push @{$self->{data}},$_; |
|
0
|
|
|
|
|
|
|
63
|
0
|
|
|
|
|
|
$self->get_member($_->{qun_number}); |
64
|
|
|
|
|
|
|
} |
65
|
|
|
|
|
|
|
} |
66
|
0
|
|
|
|
|
|
$self->{is_load_data} = 1; |
67
|
0
|
|
|
|
|
|
return $self; |
68
|
|
|
|
|
|
|
} |
69
|
0
|
|
|
|
|
|
return; |
70
|
|
|
|
|
|
|
} |
71
|
|
|
|
|
|
|
sub get_friend { |
72
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
73
|
0
|
0
|
|
|
|
|
return if $self->{is_load_data}; |
74
|
0
|
|
|
|
|
|
my $api = 'http://qun.qq.com/cgi-bin/qun_mgr/get_friend_list'; |
75
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
76
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
77
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[bkn => $self->{token}||$self->get_token()]); |
78
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
79
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
80
|
|
|
|
|
|
|
#{"ec":0,"result":{"0":{"mems":[{"name":"卖茶叶和眼镜per","uin":744891290}]},"1":{"gname":"朋友"},"2":{"gname":"家人"},"3":{"gname":"同学"}}} |
81
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
82
|
0
|
|
|
|
|
|
for my $group_index (keys %{$json->{result}}){ |
|
0
|
|
|
|
|
|
|
83
|
0
|
0
|
|
|
|
|
my $category = $group_index==0?"我的好友":encode("utf8",$json->{result}{$group_index}{gname}); |
84
|
0
|
|
|
|
|
|
for my $f (@{ $json->{result}{$group_index}{mems} }){ |
|
0
|
|
|
|
|
|
|
85
|
0
|
|
|
|
|
|
push @{ $self->{friend} },{ |
|
0
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
category => $category, |
87
|
|
|
|
|
|
|
nick => encode("utf8",$f->{name}), |
88
|
|
|
|
|
|
|
qq => $f->{uin}, |
89
|
|
|
|
|
|
|
} |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
} |
93
|
0
|
|
|
|
|
|
return $self; |
94
|
|
|
|
|
|
|
} |
95
|
0
|
|
|
|
|
|
return; |
96
|
|
|
|
|
|
|
} |
97
|
|
|
|
|
|
|
sub get_member { |
98
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
99
|
0
|
|
|
|
|
|
my $qun_number = shift; |
100
|
0
|
|
|
|
|
|
my $api = "http://qun.qq.com/cgi-bin/qun_mgr/search_group_members"; |
101
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
102
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
103
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ gc => $qun_number, st => 0, end => 2000,sort => 0,bkn => $self->{token}|| $self->get_token(),]); |
104
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
105
|
|
|
|
|
|
|
#{"adm_max":10,"adm_num":1,"count":4,"ec":0,"levelname":{"1":"潜水","2":"冒泡","3":"吐槽","4":"活跃","5":"话唠","6":"传说"},"max_count":500,"mems":[{"card":"","flag":0,"g":0,"join_time":1410241477,"last_speak_time":1427191050,"lv":{"level":2,"point":404},"nick":"灰灰","qage":10,"role":0,"tags":"-1","uin":308165330},{"card":"","flag":0,"g":0,"join_time":1423016758,"last_speak_time":1427210847,"lv":{"level":2,"point":275},"nick":"小灰","qage":0,"role":1,"tags":"-1","uin":3072574066},{"card":"","flag":0,"g":0,"join_time":1427210502,"last_speak_time":1427210858,"lv":{"level":2,"point":1},"nick":"王鹏飞","qage":8,"role":2,"tags":"-1","uin":470869063},{"card":"小灰2号","flag":0,"g":0,"join_time":1422946743,"last_speak_time":1424144472,"lv":{"level":1,"point":0},"nick":"小灰2号","qage":0,"role":2,"tags":"-1","uin":1876225186}],"search_count":4,"svr_time":1427291710,"vecsize":1} |
106
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
107
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
108
|
0
|
|
|
|
|
|
my %role = ( |
109
|
|
|
|
|
|
|
0 => "owner", |
110
|
|
|
|
|
|
|
1 => "admin", |
111
|
|
|
|
|
|
|
2 => "member", |
112
|
|
|
|
|
|
|
); |
113
|
0
|
|
|
|
|
|
for(keys %{$json->{levelname}}){ |
|
0
|
|
|
|
|
|
|
114
|
0
|
|
|
|
|
|
$levelname{$_} = encode("utf8",$json->{levelname}{$_}); |
115
|
|
|
|
|
|
|
} |
116
|
0
|
|
|
|
|
|
delete $json->{levelname}; |
117
|
0
|
|
|
|
|
|
delete $json->{ec}; |
118
|
0
|
|
|
|
|
|
for(@{$json->{mems}}){ |
|
0
|
|
|
|
|
|
|
119
|
0
|
|
|
|
|
|
delete $_->{tags}; |
120
|
0
|
|
|
|
|
|
my $level = $levelname{$_->{lv}{level}}; |
121
|
0
|
|
|
|
|
|
$_->{level} = $level; |
122
|
0
|
|
|
|
|
|
$_->{bad_record} = $_->{flag}; |
123
|
0
|
0
|
|
|
|
|
$_->{sex} = $_->{g}?"female":"male"; |
124
|
0
|
|
|
|
|
|
$_->{qq} = $_->{uin}; |
125
|
0
|
|
|
|
|
|
delete $_->{flag}; |
126
|
0
|
|
|
|
|
|
delete $_->{g}; |
127
|
0
|
|
|
|
|
|
delete $_->{lv}; |
128
|
0
|
|
|
|
|
|
delete $_->{uin}; |
129
|
|
|
|
|
|
|
|
130
|
0
|
|
|
|
|
|
$_->{role} = $role{$_->{role}}; |
131
|
0
|
|
|
|
|
|
$_->{card} = encode("utf8",$_->{card}); |
132
|
0
|
|
|
|
|
|
$_->{nick} = encode("utf8",$_->{nick}); |
133
|
|
|
|
|
|
|
} |
134
|
0
|
|
|
|
|
|
$json->{members} = $json->{mems}; |
135
|
0
|
|
|
|
|
|
delete $json->{mems}; |
136
|
0
|
|
|
|
|
|
for (@{$self->{data}}){ |
|
0
|
|
|
|
|
|
|
137
|
0
|
0
|
|
|
|
|
if($_->{qun_number} eq $qun_number){ |
138
|
0
|
|
|
|
|
|
for my $m(@{$json->{members}}){ |
|
0
|
|
|
|
|
|
|
139
|
0
|
|
|
|
|
|
$m->{qun_number} = $_->{qun_number}; |
140
|
0
|
|
|
|
|
|
$m->{qun_name} = $_->{qun_name}; |
141
|
|
|
|
|
|
|
} |
142
|
0
|
|
|
|
|
|
@$_{keys %$json} = @$json{keys %$json}; |
143
|
0
|
|
|
|
|
|
return $self; |
144
|
|
|
|
|
|
|
} |
145
|
|
|
|
|
|
|
} |
146
|
0
|
|
|
|
|
|
return; |
147
|
|
|
|
|
|
|
} |
148
|
0
|
|
|
|
|
|
return; |
149
|
|
|
|
|
|
|
} |
150
|
|
|
|
|
|
|
sub add_member { |
151
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
152
|
0
|
|
|
|
|
|
my($qun_number,@member) = @_; |
153
|
0
|
|
|
|
|
|
my $api = "http://qun.qq.com/cgi-bin/qun_mgr/add_group_member"; |
154
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
155
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
156
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ gc => $qun_number, ul => join("|",@member), bkn => $self->{token} || $self->get_token(),],@headers); |
157
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
158
|
0
|
0
|
|
|
|
|
print $res->content if $self->{debug}; |
159
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
160
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
161
|
0
|
|
|
|
|
|
return $self; |
162
|
|
|
|
|
|
|
} |
163
|
0
|
|
|
|
|
|
return; |
164
|
|
|
|
|
|
|
} |
165
|
|
|
|
|
|
|
sub del_member { |
166
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
167
|
0
|
|
|
|
|
|
my($qun_number,@member) = @_; |
168
|
0
|
|
|
|
|
|
my $api = "http://qun.qq.com/cgi-bin/qun_mgr/delete_group_member"; |
169
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
170
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
171
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ gc => $qun_number, ul => join("|",@member), flag => 0, bkn => $self->{token}|| $self->get_token(),],@headers); |
172
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
173
|
0
|
0
|
|
|
|
|
print $res->content if $self->{debug}; |
174
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
175
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
176
|
0
|
|
|
|
|
|
return $self; |
177
|
|
|
|
|
|
|
} |
178
|
0
|
|
|
|
|
|
return; |
179
|
|
|
|
|
|
|
} |
180
|
|
|
|
|
|
|
sub set_admin { |
181
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
182
|
0
|
|
|
|
|
|
my($qun_number,@member) = @_; |
183
|
0
|
|
|
|
|
|
my $api = "http://qun.qq.com/cgi-bin/qun_mgr/set_group_admin"; |
184
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
185
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
186
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ gc => $qun_number, ul => join("|",@member), op => 1, bkn => $self->{token} || $self->get_token(),],@headers); |
187
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
188
|
0
|
0
|
|
|
|
|
print $res->content,"\n" if $self->{debug}; |
189
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
190
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
191
|
0
|
|
|
|
|
|
return $self; |
192
|
|
|
|
|
|
|
} |
193
|
0
|
|
|
|
|
|
return; |
194
|
|
|
|
|
|
|
} |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
sub del_admin { |
197
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
198
|
0
|
|
|
|
|
|
my($qun_number,$member) = @_; |
199
|
0
|
|
|
|
|
|
my $api = "http://qun.qq.com/cgi-bin/qun_mgr/set_group_admin"; |
200
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
201
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
202
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ gc => $qun_number, ul => $member, op => 0, bkn => $self->{token} || $self->get_token(),],@headers); |
203
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
204
|
0
|
0
|
|
|
|
|
print $res->content,"\n" if $self->{debug}; |
205
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
206
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
207
|
0
|
|
|
|
|
|
return $self; |
208
|
|
|
|
|
|
|
} |
209
|
0
|
|
|
|
|
|
return; |
210
|
|
|
|
|
|
|
} |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
sub _report1{ |
213
|
0
|
|
|
0
|
|
|
my $self = shift; |
214
|
0
|
|
|
|
|
|
my $qq = shift; |
215
|
0
|
|
|
|
|
|
my $qun_number = shift; |
216
|
0
|
|
|
|
|
|
my $api = 'http://cgi.connect.qq.com/report/tdw/report'; |
217
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
218
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
219
|
0
|
|
|
|
|
|
my $ts = time() . "000"; |
220
|
0
|
|
|
|
|
|
my @query_string = ( |
221
|
|
|
|
|
|
|
table => "dc00141", |
222
|
|
|
|
|
|
|
fields => qq{["uin","ts","opername","module","action","obj1"]}, |
223
|
|
|
|
|
|
|
datas => qq{[["$qq",$ts,"Grp_website","mana_mber","Clk_set","$qun_number"]]}, |
224
|
|
|
|
|
|
|
t => time(), |
225
|
|
|
|
|
|
|
); |
226
|
0
|
|
|
|
|
|
my $res = $ua->get(gen_url2($api,@query_string),@headers); |
227
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
228
|
0
|
0
|
|
|
|
|
print $res->content,"\n" if $self->{debug}; |
229
|
|
|
|
|
|
|
} |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
sub _report2 { |
233
|
0
|
|
|
0
|
|
|
my $self = shift; |
234
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
235
|
0
|
|
|
|
|
|
my $api = "http://cgi.connect.qq.com/report/report"; |
236
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
237
|
0
|
|
|
|
|
|
my $res = $ua->get($api."?tag=0&strValue=0&nValue=12094&t=".time(),@headers); |
238
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
239
|
0
|
0
|
|
|
|
|
print $res->content,"\n" if $self->{debug}; |
240
|
|
|
|
|
|
|
} |
241
|
|
|
|
|
|
|
} |
242
|
|
|
|
|
|
|
sub set_card { |
243
|
0
|
|
|
0
|
0
|
|
my $self = shift; |
244
|
0
|
|
|
|
|
|
my($qun_number,$member,$card) = @_; |
245
|
0
|
|
|
|
|
|
my $api = "http://qun.qq.com/cgi-bin/qun_mgr/set_group_card"; |
246
|
0
|
|
|
|
|
|
my $ua = $self->{ua}; |
247
|
0
|
|
|
|
|
|
my @headers = (Referer => $self->{referer}); |
248
|
0
|
|
0
|
|
|
|
my $res = $ua->post($api,[ gc => $qun_number, u => $member, name => $card, bkn => $self->{token}|| $self->get_token(),],@headers); |
249
|
0
|
0
|
|
|
|
|
if($res->is_success){ |
250
|
0
|
0
|
|
|
|
|
print $res->content if $self->{debug}; |
251
|
0
|
|
|
|
|
|
my $json = JSON->new->utf8->decode($res->content); |
252
|
0
|
0
|
|
|
|
|
return if $json->{ec}!=0; |
253
|
0
|
|
|
|
|
|
return $self; |
254
|
|
|
|
|
|
|
} |
255
|
0
|
|
|
|
|
|
return; |
256
|
|
|
|
|
|
|
} |
257
|
|
|
|
|
|
|
|
258
|
0
|
|
|
0
|
0
|
|
sub create {} |
259
|
0
|
|
|
0
|
0
|
|
sub dismiss {} |
260
|
0
|
|
|
0
|
0
|
|
sub upgrate{} |
261
|
0
|
|
|
0
|
0
|
|
sub transfer {} |
262
|
0
|
|
|
0
|
0
|
|
sub recover {} |
263
|
|
|
|
|
|
|
1; |