【原创】python模拟腾讯网页登录

【原创】python模拟腾讯网页登录

    近日,研究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 = '0'*(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) == '0'):
        return params.group(2)
    elif(params.group(1) == '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 = '0'*(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) == '0'):
            self.verifyCode = params.group(2)
        elif(params.group(1) == '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', '密码')

下面是测试结果

【原创】python模拟腾讯网页登录

 

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

转载于:https://www.cnblogs.com/doudongchun/p/3694922.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100838.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 第三章:hadoop安装配置,jps命令不能使用。apt-get命令不能下载jdk,缺少依赖包,设置静态ip后不能上网,ubuntu防火墙,ssh无密码登录

    第三章:hadoop安装配置,jps命令不能使用。apt-get命令不能下载jdk,缺少依赖包,设置静态ip后不能上网,ubuntu防火墙,ssh无密码登录第三章:hadoop安装配置,jps命令不能使用。apt-get命令不能下载jdk,缺少依赖包,设置静态ip后不能上网,ubuntu防火墙,ssh无密码登录

    2022年4月23日
    43
  • 史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了「建议收藏」

    史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了「建议收藏」Linux系统要启动就必须需要一个bootloader程序,也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NORFLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核。当然了,bootloader的实际工作要复杂的多,但是它最主要的工作就是启动Linux内核,bootloader和Linux内核的关系就跟PC上的BIOS和Windows的

    2022年6月23日
    131
  • 第一天python是干什么的–数字常量

    第一天python是干什么的–数字常量Python是干什么的?Python历史发明人:guidovanrossum1989名称:montypython马戏团发音:拍桑美国拍森英语Python能干啥?Python

    2022年7月5日
    20
  • C# ZIP文件的压缩和解压缩(SharpZipLib.dll)

    C# ZIP文件的压缩和解压缩(SharpZipLib.dll)真是折腾呀,网上虽然有不少的源码但测试几个就是不成功,经过折腾还是折腾出来了现在分享出来给大家。源码还是在网友们的基础上调整的,主要是调整源码大大小写格式。sharpziplib.dll下载:http://pan.baidu.com/share/link?shareid=1016448925&uk=134565274&fid=3214033513首先需要在项目里引用sharp

    2022年7月26日
    5
  • Python正则表达式_正则表达式有什么用

    Python正则表达式_正则表达式有什么用定义:正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。上面都是官方的说明,我自己的理解是(仅供参考):通过事先规定好一些特殊字符的匹配规则,然后利用这些字符进行组合来匹配各种复杂的字符串场景。比如现在的爬虫和数据分析,字符串校验等等都需要用

    2022年10月3日
    2
  • 运维架构体系搭建系列-目录篇[通俗易懂]

    运维架构体系搭建系列-目录篇[通俗易懂]前言:去年新加入的一家公司,传统企业这里就不说名字了,不过公司规模还是有的,鄙人来之前基本上用的都是saas产品,加上疫情原因,没及时跳坑,做为一个半吊子自动化运维开发当然是选择先混日子,后面等来了一个新的技术团队,开始做自己的系统和产品。一、云选型及网络规划1、云产品选型2、网络规划二、devops相关服务搭建1、cicd工具链搭建2、项目管理三、db&中间件1、数据库管理2、中间件管理四、k8s环境及微服务治理1、k8s选型及搭建2、mse管理五、监控&日志

    2022年7月17日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号