package com.wyp.materialqqlite.qqclient.protocol;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.cookie.Cookie;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONObject;
import com.wyp.materialqqlite.AppData;
import com.wyp.materialqqlite.JsEngine;
import com.wyp.materialqqlite.Utils;
import com.wyp.materialqqlite.qqclient.QQHttpClient;
import com.wyp.materialqqlite.qqclient.protocol.protocoldata.*;
public class QQProtocol {
public final static String WEBQQ_APP_ID = "1003903";
public final static String WEBQQ_CLIENT_ID = "97518388";
// 获取登录信令
public static String getLoginSig(QQHttpClient httpClient, String strAppId) {
try {
String url = "https://ui.ptlogin2.qq.com/cgi-bin/login?";
url += "daid=164&target=self&style=5&mibao_css=m_webqq&";
url += "appid=" + strAppId + "&";
url += "enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&";
url += "f_url=loginerroralert&strong_login=1&login_state=10&t=20140612002";
System.out.println(url);
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return "";
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://web2.qq.com/webqq.html");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return "";
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
if (bytRespData == null || bytRespData.length <= 0)
return "";
String strData = new String(bytRespData, "UTF-8");
System.out.println(strData);
return Utils.GetBetweenString(strData, "var g_login_sig=encodeURIComponent(\"", "\"");
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
// 检查是否需要输入验证码
public static boolean checkVerifyCode(QQHttpClient httpClient,
String strQQNum, String strAppId, VerifyCodeInfo result) {
try {
String url = "https://ssl.ptlogin2.qq.com/check?";
url += "pt_tea=1&";
url += "uin=" + strQQNum + "&";
url += "appid=" + strAppId + "&";
url += "js_ver=10114&js_type=0&";
url += "login_sig=" + result.m_strLoginSig + "&";
url += "u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.1790402590123438";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20140612002");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
List<Cookie> cookies = httpClient.getCookies();
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData, cookies);
// CookieStore httpCookies = (CookieStore)m_httpContext.getAttribute(ClientContext.COOKIE_STORE);
// List<Cookie> respCookieList = httpCookies.getCookies();
// for(Cookie ck : respCookieList)
// {
// System.out.println(ck);
// }
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取验证码图片
public static byte[] getVerifyCodePic(QQHttpClient httpClient,
String strAppId, String strQQNum, VerifyCodeInfo vcodeInfo) {
try {
String url = "https://ssl.captcha.qq.com/getimage?";
url += "aid=" + strAppId + "&";
url += "r=0.43951176664325314" + "&";
url += "uin=" + strQQNum;
// url += "r=" + Math.random();
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return null;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader(
"Referer",
"https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20130723001");
httpClient.addHeader("Accept-Language", "zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return null;
}
List<Cookie> cookies = httpClient.getCookies();
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
for(Cookie cookie : cookies)
{
System.out.println(cookie);
if (cookie.getName().equals("verifysession"))
vcodeInfo.m_strVerifySession = cookie.getValue();
}
return bytRespData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static boolean login1(QQHttpClient httpClient,
int nQQUin, String strQQPwd, String strVerifyCode,
String strLoginSig, String strVerifySession, String strPtUin,
String strAppId, LoginResult_1 result) {
try {
String strPwdHash = calcPwdHash(strPtUin, strQQPwd, strVerifyCode);
String url = "https://ssl.ptlogin2.qq.com/login?";
url += "u=" + Utils.getUInt(nQQUin) + "&";
url += "p=" + strPwdHash + "&";
url += "verifycode=" + strVerifyCode + "&";
url += "webqq_type=10&remember_uin=1&login2qq=1&";
url += "aid=" + strAppId + "&";
url += "u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&";
url += "h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&";
url += "action=2-7-7688&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10114&";
url += "login_sig=" + strLoginSig + "&";
url += "pt_uistyle=5&pt_randsalt=0&pt_vcode_v1=0&";
url += "pt_verifysession_v1=" + strVerifySession;
System.out.println(url);
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20130723001");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
List<Cookie> cookies = httpClient.getCookies();
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
if (!result.parse(bytRespData, cookies))
return false;
if (result.m_nRetCode == 0) {
bRet = httpClient.openRequest(result.m_strCheckSigUrl, QQHttpClient.REQ_METHOD_GET);
if (!bRet)
return false;
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20130723001");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
nRespCode = httpClient.getRespCode();
httpClient.closeRequest();
if (nRespCode != 200)
return false;
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static boolean login2(QQHttpClient httpClient, int nQQStatus,
String strPtWebQq, String strClientId, LoginResult_2 result) {
try {
String url = "http://d.web2.qq.com/channel/login2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2&id=3");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("status", QQStatus.convertToQQStatusStr(nQQStatus));
json.put("ptwebqq", strPtWebQq);
json.put("passwd_sig", "");
json.put("clientid", strClientId);
json.put("psessionid", JSONObject.NULL);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
NameValuePair pair2 = new BasicNameValuePair("clientid", strClientId);
NameValuePair pair3 = new BasicNameValuePair("psessionid", "null");
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
list.add(pair2);
list.add(pair3);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
if (!result.parse(bytRespData))
return false;
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 注销
public static boolean logout(QQHttpClient httpClient,
String strClientId, String strPSessionId, LogoutResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://d.web2.qq.com/channel/logout2?";
url += "ids=12916&";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId + "&";
url += "t=" + String.valueOf(t);
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 获取好友列表
public static boolean getBuddyList(QQHttpClient httpClient,
int nQQUin, String strPtWebQq, String strVfWebQq, BuddyListResult result) {
try {
String url = "http://s.web2.qq.com/api/get_user_friends2";
String strHash = calcBuddyListHash(nQQUin, strPtWebQq);
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=3");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("h", "hello");
json.put("hash", strHash);
json.put("vfwebqq", strVfWebQq);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 获取在线好友列表
public static boolean getOnlineBuddyList(QQHttpClient httpClient,
String strClientId, String strPSessionId, OnlineBuddyListResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://d.web2.qq.com/channel/get_online_buddies2?";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId + "&";
url += "t=" + String.valueOf(t);
boolean bRet = httpClient.openRequest(url,
QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer",
"http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language", "zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 获取群列表
public static boolean getGroupList(QQHttpClient httpClient,
int nQQUin, String strPtWebQq, String strVfWebQq, GroupListResult result) {
try {
String url = "http://s.web2.qq.com/api/get_group_name_list_mask2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
String strHash = calcBuddyListHash(nQQUin, strPtWebQq);
JSONObject json = new JSONObject();
json.put("vfwebqq", strVfWebQq);
json.put("hash", strHash);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 获取最近联系人列表
public static boolean getRecentList(QQHttpClient httpClient,
String strVfWebQq, String strClientId,
String strPSessionId, RecentListResult result) {
try {
String url = "http://d.web2.qq.com/channel/get_recent_list2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("vfwebqq", strVfWebQq);
json.put("clientid", strClientId);
json.put("psessionid", strPSessionId);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
NameValuePair pair2 = new BasicNameValuePair("clientid", strClientId);
NameValuePair pair3 = new BasicNameValuePair("psessionid", strPSessionId);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
list.add(pair2);
list.add(pair3);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 轮询消息
public static byte[] poll(QQHttpClient httpClient,
String strClientId, String strPSessionId) {
try {
String url = "http://d.web2.qq.com/channel/poll2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return null;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
JSONArray json2 = new JSONArray();
json.put("clientid", strClientId);
json.put("psessionid", strPSessionId);
json.put("key", 0);
json.put("ids", json2);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
NameValuePair pair2 = new BasicNameValuePair("clientid", strClientId);
NameValuePair pair3 = new BasicNameValuePair("psessionid", strPSessionId);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
list.add(pair2);
list.add(pair3);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return null;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return bytRespData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 获取好友信息
public static boolean getBuddyInfo(QQHttpClient httpClient,
int nQQUin, String strVfWebQq, BuddyInfoResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://s.web2.qq.com/api/get_friend_info2?";
url += "tuin=" + Utils.getUInt(nQQUin) + "&";
url += "verifysession=&code=&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取陌生人信息
public static boolean getStrangerInfo(QQHttpClient httpClient,
int nQQUin, String strVfWebQq, BuddyInfoResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://s.web2.qq.com/api/get_stranger_info2?";
url += "tuin=" + Utils.getUInt(nQQUin) + "&";
url += "verifysession=&gid=0&code=&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取群信息
public static boolean getGroupInfo(QQHttpClient httpClient,
int nGroupCode, String strVfWebQq, GroupInfoResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://s.web2.qq.com/api/get_group_info_ext2?";
url += "gcode=" + Utils.getUInt(nGroupCode) + "&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取好友、群成员或群号码
public static boolean getQQNum(QQHttpClient httpClient, boolean bIsBuddy,
int nQQUin, String strVfWebQq, GetQQNumResult result) {
try {
int nType = bIsBuddy ? 1 : 4;
long t = System.currentTimeMillis() / 1000;
String url = "http://s.web2.qq.com/api/get_friend_uin2?";
url += "tuin=" + Utils.getUInt(nQQUin) + "&";
url += "verifysession=&";
url += "type=" + nType + "&";
url += "code=&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取QQ个性签名
public static boolean getQQSign(QQHttpClient httpClient,
int nQQUin, String strVfWebQq, GetSignResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://s.web2.qq.com/api/get_single_long_nick2?";
url += "tuin=" + Utils.getUInt(nQQUin) + "&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 设置QQ个性签名
public static boolean setQQSign(QQHttpClient httpClient,
String strSign, String strVfWebQq, SetSignResult result) {
try {
String url = "http://s.web2.qq.com/api/set_long_nick2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("nlk", Utils.unicodeToHexStr(strSign, false));
json.put("vfwebqq", strVfWebQq);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
if (!result.parse(bytRespData))
return false;
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 发送好友消息
public static boolean sendBuddyMsg(QQHttpClient httpClient,
BuddyMessage buddyMsg, String strClientId,
String strPSessionId, SendBuddyMsgResult result) {
try {
if (null == httpClient || null == buddyMsg || null == result
|| Utils.isEmptyStr(strClientId) || Utils.isEmptyStr(strPSessionId))
return false;
String strContent = "[";
for (int i = 0; i < buddyMsg.m_arrContent.size(); i++)
{
Content content = buddyMsg.m_arrContent.get(i);
if (null == content)
continue;
if (content.m_nType == ContentType.CONTENT_TYPE_TEXT)
{
strContent += "\"";
strContent += Utils.unicodeToHexStr(content.m_strText, false);
strContent += "\",";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_FONT_INFO)
{
String strFontName = Utils.unicodeToHexStr(content.m_FontInfo.m_strName, true);
String strColor = Utils.RGBToHexStr(content.m_FontInfo.m_clrText);
strContent += "[\"font\",{\"name\":\"";
strContent += strFontName;
strContent += "\",\"size\":\"";
strContent += content.m_FontInfo.m_nSize;
strContent += "\",\"style\":[";
strContent += (content.m_FontInfo.m_bBold ? 1 : 0);
strContent += ",";
strContent += (content.m_FontInfo.m_bItalic ? 1 : 0);
strContent += ",";
strContent += (content.m_FontInfo.m_bUnderLine ? 1 : 0);
strContent += "],\"color\":\"";
strContent += strColor;
strContent += "\"}],";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_FACE)
{
strContent += "[\"face\",";
strContent += content.m_nFaceId;
strContent += "],";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_CUSTOM_FACE)
{
strContent += "[\"cface\",\"";
strContent += content.m_CFaceInfo.m_strRemoteFileName;
strContent += "\"],";
}
}
char c = strContent.charAt(strContent.length()-1);
if (c == ',') {
strContent = strContent.substring(0, strContent.length()-1);
}
strContent += "]";
String url = "http://d.web2.qq.com/channel/send_buddy_msg2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("to", Utils.getUInt(buddyMsg.m_nToUin));
json.put("face", 0);
json.put("content", strContent);
json.put("msg_id", Utils.getUInt(buddyMsg.m_nMsgId));
json.put("clientid", strClientId);
json.put("psessionid", strPSessionId);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
NameValuePair pair2 = new BasicNameValuePair("clientid", strClientId);
NameValuePair pair3 = new BasicNameValuePair("psessionid", strPSessionId);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
list.add(pair2);
list.add(pair3);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 发送群消息
public static boolean sendGroupMsg(QQHttpClient httpClient,
GroupMessage groupMsg, String strClientId, String strPSessionId,
String strGFaceKey, String strGFaceSig, SendGroupMsgResult result) {
try {
if (null == httpClient || null == groupMsg || null == result
|| Utils.isEmptyStr(strClientId) || Utils.isEmptyStr(strPSessionId))
return false;
boolean bHasCustomFace = false;
String strContent = "[";
for (int i = 0; i < groupMsg.m_arrContent.size(); i++)
{
Content content = groupMsg.m_arrContent.get(i);
if (null == content)
continue;
if (content.m_nType == ContentType.CONTENT_TYPE_TEXT)
{
strContent += "\"";
strContent += Utils.unicodeToHexStr(content.m_strText, false);
strContent += "\",";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_FONT_INFO)
{
String strFontName = Utils.unicodeToHexStr(content.m_FontInfo.m_strName, true);
String strColor = Utils.RGBToHexStr(content.m_FontInfo.m_clrText);
strContent += "[\"font\",{\"name\":\"";
strContent += strFontName;
strContent += "\",\"size\":\"";
strContent += content.m_FontInfo.m_nSize;
strContent += "\",\"style\":[";
strContent += (content.m_FontInfo.m_bBold ? 1 : 0);
strContent += ",";
strContent += (content.m_FontInfo.m_bItalic ? 1 : 0);
strContent += ",";
strContent += (content.m_FontInfo.m_bUnderLine ? 1 : 0);
strContent += "],\"color\":\"";
strContent += strColor;
strContent += "\"}],";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_FACE)
{
strContent += "[\"face\",";
strContent += content.m_nFaceId;
strContent += "],";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_CUSTOM_FACE)
{
bHasCustomFace = true;
strContent += "[\"cface\",\"group\",\"";
strContent += content.m_CFaceInfo.m_strRemoteFileName;
strContent += "\"],";
}
}
char c = strContent.charAt(strContent.length()-1);
if (c == ',') {
strContent = strContent.substring(0, strContent.length()-1);
}
strContent += "]";
String url = "http://d.web2.qq.com/channel/send_qun_msg2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("group_uin", Utils.getUInt(groupMsg.m_nToUin));
if (bHasCustomFace) {
json.put("group_code", Utils.getUInt(groupMsg.m_nGroupCode));
json.put("key", strGFaceKey);
json.put("sig", strGFaceSig);
}
json.put("content", strContent);
json.put("msg_id", Utils.getUInt(groupMsg.m_nMsgId));
json.put("clientid", strClientId);
json.put("psessionid", strPSessionId);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
NameValuePair pair2 = new BasicNameValuePair("clientid", strClientId);
NameValuePair pair3 = new BasicNameValuePair("psessionid", strPSessionId);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
list.add(pair2);
list.add(pair3);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 发送临时会话消息
public static boolean sendSessMsg(QQHttpClient httpClient,
SessMessage sessMsg, String strGroupSig, String strClientId,
String strPSessionId, SendSessMsgResult result) {
try {
if (null == httpClient || null == sessMsg || null == result
|| Utils.isEmptyStr(strClientId) || Utils.isEmptyStr(strPSessionId))
return false;
String strContent = "[";
for (int i = 0; i < sessMsg.m_arrContent.size(); i++)
{
Content content = sessMsg.m_arrContent.get(i);
if (null == content)
continue;
if (content.m_nType == ContentType.CONTENT_TYPE_TEXT)
{
strContent += "\"";
strContent += Utils.unicodeToHexStr(content.m_strText, false);
strContent += "\",";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_FONT_INFO)
{
String strFontName = Utils.unicodeToHexStr(content.m_FontInfo.m_strName, true);
String strColor = Utils.RGBToHexStr(content.m_FontInfo.m_clrText);
strContent += "[\"font\",{\"name\":\"";
strContent += strFontName;
strContent += "\",\"size\":\"";
strContent += content.m_FontInfo.m_nSize;
strContent += "\",\"style\":[";
strContent += (content.m_FontInfo.m_bBold ? 1 : 0);
strContent += ",";
strContent += (content.m_FontInfo.m_bItalic ? 1 : 0);
strContent += ",";
strContent += (content.m_FontInfo.m_bUnderLine ? 1 : 0);
strContent += "],\"color\":\"";
strContent += strColor;
strContent += "\"}],";
}
else if (content.m_nType == ContentType.CONTENT_TYPE_FACE)
{
strContent += "[\"face\",";
strContent += content.m_nFaceId;
strContent += "],";
}
}
char c = strContent.charAt(strContent.length()-1);
if (c == ',') {
strContent = strContent.substring(0, strContent.length()-1);
}
strContent += "]";
String url = "http://d.web2.qq.com/channel/send_sess_msg2";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Content-Type","application/x-www-form-urlencoded");
JSONObject json = new JSONObject();
json.put("to", Utils.getUInt(sessMsg.m_nToUin));
json.put("group_sig", strGroupSig);
json.put("face", 0);
json.put("content", strContent);
json.put("msg_id", Utils.getUInt(sessMsg.m_nMsgId));
json.put("service_type", 0);
json.put("clientid", strClientId);
json.put("psessionid", strPSessionId);
NameValuePair pair1 = new BasicNameValuePair("r", json.toString());
NameValuePair pair2 = new BasicNameValuePair("clientid", strClientId);
NameValuePair pair3 = new BasicNameValuePair("psessionid", strPSessionId);
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(pair1);
list.add(pair2);
list.add(pair3);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpClient.setEntity(entity);
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 获取头像图片
public static byte[] getHeadPic(QQHttpClient httpClient,
boolean bIsBuddy, int nQQUin, String strVfWebQq) {
try {
java.util.Random random = new java.util.Random();
int r = random.nextInt(10);
int nType = bIsBuddy ? 11 : 14;
long t = System.currentTimeMillis() / 1000;
String url = "http://face" + r + ".web.qq.com/cgi/svr/face/getface?";
url += "cache=0&";
url += "type=" + nType + "&";
url += "fid=0&";
url += "uin=" + Utils.getUInt(nQQUin) + "&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return null;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://web2.qq.com/webqq.html");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (!(nRespCode >= 200 && nRespCode < 300)) {
httpClient.closeRequest();
return null;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return bytRespData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 获取好友聊天图片
public static byte[] getBuddyChatPic(QQHttpClient httpClient,
int nMsgId, String strFileName, int nQQUin,
String strClientId, String strPSessionId) {
try {
String url = "http://d.web2.qq.com/channel/get_cface2?";
url += "lcid=" + Utils.getUInt(nMsgId) + "&";
url += "guid=" + strFileName + "&";
url += "to=" + Utils.getUInt(nQQUin) + "&";
url += "count=5&time=1&";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return null;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://web.qq.com/?ADTAG=DESKTOP");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (!(nRespCode >= 200 && nRespCode < 300)) {
httpClient.closeRequest();
return null;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return bytRespData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 获取好友离线聊天图片
public static byte[] getBuddyOffChatPic(QQHttpClient httpClient,
String strFileName, int nQQUin, String strClientId, String strPSessionId) {
try {
String url = "http://d.web2.qq.com/channel/get_offpic2?";
url += "file_path=" + strFileName + "&";
url += "f_uin=" + Utils.getUInt(nQQUin) + "&";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return null;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://web.qq.com/?ADTAG=DESKTOP");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Accept-Encoding","gzip, deflate");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (!(nRespCode >= 200 && nRespCode < 300)) {
httpClient.closeRequest();
return null;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return bytRespData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 获取群聊天图片
public static byte[] getGroupChatPic(QQHttpClient httpClient,
int nGroupId, int nQQUin, String strServer,
int nPort, int nFileId, String strFileName, String strVfWebQq) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://web.qq.com/cgi-bin/get_group_pic?";
url += "type=0&";
url += "gid=" + Utils.getUInt(nGroupId) + "&";
url += "uin=" + Utils.getUInt(nQQUin) + "&";
url += "rip=" + strServer + "&";
url += "rport=" + nPort + "&";
url += "fid=" + Utils.getUInt(nFileId) + "&";
url += "pic=" + URLEncoder.encode(strFileName, "UTF-8") + "&";
url += "vfwebqq=" + strVfWebQq + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return null;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://web.qq.com/?ADTAG=DESKTOP");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Accept-Encoding","gzip, deflate");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (!(nRespCode >= 200 && nRespCode < 300)) {
httpClient.closeRequest();
return null;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return bytRespData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 改变状态
public static boolean changeStatus(QQHttpClient httpClient,
int nStatus, String strClientId,
String strPSessionId, ChangeStatusResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://d.web2.qq.com/channel/change_status2?";
url += "newstatus=" + QQStatus.convertToQQStatusStr(nStatus) + "&";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取临时会话信令
public static boolean getC2CMsgSignal(QQHttpClient httpClient,
int nGroupId, int nToUin, String strClientId,
String strPSessionId, GetC2CMsgSigResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://d.web2.qq.com/channel/get_c2cmsg_sig2?";
url += "id=" + Utils.getUInt(nGroupId) + "&";
url += "to_uin=" + Utils.getUInt(nToUin) + "&";
url += "service_type=0&";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 获取群表情信令
public static boolean getGroupFaceSignal(QQHttpClient httpClient,
String strClientId, String strPSessionId, GetGroupFaceSigResult result) {
try {
long t = System.currentTimeMillis() / 1000;
String url = "http://d.web2.qq.com/channel/get_gface_sig2?";
url += "clientid=" + strClientId + "&";
url += "psessionid=" + strPSessionId + "&";
url += "t=" + t;
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_GET);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "*/*");
httpClient.addHeader("Referer", "http://d.web2.qq.com/proxy.html?v=20110331002&callback=2");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
return result.parse(bytRespData);
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
// 上传自定义表情
public static boolean uploadCustomFace(QQHttpClient httpClient,
String strFileName, String strVfWebQq, UploadCustomFaceResult result) {
try {
String url = "http://up.web2.qq.com/cgi-bin/cface_upload";
boolean bRet = httpClient.openRequest(url, QQHttpClient.REQ_METHOD_POST);
if (!bRet) {
return false;
}
httpClient.addHeader("Accept", "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*");
httpClient.addHeader("Referer", "http://web2.qq.com/webqq.html");
httpClient.addHeader("Accept-Language","zh-cn");
httpClient.addHeader("Accept-Encoding","gzip, deflate");
httpClient.addHeader("Connection","keep-alive");
httpClient.addHeader("Cache-Control","no-cache");
//String strMimeType = GetMimeTypeByExtension(strFileName);
File file = new File(strFileName);
MultipartEntity mpEntity = new MultipartEntity();
ContentBody cbFile = new FileBody(file);
mpEntity.addPart("custom_face", cbFile);
ContentBody cbFile2 = new StringBody("EQQ.View.ChatBox.uploadCustomFaceCallback", Charset.forName(HTTP.UTF_8));
mpEntity.addPart("f", cbFile2);
ContentBody cbFile3 = new StringBody(strVfWebQq, Charset.forName(HTTP.UTF_8));
mpEntity.addPart("vfwebqq", cbFile3);
httpClient.setEntity(mpEntity);
//System.out.println("executing request " + );
httpClient.sendRequest();
int nRespCode = httpClient.getRespCode();
if (nRespCode != 200) {
httpClient.closeRequest();
return false;
}
byte[] bytRespData = httpClient.getRespBodyData();
httpClient.closeRequest();
if (!result.parse(bytRespData))
return false;
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
// 计算第一次登录的密码hash参数
private static String calcPwdHash(String strPtUin, String strQQPwd, String strVerifyCode) {
try {
JsEngine jsEngine = AppData.getAppData().getJsEngine();
if (jsEngine != null) {
String strUrl = "file:///android_asset/PwdHash.html";
String strFuncName = "calcPwdHash";
String strArg = "'" + strPtUin + "',";
strArg += "'" + strQQPwd + "',";
strArg += "'" + strVerifyCode + "'";
jsEngine.sendMsg_RunJs(strUrl, strFuncName, strArg);
String strPwdHash = "";
while (Utils.isEmptyStr(strPwdHash)) {
Thread.sleep(100);
strPwdHash = jsEngine.getJsResult();
}
return strPwdHash;
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
private static String toHexStr(byte[] bytData) {
byte[] bytHexTable = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
byte[] bytHex = new byte[bytData.length*2];
int i = 0;
for (int j = 0; j < bytData.length; j++) {
byte a = bytData[j];
bytHex[i++] = bytHexTable[(a & 0xf0) >> 4];
bytHex[i++] = bytHexTable[(a & 0x0f)];
}
try {
return new String(bytHex, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 计算获取好友列表的hash参数
private static String calcBuddyListHash(int nQQUin, String strPtWebQq) {
try {
JsEngine jsEngine = AppData.getAppData().getJsEngine();
if (jsEngine != null) {
String strUrl = "file:///android_asset/Hash.html";
String strFuncName = "hash";
String strArg = "'" + Utils.getUInt(nQQUin) + "',";
strArg += "'" + strPtWebQq + "'";
jsEngine.sendMsg_RunJs(strUrl, strFuncName, strArg);
String strHash = "";
while (Utils.isEmptyStr(strHash)) {
Thread.sleep(100);
strHash = jsEngine.getJsResult();
}
return strHash;
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}