Python模拟登录QQ空间(一)

1. 说明

  • 已失效,跳转(2015/04/05)
  • 可虑验证码出现的情况
  • 请在Python3.x上运行

2. 源码

# -*- coding: utf-8 -*-

import urllib.parse, urllib.request, http.cookiejar, hashlib, re, json, os, tempfile


"""cookie"""
cookie=http.cookiejar.CookieJar()
chandle=urllib.request.HTTPCookieProcessor(cookie)

def get(url, header = False):
    if header:
        r = urllib.request.Request(url, headers = header)
    else:
        r = urllib.request.Request(url)
    opener = urllib.request.build_opener(chandle)
    u = opener.open(r)
    data = u.read()
    try:
        data = data.decode('utf-8')
    except:
        data = data.decode('gbk', 'ignore')
    return data

def post(url, data, header = False):
    data = urllib.parse.urlencode(data)
    data = bytes(data,'utf-8')
    if header:
        r = urllib.request.Request(url, data, headers = header)
    else:
        r = urllib.request.Request(url, data)
    opener = urllib.request.build_opener(chandle)
    u = opener.open(r)
    data = u.read()
    try:
        data = data.decode('utf-8')
    except:
        data = data.decode('gbk', 'ignore')
    return data

class QQ:
    num         = ""
    pwd         = ""
    login_sig   = ""
    appid       = 549000912
    qzreferrer  = ""

    def __init__(self, num, pwd):
        self.num = num
        self.pwd = pwd
        self.check()
        self.login()

    def check(self):
        par = {
            'appid'             : self.appid,
            'daid'              : 5,
            'hide_title_bar'    : 1,
            'link_target'       : "blank",
            'low_login'         : 0,
            'no_verifyimg'      : 1,
            'proxy_url'         : "http://qzs.qq.com/qzone/v6/portal/proxy.html",
            'pt_qr_app'         : "手机QQ空间",
            'pt_qr_help_link'   : "http://z.qzone.com/download.html",
            'pt_qr_link'        : "http://z.qzone.com/download.html",
            'pt_qzone_sig'      : 1,
            'qlogin_auto_login' : 1,
            's_url'             : "http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone",
            'self_regurl'       : "http://qzs.qq.com/qzone/v6/reg/index.html",
            'style'             : 22,
            'target'            : "self"
        }
        url = "http://xui.ptlogin2.qq.com/cgi-bin/xlogin?%s" % urllib.parse.urlencode(par)
        self.login_sig = re.findall('login_sig:"([^"]+)"', get(url))[0]
        par = {
            'appid'             : self.appid,
            'js_type'           : 1,
            'js_ver'            : 10076,
            'login_sig'         : self.login_sig,
            'r'                 : 0.8861454421075537,
            'regmaster'         : "",
            'u1'                : "http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone",
            'uin'               : self.num
        }
        url = 'http://check.ptlogin2.qq.com/check?%s' % urllib.parse.urlencode(par)
        li =  re.findall("'([^']+)'", get(url))
        print(li)
        if len(li) == 4:
            self.flag, self.vcode, self.uin, _ = li
        elif len(li) == 3:
            self.flag, self.vcode, self.uin    = li
        else:
            print("不按套路出牌啊...")

        if self.flag == "1":
            self.getCode()

    def getPwd(self):
        str = hashlib.md5(self.pwd.encode())
        str = str.digest()
        str = hashlib.md5((str + int(self.num).to_bytes(8, "big")))
        str = str.hexdigest().upper()
        str = hashlib.md5((str + self.vcode.upper()).encode())
        return str.hexdigest().upper()

    def getCode(self):
        par = {
            'uin'       : self.num,
            'aid'       : self.appid,
            'cap_cd'    : self.vcode
        }
        url = 'http://captcha.qq.com/getimage?%s' % urllib.parse.urlencode(par)
        r = urllib.request.Request(url)
        opener = urllib.request.build_opener(chandle)
        u = opener.open(r)
        data = u.read()
        tmp = tempfile.mkstemp(suffix='.png')
        os.write(tmp[0], data)
        os.close(tmp[0])
        os.startfile(tmp[1])
        self.vcode = input("验证码:")


    def login(self):
        par = {
            'action'            : "5-20-1314",
            'aid'               : self.appid,
            'daid'              : 5,
            'from_ui'           : 1,
            'g'                 : 1,
            'h'                 : 1,
            'js_type'           : 1,
            'js_ver'            : 10076,
            'login_sig'         : self.login_sig,
            'p'                 : self.getPwd(),
            'pt_qzone_sig'      : 1,
            'pt_rsa'            : 0,
            'ptlang'            : 2052,
            'ptredirect'        : 0,
            't'                 : 1,
            'u'                 : self.num,
            'u1'                : "http://qzs.qq.com/qzone/v5/loginsucc.html?para=izone",
            'verifycode'        : self.vcode
        }

        url = "http://ptlogin2.qq.com/login?%s" % urllib.parse.urlencode(par)
        header = {
            'Host'          : "ptlogin2.qq.com",
            'User-Agent'    : "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0"
        }
        s = get(url, header)
        print(s)
        li = re.findall("'([^']+)'", get(url))

        if not int(li[0]):
            self.qzreferrer = li[2]
            print("你好,%s" % li[len(li) - 1])
            return True
        else:
            return False


    def gtk(self):
        for x in cookie:
            if x.name == "skey":
                hash = 5381;
                for c in x.value:
                    hash += (hash << 5) + ord(c)
                return hash & 0x7fffffff;


    def feed(self, txt, pic = False):
        url = "http://taotao.qq.com/cgi-bin/emotion_cgi_publish_v6?g_tk=%d" % self.gtk()
        par = {
            'code_version'      : 1,
            'con'               : txt,
            'feedversion'       : 1,
            'format'            : "fs",
            'hostuin'           : self.num,
            'paramstr'          : 1,
            'pic_template'      : "",
            'qzreferrer'        : self.qzreferrer,
            'richtype'          : "",
            'richval'           : "",
            'special_url'       : "",
            'subrichtype'       : "",
            'syn_tweet_verson'  : 1,
            'to_sign'           : 0,
            'to_tweet'          : 0,
            'ugc_right'         : 1,
            'ver'               : 1,
            'who'               : 1
        }
        if not int(re.findall('"subcode":([\d\-]+)', post(url, par))[0]):
            return True
        else:
            return False

    def friend(self):
        par = {
            'uin'           : self.num,
            'rd'            : 0.5437208298024628,
            'do'            : 1,
            'fupdate'       : 1,
            'clean'         : 1,
            'g_tk'          : self.gtk()
        }
        url = "http://r.qzone.qq.com/cgi-bin/tfriend/friend_ship_manager.cgi?%s" % urllib.parse.urlencode(par)
        s = get(url)
        uin = re.findall('"uin":(\d+)[,\s]+"name":"([^"]+)"', s)

        for x in uin:
            print(x) #有些好友的名字可能无法输出,涉及utf8与gbk编码问题,可自行注释

    def getFeed(self):

        par = {
            'uin'                   : 12345678,
            'ftype'                 : 0,
            'sort'                  : 0,
            'pos'                   : 0,
            'num'                   : 20,
            'replynum'              : 100,
            'g_tk'                  : self.gtk(),
            'callback'              : "_preloadCallback",
            'code_version'          : 1,
            'format'                : "jsonp",
            'need_private_comment'  : 1
        }

        js = json.loads(re.findall(r'{.+}', get('http://taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?%s' % urllib.parse.urlencode(par)))[0])
account = input("帐号:")
password = input("密码:")
qq = QQ(account, password)
os.system("pause")
# qq.feed("I'm Spider-Man")
# qq.friend()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容