元のブログのアドレス: http://blog.csdn.net/lgg201/article/details/8050606
<?php/** * 功能: 模拟新浪微博登陆 * 用途: 模拟用户登陆, 以便进行后续操作, 比如自动化的控制自己的新浪app刷新某些数据 * 注意事项: * 1. 需要安装nodejs * 2. 需要下载新浪的加密js文件, 请到新浪登陆页查看网络请求自己下载最新版本(我当时用的: http://js.t.sinajs.cn/t35/miniblog/static/js/sso.js?version=e482ef2bbdaa8bc2) * 3. 对新浪加密js文件进行修改, 以便让nodejs可以运行它 * 1) 在文件前面增加下面内容var window = { location : { hash : '', host : 'weibo.com', hostname : 'weibo.com', href : 'http://weibo.com/', pathname : '/', port : '', protocol : 'http:', search : '' }, navigator : { appCodeName : 'Mozilla', appName : 'Netscape', appVersion : '5.0 (Macintosh)', buildID : '20120713134347', cookieEnabled : true, doNotTrack : 'unspecified', language : 'en-US' }};var location = window.location;var navigator = window.navigator; * 2) 在文件后面增加下面内容var argv = process.argv.splice(2);var pubkey = argv[0], servertime = argv[1], nonce = argv[2], password = argv[3];var RSAKey = new sinaSSOEncoder.RSAKey();RSAKey.setPublic(pubkey, '10001');password = RSAKey.encrypt([servertime, nonce].join("\t") + "\n" + password); console.log(password);process.exit(); * 4. 修改encode_password函数中的nodejs程序路径和修改后的新浪js文件路径 * 5. 修改用户名密码 * author: selfimpr * blog: http://blog.csdn.net/lgg201 * mail: lgg860911@yahoo.com.cn */define('REQUEST_METHOD_GET', 'GET');define('REQUEST_METHOD_POST', 'POST');define('REQUEST_METHOD_HEAD', 'HEAD');define('COOKIE_FILE', '/tmp/sina.login.cookie');function curl_switch_method($curl, $method) { switch ( $method) { case REQUEST_METHOD_POST: curl_setopt($curl, CURLOPT_POST, TRUE); break; case REQUEST_METHOD_HEAD: curl_setopt($curl, CURLOPT_NOBODY, TRUE); break; case REQUEST_METHOD_GET: default: curl_setopt($curl, CURLOPT_HTTPGET, TRUE); break; }}function curl_set_headers($curl, $headers) { if ( empty($headers) ) return ; if ( is_string($headers) ) $headers = explode("\r\n", $headers); #类型修复 foreach ( $headers as &$header ) if ( is_array($header) ) $header = sprintf('%s: %s', $header[0], $header[1]); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);}function curl_set_datas($curl, $datas) { if ( empty($datas) ) return ; curl_setopt($curl, CURLOPT_POSTFIELDS, $datas);}function curl_request($url, $method = REQUEST_METHOD_GET, $datas = NULL, $headers = NULL) { static $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("%10d\t%s\n", $errno, curl_error($curl)), 3, 'php://stderr'); return FALSE; } return $response;}function get_js_timestamp() { return time() * 1000 + rand(0, 999);}function 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) || empty($info) ) return $url; $components = parse_url($url); if ( array_key_exists('query', $components) ) $query = parse_str($components['query']); else $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['scheme'] . '://' : ''; $components['user'] = array_key_exists('user', $components) ? $components['user'] . ':' . $components[HTTP_URL_PASS] . '@' : ''; $components['host'] = array_key_exists('host', $components) ? $components['host'] : ''; $components['port'] = array_key_exists('port', $components) ? ':' . $components['port'] : ''; $components['path'] = array_key_exists('path', $components) ? '/' . ltrim($components['path'], '/') : ''; $components['query'] = $query ? '?' . $query : ''; $components['fragment'] = array_key_exists('fragment', $components) ? '#' . $components['fragment'] : ''; return sprintf('%s%s%s%s%s%s%s', $components['scheme'], $components['user'], $components['host'], $components['port'], $components['path'], $components['query'], $components['fragment']);}function encode_username($username) { return base64_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"`; return substr($response, 0, strlen($response) - 1);}function main_page() { return curl_request('weibo.com');}function prepare_login_info() { $time = get_js_timestamp(); $url = makeUrl('http://login.sina.com.cn/sso/prelogin.php', array( 'entry' => 'sso', 'callback' => 'sinaSSOController.preloginCallBack', 'su' => encode_username('undefined'), 'rsakt' => 'mod', 'client' => 'ssologin.js(v1.4.2)', '_' => $time, ), FALSE); $response = curl_request($url); $length = strlen($response); $left = 0; $right = $length - 1; while ( $left < $length ) if ( $response[$left] == '{' ) break; else $left ++; while ( $right > 0 ) if ( $response[$right] == '}' ) break; else $right --; $response = substr($response, $left, $right - $left + 1); return array_merge(json_decode($response, TRUE), array( 'preloginTime' => max(get_js_timestamp() - $time, 100), ));}function login($info, $username, $password) { $feedbackurl = makeUrl('http://weibo.com/ajaxlogin.php', array( 'framelogin' => 1, 'callback' => 'parent.sinaSSOController.feedBackUrlCallBack', )); $datas = array( 'encoding' => 'UTF-8', 'entry' => 'weibo', 'from' => '', 'gateway' => 1, 'nonce' => $info['nonce'], 'prelt' => $info['preloginTime'], 'pwencode' => 'rsa2', 'returntype' => 'META', 'rsakv' => $info['rsakv'], 'savestate' => 7, 'servertime' => $info['servertime'], 'service' => 'miniblog', 'sp' => encode_password($info['pubkey'], $password, $info['servertime'], $info['nonce']), 'ssosimplelogin' => 1, 'su' => encode_username($username), 'url' => $feedbackurl, 'useticket' => 1, 'vsnf' => 1, ); $url = makeUrl('http://login.sina.com.cn/sso/login.php', array( 'client' => 'ssologin.js(v1.4.2)', ), FALSE); $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 < $length ) if ( $response[$left] == '{' ) break; else $left ++; while ( $right > 0 ) if ( $response[$right] == '}' ) break; else $right --; $response = substr($response, $left, $right - $left + 1); return json_decode($response, true);}$info = prepare_login_info();$info = login($info, '用户名', '密码');echo curl_request('http://weibo.com/u/' . $info['userinfo']['uniqueid'] . $info['userinfo']['userdomain']);
落ち込んでいます。nodejs には対応するバージョンがないようですwin
仮想ホスト環境は使用できないようです、nodejsを自分で設定する必要があります
nodejsを見てみる必要があるようです! !
待って見ています
それは良いことです、戻って Sina アカウントを登録して遊んでみます。
経験、、、、、、、、
実際、Weibo が普及したため、多くの Web サイトが使用できます。
どのくらいの期間、nodejs を学習していますか?私は少し前にこれについて見てみることに非常に興味がありました
どのくらいの期間、nodejs を学習していますか?しばらく前にこれを見て非常に興味がありました
まだ学習していないので、これが JS エンジンであることは知っています。したがって、Sina の JS を実行するために使用されています
共有は進歩につながります、作者のシェア精神は賞賛に値します
Nodejsあります 多分当分使わないのでとりあえず取っておきます
実はなぜ模擬ログインしなければならないのか未だに分かりません……… …
他の人の良い api+oauth2 インターフェース………………
実際のところ、なぜシミュレートされたログインを行わなければならないのかまだ理解できません...
他の人は良い api+oauth2 インターフェースを持っています...
たとえば、Sina はサイト全体の最新の Weibo を取得するためのインターフェイスを提供しており、システムはこの情報を取得する必要があり、ユーザーのログインをシミュレートして、これらのインターフェイスを使用する必要があります...
その他つまり、API/oauth に基づいて Sina Weibo アプリケーションを開発するには、Sina ユーザーにアプリケーションをインストールして使用させる必要があります。
必要なのは、いくつかのプログラムを使用して、Sina からいくつかのものを自動的に取得して、当社で使用することです。
11 階の返信からの引用:
実際、なぜシミュレートされたログインを実行する必要があるのかまだ理解できません... …………
他の人の優れた API+oauth2 インターフェイス……………… …………
たとえば、Sina はサイト全体の最新の Weibo を取得するためのインターフェイスを提供しており、この情報を取得する必要があるシステムがあります。その後、ユーザーのログインをシミュレートして、これらのインターフェイスを使用する必要があります。 ...
つまり、api/oauth に基づいて Sina Weibo アプリケーションを開発するには、Sina ユーザーにアプリケーションをインストールして使用させる必要があります...
そして私たちは...
誰が何を言ったか
私たちの企業の自動収集は oauth Sina API を使用します
ユーザー ID 操作を伴う場合を除き、Sina API はログインせずに使用できます。
ああ、もしかしたら v2 インターフェイスを見ているのかもしれません...
ドキュメントを確認したところ、v2 は確かにはるかに制限が厳しいです。
ただし、当社は Sina とより協力しているため、v1 は引き続き使用できます...v1 の認証はそれほど面倒ではありません...
ああ、もしかして v2 のインターフェイスを見ているのですか... ……………
ドキュメントを確認したところ、v2 は確かにさらに制限が厳しくなっています。
ただし、当社は Sina とうまく連携しているため、v1 は引き続き使用できます...v1 の認証はそれほど面倒ではありません...
もちろん、ログイン インターフェイスが必要なものもあります。ログインする必要がありますが、もちろんこれらのことは行いません
15 階の返信からの引用:
ああ、もしかしてあなたは v2 インターフェースを見ているのかもしれません………………
Iドキュメントを読んだところ、v2 は確かにさらに制限が厳しくなりました。
ただし、当社は Sina との連携が強化されているため、v1 を引き続き使用できます...v1 の認証はそれほど面倒ではありません...
もちろん、これらはいくつか必要なものですログイン インターフェイス、ログインする必要がない場合は実行できますが、もちろんこれらのことは実行しません
たとえば、サイトが Sina Weibo と通信する必要がある場合、ユーザーがそれを承認した後にサービスを提供します。 , 彼が Sina に投稿したフィードは、あなたのウェブサイトにも掲載されます。
16 階の返信から引用:
15 階の返信から引用:
ああ、もしかしたら v2 インターフェースを見ているのかもしれません………………
ちょうどドキュメントを読みに行ったのですが、v2 は確かにはるかに制限が厳しいです。
ただし、当社は Sina との連携が強化されているため、v1 を引き続き使用できます...v1 の認証はそれほど面倒ではありません...
もちろん、これらはいくつか必要なものですログイン インターフェイス、ログインする必要がない場合は、実行できます。もちろん、これらのことは実行しません
たとえば、サイトで必要がある場合は...
これは実際にはシミュレートされたログインを必要としません。ユーザーのメッセージを収集するための oauth Weibo を使用するだけです
さらに、この方法の最大の問題は、ユーザーが自分の Sina パスワードを送信する必要があることです。
私だったら安心しません。たとえそれが私の会社のアプリケーションであっても、私はパスワードを送信しません
そうです、このメソッドは内部的なことをいくつか実行できます
しかし、顧客に対しては実行できません
さらに、このメソッドの最大の問題は、ユーザーがSina のパスワードを送信する必要があります。
私だったら安心しません。たとえ自分の会社のアプリケーションであっても、パスワードは送信しません
...
実際、API を使用できさえすれば、Google MAP API と同様に、詳細な調査を行う必要はありません。私のプロジェクトで使用されている API Facebook の API はアップグレードするたびに変更する必要があり、ほとんど面倒です
これには実際に模擬ログインは必要ありません。oauth を使用してユーザーから Weibo の投稿を収集するだけです
さらに、この方法の最大の問題は。ユーザーは自分の Sina パスワードを送信する必要があるということです。
私だったら安心しません。たとえそれが私の会社のアプリケーションであっても、私はパスワードを送信しません
そうですね...それは逆です...
ここでの私たちのビジネスでは、Web サイトに掲載されているものは Sina Weibo に投稿する必要があるようです ..
18 階の返信からの引用:
これには実際に模擬ログインは必要ありません。oauth を使用してユーザーが投稿した Weibo を収集するだけです
さらに、この方法の最大の問題は、ユーザーが自分の Sina パスワードを送信する必要があることです。
私だったら安心しません。たとえそれが私の会社のアプリケーションであっても、私はパスワードを送信しません
うーん...それは逆です...
ここでの私たちのビジネスでは、私たちのウェブサイトに投稿されたものは新浪微博に投稿する必要があるようです
私たちのウェブサイトユーザーのコメントを Weibo に同期する機能もあります...これも oauth で行われます...
当社の公式 Weibo は単一の入力インターフェイスのセットであり、Sina Sohu Tencent twitter に同期されます。これも oauth です………………………………………………
21 階の返信より引用:
18 階の返信より引用:
これは実際に模擬ログインを必要とせず、単に oauth を使用して収集しますユーザーが投稿した Weibo
さらに、この方法の最大の問題は、ユーザーが自分の Sina パスワードを送信しなければならないことです。
私だったら安心しません。たとえそれが私の会社のアプリケーションであっても、私はパスワードを送信しません
うーん...それは逆です...
ここでの私たちのビジネスでは、Web サイトに掲載されているものは Sina Weibo に投稿する必要があるようです
私たちのウェブサイトにはユーザーのコメントをWeiboに同期する機能もあります...
これは最も一般的なアプリケーションです(Sinaとの協力関係はありません)、ログインせずに何ができるでしょうか?
私の模擬ログインは私が行ったものなので、他のプロジェクトチームと連携しているため、具体的なインターフェイスはわかりません...
上で述べたことは、発散予想の一般的な理解です...
これは最も一般的なアプリケーションです (Sina とは協力関係がありません)。ログインせずにログインすることはできません。どうすればよいでしょうか?
この模擬ログインは他のプロジェクト チームで行ったので、具体的なインターフェイスがわかりません...
上記の内容はすべて理解するためのものです。発散予想...
こう言ってみましょう、あなた Sina Weibo の API を使用すると、完全な Sina Weibo クライアントを作成できます。
つまり、何でもできるのです。
独自の API を構築する必要があるかどうかを議論する必要はありません
詳細に調査する必要がある既製の API もありますが、代替の API を作成することをお勧めします
それらがすべて組み込まれている場合同じ箱ですが、プログラミングの面白さは何ですか?
独自の API を構築する必要があるかどうかについて議論する必要はありません
詳細に調査する必要がある既製の API はありますが、代替 API を作成することは依然として良い考えです
すべてが同じ内にある場合フレームでは、プログラミングの楽しさとは何でしょうか?
こんなことを言うのは間違いです。
模擬ログインは他人の内部インターフェイスを使用します。このインターフェイスが変更されると、ドキュメントには反映されず、ドキュメントもまったく存在しないため、将来のメンテナンスに無限の負担がかかります。 Google の未公開 API を使用する開発者は、このことを深く理解する必要があります。過去 2 か月間、使用した API が閉じられていたため、アプリケーションのバッチが同時に失敗しました。したがって、警告は出されませんでした。
この議論では、私には 2 つの意見があります:
1. 車輪の再発明をしないでください。
2. 相手が玄関のドアを開けた場合、裏口の鍵をコピーしないでください。
参照:
http://www.google.com.hk/search?hl=ja&q=google+api+%E5%85%B3%E9%97%AD
1. 元の投稿者は、ホイール;ホイールの材質を変更しました。これは特許に記載されています: 実用新案
この見解には問題があります (もちろん、これを発明したのはあなたではありません)。ホイールが革新されない限り、ホイールは古代から存在しています。では、今では街路のいたるところに木製の車輪が置かれているのではないでしょうか?
2. 投稿者の投稿の目的は、玄関だけではないことを伝えることです。バックドアを通過することも可能です
プロジェクト担当の同僚を探しに行って、(特定のユーザーの Weibo を取得するには)インターフェイスにログインが必要であることを確認しました
私は Sina Weibo のオープンに行きました。プラットフォームはドキュメントを読み、次の情報を取得しました:
1. 2012.10.15 以降、プラットフォームは「累積ユーザー数が 10,000 未満」のアプリケーションが V1 インターフェイスを使用することを禁止します。アプリケーションが正常に動作するように、新しいバージョンのインターフェイスの移行を時間内に完了してください。移行ガイド: http://t.cn/zWTaigK
2. インターフェース文書 http://open.weibo.com/wiki/2/statuses/user_timeline には、ログインする必要があることが明確に記載されています
おそらくあなたの会社のアプリケーション認証ログインせずにレベルが高い...
お互いの説明が理解できなかった可能性もあります。この模擬ログインの目的をもう一度説明してみましょう:
ユーザー名とパスワードを介して (通常、このユーザー名とパスワードは提供されません。ユーザーによって、代わりに、access_token と引き換えに自分たちで会社を登録しました。これにより、ログインが必要な特定の Sina Weibo インターフェイスにアクセスするために継続的に有効な access_token を必要とする一部のバックグラウンド サービスが引き続き有効になる可能性もあります。お互いの説明が理解できませんでした。この模擬ログインの目的をもう一度説明してみましょう:
この説明に関する限り、私は依然として oauth を使用する傾向があります。この説明の要件を満たします。
模擬ログインの使用をお勧めしない理由は、模擬ログインで使用されるメソッドが非公開であり、変更された場合の警告やドキュメントがないためです。
1. 投稿者はホイールを発明したのではなく、ホイールの素材を変えただけです。これは特許に記載されています: 実用新案
2. 投稿者の投稿の目的は、玄関だけではないことを伝えることです。裏口から行くことも可能です
1 問題は、この車輪の車軸が他人の私有物であることです。ある日、誰かが何の警告もなしに、この軸のインターフェイスを正方形から五芒星に変更し、ホイールの最下層を書き直す必要があります。
2 裏口から入ると、誰かがドアをバタンと閉めて顔を平手打ちする危険があります。
模擬ログインの使用をお勧めしない理由は、模擬ログインで使用されるメソッドが非公開であり、変更された場合の警告やドキュメントがないためです。
私はこれに同意しますが、これまでに知っている限り、Sina 自体はこのように使用したくありません、そして私たちはそれを必要としているので、この格言があります...
実際、私は言いました、これはすべてそうですoauth と競合しません。ログインをシミュレートしただけで、その後のロジックは oauth 認証リクエストをリクエストし、access_token を取得することでした...
シミュレートされたログインは、プログラムを通じて oauth+API プロセスを制御できるようにするためです。ページ クロール データからではなく..
話が逸れすぎます。これはコードレベルの問題ではありません。
これには同意しますが、私たちがこれまでに知っていることから判断すると、Sina 自体はこのように使用したくなく、私たちにはそれが必要なので、この格言があります...
実際、私が言ったことはすべてこれに当てはまりますoauth と競合しません。ログインをシミュレートしただけです。その後のロジックは、oauth 認証リクエストをリクエストし、access_token を取得することです...
シミュレートされたログインは、プログラムからではなく、プログラムを通じて oauth+API プロセスを制御できるようにすることです。ページ データのキャプチャ..
つまり、ユーザーに Sina アプリケーションを承認して [OK] をクリックし、プログラムを通じてこのステップを自動的に実行するようにしたいですか?
これは良い方法です。
話が逸れすぎました!これはコードレベルの問題ではありません。
最初からアーキテクチャについての議論だと思っていました
つまり、ユーザーが Sina アプリケーションを承認し、[OK] をクリックして、プログラムを通じてこのステップを自動的に実行するようにしたいのですか?
やっと一緒に話せました…
はは…そういうことだったんですね…
マスターはどこにでもいるようですが、いつになったら私もマスターになれますか?
初心者さん、見に来てください。マスター
楽しい。 。 。
youdianyisi
ほら、ここに来るのは初めてです
新人は教えられました!
どこにでも素晴らしい人がいます、そこから学びましょう!
ははは、素晴らしい投稿ですね