【原创】PHP QQ群自动签到脚本

发布于 / PHP / 1 条评论

   
 声明:本脚本为原创,供大家借鉴使用,转载请声明原作者并附上本文链接,使用本脚本造成的一切后果(包括但不限于连续签到过快而被限制)自负!

   
 首先在android上抓包,可见签到的时候请求如下:

   
 由此可知,群签到的接口为http://qun.qq.com/cgi-bin/qiandao/sign/publish

   
 请求方式为POST,请求参数为

   
 bkn=【g_tk】&gallery_info={"category_id":9,"page":0,"pic_id":15}&template_id=2&gc=【群号】&client=2&text=【签到文本】

   
 cookie需要发送uin和skey。返回的内容为json。

   
 通过抓包还可以发现获取群列表的接口为

   
 http://qun.qzone.qq.com/cgi-bin/get_group_list?uin=【uin】&g_tk=【g_tk】

   
 cookie同样需要发送uin和skey。

   
 获取uin和skey的方式可以使用php cURL模拟登陆并抓取内容进行匹配。也可以手动登陆QQ空间后在F12的console里输入

document.cookie.match(/(uin|skey)=(.+?);/g);

进行获取。签到可以用如下代码实现:

    

<?php
/*
请手动登陆QQ空间后在F12的console中输入下面代码
    document.cookie.match(/(uin|skey)=(.+?);/g);
获取uin和skey后请替换掉下面的uin和skey。否则无法使用!
*/
$uin = 'o0123456789';  //请务必修改这里的uin
$skey = '@ABcdEfgHijK';  //请务必修改这里的skey

new QianDao($uin, $skey);
class QianDao{
    private $signUrl = 'http://qun.qq.com/cgi-bin/qiandao/sign/publish';//签到的URL地址
    function __construct($uin, $skey){
        $this->un = preg_replace('/^o0*/', '', $uin);//数字QQ号码
        $this->cookie = sprintf('Cookie: uin=%s; skey=%s;', $uin, $skey);//Cookie
        $this->g_tk = $this->getGTK($skey);//计算 g_tk
        $this->sign($this->getQunList());//获取群列表并签到
    }
    function getGTK($skey){
        $len = strlen($skey);
        $hash = 5381;
        for($i = 0; $i < $len; $i++){
            $hash += ($hash << 5) + ord($skey[$i]);
        }
        return $hash & 0x7fffffff;//计算g_tk
    }
    function getQunList(){
        $html = file_get_contents(
                sprintf('http://qun.qzone.qq.com/cgi-bin/get_group_list?uin=%s&g_tk=%s', $this->un, $this->g_tk),
                false,
                stream_context_create(array(
                    'http'=>array(
                        'method'=>'GET',
                        'header'=>$this->cookie
                    )
                ))
            );
        preg_match('/(\{[\s\S]+\})/', $html, $qunList);
        if(count($qunList) == 0){
            return NULL;
        }
        $qunList = json_decode($qunList[1]);
        if($qunList == NULL || $qunList->code != 0){
            return NULL;
        }
        return $qunList->data->group;
    }
    function sign($groups){
        if($groups == NULL)return;
        $i = 1;
        foreach($groups as $qun){
            $this->qiandao($qun->groupid);//签到
            printf("%d\t%s(%d)\t签到完成\r\n", $i++, $qun->groupname, $qun->groupid);//输出信息
        }
    }
    function qiandao($qin){
        file_get_contents($this->signUrl, false,
            stream_context_create(
                array('http' => array(
                    'method'  => 'POST',
                    'header'  => $this->cookie,
                    'content' => sprintf('bkn=%s&gallery_info={"category_id":9,"page":0,"pic_id":15}&template_id=2&gc=%s&client=2&text=', $this->g_tk, $qin)
                ))
            )
        );
    }
}

     

   
 接着可以写个定时任务,每天运行一遍即可给所有群签到。

   
 不想给所有群签到可以在qiandao()函数里面加上个

if($qin == 【群号】) return false;

   
 即可禁止给某个群签到。代码很多细节之处不完善,请自行修改。

转载原创文章请注明,转载自: 斐斐のBlog » 【原创】PHP QQ群自动签到脚本
  1. 熙熙攘攘

    你好我想问问这个脚本在哪儿使用,我是电脑小白