Javaは3 GQQに上陸しておよび友達の情報と友達のチャットの簡単な実現を獲得します


主にjavaを通じて3 GQQの登录を実现して、友达の情报(ニックネーム、QQ号など)をつかんで、チャットの情报などを取得します.
コードのインスピレーションは@水の子ハハが分かち合ったphpが3 GQQに上陸したコードから来た.実は3 GQQの登录と友达を捕まえるのは简単で、登录に成功してSIDを手に入れるだけで好きなようにすることができます.コードの书き込みはとても粗くて、主に机能の実现のためで、まだ多くの最適化することができる地方があって、これを出して、みんなは胜手に指导することができて、ツッコミを歓迎します.
全体のコードの論理は複雑ではありません.3 GQQの流れは簡単だからです.みんなChromeかfirefoxを使ってwapを開けます.3g.qq.com、QQをクリックしてログインページを開き、右クリックしてページのソースコードを見ると分かります.プログラムで使用されるのは、友達のグループ情報を表示したり、グループに基づいてそのグループの下のQQ友達などを取得したりすることです.Webソースを表示することで実現されます.
これはログインを説明するだけで、次の編ではメッセージの送信とメッセージの取得を実現します.
具体的なWebUtilsの実装については、http://url.cn/65b9am(PS:どのように自分の文章のアドレスの接続をコピーしますか...)
ステップ1:
3 GQQにログインして、SIDを手に入れます.
	/**
	 * QQ  
	 */
	public static String login(String qq,String password){
		HashMap<String, String> params=new HashMap<String, String>();
		params.put("login_url", "http://pt.3g.qq.com/s?aid=nLogin");
		params.put("sidtype", "1");
		params.put("loginTitle", "     ");
		params.put("bid", "0");
		params.put("qq", qq);
		params.put("pwd", password);
		params.put("loginType", "1");
		try {
			String response=WebUtils.doPost(QQ_LOGIN_URL, params, 0, 0);
			int sidIndex=response.indexOf("sid");
			SID=response.substring(sidIndex+4, sidIndex+28);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return SID;
	}

第2のステップでは、SIDに基づいて、パケット名、パケット番号、パケットのURLリンクなど、すべてのパケット情報を取得する.
        /**
	 *         
	 */
	public static List<Group> getFrendGroup(String sid){
		List<Group> groupList=null;
		try {
			String response=WebUtils.doGet("http://q16.3g.qq.com/g/s?sid="+sid+"&aid=nqqGroup");
			Pattern pattern = Pattern.compile("(?<=border=\"0\"/>).+?(?=<span class=\"no\">)");
			Matcher matcher=pattern.matcher(response);
			groupList=new ArrayList<Group>();
			Group group=null;
			int i=-1;
			while(matcher.find()){
				i++;
				group=new Group();
				group.setGroupUrl("http://q32.3g.qq.com/g/s?sid="+sid+"&aid=nqqGrpF&name="+matcher.group()+"&id="+i+"&gindex="+i+"&pid=1");
				group.setGroupIndex(i);
				group.setGroupName(matcher.group());
				groupList.add(group);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return groupList;
	}

第三歩、取得したパケット情報に基づいてすべての友达のQQ号をキャプチャして、私のところは単一のスレッドで実現して、みんなはマルチスレッドの方式を使ってパケットを分けて取得することを考えることができます.
	/**
	 *                  
	 * @param groupInfoList
	 * @return
	 */
	public static List<String> getFriendsFromGroup(List<Group> groupInfoList) {
		List<String> friendList=null;
		if(groupInfoList!=null&&groupInfoList.size()!=0){
			friendList=new ArrayList<String>();
			for(Group group:groupInfoList){
				String response;
				try {
					response = WebUtils.doGet(group.getGroupUrl());
				} catch (IOException e) {
					e.printStackTrace();
				}
				Pattern pattern = Pattern.compile("(?<=&amp;u=).+?(?=&amp)");
				Matcher matcher=null;
				int hasNext=-1;
				int pid=0;
				do{
					pid=pid+1;
					response=QQClient.getFrindsByGroupUrl(getGroupUrl(group.getGroupUrl(),pid));
					hasNext=response.indexOf("  ");
					matcher=pattern.matcher(response);
					while(matcher.find()){
						String firendQQ=matcher.group();
						friendList.add(firendQQ);
					}	
				}while(hasNext!=-1);
			}
		}
		return friendList;
	}