Group
Extension

Webqq-Client/lib/Webqq/Client/Method/_get_discuss_info.pm

use JSON;
use Encode;
use Webqq::Client::Util qw(code2client);
sub Webqq::Client::_get_discuss_info {
    my $self = shift;       
    my $ua = $self->{ua};
    my $did = shift;
    return undef if $self->{type} ne 'smartqq';
    my $api_url  = 'http://d.web2.qq.com/channel/get_discu_info';
    my @query_string = (
        did         =>  $did,
        vfwebqq     =>  $self->{qq_param}{vfwebqq},
        clientid    =>  $self->{qq_param}{clientid},
        psessionid  =>  $self->{qq_param}{psessionid},
        t           =>  time(),
    );
    my @headers = (
        Referer  => 'http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=2',
    );

    my @query_string_pairs;
    push @query_string_pairs , shift(@query_string) . "=" . shift(@query_string) while(@query_string);
    my $response = $ua->get($api_url.'?'.join("&",@query_string_pairs),@headers);

    if($response->is_success){
        print $response->content,"\n" if $self->{debug};
        my $json;
        eval{
            #my $d = $response->content();
            #$d=~s/\\u([a-zA-Z0-9]{4})/encode("utf8",eval qq#"\\x{$1}"#)/eg;
            #print $d,"\n" if $self->{debug};
            $json = JSON->new->utf8->decode($response->content());
        };    
        print $@ if $@ and $self->{debug};
        $json = {} unless defined $json;
        return undef if $json->{retcode}!=0;
        return undef unless exists $json->{result}{info};
        
        my %mem_list;
        my %mem_status;
        my %mem_info;
        my $minfo = [];

        for(@{ $json->{result}{info}{mem_list} }){
            $mem_list{$_->{mem_uin}}{ruin} = $_->{ruin};            
        }

        for(@{ $json->{result}{mem_status} }){
            $mem_status{$_->{uin}}{status} = $_->{status};
            $mem_status{$_->{uin}}{client_type} = $_->{client_type};
        }

        for(@{ $json->{result}{mem_info} }){
            $mem_info{$_->{uin}}{nick} = encode("utf8",$_->{nick});
        }

        for(keys %mem_list){
            my $m = {
                uin         => $_,  
                nick        => $mem_info{$_}{nick},
                ruin        => $mem_list{$_}{ruin},
            };
            if(exists $mem_status{$_}){
                $m->{state} = $mem_status{$_}{status};
                $m->{client_type} = code2client($mem_status{$_}{client_type});
            }
            else{
                $m->{state} = 'offline';
                $m->{client_type} = 'unknown';
            }
            push @{$minfo},$m;
        }

        my $discuss_info = {
            dinfo   => {
                did         =>  $json->{result}{info}{did},
                owner       =>  $json->{result}{info}{discu_owner},
                name        =>  encode("utf8",$json->{result}{info}{discu_name}),
                info_seq    =>  $json->{result}{info}{info_seq},
            },
            minfo           =>  (@$minfo>0?$minfo:undef),
        } ;
        return $discuss_info;
    }
    else{return undef;} 

}
1;


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.