php模拟登陆新浪微博

<?php
/**
 * 用于模拟新浪微博登录! by CJ ( http://www.summerbluet.com ) 
 */

/** 定义项目路径 */
define('PROJECT_ROOT_PATH' , dirname(__FILE__));
define('COOKIE_PATH' , PROJECT_ROOT_PATH );

// 通用时间戳
define('TIMESTAMP', time());

// 出现问题的时候可以开启, 调试用的, 会在当前文件夹下面创建 LOG 文件
define('DEBUG', false);

/** 用来做模拟登录的新浪帐号 */
$username = "*******"; 
$password = "*******";

/* Fire Up */
$weiboLogin = new weiboLogin( $username, $password );
exit($weiboLogin->showTestPage( 'http://weibo.com/at/comment' ));

class weiboLogin {
    
    private $cookiefile;
    private $username;
    private $password;
    
    function __construct( $username, $password ) 
    {
        ( $username =='' ||  $password=='' ) && exit( "请填写用户名密码" );
        
        $this->cookiefile = COOKIE_PATH.'/cookie_sina_'.substr(base64_encode($username), 0, 10);
        $this->username = $username;
        $this->password = $password;
    }
    
    /**
     * CURL请求
     * @param String $url 请求地址
     * @param Array $data 请求数据
     */
    function curlRequest($url, $data = false)
    {
        $ch = curl_init();
        
        $option = array(
                            CURLOPT_URL => $url, 
                            CURLOPT_HEADER => 0, 
                            CURLOPT_HTTPHEADER => array('Accept-Language: zh-cn','Connection: Keep-Alive','Cache-Control: no-cache'), 
                            CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1", 
                            CURLOPT_FOLLOWLOCATION => TRUE, 
                            CURLOPT_MAXREDIRS => 4, 
                            CURLOPT_RETURNTRANSFER => TRUE,
                            CURLOPT_COOKIEJAR => $this->cookiefile,
                            CURLOPT_COOKIEFILE => $this->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) {
            exit("CURL ERROR:$url " . curl_error($ch));
        }
        curl_close($ch);
        return $response;
    }
    
    /**  @desc CURL 模拟新浪登录 */
    function doSinaLogin()
    {
        // Step 1 : Get tickit
        $preLoginData = $this->curlRequest('http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=' .
                base64_encode($this->username) . '&client=ssologin.js(v1.3.16)');
        preg_match('/sinaSSOController.preloginCallBack\((.*)\)/', $preLoginData, $preArr);
        $jsonArr = json_decode($preArr[1], true);
        
        $this->debug('debug_1_Tickit', $preArr[1]);
        
        if (is_array($jsonArr)) {
            // Step 2 : Do Certification 
            $postArr = array( 'entry' => 'weibo',
                    'gateway' => 1,
                    'from' => '',
                    'vsnval' => '',
                    'savestate' => 7,
                    'useticket' => 1,
                    'ssosimplelogin' => 1,
                    'su' => base64_encode(urlencode($this->username)),
                    'service' => 'miniblog',
                    'servertime' => $jsonArr['servertime'],
                    'nonce' => $jsonArr['nonce'],
                    'pwencode' => 'wsse',
                    'sp' => sha1(sha1(sha1($this->password)) . $jsonArr['servertime'] . $jsonArr['nonce']),
                    'encoding' => 'UTF-8',
                    'url' => 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
                    'returntype' => 'META');
    
            $loginData = $this->curlRequest('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.19)', $postArr);
            
            $this->debug('debug_2_Certification_raw', $loginData);
                
            // Step 3 : SSOLoginState
            if ($loginData) {
    
                $matchs = $loginResultArr  =array();
                preg_match('/replace\(\'(.*?)\'\)/', $loginData, $matchs);
                
                $this->debug('debug_3_Certification_result', $matchs[1]); 
                
                $loginResult = $this->curlRequest( $matchs[1] );
                preg_match('/feedBackUrlCallBack\((.*?)\)/', $loginResult, $loginResultArr);
                
                $userInfo = json_decode($loginResultArr[1],true);
                
                $this->debug('debug_4_UserInfo', $loginResultArr[1]); 
            } else {
                exit('Login sina fail.');
            }
        } else {
            exit('Server tickit fail');
        }
    }
    
    /**  测试登录情况, 调用参考 */
    function showTestPage( $url ) {
        $file_holder = $this->curlRequest( $url );
        
        // 如果未登录情况, 登录后再尝试
        $isLogin = strpos( $file_holder, 'class="user_name"');
        if ( !$isLogin ){
            unset($file_holder);
            $this->doSinaLogin();
            $file_holder = $this->curlRequest( $url );
        }
        return $file_holder ;
    }    
    
    /**  调试 */
    function debug( $file_name, $data ) {
        if ( DEBUG ) {
            file_put_contents( $file_name.'.txt', $data );
        }
    }
    
}

 

转载于:https://www.cnblogs.com/lxu220/p/3432008.html

好的,我可以为您提供一个简单的Python代码示例,用于模拟登陆新浪微博。请注意,这只是一个示例,具体的实现方法可能因为新浪微博的更新而有所不同。 ```python import requests from lxml import etree # 定义登录函数 def login(username, password): # 创建一个Session对象,用于保持登录状态 session = requests.Session() # 访问登录页面,获取一些必要的参数 url = 'https://login.sina.com.cn/signup/signin.php' response = session.get(url) html = etree.HTML(response.text) vk = html.xpath('//input[@name="vk"]/@value')[0] action = html.xpath('//form[@id="SinaLoginform"]/@action')[0] # 构造登录请求 data = { 'username': username, 'password': password, 'vk': vk, 'returntype': 'META', 'encoding': 'UTF-8', 'entry': 'sso', 'gateway': '1', 'from': 'null', 'savestate': '30', 'userticket': '0', 'pagerefer': '', 'wsseretry': 'servertime_error', 'pcid': '', 'door': '', 'appkey': '1', 's': '1', 'vsnf': '1', 'su': '', 'service': 'sso', 'servertime': '', 'nonce': '', 'pwencode': 'rsa2', 'rsakv': '', 'sp': '', 'sr': '', } response = session.post(action, data=data, allow_redirects=False) # 获取重定向链接,访问该链接即可完成登录 location = response.headers.get('Location') session.get(location) return session # 使用示例 if __name__ == '__main__': username = 'your_username' password = 'your_password' session = login(username, password) # 使用session对象访问需要登录后才能访问的页面 response = session.get('https://weibo.com/') print(response.text) ``` 请将 `your_username` 和 `your_password` 替换为您自己的用户名和密码。此外,需要安装 `requests` 和 `lxml` 两个库,可以使用 `pip` 命令进行安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值