【github】QQ互联重写JDK

简介: 原创作品,转载前请联系我~ 因为qq官方提供的jdk相当的不好修改,所以就参照新浪微博的jdk结构重新调整了下 我把项目托管到github上了,大家可以一起学习下,征集宝贵意见,一起进步! 下面是第一版的代码 $format, ); r...

原创作品,转载前请联系我~


因为qq官方提供的jdk相当的不好修改,所以就参照新浪微博的jdk结构重新调整了下


我把项目托管到github上了,大家可以一起学习下,征集宝贵意见,一起进步!


下面是第一版的代码

<?php
/*
 * 自己写的腾讯QQ互联的类
 * 开始  2014-01-16 
 * 更新  2014-01-17
 * 更新历史 
 * 2014-01-17 修改post方法
 * diandianxiyu <diandianxiyu@foxmail.com>
 */

/**
 * 接口实际操作类
 */
class TengxunClientV2 {
    private  $keysArr,$OAuth;
            function __construct($access_token, $openid) {
        $this->keysArr = array(
            "oauth_consumer_key" => Yii::app()->params['QQ_APP_ID'],
            "access_token" => $access_token,
            "openid" => $openid
        );
        
        $this->OAuth=new TengxunTOAuthV2($this->keysArr);
    }

    //===================调用接口的方法===================================//
    
    
    //---------------------------------------访问用户资料---------------------------------------------------------------------------------//
    
    /**
     * 取登录用户在QQ空间的信息,包括昵称、头像、性别及黄钻信息(包括黄钻等级、是否年费黄钻等)。
     * https://graph.qq.com/user/get_user_info
     * 参数:format:json,xml 返回的格式
     */
    function get_user_info($format = 'json'){
        $param=array(
             'format'=>$format,
        );
        return $this->get('user/get_user_info',$param);
    }

    //---------------------------------------访问用户QQ会员信息------------------------------------------------------------------------//
    
    /**
     * 获取已登录用户的关于QQ会员业务的基本资料。
基本资料包括以下信息:是否为“普通包月会员”,是否为“年费会员”,QQ会员等级信息,是否为“豪华版QQ会员”,是否为“钻皇会员”,是否为“SVIP”。
     * https://graph.qq.com/user/get_vip_info
     * @param type $format json,xml 返回的格式
     * @return type
     */
     
    function get_vip_info($format = 'json'){
         $param=array(
             'format'=>$format,
        );
         return $this->get('user/get_vip_info',$param);
    }
    /**
     * 获取已登录用户的关于QQ会员业务的详细资料。
详细资料包括:用户会员的历史属性,用户会员特权的到期时间,用户最后一次充值会员业务的支付渠道,用户开通会员的主要驱动因素。
     * https://graph.qq.com/user/get_vip_rich_info
     * @param type $format json,xml 返回的格式
     */
    function get_vip_rich_info($format = 'json'){
         $param=array(
             'format'=>$format,
        );
         return $this->get('user/get_vip_rich_info',$param);
    }


    //-------------------------------------分享内容到我的腾讯微博--------------------------------------------------------------------//
    /**
     * 获取腾讯微博登录用户的用户资料
     * https://graph.qq.com/user/get_info
     * HTTP请求方式    GET
     * 参数:format:json,xml 返回的格式
     */
    function get_info($format = 'json') {
        $param=array(
            'format'=>$format,
        );
        return  $this->get('user/get_info', $param);
    }
    
     //-----------------------------------------获得我的微博好友信息------------------------------------------------------------------//
    /**
     * 获取登录用户的听众列表。
     * 
     * @param type $reqnum 请求获取的听众个数。取值范围为1-30。
     * @param type $startindex 请求获取听众列表的起始位置。第一页:0; 继续向下翻页:reqnum*(page-1)。
     * @param type $mode 获取听众信息的模式,默认值为0。0:旧模式,新添加的听众信息排在前面,最多只能拉取1000个听众的信息。 1:新模式,可以拉取所有听众的信息,暂时不支持排序。
     * @param type $install 判断获取的是安装应用的听众,还是未安装应用的听众。 0:不考虑该参数;1:获取已安装应用的听众信息; 2:获取未安装应用的听众信息。
     * @param type $sex 按性别过滤标识,默认为0。此参数当mode=0时使用,支持排序。 1:获取的是男性听众信息;2:获取的是女性听众信息; 0:不进行性别过滤,获取所有听众信息。
     * @param type $format
     */
    function get_fanslist($reqnum=10,$startindex=0,$mode=0,$install=0,$sex=0,$format='json'){
        $param=array(
            'reqnum'=>$reqnum,
            'startindex'=>$startindex,
            'mode'=>$mode,
            'install'=>$install,
            'sex'=>$sex,
            'format'=>$format,
        );
        return  $this->get('relation/get_fanslist', $param);
    }
    
     /**
     * 获取登录用户收听的人的列表。
     * 
     * @param type $reqnum 请求获取收听的个数。取值范围为1-30。
     * @param type $startindex 请求获取收听列表的起始位置。第一页:0; 继续向下翻页:reqnum*(page-1)。
     * @param type $mode 获取收听信息的模式,默认值为0。0:旧模式,新添加的听众信息排在前面,最多只能拉取1000个收听的信息。 1:新模式,可以拉取所有收听的信息,暂时不支持排序。
     * @param type $install 判断获取的是安装应用的收听,还是未安装应用的收听。 0:不考虑该参数;1:获取已安装应用的收听信息; 2:获取未安装应用的收听信息。
     * @param type $sex 按性别过滤标识,默认为0。此参数当mode=0时使用,支持排序。 1:获取的是男性收听信息;2:获取的是女性收听信息; 0:不进行性别过滤,获取所有收听信息。
     * @param type $format
     */
    function get_idollist($reqnum=10,$startindex=0,$mode=0,$install=0,$sex=0,$format='json'){
        $param=array(
            'reqnum'=>$reqnum,
            'startindex'=>$startindex,
            'mode'=>$mode,
            'install'=>$install,
            'sex'=>$sex,
            'format'=>$format,
        );
        return  $this->get('relation/get_idollist', $param);
    }
    
    /**
     * 发表一条微博信息(纯文本)到腾讯微博平台上。 注意连续两次发布的微博内容不可以重复。
     * https://graph.qq.com/t/add_t
     */
    function add_t($content,$format='json'){
         $param=array(
            'content'=>$content,
            'format'=>$format,
        );
        return $this->post('t/add_t', $param);
    }
    
    /**
     * 代理get,直接返回数组
     * @param type $url
     * @param type $param
     * @param type $ismerge
     * @return type
     */
    private function get($url,$param,$ismerge){
        return $this->objToArr(json_decode($this->OAuth->get($url, $param,$ismerge)));
    }
    
    /**
     * 代理post,直接返回数组
     * @param type $url
     * @param type $param
     * @param type $ismerge
     * @return type
     */
    private function post($url,$param,$ismerge){
        return $this->objToArr(json_decode($this->OAuth->post($url, $param,$ismerge)));
    }
    //=======================私有方法==================================//
     //php 对象到数组转换
     private function objToArr($obj) {
        if (!is_object($obj) && !is_array($obj)) {
            return $obj;
        }
        $arr = array();
        foreach ($obj as $k => $v) {
            $arr[$k] = $this->objToArr($v);
        }
        return $arr;
    }
    

}

/**
 * 认证类
 */
class TengxunTOAuthV2 {

    private  $apiUrl='https://graph.qq.com/';
    private $keyarr;
    private $oauthkey;
            
    function __construct($keyarr) {
        $this->keyarr=$keyarr;
        $this->oauthkey=array(
            "appid" => Yii::app()->params['QQ_APP_ID'],
            "appkey" => Yii::app()->params['QQ_APP_KEY'],
            "callback" => Yii::app()->params['QQ_callback'],
            "scope" => Yii::app()->params['QQ_scope'],
            "errorReport" => Yii::app()->params['QQ_errorReport'],
            "storageType" => Yii::app()->params['QQ_storageType'],
        );
    }
    //================通过Authorization Code获取Access Token======================//
    
    public function getAccessTokenByCode($code,$state){
        //https://graph.qq.com/oauth2.0/token
        //?grant_type=authorization_code&client_id=[YOUR_APP_ID]&client_secret=[YOUR_APP_Key]
        //&code=[The_AUTHORIZATION_CODE]&state=[The_CLIENT_STATE]&redirect_uri=[YOUR_REDIRECT_URI]
        $oauthkey=$this->oauthkey;
         $param=array(
            'grant_type'=>'authorization_code',
            'client_id'=>  $oauthkey['appid'],
            'client_secret'=>$oauthkey['appkey'],
            'code'=>$code,
            'state'=>$state,
            'redirect_uri'=>$oauthkey['callback'],
        );
        //return $param;
         $tokenstring=$this->get("oauth2.0/token", $param,false);
        return $this->returnStringToArray($tokenstring);
        //return explode("&", $this->get("oauth2.0/token", $param,0));
    }
    //====================使用Access Token来获取用户的OpenID=====================//
    
    public  function getOpenIDByAccessToken($accesstoken){
         $param=array(
             'access_token'=>$accesstoken
             );
         $response=  $this->get('oauth2.0/me', $param);
         if (strpos($response, "callback") !== false) {

            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response = substr($response, $lpos + 1, $rpos - $lpos - 1);
        }
         $arr=json_decode($response);
         return array(
             'openid'=>$arr->openid
         );
    }
    //===============通过Authorization Code获取Access Token 和 OpenID=================//
    
    function getAccessTokenOpenIDByCode($code,$state){
        $tokenarr=  $this->getAccessTokenOpenIDByCode($code, $state);
        $openidarr=  $this->getOpenIDByAccessToken($tokenarr['access_token']);
        return array_merge($openidarr,$tokenarr);
        
    }
    //=======================获取数据===================================//

    /**
     * combineURL
     * 拼接url
     * @param string $baseURL   基于的url
     * @param array  $keysArr   参数列表数组
     * @return string           返回拼接的url
     */
    public function combineURL($baseURL, $keysArr,$ismerge=true) {
      //  $ismerge=$ismerge?$ismerge:1;
        $combined =  $this->apiUrl. $baseURL . "?";
        $valueArr = array();
        //合并数组
        $oatharr=  $this->keyarr;
        if($ismerge){
          
        $keysArr=  array_merge($oatharr,$keysArr);
       }
        foreach ($keysArr as $key => $val) {
            $valueArr[] = "$key=$val";
        }

        $keyStr = implode("&", $valueArr);
        $combined .= ($keyStr);
        return $combined;
    }
    /**
     * 合并数组到参数中,目的是将token和openid传入参数中
     * @param type $keysArr
     */
    function combineArr($keysArr){
        //合并数组
        $oatharr=  $this->keyarr;
        $keys=  array_merge($oatharr,$keysArr);
        return $keys;
    }

    /**
     * get_contents
     * 服务器通过get请求获得内容
     * @param string $url       请求的url,拼接后的
     * @return string           请求返回的内容
     */
    public function get_contents($url) {
        if (ini_get("allow_url_fopen") == "1") {
            $response = file_get_contents($url);
        } else {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_URL, $url);
            $response = curl_exec($ch);
            curl_close($ch);
        }

        //-------请求为空
        if (empty($response)) {
           // $this->error->showError("50001");
        }

        return $response;
    }
    /**
     * get
     * get方式请求资源
     * @param string $url     基于的baseUrl
     * @param array $keysArr  参数列表数组      
     * @return string         返回的资源内容
     */
    public function get($url, $keysArr,$ismerge) {
        $combined = $this->combineURL($url, $keysArr,$ismerge);
        return $this->get_contents($combined);
    }

    /**
     * post
     * post方式请求资源
     * @param string $url       基于的baseUrl
     * @param array $keysArr    请求的参数列表
     * @param int $flag         标志位
     * @return string           返回的资源内容
     */
    public function post($url, $keysArr, $flag = 0) {
        $combined=  $this->combineURL($url);
   
        $keysArr=  $this->combineArr($keysArr);
        $ch = curl_init();
        if (!$flag)
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);
        curl_setopt($ch, CURLOPT_URL, $combined);
        $ret = curl_exec($ch);

        curl_close($ch);
 
        return $ret;
    }
    
    
    //=======================私有方法==================================//
    /**
     * 将格式为 access_token=YOUR_ACCESS_TOKEN&expires_in=3600 的字符串转化成数组
     */
    private function returnStringToArray($string){
        //$string="access_token=YOUR_ACCESS_TOKEN&expires_in=3600&reesasdasd=safdsa";
        $arr1=  explode('&', $string);
        $arr2=array();
        foreach ($arr1 as $key => $value) {
            $arr=  explode("=", $value);
            $arr2[$arr[0]]=$arr[1];
        }
        return $arr2;
    }
    
    

}



目录
相关文章
|
Java 容器
阿里内部流传的JDK源码剖析手册!GitHub已获上千万的访问量
相信现在已经有很多小伙伴知道了“微软”要对JDK下手了! JDK是什么? jdk是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。jdk是整个java开发的核心,它包含了JAVA的运行环境和JAVA工具。相对而言,没有jdk的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。
255 0
|
12月前
|
设计模式 Java 程序员
太爆了!阿里最新出品2023版JDK源码学习指南,Github三天已万赞
最近后台收到很多粉丝私信,说的是程序员究竟要不要去读源码?当下行情,面试什么样的薪资/岗位才会被问到源码? 对此,我的回答是:一定要去读,并且要提到日程上来! 据不完全统计,现在市面上不管是初级,中级,还是高级岗,面试的时候都有可能会问到源码中的问题,它已经成为程序员常规必备的一个技术点。如果你当下想通过一个面试,或者想把中级薪资要到相对于比较高的话,源码这块就必须要会。
133 0
|
10月前
|
设计模式 Java 程序员
又搞事!阿里员工竟把上司的400页JDK并发源码指南拿去GitHub置顶
不知道大家闲下来的时候有没有去阅读过JDK源码,虽然看源码有点找虐的感觉,但作为一名程序员,在闲暇时看一下jdk源码,有利于对自己日常的开发环境了解得更加深刻。而且还有以下五点好处。
|
Java 程序员 容器
拿捏了!阿里2023最新JDK源码深度解析小册,Github全站热榜第二
前几日闲来无事逛微信公众号时有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做过多的赘述了,我这篇主要跟大家说说怎么去看源码。
|
Java
Github参与jdk8u,提交的PR提示:Testing is not configured
Github参与jdk8u,提交的PR提示:Testing is not configured
104 0
Github参与jdk8u,提交的PR提示:Testing is not configured
造孽啊!阿里内部的神级项目和JDK源码阅读指南竟惨遭GitHub开源
背景 今天逛GitHub,发现了一个神级项目,作者将整理/记录阅读JDK源码时的理解与体会分享出来,便于大家学习。这里将项目分享出来,让小伙伴们能更好地学习Java。
|
Rust IDE 前端开发
GitHub 官宣“报废”Atom 编辑器,创始团队不甘心表示正用 Rust 重写
GitHub 有 Atom,微软有 Visual Studio Code。但向来是一山不容二虎。
712 0
GitHub 官宣“报废”Atom 编辑器,创始团队不甘心表示正用 Rust 重写
|
21天前
|
SQL JavaScript 前端开发
Github 2024-08-05 开源项目周报 Top15
根据 Github Trendings 的统计,本周(2024年8月5日统计)共有15个项目上榜。以下是根据开发语言汇总的项目数量: - Go 项目:4个 - JavaScript 项目:3个 - Python 项目:3个 - Java 项目:2个 - TypeScript 项目:2个 - C 项目:1个 - Shell 项目:1个 - Dockerfile 项目:1个 - 非开发语言项目:1个
28 2
|
21天前
|
人工智能 Rust JavaScript
Github 2024-08-26 开源项目周报Top15
根据Github Trendings的统计,本周共有15个项目上榜。以下是按开发语言汇总的项目数量:Python项目8个,TypeScript、C++ 和 Rust 项目各2个,Jupyter Notebook、Shell、Swift 和 Dart 项目各1个。其中,RustDesk 是一款用 Rust 编写的开源远程桌面软件,可作为 TeamViewer 的替代品;Whisper 是一个通用的语音识别模型,基于大规模音频数据集训练而成;初学者的生成式人工智能(第2版)则是由微软提供的18门课程,教授构建生成式AI应用所需的知识。
50 1
|
21天前
|
Rust Dart 前端开发
Github 2024-08-19 开源项目周报Top15
根据Github Trendings的统计,本周(2024年8月19日统计)共有15个项目上榜。按开发语言分类,上榜项目数量如下:Python项目最多,有7项;其次是JavaScript和TypeScript,各有3项;Dart有2项;HTML、PowerShell、Clojure和C++各1项。此外,还介绍了多个热门项目,包括Bootstrap 5、RustDesk、ComfyUI、易采集、Penpot等,涵盖了Web开发、远程桌面、自动化测试、设计工具等多个领域。
57 1