PHP自动登录新浪微博 出现问题 CURL ERROR: malformed

liufenghuixue123 2013-04-02 03:33:56
求大侠指点一下啊

全部代码为:

<?php

/**

* 用于模拟新浪微博登录!

*/

define('PROJECT_ROOT_PATH' , dirname(__FILE__));

define('COOKIE_PATH' , PROJECT_ROOT_PATH );

define('TIMESTAMP', time());

define('DEBUG', true);

$username = "xxxx";

$password = "xxxxx";

$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;

}

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;

}

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.16)', $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 );

}

}

}
...全文
498 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
夏之冰雪 2013-04-02
  • 打赏
  • 举报
回复
调试了一下,这个地方有问题了:
preg_match('/replace\(\'(.*?)\'\)/', $loginData, $matchs);
因为loginData返回的结果是:

<script type="text/javascript" language="javascript">
		location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=4403&reason=%B1%A7%C7%B8%A3%A1%B5%C7%C2%BC%CA%A7%B0%DC%A3%AC%C7%EB%C9%D4%BA%F2%D4%D9%CA%D4");
		</script>
这里面的replace是双引号,而你的正则是单引号,我帮你做了一下修改,匹配单引号或者双引号。这个问题究其原因,肯定是weibo从做返回的数据了。修改如下:
preg_match('/replace\([\'"](.*?)[\'\"]\)/', $loginData, $matchs);
但是即便这里成功了,但是!!! 已经不能用了这个代码,我帮你试了一下,最终结果是: array(3) { ["result"]=> bool(false) ["errno"]=> string(4) "4403" ["reason"]=> string(39) "抱歉!登录失败,请稍候再试" } 说明传递的参数也有变化。 因此,建议你: 1.尝试用oauth去操作微博 2.自己通过网络监听,研究微博传递数据的格式,自行模拟登录。 2有一个不好的地方就是,weibo一变动,你的代码就不能用了。

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧