• web qq 获取好友列表hash算法


    web qq 获取好友列表hash算法

    在使用web qq的接口进行好友列表获取的时候,需要post一个参数:hash
    在对其js文件进行分析之后,发现计算hash的函数位于:
    http://0.web.qstatic.com/webqqpic/pubapps/0/50/eqq.all.js
    这个文件中:
    		P = function(b, i) {
    				for (var a = [], s = 0; s < i.length; s++) a[s % 4] ^= i.charCodeAt(s);
    				var j = ["EC", "OK"],
    				d = [];
    				d[0] = b >> 24 & 255 ^ j[0].charCodeAt(0);
    				d[1] = b >> 16 & 255 ^ j[0].charCodeAt(1);
    				d[2] = b >> 8 & 255 ^ j[1].charCodeAt(0);
    				d[3] = b & 255 ^ j[1].charCodeAt(1);
    				j = [];
    				for (s = 0; s < 8; s++) j[s] = s % 2 == 0 ? a[s >> 1] : d[s >> 1];
    				a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
    				d = "";
    				for (s = 0; s < j.length; s++) d += a[j[s] >> 4 & 15],
    				d += a[j[s] & 15];
    				return d
    		}

    这样可以写一个python版本:
    		a=[0,0,0,0]
    		s=0
    		for s in range(0,len(i)):
    			a[s%4] = a[s%4] ^ ord(i[s])
    		j = ["EC", "OK"]
    		d = [0,0,0,0]
    		d[0] = int(b) >> 24 & 255 ^ ord(j[0][0])
    		d[1] = int(b) >> 16 & 255 ^ ord(j[0][1])
    		d[2] = int(b) >> 8 & 255 ^ ord(j[1][0])
    		d[3] = int(b) & 255 ^ ord(j[1][1])
    		j = range(0,8)
    		for s in range(0,8):
    			if s % 2 == 0:
    				j[s] = a[s >> 1]
    			else:
    				j[s] = d[s >> 1]
    		a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
    		d = ""
    		for s in range(0,len(j)):
    			d = d + a[j[s] >> 4 & 15]
    			d = d + a[j[s] & 15]
    		return d

    但是第二天使用web qq接口获取好友列表时,却不能获取了。后来发现原来是这个hash函数变了:
    		P = function(b, i) {
    			for (var a = [], s = 0; s < b.length; s++) a[s] = b.charAt(s) - 0;  alert(a);//ago
    			for (var j = 0, d = -1, s = 0; s < a.length; s++) {
    				j += a[s];
    				j %= 
    				i.length;
    				var c = 0;
    				if (j + 4 > i.length) for (var l = 4 + j - i.length, x = 0; x < 4; x++) c |= x < l ? (i.charCodeAt(j + x) & 255) << (3 - x) * 8: (i.charCodeAt(x - l) & 255) << (3 - x) * 8;
    				else for (x = 0; x < 4; x++) c |= (i.charCodeAt(j + x) & 255) << (3 - x) * 8;
    				d ^= c
    			}
    			a = [];
    			a[0] = d >> 24 & 255;
    			a[1] = d >> 16 & 255;
    			a[2] = d >> 8 & 255;
    			a[3] = d & 255;
    			d = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
    			s = "";
    			for (j = 0; j < a.length; j++) s += d[a[j] >> 4 & 15],
    			s += d[a[j] & 15];
    			return s
    		}
    继续改写成python版:
    		a=[]
    		s=0
    		for s in range(0,len(b)):
    			t=int(b[s])
    			a.append(t)	
    		j = 0
    		d = -1
    		s = 0
    		for s in range(0,len(a)):
    			j = j + a[s]
    			j = j % len(i)
    			c = 0
    			if (j + 4) > len(i): 
    				l = 4 + j - len(i)
    				for x in range(0,4):
    					if x < l:
    						c = c | (( ord(i[j + x]) & 255) << (3 - x) * 8 )
    					else:
    						c = c | ( ( ord(i[x - l]) & 255) << (3 - x) * 8 )
    			else:
    				for x in range(0,4):
    					c = c | (( ord(i[j + x]) & 255) << (3 - x) * 8 )
    			d = d ^ c	
    			
    		a = [0,0,0,0]
    		a[0] = d >> 24 & 255
    		a[1] = d >> 16 & 255
    		a[2] = d >> 8 & 255
    		a[3] = d & 255
    		d = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"]
    		s = ""
    		for j in range(0,len(a)):
    			s = s + d[a[j] >> 4 & 15]
    			s = s + d[a[j] & 15]
    		return s


  • 相关阅读:
    Java中的各种锁总结2
    Java中锁的总结学习
    双亲委派模型
    mybatis中使用in查询问题
    ArrayList、LinkedList、Vector 区别,优缺点,实现原理
    java value注解总结
    linux-系统启动流程
    linux-文本编辑器
    linux-LVM 逻辑卷
    nodejs + access 应用
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3217827.html
Copyright © 2020-2023  润新知