php非接口模拟登录新浪微博的例子

发布时间:2020-02-23编辑:脚本学堂
新浪微博对外是提供接口的,本文介绍的是用模拟登录的方式去用户中心取一些想要得到的数据,这个类对于一些想取到通过接口得不到的数据很有用,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模拟登录教程大全