qq联系人按不起,还有另外一种方法同意个人的微信被邀请进群需同意么

项目中有个需求,要求能够导入MSN及QQ联系人。MSN的好说,有开源的jmsn及其它众多开源组件。可是QQ仍然是我行我素,至今也不开放API。虽然网上查到有lumaqq这样的开源
协议,可我Down下了折腾了半天,QQ都没有登录上去,好啦,我承认自己资质愚钝。时间紧迫,来不及仔细研究了,于是打起了QQ邮箱的主意~~
既然通过浏览器可以登录QQ邮箱,查看联系人,那么我们同样可以用程序模拟浏览器登录获取联系人。嗯,听起来不错,试试吧。
登录请求:
POST /cgi-bin/login?sid=0,2,zh_CN HTTP/1.1
Host: m126. 
User-Agent: Mozilla/5.0 (W U; Windows NT 6.0; zh-CN; rv:1.9.0.13) Gecko/ Firefox/3.0.13 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8 
Accept-Language: zh-cn,q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: /cgi-bin/loginpage 
Cookie: verifysession=c6c09b326c4dac79b727c7e6ebfe9ae6eaf7cc57bddeacf1b617a15a912; pvid=; flv=10.0 r22; };
Content-Type: application/x-www-form-urlencoded 
Content-Length: 371
sid=0%2C2%2Czh_CN&firstlogin=false&starttime=5&redirecturl=&f=html&p=UyoLX7JYspcnU9wCUK7qBA2Xjwo%2FO52FldnJnRABCnNLXI1ndwR8%2BQaepkT% 
2FIcKHxMshWv4SjrxgvRtA%2B1eHAookTXzcia%2FhP5QrRlGyNoqzVCi1X%2FsJwb4SmjPZRwV%2B7WeskUwClUfeNv%2BmCq0ygoNzi9UnIVeI7lYzgqXnxZE% 
3D&delegate_url=&s=&ts=&from=&uin=XXXXXXXX&aliastype=%&pp=&verifycode=qmpb 
HTTP/1.1 200 OK 
Connection: close 
Date: Fri, 28 Aug :18 GMT 
Content-Type: text/ charset=gbk 
Set-Cookie:tinfo=.0550; Domain=; Path=/
Set-Cookie:wimrefreshrun=; Domain=; Path=/
Set-Cookie:autologin=EXPIRED; Domain=; Path=/; Expires=Fri, 28-Aug-:18 GMT 
Set-Cookie:sid=; Domain=; Path=/; Expires=Wed, 31-Dec-:59 GMT 
Set-Cookie:sid=adc402ac5c80e08bec3ca6c; Domain=; Path=/
Set-Cookie:username=; Domain=; Path=/; Expires=Wed, 31-Dec-:59 GMT 
Set-Cookie:username=XXXXXXXX; Domain=; Path=/
Set-Cookie:qqmail_alias=; Domain=; Path=/
Set-Cookie:qqmail_sid=adc402ac5c80e08bec3ca6c; ; Path=/
Set-Cookie:qqmail_username=XXXXXXXX; ; Path=/
Set-Cookie:qqmail_domain=http://m126.; ; Path=/
Set-Cookie:qqmail_key=1_de7d6175bf2aab152fb; ; Path=/
Set-Cookie:CCSHOW=0000; Domain=; Path=/; Expires=Sun, 28-Oct-:58 GMT 
Set-Cookie:noteorg=; Domain=; Path=/; Expires=Sun, 28-Oct-:58 GMT 
Set-Cookie:foxacc=0; Domain=; Path=/; Expires=Sun, 28-Oct-:58 GMT 
Set-Cookie:edition=4m126.; Domain=; Path=/; Expires=Sun, 28-Oct-:58 GMT 
Content-Encoding: gzip
Content-Length: 356 
通过分析QQ邮箱登录页,发现除了QQ号码和密码之外,还有几个隐藏字段。
firstlogin 常量
starttime 
redirecturl 常量
delegate_url 常量
verifycode
大部分都不清楚什么用途,且都是固定的。
有用的就是 starttime(js生成的当前时间戳)、p(QQ号码和密码混合加密后生成的字符串)、ts(某种算法生成的时间戳,来自服务器)、uin(QQ号码)、aliastype(邮箱域
,通常是 @qq.com)、pp(密码掩码)、verifycode(验证码)
还有几个Cookie:
verifysession(获取验证码时服务器种下的)
pvid、flv、r_cookie(看起来像是跟踪用的)
OK,我们把这些参数及Cookie发送给服务器,就可以登录了。
再做一些加工,一个导入QQ联系人的组件就诞生了,不过这些代码却脆弱无比,只要qq邮箱一更新,那怕少一个空格,我这几个小时的代码就变成垃圾了。所以,如果想用到正
式的项目上,你就要时刻准备更新你的程序~~
ie7 firefox 下测试通过,google浏览器下总说验证码错误。
不多说了,上代码
-----------------QQContactsService.java------------------------------------------------
import java.io.IOE
import java.util.ArrayL
import java.util.L
import java.util.M
import mons.httpclient.C
import mons.httpclient.HttpC
import mons.httpclient.NameValueP
import mons.httpclient.cookie.CookieP
import mons.httpclient.methods.GetM
import mons.httpclient.methods.PostM
public class QQContactsService {
 private static QQContactsService qcs = new QQContactsService();
 public static QQContactsService getInstance(){
 return 
 public static final RuntimeException QQ_EEROR = new RuntimeException( "qq server error");
 public static final RuntimeException QQ_WRONG_PWD = new RuntimeException("qq wrong password");
 public static final RuntimeException QQ_WRONG_VERIFY = new RuntimeException("qq wrong verify");
 public static final RuntimeException QQ_MANY_LOGIN_TIMES = new RuntimeException("qq too many login times");
 public RSAInfo getRSAInfo() {
 String loginPage = "/cgi-bin/loginpage";
 HttpClient httpClient = newHttpClient();
 GetMethod getLoginPage = new GetMethod(loginPage);
  int code = httpClient.executeMethod(getLoginPage);
 if (code != 200) throw QQ_EEROR;
 String body = getLoginPage.getResponseBodyAsString();
 String publicKey = QQUtil.paser(body,QQUtil.publicKeyPattern);
  String ts = QQUtil.paser(body,QQUtil.tsPattern);
  String domain = QQUtil.paser(body,QQUtil.domainPattern);
 if (publicKey == null || ts == null || domain == null) throw QQ_EEROR;
 return new RSAInfo(publicKey, ts, domain);
 } catch (IOException e) {
  e.printStackTrace();
  throw QQ_EEROR;
 public VerifyCode getVerifyCode() {
 HttpClient httpClient = newHttpClient();
 GetMethod getVerifyPage = new GetMethod(getVerifyUrl());
  int code = httpClient.executeMethod(getVerifyPage);
 if (code != 200) throw QQ_EEROR;
  System.out.println("code:"+code);
  byte[] data = getVerifyPage.getResponseBody();
  Cookie[] cookies = httpClient.getState().getCookies();
  Cookie verifySession = pickUpVerifySessionCookie(cookies);
  System.out.println("verifySession:"+verifySession+",data:"+data);
  if (data == null || verifySession == null) throw QQ_EEROR;
 return new VerifyCode(verifySession, data);
 } catch (IOException e) {
  e.printStackTrace();
  throw QQ_EEROR;
 public List getQQContacts(AuthInfo authInfo) {
 login(authInfo);
 String contactsHtml = getQQContactsPage(authInfo);
 return QQUtil.parserQQContects(contactsHtml);
 private String getQQContactsPage(AuthInfo authInfo) {
 //http://m154./cgi-bin/addr_listall?sid=iaVXkE2ACz61dmYs&category=qq 
 String domain = authInfo.getParam(AuthInfo.DOMAIN);
 String sid = authInfo.getParam("sid");
 String contactUrl = domain+"/cgi-bin/addr_listall?sid="+sid+"&category=qq";
 GetMethod getAllContect = new GetMethod(contactUrl);
 getAllContect.setRequestHeader("Cookie", authInfo.getParam(AuthInfo.COOKIE));
 getAllContect.setRequestHeader("User-Agent", "Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; GTB5; InfoPath.2; CIBA)");
 HttpClient httpClient = newHttpClient();
  httpClient.executeMethod(getAllContect);
  String body = new String(getAllContect.getResponseBody(),"gbk");
  return 
 } catch (IOException e) {
  e.printStackTrace();
  throw QQ_EEROR;
 private void login(AuthInfo authInfo){
 fillPvidAndRCookie(authInfo);
 String domain = authInfo.getParam(AuthInfo.DOMAIN);
 PostMethod postMethod = new PostMethod(domain+"/cgi-bin/login?sid=0,2,zh_CN");
 postMethod.setRequestBody(toNameValuePer(authInfo));
 postMethod.setRequestHeader("Cookie", authInfo.getParam(AuthInfo.COOKIE));
 postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 postMethod.setRequestHeader("Referer", "/cgi-bin/loginpage");
 postMethod.setRequestHeader("User-Agent", "Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; GTB5; InfoPath.2; CIBA)");
 HttpClient httpClient = newHttpClient();
  int status = httpClient.executeMethod(postMethod);
  if(status != 200 ) throw QQ_EEROR;
  String body = postMethod.getResponseBodyAsString();
  System.out.println("body:"+body);
 String sid = QQUtil.paser(body, QQUtil.sidPattern);
  if(sid == null){
  String errType = QQUtil.paser(body, QQUtil.errTypePattern);
  if("1".equals(errType)) throw QQ_WRONG_PWD;
  if("2".equals(errType)) throw QQ_WRONG_VERIFY;
  if("17".equals(errType)) throw QQ_MANY_LOGIN_TIMES;
  throw QQ_EEROR;
  System.out.println("sid:"+sid);
  Cookie[] cookies = httpClient.getState().getCookies();
  addCookie(authInfo,cookies);
  authInfo.putParam("sid", sid);
  System.out.println("set sid:"+authInfo.getParam("sid"));
 }catch (IOException e) {
  e.printStackTrace();
  throw QQ_EEROR;
 private NameValuePair[] toNameValuePer(AuthInfo authInfo) {
 List nvp = new ArrayList();
 Map params = authInfo.getParam();
 for (Map.Entry entry : params.entrySet()) {
  if(!entry.getKey().equals(AuthInfo.COOKIE) && !entry.getKey().equals(AuthInfo.DOMAIN)){
  nvp.add(new NameValuePair(entry.getKey(),entry.getValue()));
 return nvp.toArray(new NameValuePair[nvp.size()]);
 private HttpClient newHttpClient() {
 HttpClient c = new HttpClient();
 c.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
 return c;
 private String getVerifyUrl() {
 return "/getimage?aid=&" + Math.random();
 private Cookie pickUpVerifySessionCookie(Cookie[] cookies) {
 for (Cookie c : cookies) {
  System.out.println("cookie:"+c.getName());
  if ("verifysession".equalsIgnoreCase(c.getName())) {
  return c;
 return 
 private void fillPvidAndRCookie(AuthInfo authInfo) {
 String cookie = authInfo.getParam(AuthInfo.COOKIE);
 cookie+=newPvid();
 cookie+=newRCookie();
 authInfo.putParam(AuthInfo.COOKIE, cookie);
 private String newPvid() {
 long pvidtmp = (Math.round(Math.random() * ) * 199) % L;
 return "pvid="+pvidtmp+";";
 private String newRCookie() {
 long r_cookie = Math.round(Math.random() * 0L);
 return "r_cookie="+r_cookie+";";
 private void addCookie(AuthInfo authInfo, Cookie[] cookies){
 String cookie = authInfo.getParam(AuthInfo.COOKIE);
 for(Cookie c : cookies){
  cookie += c.toString()+";";
 System.out.println("addCookie:"+cookie);
 authInfo.putParam(AuthInfo.COOKIE, cookie);
 public static void main(String[] args) {
 QQContactsService service = QQContactsService.getInstance();
 RSAInfo rsa = service.getRSAInfo();
 System.out.println("rsa:"+rsa.getDomain()+","+rsa.getPublicKey()+","+rsa.getTs());
 service.getVerifyCode();
---------------AuthInfo.java----------------------------
import java.util.HashM
import java.util.M
public class AuthInfo {
  public static final String PP = "pp";
  public static final String START_TIME = "starttime";
  public static final String TS = "ts";
  public static final String UIN = "uin";
  public static final String VERIFY_CODE = "verifycode";
  public static final String P = "p";
  public static final String COOKIE = "cookie";
  public static final String DOMAIN = "domain";
 private HashMap param = new HashMap();
 public AuthInfo(){
   putParam("aliastype", "@qq.com");
   putParam("firstlogin", "false");
   putParam("redirecturl", "");
   putParam("sid", "0,2,zh_CN");
   putParam("delegate_url", "");
   putParam("from", "");
   putParam("f", "");
   putParam("s", "");
  public void putParam(String key, String value){
   param.put(key, value);
 public String getParam(String key){
   return param.get(key);
 @SuppressWarnings("unchecked") 
 public Map getParam() {
 return (Map) param.clone();
-------------QQContact.java----------------
public class QQContact {
 private String 
 private String 
 private String 
 public QQContact(){}
 public QQContact(String qq, String email, String name){
 this.qq = 
 this.email = 
 this.name = 
 public String getQq() {
 return 
 public void setQq(String qq) {
 this.qq = 
 public String getEmail() {
 return 
 public void setEmail(String email) {
 this.email = 
 public String getName() {
 return 
 public void setName(String name) {
 this.name = 
----------RSAInfo.java----------------------
public class RSAInfo {
 private String publicK
 private String 
 private String 
 public RSAInfo(){}
 public RSAInfo(String publicKey, String ts, String domain){
 this.publicKey = publicK
 this.ts = 
 this.domain = 
 public String getPublicKey() {
 return publicK
 public void setPublicKey(String publicKey) {
 this.publicKey = publicK
 public String getTs() {
 return 
 public void setTs(String ts) {
 this.ts = 
 public String getDomain() {
 return 
 public void setDomain(String domain) {
 this.domain = 
-------VerifyCode.java--------------
import mons.httpclient.C
public class VerifyCode {
 private Cookie verifyS
 private byte[] //verify code image 
 public VerifyCode(){}
 public VerifyCode(Cookie verifySession, byte[] data){
 this.verifySession = verifyS
 this.data = 
 public Cookie getVerifySession() {
 return verifyS
 public void setVerifySession(Cookie verifySession) {
 this.verifySession = verifyS
 public byte[] getData() {
 return 
 public void setData(byte[] data) {
 this.data = 
---------QQUtil.java-------------------
import java.util.ArrayL
import java.util.L
import java.util.regex.M
import java.util.regex.P
public class QQUtil {
 public static Pattern sidPattern = pile("sid=(.*?)\";");
 public static Pattern contactPattern = pile("(.*?)");
 public static Pattern publicKeyPattern = pile("PublicKey = \"(.*?)\"");
 public static Pattern tsPattern = pile("PublicTs=\"(.*?)\"");
 public static Pattern domainPattern = pile("action=\"(.*?\\.qq\\.com)");
 public static Pattern errTypePattern = pile("\"errtype=(.?)\"");
 public static String paser(String body,Pattern pattern) {
 String publicKey = 
    Matcher matcher = pattern.matcher(body);
    if (matcher.find()) {
     publicKey = matcher.group(1);
    return publicK
 public static List parserQQContects(String contactsHtml) {
 List list = new ArrayList();
 Matcher allMatcher = contactPattern.matcher(contactsHtml);
 while(allMatcher.find()){
  String qq = allMatcher.group(1);
  String email = allMatcher.group(2);
  String name=allMatcher.group(3).replace("&", "");
  list.add(new QQContact(qq,email,name));
 return 
-----------action.jsp----------
  String uin = request.getParameter("uin").trim();
  String pp = request.getParameter("pp").trim();
  String p = request.getParameter("p").trim();
  String ts = request.getParameter("ts").trim();
  String starttime = request.getParameter("starttime").trim();
  String verifycode = request.getParameter("verifycode").trim();
  String domain = request.getParameter("domain").trim();
  String cookie = request.getHeader("cookie");
 System.out.println(cookie);
  QQContactsService service =QQContactsService.getInstance();
 AuthInfo auth = new AuthInfo();
  auth.putParam("uin",uin);
  auth.putParam("pp",pp);
  auth.putParam("p",p);
  auth.putParam("ts",ts);
  auth.putParam("starttime",starttime);
  auth.putParam("verifycode",verifycode);
  auth.putParam("domain",domain);
  auth.putParam("cookie",cookie);
  System.out.println(auth.getParam());
  List list = 
   list = service.getQQContacts(auth);
  }catch(Exception e){
   if(e == QQContactsService.QQ_WRONG_PWD){
   out.println("密码错误");
   }else if(e == QQContactsService.QQ_WRONG_VERIFY){
   out.println("验证码错误");
   }else if(e == QQContactsService.QQ_MANY_LOGIN_TIMES){
   out.println("登录次数太多,稍后再试");
   }else if(e == QQContactsService.QQ_EEROR){
   out.println("服务器错误,可能代码已经失效");
   }else{
   out.println("服务器错误");
   return ;
 if(list == null){
   out.println("没有取到联系人,可能代码已经失效");
   return ;
 for(QQContact c:list){
   out.println(c.getEmail()+"&"+c.getName()+"("+c.getQq()+")");
-------code.jsp----------------
  QQContactsService service = QQContactsService.getInstance();
 VerifyCode code = service.getVerifyCode();
  byte[] data = code.getData();
 Cookie c = code.getVerifySession();
  response.addCookie(new javax.servlet.http.Cookie(c.getName(),c.getValue()));
 ServletOutputStream utStream = response.getOutputStream();
  outStream.write(data);
 out.clear();
  ut = pageContext.pushBody();
-----------index.jsp-------------
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程浅谈两种方法教你如何把QQ好友导入微信?微信如何导入QQ好友?
查看: 272678| 评论: | 发布者:
简介:  (老版本微信)把QQ好友导入微信  相对于QQ,微信在好友互动、交流方面提供了更加高效的对话交流方式,因此将QQ好友变成微信好友,最有十分重要的意义。下面就来看一下如何将QQ好友添加为微信好友。   首先
  (老版本微信)把QQ好友导入微信  相对于QQ,微信在好友互动、交流方面提供了更加高效的对话交流方式,因此将QQ好友变成微信好友,最有十分重要的意义。下面就来看一下如何将QQ好友添加为微信好友。
  首先进入“程序”列表,打开手机中的微信程序,在弹出的登陆窗口中输入QQ号和密码,点击“登陆”按钮进行登陆。在登陆完成后,点击主界面中的“设置”按钮,进入设置界面。在“设置”界面中找到“插件”选项并点击进入。
  在“插件”窗口中找到“查看QQ好友”,点击并进入。然后程序会自动下载并安装相应原插件,当插件安装完成后,就进入“查看QQ好友”界面,此时在界面找到并点击“查看好友”选项。
  在打开的QQ好友列表中,选择需要加入的QQ好友,点击“邀请”(对方目前还不是微信用户)或“添加”(对方已是微信用户)按钮申请加对方为好友。
  当我们通过点击“邀请”按钮来添加一位非微信用户时,程序会自动打开对应的邀请界面,此时点击“发送邀请”按钮,就会向对方发送一份邀请邮件。此时被邀请方会收到一份邀请成为微信用户的邮件。
  当对方成为微信用户后,我们就可以再次添加对方为微信好友啦。点击“我的好友”列表中的“添加”按钮,在打开的窗口中选择“添加到通讯录”按钮,此时程序会向对方发送一份申请添加为微信好友的请求。当对方允许后,就正式将QQ好友添加为微信好友啦。
  (新版本微信)把QQ好友导入微信?  相对于老版本的微信,新版的更具人性化,新版微信已经实现和QQ联通,这样你就可以直接把你QQ里的人直接导入微信,这样就会使沟通无处不在。好了,废话不多说,直接以图的形式告诉大家,这样更方便一目了然。(以下有两种方式可选)  第一种方法:先打开微信,选择添加好友,然后进去以后如图:  第二种方法:打开微信通讯录,选择最上方的新的朋友,如图:  不管是上面哪种都可以,都会直接带我们到QQ好友列表,下面大家就可以随心所欲的往微信里导入QQ好友了。
RELATED ARTICLES
,新浪微博自媒体计划正式启动,并公开招募 ...
备案这个问题一直困扰很多草根站长,我也不例外。最近 ...
个人认证详细认证标准请查看:各行业认证标准。如需认 ...
QQ公众号简介QQ公众号是一款与微信公众号基本运作模式 ...
支付宝客服、支付宝投诉电话、如何使用支付宝大集锦。 ...
微信公众平台现在已分成订阅公众号、服务公众号以及企 ...
  本文是针对上篇《如何申请微信公众账号认证?微信 ...
  想必大家都知道,微信公众平台目 前拥有两个功能 ...
QQ 空间权重高,用来做 SEO 排名效果非常快!当然这是 ...
随着网络人数的逐渐增多,众多人开始选择在网络当中进 ...
在PPT中,利用VBA能够轻松调取Excel中数据,通过一张 ...
随着互联网信息量的越来越大,思维导图越来越多的被利 ...
我们知道,要创建一个自己的网站,那就需要有域名和空 ...
最近跟售后经理吃饭,他跟我再次谈起两年前为公司临时 ...
微软称Windows 10将是该公司“有史以来最全面的平台” ...
在互联网盛行的今天,越来越多的在线用户希望得到安全 ...
鏂囩珷鎺掕
TOP ARTICLES
一、管理上的那些尴尬由于高粱seo目前在大型网络公司里面作为一名seo团队的管理,虽然...
zhuhaitao51
最近估计是研究微商上瘾了,脑子里面装的多数都是微商方面的东西,以前研究百度贴吧、...
zhuhaitao51
大约在11个月前,我当时在网站上面定下了一年内的运营目标,以此作为当时的动力。那个...
zhuhaitao51
经常有人私聊我,问小白怎么在网赚行业获得一个正确的学习方法,有些时候我的回答都是...
zhuhaitao51
最近有很多人感觉不懂规矩,啥都是想空手套白狼,总想着有人能够给他点什么,特别是这...
zhuhaitao51
最近有很多人感觉不懂规矩,啥都是想空手套白狼,总想着有人能够给他点什么,特别是这...
zhuhaitao51
微调是根据用户需求对网页进行特定的调整,对于网站内部页面的微调,相信大家都不是很...
SEO老炮儿再聚厦门MADCon,机遇与未来并存
4月15日最关注互联网...
一、管理上的那些尴尬由于高粱seo目前在大型网络公司里面作为一名seo团队的管理,虽然...
zhuhaitao51
最近估计是研究微商上瘾了,脑子里面装的多数都是微商方面的东西,以前研究百度贴吧、...
zhuhaitao51
大约在11个月前,我当时在网站上面定下了一年内的运营目标,以此作为当时的动力。那个...
zhuhaitao51
经常有人私聊我,问小白怎么在网赚行业获得一个正确的学习方法,有些时候我的回答都是...
zhuhaitao51
最近有很多人感觉不懂规矩,啥都是想空手套白狼,总想着有人能够给他点什么,特别是这...
zhuhaitao51
最近有很多人感觉不懂规矩,啥都是想空手套白狼,总想着有人能够给他点什么,特别是这...
zhuhaitao51
微调是根据用户需求对网页进行特定的调整,对于网站内部页面的微调,相信大家都不是很...
SEO老炮儿再聚厦门MADCon,机遇与未来并存
4月15日最关注互联网...}

我要回帖

更多关于 微信被邀请进群需同意 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信