近日,研究Tencent网页模拟登录的过程,过程有些忐忑,但最终还是实现了这一功能。先将结果写于此,供大家参考:

其加密过程在c_login_old.js文件中执行,将JS关键代码提取出来如下:

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
}
function uin2hex(str) {
var maxLength = 16;
str = parseInt(str);
var hex = str.toString(16);
var len = hex.length;
for (var i = len; i < maxLength; i++) {
hex = "0" + hex
}
var arr = [];
for (var j = 0; j < maxLength; j += 2) {
arr.push("\\x" + hex.substr(j, 2))
}
var result = arr.join("");
eval('result="' + result + '"');
alert(result)
return result
}

将其转换为Python脚本如下,测试有效。

# -*- coding: utf-8 -*-
'''
Version : Python27
Author : Spring God
Date : 2014-4-26
''' import md5 def hexchar2bin(hexchar): params = ''
for i in range(0, len(hexchar), 2):
params += chr(int(hexchar[i:i+2], 16)) return params def uin2hex(uin): hex_str = str(hex(int(uin)))[2:]#.upper()
hex_len = len(hex_str)
hex_str = ''*(16-hex_len) + hex_str return hexchar2bin(hex_str) def getEncryption(password, uin, vcode): str1 = md5.md5(password).hexdigest()
str2 = md5.md5(hexchar2bin(str1)+uin2hex(uin)).hexdigest()
str3 = md5.md5((str2+vcode).upper()).hexdigest().upper() return str3 if __name__ == '__main__': print(getEncryption('密码','QQ','验证码'))

需要注意的是:验证码怎么获取,我在腾讯微博登录时通过分析网络传输数据得到如下方式来获取验证码

def check(account):

    check_page = 'https://ssl.ptlogin2.qq.com/check?uin=%s&appid=46000101&low_login=1' % account
headers = {
'Referer': 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=46000101',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36'}
res = urllib2.urlopen(check_page)
data = res.read()
params = re.search("'(.*?)','(.*?)',", data)
#print(params.groups())
'''
第一个参数:0-默认验证码; 1-需要验证码
第二个参数:默认验证码; 验证码cap_cd
获取验证码地址:https://ssl.captcha.qq.com/getimage?uin=1090523513&aid=46000101&cap_cd=cbDkfT8sXEd21HNyJXwSFPDwR2Sw70dK
第三个参数:用户帐号HEX值
'''
if(None == params):
return None
if(params.group(1) == ''):
return params.group(2)
elif(params.group(1) == ''):
img_page = 'https://ssl.captcha.qq.com/getimage?uin=%s&aid=46000101&cap_cd=%s' % (account, params.group(2))
img_data = urllib2.urlopen(img_page).read()
with open(r'verifyCode.jpg', 'wb') as _file:
_file.write(img_data)
_file.close()
os.popen(r'start verifyCode.jpg')
return verifyCode = raw_input(u'输入验证码:')
else:
return None return None

至于登录,就简单了

def login(account, pwd):

    verrifyCode = check(account)
if(None == verrifyCode):
return False
print(u'登录中...')
pwd = password.getEncryption(pwd, account, verifyCode)
login_page = 'https://ssl.ptlogin2.qq.com/login?u='+account+'&verifycode='+self.verifyCode+'&p='+pwd+'&pt_rsa=0&ptredirect=1&u1=http%3A%2F%2Ft.qq.com&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=1-11-1398479501082&js_ver=10076&js_type=1&login_sig=AzGRTF28dkUVNnUrx8c0RlDtx4Rl-6gfJ4Z6SIC1VLphoHULwNooXLsFaS12t2p8&low_login_enable=1&low_login_hour=720&aid=46000101&daid=6&'
res = urllib2.urlopen(login_page)
data = res.read().decode('utf-8')
params = re.search("'.*?','.*?','.*?','.*?','(.*?)', '(.*?)'", data)
print(params.group(1)+params.group(2))

贴上完整代码段

# password.py
# -*- coding: utf-8 -*-
'''
Version : Python27
Author : Spring God
Date : 2014-4-26
''' import md5 def hexchar2bin(hexchar): params = ''
for i in range(0, len(hexchar), 2):
params += chr(int(hexchar[i:i+2], 16)) return params def uin2hex(uin): hex_str = str(hex(int(uin)))[2:]#.upper()
hex_len = len(hex_str)
hex_str = ''*(16-hex_len) + hex_str return hexchar2bin(hex_str) def getEncryption(uin, password, vcode): str1 = md5.md5(password).hexdigest()
str2 = md5.md5(hexchar2bin(str1)+uin2hex(uin)).hexdigest()
str3 = md5.md5((str2+vcode).upper()).hexdigest().upper() return str3 if __name__ == '__main__': print(getEncryption('QQ','密码','验证码'))
# Tencent.py
# -*- coding: utf-8 -*-
'''
Version : Python27
Author : Spring God
Date : 2013-6-28
''' import urllib
import urllib2
import cookielib
import io
import gzip
import re
import os
import password class Tencent(object): def __init__(self): self.verifyCode = None
self.uin = None
self.newtask = None
self.daytask = None # 安装cookie 支持登录操作
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener) def check(self, account): '''
应用ID:46000101(微博)
https://ssl.ptlogin2.qq.com/check?regmaster=&uin=947742112&appid=46000101&js_ver=10076&js_type=1&login_sig=ohbOoy-NhVcIjEGkjmMCUcg4BG6Xn8C9q182ebLKuXLuK1rawH0w0LEuAJYNM9GW&u1=http%3A%2F%2Ft.qq.com&r=0.7585592269897461
'''
self.uin = account
check_page = 'https://ssl.ptlogin2.qq.com/check?uin=%s&appid=46000101&low_login=1' % account
headers = {
'Referer': 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=46000101',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36'}
res = urllib2.urlopen(check_page)
data = res.read()
params = re.search("'(.*?)','(.*?)',", data)
#print(params.groups())
'''
第一个参数:0-默认验证码; 1-需要验证码
第二个参数:默认验证码; 验证码cap_cd
获取验证码地址:https://ssl.captcha.qq.com/getimage?uin=1090523513&aid=46000101&cap_cd=cbDkfT8sXEd21HNyJXwSFPDwR2Sw70dK
第三个参数:用户帐号HEX值
'''
if(None == params):
return False
if(params.group(1) == ''):
self.verifyCode = params.group(2)
elif(params.group(1) == ''):
img_page = 'https://ssl.captcha.qq.com/getimage?uin=%s&aid=46000101&cap_cd=%s' % (account, params.group(2))
img_data = urllib2.urlopen(img_page).read()
with open(r'verifyCode.jpg', 'wb') as _file:
_file.write(img_data)
_file.close()
os.popen(r'start verifyCode.jpg')
self.verifyCode = raw_input(u'输入验证码:')
else:
return False return True def login(self, account, pwd): if(False == self.check(account)):
return False
print(u'登录中...')
pwd = password.getEncryption(account, pwd, self.verifyCode)
login_page = 'https://ssl.ptlogin2.qq.com/login?u='+account+'&verifycode='+self.verifyCode+'&p='+pwd+'&pt_rsa=0&ptredirect=1&u1=http%3A%2F%2Ft.qq.com&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=1-11-1398479501082&js_ver=10076&js_type=1&login_sig=AzGRTF28dkUVNnUrx8c0RlDtx4Rl-6gfJ4Z6SIC1VLphoHULwNooXLsFaS12t2p8&low_login_enable=1&low_login_hour=720&aid=46000101&daid=6&'
res = urllib2.urlopen(login_page)
data = res.read().decode('utf-8')
params = re.search("'.*?','.*?','.*?','.*?','(.*?)', '(.*?)'", data)
print(params.group(1)+params.group(2)) if __name__ == '__main__': app = Tencent()
app.login('QQ', '密码')

下面是测试结果

转载请注明出处http://www.cnblogs.com/doudongchun/p/3694922.html

【原创】python模拟腾讯网页登录的更多相关文章

  1. Python模拟登陆TAPD

    因为在wiki中未找到需要的数据,查询也很迷,打算用python登录tapd抓取所需项目下的wiki数据,方便查找. 2018-9-30 19:12:44 几步走 模拟登录tapd 抓取wiki页左侧 ...

  2. 第14.7节 Python模拟浏览器访问实现http报文体压缩传输

    一. 引言 在<第14.6节 Python模拟浏览器访问网页的实现代码>介绍了使用urllib包的request模块访问网页的方法.但上节特别说明http报文头Accept-Encodin ...

  3. Python学习---模拟微信网页登录180410

    WEB微信 网页登录的猜想: a. 访问页面出现二维码 b. 长轮询监听是否已经扫码并且点击确认 c. 如何进行会话保持 d. 如何获取用户列表 e. 如何发送消息(接收消息) 过程:访问微信官网[h ...

  4. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  5. Python模拟校园网登录

    最近忙着实验室的项目,学习的时间相对较少.前一段时间刚开始接触python时,依葫芦画瓢照着写了一个爬虫,爬取了某个网站的图片.当看到一张张图片自动出现在电脑屏幕上时,有些小小成就感.我想大多数人开始 ...

  6. 利用Python模拟GitHub登录

    最近学习了Fiddler抓包工具的简单使用,通过抓包,我们可以抓取到HTTP请求,并对其进行分析.现在我准备尝试着结合Python来模拟GitHub登录. Fiddler抓包分析 首先,我们想要模拟一 ...

  7. 【py登陆】python模拟登录

    用Python模拟登录网站 前面简单提到了 Python 模拟登录的程序,但是没写清楚,这里再补上一个带注释的 Python 模拟登录的示例程序.简单说一下流程:先用cookielib获取cookie ...

  8. 谈网页游戏外挂之用python模拟游戏(热血三国2)登陆

    看web看多了,想写写页游的外挂,其实原理是一样的,就是端口不一样协议字段你不知道,而这也提高了点技术门槛,看我们来一点一点突破这些门槛,这次我们来用python发包模拟flash的客户端登陆. 以热 ...

  9. 忘记秘密利用python模拟登录暴力破解秘密

    忘记秘密利用python模拟登录暴力破解秘密: #encoding=utf-8 import itertools import string import requests def gen_pwd_f ...

随机推荐

  1. windows下解压zip包,包含中文解析

    #coding=utf8 import os import zipfile import sys,locale # 本来以为需要,结果不需要 # def p(f): # #print '%s.%s() ...

  2. 编译安装lamp环境

    httpd 2.4.9 + mysql-5.5.33 + php-5.4.29编译安装过程: 准备好以下安装包: mysql-5.5.33-linux2.6-x86_64.tar.gz apr-uti ...

  3. Vue+ajax的使用小结

    js var vue = new Vue({ el:"#vueid", data:{ selectById : "", }, methods:{ yourMet ...

  4. 性能测试七:jmeter进阶之文件上传下载、定时器

    一.上传下载 上传: 1,POST请求,勾选 use …for post 2,同请求一起发送文件里,填写文件名称,参数名称 3,MIME类型: application/octet-stream(非必须 ...

  5. python 全栈开发,Day66(web应用,http协议简介,web框架)

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

  6. 51nod1185 威佐夫游戏 V2 (模拟乘法)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...

  7. ERP退货系统管理(四十五)

    添加的存储过程:(添加退货申请信息的存储过程) CREATE PROCEDURE [dbo].[BioBackSendGoods_ADD] @SendBackID INT OUTPUT, ), @Ap ...

  8. Spring Boot学习笔记---Spring Boot 基础及使用idea搭建项目

    最近一段时间一直在学习Spring Boot,刚进的一家公司也正好有用到这个技术.虽然一直在学习,但是还没有好好的总结,今天周末先简单总结一下基础知识,等有时间再慢慢学习总结吧. Spring Boo ...

  9. 用两个int值实现读写锁

    private int readcount = 0; private int writecount = 0; public void lockread() throws InterruptedExce ...

  10. hdu 1728 迷宫 给定最大转弯次数 (BFS)

    给出起点 终点 以及转弯次数 在<=转弯次数的条件 能否走到终点 Sample Input25 5...** // .可走 *不可走*.**...........*....1 1 1 1 3 / ...