首页简历就业营销资料下载销售教程范文大全加入收藏网站地图
您现在的位置: 大学生之家: >> 大学生专栏电脑学习qq大全QQ技巧腾讯QQ空间登录的方法实现方式与验证过程分析

腾讯QQ空间登录的方法实现方式与验证过程分析

10-30 16:36:09| http://www.yxzj8.com |QQ技巧 |人气:292
腾讯QQ空间登录的方法实现方式与验证过程分析由http://www.yxzj8.com整理发布,类别:QQ技巧, 本站还有更多关于qq技巧大全,qq飞车技巧,qq聊天技巧,qq申诉技巧方面的资料。

下面是李昱的关于QQ空间登陆方式以及写法,并对实现方式与写法进行了解释,主要用与在设计QQ空间小工具需要验证空间登陆信息时候用到,比如留言,日志提交等,还能适用到其他的腾讯产品比如微博等.

一、腾讯QQ空间登录与验证过程
       腾讯QQ空间的登录一共需要经过三次验证,分别是在登录页面1、验证帐号状态,并通过帐号获取令牌的原始密钥;2、对原始密钥进行运算生成令牌密钥并提交服务器,服务器进行一次验证;3、经过第二次验证通过,服务器自动跳转,进行第三此验证,最后返回登录令牌……终成功后才能获取到加密过后的登录令牌,而利用此令牌就可以顺利的操作任何腾讯的产品与服务了。
      接下来我们以腾讯微博为例来进行一些在合法的限度内的讲解,旨在开拓各位读者的思维与分享技术思路,因为这东西其实我用了很久很久了,相信很多技术大牛们也都自己偷偷在应用着,只是懒得拿出来分享,或者用来赚钱而已。但是很不爽的就是腾讯最近宣布推出了开放平台,可实际上是换汤不换药的东西,所以才想要跟大家分享分享。因此如果您抱着想要通过本文的讲解来进行获利的目的,那我建议您可以就此打住了。因为,接下来的内容中我并不会去讲解或者说分享那些您会感兴趣的东西。
二、协议详解
       1、言归正传,首先第一次的登录是发生在我们打开登录页面的时候。 还是以腾讯微博为例,当我们打开微博的登录页面时,页面上的js会触发一个地址:http://ptlogin2.qq.com/check?uin=939567050&appid=46000101&r=0.5354662109559408
这个地址是用来判断您的用户名是否是正常状态,以及是否有效用户名,并返回一个状态值以及一个验证码。其中uin就是你的用户名,appid指的是腾讯QQ空间的编码。r是一个随机生成的数字,用来避免浏览器缓存。
 
1正常时,请求这个地址,会获得类似ptui_checkVC('0','!AFO');这样的返回值,这其中0是代表正常状态,不采用图片验证。但是如果短时间内这个帐号多次在不同的ip登录,那么返回值就是另外的一种返回值了,那表明需要进行图片验证码验证。
此外,0还有可能变为其他的数值,用来标明诸如帐号不存在,帐号状态不正确,帐号已锁定等等的。。。。。而后面的!AFO是四位则是我们需要获得的原始令牌值,它是由腾讯服务器随机生成的一个令牌的原始密钥。当然也许您在获取的时候会发现这个值并不是4位,而是很多位。那么就要恭喜您了,您获得也是令牌的原始密钥,只不过不同的是,您获得是图片验证码的原始密钥而已。
当然其实图形验证码的自动识别也很简单,只是这已经超出本文的范围了,以后有机会可以与大家再次分享下。此时,当我们正确的获得!AFO时就已经完成了第一次的验证!但是有一点需要注意的是:腾讯的令牌是存储在cookies中的,

 2、此时我们需要对获取到的原始密钥进行一系列的运算,从而得到令牌密钥。这个算法其实也很简单,就是先把用户密码连续进行两次md5加密,每次md5加密输出二进制的结果,然后在对经过两次md5加密后的结果在进行一次md5加密,最后输出16进制大写的结果。在把我们第一步获取到的原始密钥合并在此结果之后,形成一个新的字符串。并且再次对此字符串进行md5加密,并输出16进制大写的字符串。此时,此字符串就为令牌密钥了。示例代码如下
 
1        def md5hash(self,str):
2        return hashlib.md5(str).digest()
3def hex_md5hash(self,str):
4        return hashlib.md5(str).hexdigest().upper()
5def md5hash_3(self,str):
6        return self.hex_md5hash(self.md5hash(self.md5hash(str)))
7def EncodePasswordWithVerifyCode(self,pwd, verifyCode):
8        return self.hex_md5hash(self.md5hash_3(pwd) + verifyCode.upper())
1EncodePasswordWithVerifyCode()即为此加密算法,pwd是密码,verifyCode为我们第一步获取到的4位的原始密钥。

二、先贴代码


01def Get_qzone(self,model,pushitem,**kwargs):
02                try:
03                        message = mail.EmailMessage()
04                        message.sender = '%s@qq.com'% pushitem.username
05                        message.to = '%s@qzone.qq.com'% pushitem.username
06                        message.body =htmllib.encoding(stringQ2B(htmllib.encoding(model.content)),'gb18030')
07                        message.subject =htmllib.encoding(stringQ2B(htmllib.encoding(model.title)),'gb18030')
08                        message.send()
09                        return self.Get_True(model,pushitem)
10                except Exception,data:
11                        return self.Get_False(model,pushitem,data)


三、简单解释
其实这个方法实现自己的qq空间的更新,或者实现自己的qq空间与其他博客同步更新等应用来说是最简洁的方法之一,技术含量也是最低的。
就是通过发送邮件到自己的username@qzone.qq.com来更新qq空间而已。甚至都不用写代码都可以实现,网易以及新浪的博客也具有类似的功能。
功能是简单,但是关键看怎么应用了。我是做新媒体,所以研究新媒体的营销方式,基于新媒体与基于网络的新的营销方式。
因此,我觉得这个简单的功能利用好了,能够实现非常不错的内容营销的效果。具体的,大家自己研究吧,这里仅仅抛砖引玉而已,你懂得。。。
四、其他实现方式

001       def Get_qzone2(self,model,pushitem,**kwargs):
002        """
003        this method is used to get login to website,and put the content to the qzone
004        """
005        try:
006
007
008            html=u'%s 详细内容请查看:<a herf=%s>%s</a>'% (
009                        htmllib.decoding(htmllib.Filter_content(model.content)),
010                        unicode(model.fullurl),unicode(model.fullurl))
011            html=htmllib.encoding(html,'gb18030')
012            title=htmllib.encoding(htmllib.decoding(model.title),'gb18030')
013            content=htmllib.Filter_html(html)
014            result=self.send_qzone2(pushitem.username,pushitem.password,content,title,html)
015            if result:
016                return self.Get_True(model,pushitem)
017            else:
018                return self.Get_False(model,pushitem)
019        except Exception,data:
020                return self.Get_False(model,pushitem,data)
021
022def Get_qzone2_val(self,username,password):
023        verifyURL = 'http://ptlogin2.qq.com/check?uin=%s&appid=15000101'% username
024        loginURL = 'http://ptlogin2.qq.com/login?'
025        redirectURL = ''
026        cookie = ''
027        qqn = username
028        md5Pass = ''
029        verifyCode = ''
030        result = urlfetch.fetch(url=verifyURL,method=urlfetch.GET,
031                follow_redirects = False,headers={
032                'Content-Type': 'application/x-www-form-urlencoded',
033                'user-agent':'Mozilla/5.0 (Linux; U; Linux i686; en-US) AppleWebKit/525.13 (KHTML, like Gecko)_chrome/0.4.2.80 Safari/525.13',
034                },)
035        logging.info(result.content)
036        cookie1 = Cookie.SimpleCookie(result.headers.get('set-cookie', ''))
037        verifyCode=result.content[18:-3]
038        loginURL += "u=%s&p="% username
039        loginURL+=self.EncodePasswordWithVerifyCode(password,verifyCode)
040        loginURL += "&verifycode="+verifyCode+"&aid=15000101&u1=http%3A%2F%2Fimgcache.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&ptredirect=1&h=1&from_ui=1&fp=loginerroralert"
041        result=urlfetch.fetch(url=loginURL,
042                headers={'Referer':'http://t.qq.com',
043                'Cookie' : self.make_cookie_header(cookie1),
044                'Content-Type': 'application/x-www-form-urlencoded',
045                'user-agent':'Mozilla/5.0 (Linux; U; Linux i686; en-US) AppleWebKit/525.13 (KHTML, like Gecko)_chrome/0.4.2.80 Safari/525.13',
046                },
047                method=urlfetch.GET,
048                follow_redirects = False,
049        )
050
051        setCookies = result.headers.get('set-cookie', '').split(';')
052        cookie2 = ''
053        cookie2+=setCookies[29]
054        cookie2+=setCookies[7]
055        cookie2+=setCookies[4]
056        cookie2+=';'+setCookies[0]
057        cookie2 = cookie2.replace(',', ';')
058        cookie2 = cookie2[1:]
059        callback_url = result.headers.get('location','http://imgcache.qq.com/qzone/v5/loginsucc.html?para=izone')
060        result,cookie = self.do_redirect(callback_url, cookie2)
061
062
063        return result,cookie
064def Tmp_skey_get(self,cookie):
065        tmp=cookie.split(';')
066        for i in tmp:
067                if i[1:5]=='skey':
068                        return i[6:]
069        return None
070
071
072def send_qzone2(self,username,password,content,title,html):
073    """
074    send qzone blog. use  username, password,content,title,html.
075    the content parameter like html,but no html tag.
076    """
077    memcachekey='send_qzone2'
078    cookie=''
079    if memcache.get(memcachekey):
080        cookie=memcache.get(memcachekey)
081        logging.info('get cookie from memcache')
082    else:
083        result,oldcookie=self.Get_qzone2_val(username,password)
084        cookie='%s;%s'% (result.headers.get('set-cookie', ''),oldcookie)
085        memcache.set(memcachekey,cookie,36000)
086        logging.info('set cookie')
087    tmphash=self.Tmp_skey_get(cookie)
088    tmphash=self.myhash(tmphash)
089    category='个人日记'
090    form_fields = {
091        "uin":'939567050',
092        "category":htmllib.encoding(category,'gb18030'),
093        "title":title,
094        "content":content,
095        "html":html,
096        "cb_autograph":'1',
097        "topflag":'0',
098        "needfeed":'0',
099        "lp_type":'0',
100        "g_tk":tmphash,
101        "scorr_20100723_":'http://qzs.qq.com/qzone/newblog/v5/editor.html|http://qzs.qq.com/qzone/newblog/v5/editor.html<http://user.qzone.qq.com/939567050/main',
102    }
103    form_data = urllib.urlencode(form_fields)
104    try:
105        result = urlfetch.fetch(url="http://b.qzone.qq.com/cgi-bin/blognew/blog_add",
106                        payload=form_data,
107                        method=urlfetch.POST,
108                        headers={'Referer':'http://imgcache.qq.com/qzone/v5/toolpages/fp_gbk.html',
109                        'Cookie' : cookie,
110                        'user-agent':'Mozilla/5.0 (Linux; U; Linux i686; en-US) AppleWebKit/525.13 (KHTML, like Gecko)_chrome/0.4.2.80 Safari/525.13',
111
112                        },follow_redirects = False)
113    except Exception,data:
114                logging.info(data)
115                return False
116    if result.status_code == 200:
117                return True
118    else:
119                return False
120
121def make_cookie_header2(self,cookie):
122        ret = ""
123        for val in cookie.values():
124                ret+="%s=%s; "%(val.split('=')[0], val.split('=')[1])
125        return ret
126
127
128def Make_cookie_dict(self,cookie):
129        tmpval=dict()
130        for val in cookie:
131                tmpval.update({val.split('=')[0]:val.split('=')[1]})
132        return tmpval
133
134def md5hash(self,str):
135        return hashlib.md5(str).digest()
136def hex_md5hash(self,str):
137        return hashlib.md5(str).hexdigest().upper()
138def md5hash_3(self,str):
139        return self.hex_md5hash(self.md5hash(self.md5hash(str)))
140def EncodePasswordWithVerifyCode(self,pwd, verifyCode):
141        return self.hex_md5hash(self.md5hash_3(pwd) + verifyCode.upper())


这就是常规我们所用的也是那些什么农场外挂之类的所应用的技术思路了。
具体可以参见本文第一部分所列的网址,里面有详细的解释。
这里只是简单的提几个需要注意的地方:
1、从第一讲开始,我就告诉大家了,获取到的令牌并不仅仅只是腾讯一项产品的令牌而已,他是腾讯统一的令牌,所以其他服务也可以用。记住令牌获取到了,可以一直使用下去,尽量不要每进行一个操作就从新获取一次令牌。
相信我,如果您这样做,您会哭的。。。。。这样只要3次,你就要考虑登录时进行自动智能图片验证码识别模块的编写的。。。虽然那也很简单,但是麻烦啊。。。。此外,登录的时候尽量的使用与你qq号码绑定的邮箱帐号登录,而不是qq号码。
因为,腾讯的帐号验证机制会对qq号码比较严格,所以用邮箱帐号登录可以获得一样的效果,而且很难出现图片验证码这个讨厌的东西。
2、Tmp_skey_get方法是用来从令牌cookies中获取skey值,这个值我在第一讲里面就已经说了,非常重要很多地方都要用到它的,它就相当于另一个令牌一样。。。腾讯还真是下足了功夫,弄个双保险啊。。
3、呃。。。不好意思前面贴代码少贴了一个方法。


1def myhash(self,tmpstr):
2                tmphash=5381
3                tmpstr=tmpstr
4                for i in range(0, len(tmpstr)):
5                        tmphash+=(tmphash<<5)+ord(tmpstr )
6                return (tmphash & _0x7FFFFFFF)


就是这个myhash的方法,这个方法是用来对skey进行处理并生成另一块令牌。这个算法,是我研究了半天自己写出来的,但是运行的很好。也许有更好的算法,大家可以自己研究下。
4、tmphash=self.myhash(tmphash)是得到令牌,接下去构造表单中的g_tk的值就为这个令牌。这个g_tk不仅仅在qzone发布文章时候用到,包括获取好友列表啊,添加删除好友之类的地方以及qq邮箱都会用到的。
算法就是上面的那个算法了,但是还有一种更加容易,但是效率低的方法获得这个值——每个页面中都会藏有这个g_tk的值,是当你打开这个页面的时候,腾讯生成在页面上的。你可以使用一些html解析库来分解html然后找到这个值也可以,但是就是效率比较低就是了。
5、还有一个需要注意的就是编码问题了,请使用gb18030而不是gb2312,为了更好的兼容性。
6、其他的部分可以参考本文第一部分中的两个网址,我的第一讲中详细的有介绍。
 
 


如果觉得腾讯QQ空间登录的方法实现方式与验证过程分析不错,可以推荐给好友哦。
TAG:电脑学习 - qq大全 - QQ技巧,qq技巧大全,qq飞车技巧,qq聊天技巧,qq申诉技巧
QQ技巧相关文章
网站地图 网站合作 联系我们 销售课堂 大学实习 求职简历 就业指导 毕业论文中心 大学校园活动 热门专题
copyright © www.yxzj8.com, All Rights Reserved
本站是中国优秀的大学生学习交流平台,提供大学生毕业论文,大学生职业生涯规划,大学生创业故事,大学生创业,大学生求职,大学生实习,大学校园活动,大学生就业指导等热门资源参考。
大学生之家 版权所有   1 2 3 4 5 6 7 8