经常在做webqq机器人,但是最头痛的问题就是腾讯经常加一些验证串来防止robot,现在共享出最新的腾讯密码加密算法和hash
算法
hash算法
def webqq_hash(i, a): if isinstance(i, (str, unicode)): i = int(i) class b: def __init__(self, _b, i): self.s = _b or 0 self.e = i or 0 r = [i >> 24 & 255, i >> 16 & 255, i >> 8 & 255, i & 255] j = [ord(_a) for _a in a] e = [b(0, len(j) - 1)] while len(e) > 0: c = e.pop() if not (c.s >= c.e or c.s < 0 or c.e > len(j)): if c.s+1 == c.e: if (j[c.s] > j[c.e]) : l = j[c.s] j[c.s] = j[c.e] j[c.e] = l else: l = c.s J = c.e f=j[c.s] while c.s < c.e: while c.s < c.e and j[c.e]>=f: c.e -= 1 r[0] = r[0] + 3&255 if c.s < c.e: j[c.s] = j[c.e] c.s += 1 r[1] = r[1] * 13 + 43 & 255 while c.s < c.e and j[c.s] <= f: c.s += 1 r[2] = r[2] - 3 & 255 if c.s < c.e: j[c.e] = j[c.s] c.e -= 1 r[3] = (r[0] ^ r[1]^r[2]^r[3]+1) & 255 j[c.s] = f e.append(b(l, c.s-1)) e.append(b(c.s + 1, J)) j = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"] e = "" for c in range(len(r)): e += j[r[c]>>4&15] e += j[r[c]&15] return e def newhash(b,j): a=j+"password error" i="" E=[] while True: if len(i)<=len(a): i+=b if len(i)==len(a): break else: i=i[0:len(a)] break for c in range(len(i)): E.append(ord(str(i[c]))^ord(str(a[c]))) a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"] i = "" for c in range(len(E)): i+=a[E[c] >> 4 & 15] i+= a[E[c] & 15] return i
这个算法加密出的串是获取好友列表和群列表都需要的
密码加密算法
#md5加密函数 def PCMd5(self,s): h=hashlib.md5() h.update(s) return h.hexdigest() #16进制转字符 def hex2asc(self,s): _str="".join(s.split(r'\x')) length=len(_str) data='' for i in range(0,length,2): data+=chr(int(_str[i:i+2],16)) return data
#密码加密函数 ''' v1 是 ptui_checkVC('0','!LJV','\x00\x00\x00\x00\x00\xa1\x92\x12') 第一个参数 V2 是 ptui_checkVC('0','!LJV','\x00\x00\x00\x00\x00\xa1\x92\x12') 第二个 ''' def PasswordSecret(self,password,v1,v2,md5=True): if md5==True: password=self.PCMd5(password).upper() length=len(password) temp='' for i in range(0,length,2): temp+=r'\x'+password[i:i+2] return self.PCMd5(self.PCMd5(self.hex2asc(temp)+self.hex2asc(v2)).upper()+v1).upper()