curl模拟登录,新浪微博
使用curl登录很简单,关键是破解它的加密方式
这个加密方式是如何破解的,我才用的是nodejs的方式,直接执行里面的js的函数,让他自己进行加密解密,除掉了自己浪费时间去解密的方法
搭建nodejs,然后自己调用接口去传递参数解密,这个过程我写在了我的一篇文章里面 nodejs搭建web服务器 ,其实就是我的一个解密的接口,可以按照此方法进行搭建。
下面给出,最简单的部分,就是使用curl获取新浪微博的cookie
这里给出我的代码:
<?php
class Control
{
/**
* 获取新浪微博的登录的加密数据
* */
public static function getEntryData($servertime, $nonce, $password)
{
return self::curlRequest('http://xxx.xxx.xxx.xxx:8006/weibo?servertime=' . $servertime . '&nonce=' . $nonce . '&password=' . $password, '', '');
// return self::curlRequest('http://10.211.55.5:8006/weibo?servertime='.$servertime.'&nonce='.$nonce.'&password='.$password,'','');
}
/**
* CURL请求 辅助登录的
* @param String $url 请求地址
* @param Array $data 请求数据
*/
public static function curlRequest($url, $data = '', $cookieFile = '')
{
$ch = curl_init();
$option = [
CURLOPT_URL => $url,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPHEADER => ['Expect:'],
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4',
];
if ($cookieFile) {
$option[CURLOPT_COOKIEJAR] = $cookieFile;
$option[CURLOPT_COOKIEFILE] = $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) {
//echo "CURL ERROR:$url ".curl_error($ch);
}
curl_close($ch);
return $response;
}
/**
*
* 微博登录
* @param string $username
* @param string $password
* @param string $cookie_file
*/
public static function loginWeibo($username, $password, $cookie_file)
{
if (!empty($username) && !empty($password)) {
$preLoginData = self::curlRequest('http://login.sina.com.cn/sso/prelogin.php?entry=account&callback=sinaSSOController.preloginCallBack&su=' . base64_encode($username) . '&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.5)', '', $cookie_file);
preg_match('/sinaSSOController.preloginCallBack\((.*)\)/', $preLoginData, $preArr);
$jsonArr = json_decode($preArr[1], true);
if (is_array($jsonArr)) {
$postArr = [
'entry' => 'weibo',
'gateway' => 1,
'from' => '',
'savestate' => 7,
'useticket' => 1,
'pagerefer' => '',
'vsnf' => 1,
'su' => base64_encode(urlencode($username)),
'service' => 'sso',
'servertime' => $jsonArr['servertime'],
'nonce' => $jsonArr['nonce'],
'pwencode' => 'rsa2',
'rsakv' => $jsonArr['rsakv'],
'prelt' => 0,
'sp' => self::getEntryData($jsonArr['servertime'], $jsonArr['nonce'], $password),
'encoding' => 'UTF-8',
'url' => 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype' => 'META',
];
$loginData = self::curlRequest('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.5)', $postArr, $cookie_file);
if ($loginData) {
$matchs = [];
preg_match('/replace\([\'|\"](.*?)[\'|\"]\)/', $loginData, $matchs);
$loginResult = self::curlRequest($matchs[1], '', $cookie_file);
$loginResultArr = [];
preg_match('/feedBackUrlCallBack\((.*?)\)/', $loginResult, $loginResultArr);
if (!empty($loginResultArr[1])) {
$userInfo = json_decode($loginResultArr[1]);
if ($userInfo->result) {
// echo "Login Success \n";
//throw new Exception('Login Success');
}
} else {
// echo "Login Failure \n";
//throw new Exception('Login Failure');
}
} else {
//echo "Login SinaWeibo Failure \n";
//throw new Exception('Login SinaWeibo Failure');
}
} else {
//echo "preLoginData \n";
//throw new Exception("$preLoginData");
}
} else {
//echo "Param Error. \n";
//throw new Exception('Param Error.');
}
}
}
获取加密的部分,其实我已经在我的上篇博文写过了,可以参考一下 nodejs搭建web服务器
版权声明
由 davidzhang创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/50
版权声明
由 davidzhang创作并维护的 Gowhich博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 Gowhich博客( https://www.gowhich.com ),版权所有,侵权必究。
本文永久链接: https://www.gowhich.com/blog/50