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

web qq 获取好友列表hash算法的更多相关文章

  1. webqq 获得好友列表hash算法 获得最新hash的方法

    webqq获得好友列表的hash算法,大约每一个月中旬会变动一次.知道怎么获得他就能够了. js文件路径 http://web.qstatic.com/webqqpic/pubapps/0/50/eq ...

  2. 一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)

    × 本篇主要是: 获取好友列表,群列表 我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验 利于大家阅读,文章样式不再复杂化,根据内容取固定色 目前总进度大概65% 全系列预计会 ...

  3. XMPP框架下微信项目总结(5)花名册获取(好友列表)

    ---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...

  4. XMPP通讯开发-仿QQ显示好友列表和用户组

    在 XMPP通讯开发-服务器好友获取以及监听状态变化   中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计    我们将两个合并起来,首先获取用户组,然后把用户组用List ...

  5. XMPP系列(三)---获取好友列表、添加好友

    1.心跳检测.掉线重连功能 客户端和服务器端都可以设置多久发送一次心跳包,如果对方没有返回正确的pong信息,则会断开连接,而添加掉线重连功能,则会自动进行连接. 如果自己写聊天功能还得自己做心跳检测 ...

  6. XMPP系列(三)---获取好友列表、加入好友

    1.心跳检測.掉线重连功能 client和server端都能够设置多久发送一次心跳包,假设对方没有返回正确的pong信息,则会断开连接,而加入掉线重连功能,则会自己主动进行连接. 假设自己写聊天功能还 ...

  7. 开源微信Http协议Sdk【实现登录/获取好友列表/修改备注/发送消息】

    基于微信Http协议封装的一个Sdk,目前实现了以下功能:. 1:扫码登录(检测二维码扫描状态) 2:获取最近联系人.群组.所有联系人 3:修改好友备注 4:给好友发送消息 暂且这么多,也没多余的时间 ...

  8. qq面板/ 好友列表

    效果如下:依次为图一---图二----图三----图四 主要实现效果: 点击主标题显示下拉好友,再点击收起下拉好友:鼠标移到好友上背景颜色改变:选中的好友背景颜色也要改变: 代码如下: <!DO ...

  9. iOS实现类似QQ的好友列表,自由展开折叠(在原来TableView的基础上添加一个字典,一个Button)

    //直接代码 只包含 折叠展开字典的处理搭建#import "CFViewController.h" @interface CFViewController ()<UITab ...

随机推荐

  1. 解决CentOS 5.8在虚拟机环境下如何桥接上网

    1.虚拟机的网卡配置如下图所示: 2.在CentOS 5.8的命令行界面:输入如下指令 然后准备修改里面的网关地址和自己的IP地址 3.同时查看自己的IP地址和网关 4.在第二步里面修改,网关地址应该 ...

  2. Mysql创建函数出错

    目前在项目中,执行创建mysql的函数出错, mysql 创建函数出错信息如下: Error Code: 1227. Access denied; you need (at least one of) ...

  3. U盘装系统系列二—-如何设置U盘启动

    老毛桃U盘启动制作好之后,如何设置U盘启动呢?我的是华硕的电脑,开机后按F2进入BIOS设置(不同主板可能不一样,比如有的是按向下键或者Del键,可以在网上查下看看),按Tab键选中Boot:按向下键 ...

  4. Spring学习笔记--依赖注入

    依赖注入和控制反转:http://baitai.iteye.com/blog/792980出自李刚<轻量级 Java EE 企业应用实战> Java应用是一种典型的依赖型应用,它就是由一些 ...

  5. Microsoft.Practices.Unity 给不同的对象注入不同的Logger

    场景:我们做项目的时候常常会引用第三方日志框架来帮助我们记录日志,日志组件的用途主要是审计.跟踪.和调试.就说我最常用的日志组件log4net吧,这个在.NET同行当中应该算是用得非常多的一个日志组件 ...

  6. absolute vs fixed

    <!DOCTYPE html> <html> <head> <title>absolute和fixed的区别</title> <sty ...

  7. Codeforces 596D Wilbur and Trees

    http://codeforces.com/contest/596/problem/D 题目大意: 有n棵树排成一排,高度都为h. 主人公要去砍树,每次等概率地随机选择没倒的树中最左边的树或者最右边的 ...

  8. 开始使用Logstash

    开始使用Logstash 本节将指导处理安装Logstash 和确认一切是运行正常的, 后来的章节处理增加负载的配置来处理选择的使用案例. 这个章节包含下面的主题: Installing Logsta ...

  9. 【转】Win7、Ubuntu双系统正确卸载Ubuntu系统--不错

    原文网址:http://my.oschina.net/u/1377657/blog/281872 如果ubuntu不是以wubi方式安装的,而是U盘或者光盘装的双系统,那么卸载ubuntu时要慎重,不 ...

  10. Windows下编译eXosip、osip,以及UAC和UAS的例子

    今天开始了SIP开源库的学习,我选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,最后终于编译成功! ...