ホームページ >バックエンド開発 >PHPチュートリアル >Sina Weibo での自動ログインをシミュレートする_PHP チュートリアル

Sina Weibo での自動ログインをシミュレートする_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:54:23894ブラウズ

详细内容见程序注释.
[php]
/**
* 機能: 新浪微博ログインをシミュレートします
* 目的: Sina アプリを自動的に制御して特定のデータを更新するなど、後続の操作のためのユーザー ログインをシミュレートします
*注意:
※1.nodejsのインストールが必要です
* 2. Sina の暗号化された js ファイルをダウンロードする必要がある場合は、Sina ログイン ページにアクセスしてネットワークを確認し、最新バージョンを自分でダウンロードするように要求してください (私は http://js.t.sinajs.cn/t35/ を使用しました) miniblog/static/js/sso .js?version=e482ef2bbdaa8bc2)
* 3. Sina暗号化jsファイルをnodejsで実行できるように変更します
* 1) ファイルの前に次の内容を追加します
var window = {
場所 : {
                                                                                                      ホスト : 「weibo.com」、
ホスト名 : 'weibo.com'、
                                                                                                                              パス名 : '/'、
ポート: ''、
プロトコル: 'http:'、
検索: ''
}、
ナビゲーター: {
appCodeName アプリ名 アプリバージョン: '5.0 (macintosh)'、
ビルドID : '20120713134347'、
CookieEnabled : true、
doNotTrack : '未指定'、
言語 : 'en-US'
}
};
var location = window.location;
var navigator = window.navigator;
* 2) ファイルの最後に以下の内容を追加します
var argv = process.argv.splice(2);

var pubkey = argv[0],
サーバー時間 = argv[1],
nonce = argv[2],
パスワード = argv[3];

var RSAKey = 新しい sinaSSOEncoder.RSAKey();
RSAKey.setPublic(公開鍵, '10001');
パスワード = RSAKey.encrypt([サーバータイム, nonce].join("t") + "n" + パスワード
console.log(パスワード);
process.exit();
* 4. encode_password関数内のnodejsプログラムパスと変更後のSina jsファイルパスを変更します
* 5. ユーザー名とパスワードを変更します
* 著者: selfimpr
*ブログ:http://blog.csdn.net/lgg201
*メール: lgg860911@yahoo.com.cn
​*/
 
定義('REQUEST_METHOD_GET', 'GET'); 
定義('REQUEST_METHOD_POST', 'POST'); 
定義('REQUEST_METHOD_HEAD', 'HEAD'); 
 
定義('COOKIE_FILE', '/tmp/sina.login.cookie'); 
 
functioncurl_switch_method($curl, $method) {
    スイッチ ( $method) {
        ケース REQUEST_METHOD_POST:
            curl_setopt($curl, CURLOPT_POST, TRUE); 
            壊す; 
        ケース REQUEST_METHOD_HEAD:
            curl_setopt($curl, CURLOPT_NOBODY, TRUE); 
            壊す; 
        ケース REQUEST_METHOD_GET:
        デフォルト:
            curl_setopt($curl, CURLOPT_HTTPGET, TRUE); 
            壊す; 
    }
}
functioncurl_set_headers($curl, $headers) {
    if ( emptyempty($headers) ) が戻る ; 
    if ( is_string($headers) )
        $headers =explode("rn", $headers); 
    #型修复
    foreach ( $headers として &$header )
        if ( is_array($header) )
            $header = sprintf('%s: %s', $header[0], $header[1]); 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
}
関数curl_set_datas($curl, $datas) {
    if ( emptyempty($datas) ) が戻る ; 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $datas); 
}
functioncurl_request($url, $method = REQUEST_METHOD_GET, $datas = NULL, $headers = NULL) {
    静的 $curl; 
    if ( !$curl )
        $curl =curl_init(); 
    curl_switch_method($curl, $method); 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE); 
    curl_setopt($curl, CURLOPT_COOKIEJAR, COOKIE_FILE); 
    curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE); 
    if ( $datas )
        curl_set_datas($curl, $datas); 
    if ( $headers)
        curl_set_headers($curl, $headers); 
    $response =curl_exec($curl); 
    if ( $errno =curl_errno($curl) ) {
        error_log(sprintf("%10dt%sn", $errno,curl_error($curl)), 3, 'php://stderr'); 
        FALSEを返します。 
    }
    $response を返します。 
}
 
関数 get_js_timestamp() {
    戻り時間() * 1000 + ランド(0, 999); 
}
関数 http_build_query_no_encode($datas) {
    $r = array(); 
    foreach ( $datas as $k => $v )
        $r[] = $k 。 '=' 。 $v; 
    return implode(''&', $r); 
}
 
function makeUrl($url, $info, $encode = TRUE) {
    if ( !is_array($info) || emptyempty($info) ) $url を返します。 
    $components = parse_url($url); 
    if ( array_key_exists('query', $components) )
        $query = parse_str($components['query']); 
    その他
        $query = array(); 
    if ( is_string($info) ) $info = parse_str($info); 
    $query = array_merge($query, $info); 
    $query = $encode
                ? http_build_query($query)
                : http_build_query_no_encode($query); 
    $components['scheme'] = array_key_exists('scheme', $components)
                            ? $components['スキーム'] 。 '://'
                            : ''; 
    $components['user'] = array_key_exists('user', $components)
                            ? $components['user'] 。 ':' 。 $components[HTTP_URL_PASS] 。 「@」
                            : ''; 
    $components['host'] = array_key_exists('host', $components)
                            ? $components['ホスト']
                            : ''; 
    $components['port'] = array_key_exists('port', $components)
                            ? ':' 。 $components['ポート']
                            : ''; 
    $components['path'] = array_key_exists('path', $components)
                            ? '/' 。 ltrim($components['path'], '/')
                            : ''; 
    $components['query'] = $query
                            ? 「?」 。 $クエリ
                            : ''; 
    $components['fragment'] = array_key_exists('fragment', $components)
                            ? '#' 。 $components['フラグメント']
                            : ''; 
    return sprintf('%s%s%s%s%s%s%s', $components['scheme'], $components['user'], $components['host'],
                                $components['ポート']、$components['パス']、
                                $components['query'], $components['fragment']); 
}
 
関数 encode_username($username) {
    returnbase64_encode(urlencode($username)); 
}
function encode_password($pub_key, $password, $servertime, $nonce) {
    #ここは要nodejs実行新浪的js文件
    $response = `/usr/local/node.js-0.8.8/bin/node sina.js "$pub_key" "$servertime" "$nonce" "$password"`; 
    戻りsubstr($response, 0, strlen($response) - 1); 
}
 
 
関数 main_page() {
    returncurl_request('weibo.com'); 
}
関数 prepare_login_info() {
    $time = get_js_timestamp(); 
    $url = makeUrl('http://login.sina.com.cn/sso/prelogin.php', array(
        'エントリ' => 「っそ」、
        'コールバック' => 「sinaSSOController.preloginCallBack」、
        「す」 => encode_username('未定義')、
        'rsakt' => 「mod」、
        「クライアント」 => 「ssologin.js(v1.4.2)」、
        '_' => $time、
    )、 間違い); 
    $response =curl_request($url); 
    $length = strlen($response); 
    $left = 0; 
    $right = $length - 1; 
    while ( $left         if ( $response[$left] == '{' ) ブレーク; 
        それ以外の場合は $left ++; 
    while ( $right > 0 )
        if ( $response[$right] == '}' ) ブレーク; 
        それ以外の場合は $right --; 
    $response = substr($response, $left, $right - $left + 1); 
    return array_merge(json_decode($response, TRUE), array(
        'preloginTime' => max(get_js_timestamp() - $time, 100),
    )); 
}
 
関数ログイン($info, $username, $password) {
    $フィードバックurl = makeUrl('http://weibo.com/ajaxlogin.php', array(
        'framelogin' => 1、
        'コールバック' => 'parent.sinaSSOController.feedBackUrlCallBack',
    )); 
    $datas = array(
        'エンコーディング' => 「UTF-8」、
        'エントリ' => 「微博」、
        「から」 => ”、
        'ゲートウェイ' => 1、
        'ノンス' => $info['nonce']、
        'prelt' => $info['preloginTime']、
        'pwencode' => 「rsa2」、
        'returntype' => 「メタ」、
        'rsakv' => $info['rsakv']、
        'savestate' => 7、
        'サーバー時間' => $info['servertime']、
        「サービス」 => 「ミニブログ」、
        'sp' => encode_password($info['pubkey'], $password, $info['servertime'], $info['nonce']),
        'ssosimplelogin' => 1、
        「す」 => encode_username($username)、
        「url」 => $フィードバックURL、
        「useticket」 => 1、
        'vsnf' => 1、
    ); 
    $url = makeUrl('http://login.sina.com.cn/sso/login.php', array(
        「クライアント」 => 「ssologin.js(v1.4.2)」、
    )、 間違い); 
    $response =curl_request($url, REQUEST_METHOD_POST, $datas); 
    $sign = 'location.replace('';
    $response = substr($response, strpos($response, $sign) + strlen($sign)); 
    $location = substr($response, 0, strpos($response, '')); 
    $response =curl_request($location); 
    $length = strlen($response); 
    $left = 0; 
    $right = $length - 1; 
    while ( $left         if ( $response[$left] == '{' ) ブレーク; 
        それ以外の場合は $left ++; 
    while ( $right > 0 )
        if ( $response[$right] == '}' ) ブレーク; 
        それ以外の場合は $right --; 
    $response = substr($response, $left, $right - $left + 1); 
    return json_decode($response, true); 
}
 
$info = prepare_login_info(); 
$info = login($info, '用户名', '密码'); 
echocurl_request('http://weibo.com/u/' . $info['userinfo']['uniqueid'] . $info['userinfo']['userdomain']); 

www.bkjia.com本当http://www.bkjia.com/PHPjc/477947.html技術記事详细内容见程序注释。 [php] ?php /** * 機能: 模拟新浪微博登陆 * 用途: 模拟用户登陆、便宜进行後续操作、比如自动化的制御自己的新浪app刷新...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。