新浪微博对外是提供接口的,本文介绍的是用模拟登录的方式去用户中心取一些想要得到的数据,这个类对于一些想取到通过接口得不到的数据很有用,php模拟登录实例,需要的朋友参考下。
php非接口模拟登录新浪微博
代码:
 
复制代码 代码示例:
define('USERNAME', 'abc@163.com');  
define('PASSWORD', '123456');  
//以上定义新浪微博的用户名和密码,其实可以将它们作为类的属性写到类中
//此处暂定义为常量  
  
/** 
 * 模拟登陆新浪微博,获取微博的短链点击统计 
 */  
class sinaCollect {  
    const COOKIE_FILE = './weibo.txt';  //定义存放cookie文件常量  
  
    /** 
     * 通过用户名密码模拟登陆微博 
     */  
    public function login($username,$password){  
        if($username && $password){  
            $preLoginData = self::curlRequest('http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su='.base64_encode($username).'&client=ssologin.js(v1.3.16)','',self::COOKIE_FILE);  
            preg_match('/sinaSSOController.preloginCallBack((.*))/',$preLoginData,$preArr);  
            $jsonArr = json_decode($preArr[1],true);  
            if(is_array($jsonArr)){  
                $postArr = array(  
                'entry' => 'weibo',  
                'gateway' => 1,  
                'from' => '',  
                'savestate' => 7,  
                'useticket' => 1,  
                'ssosimplelogin' => 1,  
                'su' => base64_encode(urlencode($username)),  
                'service' => 'miniblog',  
                'servertime' => $jsonArr['servertime'],  
                'nonce' => $jsonArr['nonce'],  
                'pwencode' => 'wsse',  
                'sp' => sha1(sha1(sha1($password)).$jsonArr['servertime'].$jsonArr['nonce']),  
                'encoding' => 'UTF-8',  
                'url' => 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',  
                'returntype' => 'META'  
                );  
                $loginData = curlRequest('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.16)',$postArr,self::COOKIE_FILE);  
                if($loginData){  
                $matchs = array();  
                preg_match('/replace('(.*?)')/',$loginData,$matchs);  
                $loginResult = curlRequest($matchs[1],'',self::COOKIE_FILE);  
                $loginResultArr = array();  
                preg_match('/feedBackUrlCallBack((.*?))/',$loginResult,$loginResultArr);  
                $_SESSION['hasLoginWb'] = 1;  
                //$userInfo = json_decode($loginResultArr[1],true);  
                }else{  
                    throw_exception('Login sina fail.');  
                }  
            }else{  
                throw_exception($preLoginData);  
            }  
        }else{  
            throw_exception('Param error.');  
        }  
    }  
  
    /** 
     * 获取登陆后要抓取的页面信息 
     */  
    public function getAccountInfo($pagenum=1) {  
        return self::curlRequest('http://e.weibo.com/aj/data/enttop10?sortfield=time&sorttype=2&pagenum='.$pagenum, '', self::COOKIE_FILE);  
    }  // www.jb200.com
  
    /** 
* CURL请求 
* @param String $url 请求地址 
* @param Array $data 请求数据 
*/  
 private function curlRequest($url,$data='',$cookieFile=''){  
    $ch = curl_init();  
    $option = array(  
        CURLOPT_URL => $url,  
        CURLOPT_HEADER =>0,  
        CURLOPT_RETURNTRANSFER => 1,  
    );  
    if($cookieFile){  
        $option[CURLOPT_COOKIEJAR] = $cookieFile;  
        $option[CURLOPT_COOKIEFILE] = $cookieFile;  
    }  
    if($data){  
        $option[CURLOPT_POST] = 1;  
        $option[CURLOPT_POSTFIELDS] = $data;  
    }  
    curl_setopt_array($ch,$option);  
    $response = curl_exec($ch);  
    if(curl_errno($ch) > 0){  
        throw_exception("CURL ERROR:$url ".curl_error($ch));  
    }  
    curl_close($ch);  
    return $response;  
}  
}  
  
//开始调用  
if (!isset($_SESSION['hasLoginWb'])) {  
    sinaCollect::login(USERNAME,PASSWORD);  
} 
代码说明:
类中getAccountInfo方法就是模拟登录成功后要获取的登录后的页面数据,得到后用正则处理即可。
>>> 更多 php模拟登录 文章,专题链接:php模拟登录 php curl模拟登录教程大全