- 浏览: 97735 次
- 性别:
- 来自: 北京
最新评论
-
zgmws1978:
抄袭人家的吧
Extjs4.0 实现的后台管理模块 (包含前后台源码) -
luojia.smilence.:
这都下载不了,楼主更新一下链接吧。
史上最全的安卓android开发各种书籍文档资料整理包括书籍介绍和下载 -
429537044:
楼主你好,我想请问一下。 你在MyAccessDecision ...
Spring Security3.1 最新配置实例(spring权限管理) -
jiang_xiaohan:
在别处看过,下载过源码,但没架包的,hibernate我又不熟 ...
Spring Security3.1 最新配置实例(spring权限管理) -
yhr619:
写得挺好的
Spring Security3.1 最新配置实例(spring权限管理)
webQQ协议java的实现方法
- 博客分类:
- javadt.com
转载自:http://www.javadt.com/article-131-1.html
摘要: 迷你版QQ实现,采用WEBQQ协议,具备登陆,获取qq好友列表,收发消息功能。 只做学习之用,无任何价值,有兴趣的童鞋拿出修改完善。 对于qq号和密码填写正确,但出现这种情况的原因可能是你的qq需要验证码登陆。 ...
迷你版QQ实现,采用WEBQQ协议,具备登陆,获取qq好友列表,收发消息功能。 只做学习之用,无任何价值,有兴趣的童鞋拿出修改完善。 对于qq号和密码填写正确,但出现这种情况的原因可能是你的qq需要验证码登陆。 获取验证码的方法很简单 直接去 http://captcha.qq.com/getimage?aid=1003903&uin="+qq号码+"&vc_type="+checkType; //代码登陆的时候有这个checkType 发送http请求,将结果写出图片文件,打开图片就可以看到验证码 。 代码中加入手动加入验证码即可正常登陆。 (代码中131行 验证码) Java代码 InputStreamReader ins = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(ins); check = br.readLine(); Java代码 package com.mrlans.qq; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.GZIPInputStream; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import atg.taglib.json.JsonEntity; import atg.taglib.json.util.JSONArray; import atg.taglib.json.util.JSONException; import atg.taglib.json.util.JSONObject; import atg.taglib.json.util.JSONStringer; /** * QQ MINI 客户端 * @author mrlans E-mail:mrlans@qq.com * @version create Time:Dec 11, 2010 8:54:38 PM * */ @SuppressWarnings({"unused","deprecation"}) public class MiniQQClient { private int qq = 4008403; private String password = null; private int clientid = 73937875; private String psessionid = ""; private String ptwebqq; private String vfwebqq; private String skey; private final String host = "http://d.web2.qq.com"; private String refer = this.host+"/proxy.html?v=20101025002"; private String cookie = ""; private Map<Long, User> firends = new HashMap<Long, User>(); private Map<Long, User> firends2 = new HashMap<Long, User>(); public enum METHOD {GET, POST} private boolean run = false; private PollMessageThread poll = new PollMessageThread(); public Thread getPoolThread() { return poll; } public MiniQQClient(int qq, String password) { this.qq = qq; this.password = password; try { boolean login = login(); if(login) { //fetchAllOnlineFriends(); fetchAllFriends(); run = true; getPoolThread().start(); log("QQ START SUCESS......."); sendMsgToQQ(4008403, "哥上线了!"); } } catch (Exception e) { log("QQ发生异常退出\t"+e.getMessage()); Thread.currentThread().stop(); } } public static void main(String[] args) { MiniQQClient clinet = new MiniQQClient(4008403, "密码填写处"); try { clinet.getPoolThread().join(); } catch (Exception e) { System.out.println("QQ异常退出\t"+e.getMessage()); } } private boolean login() { //login 1 String checkQQUrl = "http://ptlogin2.qq.com/check?appid=1003903&uin="+qq; String result = sendHttpMessage(checkQQUrl, METHOD.GET.name(), null); Pattern p = Pattern. compile("\\,\\'([!\\w]+)\\'"); Matcher m = p. matcher(result); String checkType = ""; if(m.find()) { checkType = m.group(1); } String check = ""; if(!checkType.startsWith("!")) { //生成图片验证码 } else { check = checkType; } //login 2 String loginUrl = "http://ptlogin2.qq.com/login?u="+qq+"&" + "p=" +encodePass(this.password, check)+ "&verifycode="+check+"&remember_uin=1&aid=1003903" + "&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Fstrong%3Dtrue" + "&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert"; result = sendHttpMessage(loginUrl, METHOD.GET.name(), null); p = Pattern.compile("登录成功!"); m = p. matcher(result); if(m.find()) { log("Welcome QQ : "+this.qq+" Login Success!"); } else { log(checkType); return false; } //从cookie中提取ptwebqq,skey p = Pattern.compile("ptwebqq=(\\w+);"); m = p.matcher(cookie); if(m.find()) { this.ptwebqq = m.group(1); } p = Pattern.compile("skey=(@\\w+);"); m = p.matcher(cookie); if(m.find()) { this.skey = m.group(1); } //log("ptwebqq="+ptwebqq+",skey="+skey); //login 3 String channelLoginUrl = this.host+"/channel/login2"; String content = "{\"status\":\"\",\"ptwebqq\":\""+ptwebqq+"\",\"passwd_sig\":\"\",\"clientid\":\""+clientid+"\"}"; try { content = URLEncoder.encode(content,"UTF-8"); } catch (UnsupportedEncodingException e) { } content = "r="+content;//post的数据 result = sendHttpMessage(channelLoginUrl, METHOD.POST.name(), content); p = Pattern.compile("\"vfwebqq\":\"(\\w+)\""); m = p.matcher(result); if(m.find()) this.vfwebqq = m.group(1); p = Pattern.compile("\"psessionid\":\"(\\w+)\""); m = p.matcher(result); if(m.find()) psessionid = m.group(1); //log("vwebqq="+vfwebqq); //log("psessionid="+psessionid); return true; } //登陆成功 取QQ好友 public void fetchAllFriends() { String getFriendsurl = "http://web2-b.qq.com/api/get_user_friends2"; String getFriendsurl2 = "http://web2-b.qq.com/api/get_user_friends"; String result = fetchAllFriends(getFriendsurl); String result2 = fetchAllFriends(getFriendsurl2); //firends Map<String, User> user = getFriendInfo(result); // Map<String, User> user2 = getFriendInfo(result2); //真正的QQ号码 if(user!=null && user2!=null && user.size() == user2.size()) { Set<Map.Entry<String, User>> set = user.entrySet(); for(Iterator<Entry<String, User>> it = set.iterator(); it.hasNext();) { Entry<String, User> e = it.next(); User u = e.getValue(); u.setQq(user2.get(e.getKey()).getUin()); log(u.getQq()+"\t"+u.getNick()+"\t"+u.getUin()); firends.put(u.getQq(), u); firends2.put(u.getUin(), u); } } } //在线用户 public void fetchAllOnlineFriends() { String onlineUserURL = host+"/channel/get_online_buddies2"; onlineUserURL = onlineUserURL+ "?clientid="+clientid+"&psessionid="+psessionid; String result = sendHttpMessage(onlineUserURL, METHOD.GET.name(), null); System.out.println(result); } @SuppressWarnings("unchecked") public Map<String, User> getFriendInfo(String result) { Map<String, User> users = new HashMap<String, User>(500); try { JSONObject retJson = new JSONObject(result); if( retJson.getInt("retcode") == 0) { JSONArray infos = retJson.getJSONObject("result").getJSONArray("info"); for(ListIterator<JSONObject> it = infos.listIterator(); it.hasNext();) { JSONObject obj = it.next(); User user = new User(obj.getLong("uin"), obj.getString("nick"), obj.getInt("face"), obj.getLong("flag")); users.put(user.getNick()+user.getFlag(), user); } } } catch (Exception e) { log("getFriendInfo failure "+e.getMessage()); } return users; } public String fetchAllFriends(String getFriendsurl) { //{"h":"hello","vfwebqq":"7fe84931db23dc5a0351d759905642bcf5d09632e001bbfc8822809067538431d4da9dd1e8e653a0"} String content = "{\"h\":\"hello\",\"vfwebqq\":\""+vfwebqq+"\"}"; try { content = URLEncoder.encode(content, "UTF-8"); content = "r="+content; String result = sendHttpMessage(getFriendsurl, METHOD.POST.name(), content); //log("AllFriends= "+result); return result; } catch (Exception e) { log("fetchAllFriends failure.............\t"+e.getMessage()); return null; } } public User getFriend(long qq) { return this.firends.get(qq); } public boolean sendMsg(long toQQ, String message) { try { JSONObject json = new JSONObject(); json.put("to", toQQ);//要发送的人 json.put("face", 330); JSONArray msg = new JSONArray(); msg.add(message); JSONArray font = new JSONArray(); font.add("font"); JSONObject font1 = new JSONObject().put("name", "宋体").put("size", "10"); JSONArray style = new JSONArray(); style.add(0); style.add(0); style.add(0); font1.put("style", style); font1.put("color", "000000"); font.add(font1); msg.add(font); json.put("content", msg.toString()); json.put("msg_id", new Random().nextInt(10000000)); json.put("clientid", this.clientid); json.put("psessionid", this.psessionid);//需要这个才能发送 String sendMsgUrl = this.host+"/channel/send_msg2"; String content = json.toString(); try { content = URLEncoder.encode(content,"UTF-8"); } catch (UnsupportedEncodingException e) { }//他要需要编码 content ="r="+content; //发送 String res = sendHttpMessage(sendMsgUrl, METHOD.POST.name(), content); //不出意外,这是返回结果:{"retcode":0,"result":"ok"} if(null == res || !res.contains("result")) return false; JSONObject rh = new JSONObject(res); if("ok".equals(rh.getString("result"))) { return true; } } catch (Exception e) { log("send message to "+toQQ+" failure......\n"+e.getMessage()); } return false; } public boolean sendMsgToQQ(long qq, String message) { return sendMsg(getFriend(qq).getUin(), message); } //HTTP 消息发送 public String sendHttpMessage(String url, String method, String contents) { try { log("request="+url); URL serverUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection(); conn.setConnectTimeout(20000); conn.setRequestMethod(method);//"POST" ,"GET" if(null != refer) conn.addRequestProperty("Referer", refer); conn.addRequestProperty("Cookie", cookie); conn.addRequestProperty("Connection", "Keep-Alive"); conn.addRequestProperty("Accept-Language", "zh-cn"); conn.addRequestProperty("Accept-Encoding", "gzip, deflate"); conn.addRequestProperty("Cache-Control", "no-cache"); conn.addRequestProperty("Accept-Charset", "UTF-8;"); conn.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)"); if(method.equalsIgnoreCase(METHOD.GET.name())) { conn.connect(); } else if(method.equalsIgnoreCase(METHOD.POST.name())) { conn.setDoOutput(true); conn.connect(); conn.getOutputStream().write(contents.getBytes()); } else throw new RuntimeException("your method is not implement"); if(conn.getHeaderFields().get("Set-Cookie") != null) { for(String s:conn.getHeaderFields().get("Set-Cookie")) { cookie += s; } } InputStream ins = conn.getInputStream(); //处理GZIP压缩的 if(null != conn.getHeaderField("Content-Encoding") && conn.getHeaderField("Content-Encoding").equals("gzip")) { byte[] b = null; GZIPInputStream gzip = new GZIPInputStream(ins); byte[] buf = new byte[1024*8]; int num = -1; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((num = gzip.read(buf, 0, buf.length)) != -1) { baos.write(buf, 0, num); } b = baos.toByteArray(); baos.flush(); baos.close(); gzip.close(); ins.close(); return new String(b).trim(); } String charset = "UTF-8"; InputStreamReader inr = new InputStreamReader(ins, charset); BufferedReader br = new BufferedReader(inr); String line = ""; StringBuffer sb = new StringBuffer(); do { sb.append(line); line = br.readLine(); }while(line != null); log("response="+sb); return sb.toString(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } //加密密码 public String encodePass(String pass, String code) { try { ScriptEngineManager m = new ScriptEngineManager(); ScriptEngine se = m.getEngineByName("javascript"); se.eval(new FileReader(new File(this.getClass().getClassLoader().getResource("com/mrlans/qq/1.js").getPath()))); Object t = se.eval("md5(md5_3(\""+pass+"\")+\""+code.toUpperCase()+"\");"); return t.toString(); }catch (Exception e) { e.printStackTrace(); } return null; } // 记录日志 private void log(String msg) { System.out.println(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())+" : "+ msg); } public String numToIp(Long num) { String aaa = Long.toHexString(num); String n1 = Integer.parseInt(aaa.substring(0,2),16)+""; String n2 = Integer.parseInt(aaa.substring(2,4),16)+""; String n3 = Integer.parseInt(aaa.substring(4,6),16)+""; String n4 = Integer.parseInt(aaa.substring(6),16)+""; return n1+"."+n2+"."+n3+"."+n4; } public void receiveMsg(JSONObject value) throws Exception { String content = value.getJSONArray("content").getString(1); long from_uin = value.getLong("from_uin"); long reply_ip = value.getLong("reply_ip"); sendMsg(from_uin, "此乃QQ聊天机器人程序测试中,消息会转发到QQ:4008403上"); Thread.sleep(2000); User u = firends2.get(from_uin); if(null == u) sendMsgToQQ(4008403, "[qq = "+from_uin+"] send message :\r\n"+content); else { log("receive [qq = "+u.getQq()+" and name ="+u.getNick()+"] message {"+content+"} ~~~"); sendMsgToQQ(4008403, "[qq = "+u.getQq()+" and name ="+u.getNick()+"] send message :\r\n"+content); } } public void changeStatus(JSONObject value) throws Exception { long from_uin = value.getLong("uin"); String status = value.getString("status"); User u = firends2.get(from_uin); log("用户:"+u.getNick()+"\t"+status); } class PollMessageThread extends Thread { @Override public void run() { String pollUrl = host+ "/channel/poll2?clientid="+clientid+"&psessionid="+psessionid; while(run) { try { String ret= sendHttpMessage(pollUrl, METHOD.GET.name(), null); JSONObject retJ = new JSONObject(ret); int retcode = retJ.getInt("retcode"); if(retcode == 0) { JSONArray result = retJ.getJSONArray("result"); String poll_type = result.getJSONObject(0).getString("poll_type"); JSONObject value = result.getJSONObject(0).getJSONObject("value"); if("message".equals(poll_type)) {//好友消息 try { receiveMsg(value); } catch (Exception e) { } } else if("buddies_status_change".equals(poll_type)) {//好友上下线 changeStatus(value); } else if("group_message".equals(poll_type)) {//群消息 } //system_message 是系统消息 } else if(retcode == 121) { run = false; log("QQ已经在别处登录!"); } } catch (Exception e) { // TODO: handle exception log("Response PollMessage failure = "+e.getMessage()); } } } } } @SuppressWarnings("serial") class User implements Serializable { private long uin; private long qq; private String nick; private int face; private long flag; public User() { super(); } public User(long uin, String nick, int face, long flag) { super(); this.uin = uin; this.nick = nick; this.face = face; this.flag = flag; } public long getUin() { return uin; } public void setUin(long uin) { this.uin = uin; } public long getQq() { return qq; } public void setQq(long qq) { this.qq = qq; } public String getNick() { return nick; } public void setNick(String nick) { this.nick = nick; } public int getFace() { return face; } public void setFace(int face) { this.face = face; } public long getFlag() { return flag; } public void setFlag(long flag) { this.flag = flag; } @Override public String toString() { String user = this.uin+"\t\t"+this.qq+"\t\t"+this.nick+"\t\t"+this.flag; return user; } } |
发表评论
-
史上最全的安卓android开发各种书籍文档资料整理包括书籍介绍和下载
2012-05-07 13:39 3001史上最全的安卓android开发各种书籍资料整理包括书籍 ... -
收集整理的oracle常用命令大全,解决oracle常见问题
2012-05-02 12:51 4715一、ORACLE的启动和关闭 1、在单机环境下 要 ... -
史上最全html及html5的学习资料文档收集整理包括介绍和下载
2012-04-28 09:21 3264下面是我收集整理的一些关于html5的相关文档和资料,有文档介 ... -
大量的javascript学习资料包括文档介绍下载和源码等
2012-04-26 09:49 1712下面是整理的大量关于javascript的一些资料文档等的介绍 ... -
Java中将中文姓名转换为拼音的简单实现
2012-04-25 09:15 3723以下是源代码:import net.sourceforge.p ... -
SQL语句使用大全,最常用的sql语句
2012-04-23 10:38 2703下列语句部分是Mssql语 ... -
史上最全的安卓android开发各种书籍文档资料整理包括书籍介绍和下载
2012-04-19 10:48 1039史上最全的安卓androi ... -
史上最全的Eclipse各种书籍资料整理包括书籍介绍和下载
2012-04-18 11:02 2459史上最全的Eclipse各种书籍资料整理包括书籍介绍和下 ... -
史上最全的jquery框架各种书籍整理包括书籍介绍和下载
2012-04-17 19:35 2008下面是我近期整理的几乎囊括了所有的jquery的教程和学 ... -
ajax框架prototype.js的各大文档整理积累文档的介绍和下载
2012-04-16 08:03 1132下面是整理的ajax框架prototype框架的一些文档 ... -
Microsoft Silverlight 4.0 介绍[PDF]
2012-04-15 18:55 1358Microsoft Silverlight 4.0 ... -
XML详细入门教程[PDF]
2012-04-15 18:40 2211本文档是一份很详 ... -
“为什么有钱有权的都移民了”?“贫贱不能移!”
2012-04-13 10:12 3转载自:“为什么有钱有权的都移民了”?“贫贱不能移!” ht ... -
JAVA 部署TOMCAT+IIS配置方法
2012-04-12 12:58 2661本文转载自:http://www.javadt.co ... -
android开发环境搭建以及配置方法[PDF]
2012-04-12 09:59 988转载自:http://www.javadt.com/artic ... -
《JAVA代码规范》(六)通用代码格式 - 语句、SQL(2.9-2.10)
2012-04-12 21:40 1134转载自:http://www.javadt.c ... -
《JAVA代码规范》(五)通用代码格式 - 声明(2.8)
2012-04-11 20:56 846转载自:http://www.javadt.com/threa ... -
《JAVA代码规范》(四)通用代码格式 - 注释(2.7)
2012-04-11 20:55 1152转载自:http://www.javadt.c ... -
《JAVA代码规范》(三)通用代码格式 - 缩进、行长度、换行、空行、空格(2.2-2.6) ... ...
2012-04-11 20:54 8257转载自:http://www.javadt.com/threa ... -
《JAVA代码规范》(二)通用代码格式 - 文件组织(2.1)
2012-04-11 20:37 1428转自:http://www.javadt.com/thr ...
相关推荐
用java实现了webQQ协议,可发送接收消息(包括群消息,好友消息……),查看好友资料,根据条件查询好友.并且在此基础上基于NLP技术实现了简易的聊天机器人
WebQQ协议.rar
通过抓包分析WebQQ3.0协议做出的WebQQ客户端,开发工具Visual studio 2008,开发语言C#,此WebQQ客户端包括验证码获取,QQ登录,获取好友列表,获取在线好友列表,接收消息,发送消息等功能,基本上实现聊天需求。...
WEBQQ完整协议,包含了所有的协议操作文档
C#手机QQ协议、WebQQ协议、PCQQ协议及源码,2013年7月12日亲测可用
webqq协议QQ消息群发,用了精易模块,。@Integer。
一款java实现完整项目,webQQ聊天,拿去学习或者当毕业设计很不错呢
WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议WEBQQ 3.0 协议...
webQQ协议 易语言专用模块 可用于操作webQQ 酷Q机器人插件编写
基于WebQQ协议的Java版SDK,使用它吧!打造AI聊天工具,报警系统.zip
易语言WEBQQ协议群发源码,WEBQQ协议群发,请求登陆,退出登陆,获取好友,获取分组,发送消息,获取群,发送群,取中间文本内容,取随机整数,发送信息,API_SetWindowLong,API_SendMessage,CoUninitialize,CoInitialize,URL...
使用技术有,java发送http协议模拟QQweb登录网页做的一个手机3GQQ登录! 额没事,做来玩玩而已!
WEBQQ协议群发.rar
QQrobot基于腾讯公司WebQQ协议实现,可以向QQ群或者是个人自动发送信息。分为两个部分,QQ主体和robot插件。QQ主体解析WebQQ协议,负责QQ号码登录,信息接收和发送功能。robot分析聊天内容,跟据聊天内容智能做出...
webqq 3.0协议的实现, 顾名思义,就是可以在Linux终端下使用的webqq。运行分为两部分,客户端和服务端,客户端和服务端使用自定义协议通信,理论上可以在任何地方发送消息,比如在VIM里面发送qq消息。在 Shell 里面...
WebQQ协议登录加密算法——VC6实现源码
自己更新的WebQQ协议源码,
一个封装了QQ空间协议、webQQ协议、手机QQ协议、3GQQ协议的SDK,名称为:yiwoSDK。你可以引用yiwoSDK.dll快速开发QQ应用相关的产品。 目前webqq协议和QQ空间协议已经完善,支持很多功能。 yiwoSDK是易我论坛专门为...
相当让人震撼的webqq,java版工程,MyEclipse下直接导进工程