标签 weibo 下的文章

由于业务需要,研究了一下腾讯微博等登陆,下面分享一些经验给大家: 标题写的是腾讯微博的登陆,其实也可以隐身到腾讯旗下多个产品的登陆,比如QQ空间,webQQ等,想到这儿大伙是不是很激动呢?

表急,等我细细道来。

数据采集

有时候简单的数据不需要这么大费周折!使用某些语言自带的web工具也是可以的!下面我以Python为例:

分析登录过程

登录过程需要抓包,我是用的HttpWatch,大体步骤如下

第一步 手动登陆,抓包,记录登录过程

  1. 当输入完账号后想服务器请求验证码
  2. 等级登陆按钮后将登录信息发送至认证服务器,实现第一次认证
  3. 服务器返回登陆成功信息,其中包含最终URL
  4. 第二次认证,获取腾讯微博的cookie

第二步 伪造登录过程

  1. 获取验证码
  2. 根据验证码计算出加密后的密码以及其他信息,发送GET请求至认证服务器
  3. 根据返回URL获取最终cookie

工作难点

本文假设读者理解http协议及数据包的发送原理,以此为基础,工作的难点就集中在数据的准备上。

  • 密码的加密原理
  • cookie的处理
  • header的UA及refer的一致性

密码加密算法

以下提取自登录页面的c_login_2.js文件

function getEncryption(password, uin, vcode) {
	var str1 = hexchar2bin(md5(password));
	var str2 = md5(str1 + uin);
	var str3 = md5(str2 + vcode.toUpperCase());
	return str3
}


if (b == "login") {
	d.u = encodeURIComponent(pt.plogin.at_accout);
	d.verifycode = $("verifycode").value;
	if (pt.plogin.needShowNewVc && pt.plogin.pt_verifysession) {
		d.pt_vcode_v1 = 1;
		d.pt_verifysession_v1 = pt.plogin.pt_verifysession
	}
	if (pt.plogin.RSAKey) {
		d.p = $.Encryption.getRSAEncryption($("p").value, d.verifycode);
		d.pt_rsa = 1
	} else {
		d.p = $.Encryption.getEncryption($("p").value, pt.plogin.saltUin, d.verifycode);
		d.pt_rsa = 0
	}
}

加密方法大致如下:

  1. 判断是否RSA加密,如果不是,走getEncryption对称加密方法
  2. 对称加密用到了salt,参数分别为原密码,加密帐号和验证码 算法如下: a. 使用md5加密密码,并输出其二进制值 b. 解密验证码中的类似\x01等数字,再与第一步拼接再一次加密,输出输出32位的16进制 c. 再与验证码中类似!VXT的大写拼接加密,再输出输出32位的16进制

cookie及UA

UA和cookie数据比较基础,在此不赘述,主要需要搞清楚登录路径即可!

action和login_sig

action参数可以乱填,和登陆没关系

login_sig提取自登陆页面,需要在登陆时发送!

##代码

部分参考自 http://www.oschina.net/code/snippet_95475_11051

最近在做采集微博的功能,由于要自动采集,所以必须获得最终的用户的token,获取了这个token以后就可以为所欲为啦!

贴代码

$s = new SaeTOAuthV2 ( WB_AKEY, WB_SKEY);
//准备post数据
$post ['action'] = 'login';
//$post ['display'] = 'default';
//$post ['withOfficalFlag'] = 0;
//$post ['quick_auth'] = null;
//$post ['withOfficalAccount'] = '';
//$post ['scope'] = '';
//$post ['ticket'] = '';
//$post ['isLoginSina'] = '';
//$post ['isLoginSina'] = 'code';
//regCallback|appkey62需要预先请求一次拿到
//$post ['regCallback'] = $match_regCallback[1];
//这里不用urlencode,http_build_query会自动处理
$post ['redirect_uri'] = WB_CALLBACK_URL;
$post ['client_id'] = WB_AKEY;
//$post ['appkey62'] = $match_appkey[1];
//$post ['state'] = '';
//$post ['verifyToken'] = null;
//$post ['from'] = '';
$post ['userId'] = '*******';//测试用户名
$post ['passwd'] = '*******';//测试密码,不要有!@¥%……&*()这些符号,最好全是字符或数字,否则验证会失败
$post = http_build_query($post);
//UA貌似没有也行,保险起见还是加上吧
$UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36';
//获取认证URL作为refer
$url = $s->getAuthorizeURL (WB_CALLBACK_URL);
//echo $url."\n";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.weibo.com/oauth2/authorize');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//自动跳转
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $UA);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
//获取最后一个有效的url地址
$token_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
echo $token_url."\n";
curl_close($ch);
$code = preg_match('#code\=(.*)#',$token_url,$match_url);
//找到code
if($code>=1)
{
	$code = $match_url[1];
	$keys = array();
	$keys['code'] = trim($code);
	$keys['redirect_uri'] = WB_CALLBACK_URL;
	try 
	{
		$token = $s->getAccessToken( 'code', $keys );
	} catch (OAuthException $e) 
	{
		die($e->getMessage());
	}
	return $token;
}else
{
	die("code获取失败");
}

思路很简单,直接给 https://api.weibo.com/oauth2/authorize 发送登录信息,通过认证后,他会返回给你一个跳转URL,并带有一个code变量,这个code还是与开发者绑定的。

然后使用这个code,与服务器的 http://open.weibo.com/wiki/Oauth2/authorize 接口通信,返回的才是最终你需要的token,这个token同时与用户绑定,将他保存在session里随时调用!

思路参考:

http://hi.baidu.com/bing008ok/item/0a2bce068d1f8e0aeafe385d

工作中需要微博的商业API,记录一下 不了解的TX先去看说说明 http://open.weibo.com/wiki/商业数据API

商业数据API:包括数据分析、舆情监测、获取全量粉丝三大特性,同时还有实时数据推送、历史数据检索、监测粉丝变化趋势、活跃&活动粉丝分析等多项功能,协助和指引企业开展社会化营销,让真实的用户数据变为企业的决策。

申请试用 申请试用的邮箱为

[email protected] 给这个地址发邮件说明意图即可 这一步挺麻烦的,需要提供很多企业信息,需要注意的是:商业API只提供商业用途,所以如果你的APP的服务对象不是企业,请绕道。 然后填写两张申请单,分别为 订阅服务申请单、REST接口申请单-测试版。 一个是订阅微博,粉丝登上数据用的,另一个是标准API,可以使用搜索等高级接口!

价格

套餐 搜索、订阅返回条数 使用期限 套餐使用费 套餐外使用费
A 200万条 1月 6,000元 3元/千条
B 2000万条 1年 60,000元 2.5元/千条
C 1亿条 1年 250,000元 1.6元/千条
D 5亿条 1年 800,000元 0.6元/千条

确定试用时间

试用时间一般两周,请充分利用好这宝贵的时间吧!

测试

REST接口很简单,和普通接口一样直接调用。就是订阅接口比较麻烦,当你生成订阅列表后,他会把满足你需要的数据放进一个类似队列的东西,然后你需要不断从这个队列中取出你需要的信息,而且这个获取过程需要HTTP长链接。。。。。。说起来很复杂,其实做起来更复杂 :mad: ! 下面就来讲讲订阅接口,先看看这两个文档:

看完这两个接口就基本知道了订阅到底是干啥用的。

订阅开启

首先,开启了订阅接口服务以后,你会有推送时间,还有推送IP等很多需要设置的东西,当然完成了这些基本设置后,就可以开始配置订阅规则了,订阅规则基于以下两个条件:

  1. 订阅用户

  2. 订阅关键字 从subscribe/update_subscribe这个接口的示例来看,订阅有以下特点:

    • 订阅规则即刻生效
    • 规则可以添加,修改
    • 规则可以随时查询
    • 每次修改量很有限(用户:50个;关键词:20个)

使用订阅

添加与删除一样 需要说明的是:

$params['subid'] = '***';  //你的订阅ID 新浪提供
$params['source'] = '***';  //你的APPid


session_start();

include_once( 'config.php' );
include_once( 'saetv2.ex.class.php' );

$c = new SaeTClientV2( WB_AKEY , WB_SKEY , $_SESSION['token']['access_token'] );
$uid_get = $c->get_uid();
$uid = $uid_get['uid'];

//获取所有关注,默认一次50个,可以自己写循环
$friends = $c->friends_by_id($uid);
$subscribe = '';
foreach( $friends['users'] as $value )
{
	$subscribe .= $value['id'].',';
}
$subscribe =  trim($subscribe,',');

//准备数据
$params = array();
$params['subid'] = '***';
$params['source'] = '***';
$params['add_uids'] = $subscribe;
//$params['del_uids'] = $subscribe;

$rs = $c->oauth->get('http://c.api.weibo.com/subscribe/update_subscribe.json', $params);
print_r($rs);


if($rs['result']){
	echo "订阅用户成功";
}

获取订阅信息

可以访问网址:

http://open.weibo.com/apps/yourappid/payservice/subscribe

也可以使用API读取

oauth->get('http://c.api.weibo.com/subscribe/update_subscribe.json', $params);
print_r($rs);