模拟新浪微博自动登陆

详细内容见程序注释.

 $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']);


你可能感兴趣的:(模拟新浪微博自动登陆)