Python模拟登录腾讯微博发送微博

0

前不久用Java模拟登录微信,今天我有心血来潮想刷一下图片微博,于是我就用Python写了一个登录腾讯微博刷微博的。
本来可以用Java写的,但是几天没看Python差不多又忘了,于是还是用Python来写,主要是练练手。

这里不得不说Python的urlliburllib2这两个包实在是太强大了。

首先我们要实现这个功能我们需要几步:

  1. 登录微博;
  2. 记住登录状态,也就是cookie的保存;
  3. 发送微博;

我们先来写第一个登录微博:先我们用浏览器可以很清楚的看到登录地址:

https://ssl.ptlogin2.qq.com/login?u=%s&verifycode=%s&p=%s&pt_rsa=0&ptredirect=1&u1=http%%3A%%2F%%2Ft.qq.com&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=9-101-1396061515832&js_ver=10073&js_type=1&login_sig=N7rJvnAKjCRA7xRb9oz8M9SJkTSlzs3IfeY76-Ijq-fLtgozKdWJET8Bow*nGcVH&low_login_enable=1&low_login_hour=720&aid=46000101&daid=6&

注:u是你的登陆名,verifycode是验证码,p是密码,后面的参数不动就好。

登录名自然不用多说:QQ号码;

验证码

验证码: 验证码是需要获取的,获取地址:

http://check.ptlogin2.qq.com/check?uin=%s&appid=46000101&ptlang=2052&r=%s

uin:也是你的QQ号码;其他参数不变;

获得的信息:

ptui_checkVC('0','!YTW','\x00\x00\x00\x00\x11\x42\x24\x96');

0表示不需要图片验证码,如果为1那么就要手动输入图片验证码才可以;
!YTW这个相当于图片验证码里面的值,这个也是verifycode的值;
后面那个最长的参数是密码加密的时候使用;

密码加密

首先我们获取到加密的JS:

https://xui.ptlogin2.qq.com/js/10073/c_login_old.js?max_age=604800

在JS里面搜索password,我们可以看到加密算法:

function hexchar2bin(str) {
 var arr = [];
 for ( var i = 0; i < str.length; i = i + 2) {
 arr.push("\\x" + str.substr(i, 2))
 }
 arr = arr.join("");
 eval("var temp = '" + arr + "'");
 return temp
}
function getEncryption(password, uin, vcode) {
 var str1 = hexchar2bin(md5(password));
 var str2 = md5(str1 + uin);
 var str3 = md5(str2 + vcode.toUpperCase());
 return str3
}

加密算法:

  1. MD5加密你的密码转为二进制
  2. 得到的字符串加上uin(也就是上面获取验证码最后那个长长的字符串,这个也要转为二进制)在进行MD5加密
  3. 加密后的字符串再加上上面获取的verifycode的大写在MD5加密就得到密码

下面是Python的实现:

def hexchar2bin(uin):
    tmp = "";
    uins = uin.split(r"\x");
    for i in uins[1:]:
        tmp += chr(int(i, 16));
    return tmp;
def getPswd(pswd, uin, vcode):
    pswd_a = hashlib.md5(pswd).digest(); # 获取二进制
    pswd_b = hashlib.md5(pswd_a + hexchar2bin(uin)).hexdigest().upper(); # 注意转为大写
    return hashlib.md5(pswd_b + vcode.upper()).hexdigest().upper();

注意:加密后要转为大写。

登陆状态

登录要记住登录状态就要使用cookie了,Python的操作使用cookielib挺方便的,下面写一下主要的代码片段:

cookie = cookielib.MozillaCookieJar(cookiefile); # 创建cookie
cookie.load(ignore_discard=True, ignore_expires=True); # 加载cookie
cookie.save(cookiefile, ignore_discard=True, ignore_expires=True); # 保存cookie
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)); # 给请求里面添加这个cookie

注意:上面代码不能直接使用,请按照需要写到相应位置。

然后请求登录地址,登录成功后会返回登录信息,到这里还没完,返回的信息里面还有一个网址,请在跳转到这个网址,一定要跳转,否者获取到的cookie不完整,不能使用

登录就完成了,发送就简单了我就不写了。
还有个注意的就是设置一下浏览器信息。

参考网址:http://blog.vsharing.com/liyu2012/A1588860.html

DEMO下载,使用时请配置cfg.ini。
图片上传暂时也没有写,有时间实现吧。

今天发现微博的登录方式改了,这里列出几个重要的地方:

验证码地址
登录地址
密码加密方式

加密算法:

def uin2hex(uin):
    maxLength = 16;
    uin = str(hex(int(uin)))[2:];
    length = len(uin);
    print uin;
    uin = (maxLength - length) * "0" + uin;
    newUin = "";
    for i in range(8):
        newUin += chr(int(uin[2 * i:2 * (i + 1)], 16));
    return newUin;
def getPswd2(pswd, uin, vcode):
    pswd_a = hashlib.md5(pswd).digest(); # 获取二进制
    pswd_b = hashlib.md5(pswd_a + uin2hex(uin)).hexdigest().upper(); # 注意转为大写
    return hashlib.md5(pswd_b + vcode.upper()).hexdigest().upper();

配置文件:

user=
pswd=
loginUrl=https://sslNaNlogin2.qq.com/login?u=%s&verifycode=%s&pt_vcode_v1=0&pt_verifysession_v1=%s&p=%s&pt_rsa=0&u1=http%%3A%%2F%%2Ft.qq.com%%2Facgist&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=3-19-1408356849436&js_ver=10090&js_type=1&login_sig=NGwy97hn7X8dMKrfUCaiPpi5MGD3BcJIR9UA*JA-gliE2Ya6QibAVB58AbK2PNmz&pt_uistyle=23&low_login_enable=1&low_login_hour=720&aid=46000101&daid=6&
uploadUrl=http://upload.t.qq.com/asyn/uploadpicCommon.php?call=2&uin=aa94b00a53d225b83f6057d43813b0a5&g_tk=1159857173&rand=0.0168124339543283&_ps1=Cq*x4MRgK8n7SHcsNfL6oR1u6-NlNlsiIAyUCLLAmds_&_ps2=000400006a3343965e382034739b14ec722aea920ad0fcde0b76d0298c0be9afa900a22f26a48634a147a665
sendUrl=http://api.t.qq.com/old/publish.php
exitUrl=
codeUrl=https://sslNaNlogin2.qq.com/check?regmaster=&uin=%s&appid=46000101&js_ver=10090&js_type=1&login_sig=NGwy97hn7X8dMKrfUCaiPpi5MGD3BcJIR9UA*JA-gliE2Ya6QibAVB58AbK2PNmz&u1=http%%3A%%2F%%2Ft.qq.com%%2Facgist&r=%s

还有个重要的地方,之前加密要用到code获取到的信息,但是现在加密直接使用你的qq号码代替之前的uin。