本篇简单讲解一下如何接收QQ消息。

在成功登陆QQ后,要每隔一段时间发一个POST请求,用来维持登陆状态,同时也是用来接收消息的,请求如下:

Request URL:http://d.web2.qq.com/channel/poll2

Request Method:POST

Content-Type:application/x-www-form-urlencoded

Referer:http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=2

Form-Data:r={"ptwebqq":"97b4ceaed7cc09c57e331db5785b7ee96253652a66f54ba1465176ac24b5d5dd","clientid":53999199,"psessionid":"8368046764001d636f6e6e7365727665725f77656271714031302e3133392e372e3136300000084800000c0c026e04003654298d6d0000000a403659485759383574506d00000028ac185599dd47fa9fbed98f818cf0219db1c21dc1b8d71c4309b1c1d60d1d5a6d99b14133835981f4","key":""}post请求所带的数据参数前面都已经介绍过了,key默认为空就好。json字符串依旧要经过url编码。不过这个请求成功返回的时间不一定,不过最长也有一个时间限制。一般情况下若有消息发给你(或者刚登陆会收到离线消息),请求会立刻返回,但若一直没收到消息,腾讯服务器那边也会返回给你一个结果(一般是1分钟左右就返回)。所以,这个请求的延迟时间要设的长一点。下面附上我的代码:

// 获取QQ消息 收到消息就立刻再执行一次

public static String getQQMessage() throws Exception {

// post 请求

DefaultHttpClient client = new DefaultHttpClient();

HttpPost postjson = new HttpPost("http://d.web2.qq.com/channel/poll2");

postjson.setHeader("Referer",

"http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=2");

HttpClientParams.setCookiePolicy(client.getParams(),

CookiePolicy.BROWSER_COMPATIBILITY);

client.getParams().setParameter(

CoreConnectionPNames.CONNECTION_TIMEOUT, 1000 * 300);

client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,

1000 * 300);

StringEntity entity = new StringEntity(poll2Str);

entity.setContentType("application/x-www-form-urlencoded");

postjson.setEntity(entity);

// 设置CookieStore

if (cs != null) {

client.setCookieStore(cs);

}

// 获得返回的json数据包

HttpResponse httpResponse = client.execute(postjson);

HttpEntity httpent = httpResponse.getEntity();

// 保存CookieStore

cs = client.getCookieStore();

String code = String.valueOf(httpResponse.getStatusLine()

.getStatusCode());

String line;

StringBuffer sb = new StringBuffer();

if (httpent != null) {

BufferedReader br = new BufferedReader(new InputStreamReader(

httpent.getContent(), "UTF-8"));

while ((line = br.readLine()) != null) {

sb.append(line);

}

br.close();

}

return sb.toString();

}这边我是单独做了一个线程接收消息,在登陆成功后发送一次这个post请求,在得到返回值后再次post这个请求,如此来维持登陆状态,并一直获取消息(webqq就是这样实现的)。下面简单分析一下几种返回格式:

1.1分钟内无消息,则返回以下数据:

{"retcode":102,"errmsg":""}这样的话直接再post下一个请求就好。

2.好友消息

{"retcode":0,"result":[{"poll_type":"message","value":{"msg_id":27785,"from_uin":2208444277,"to_uin":2368295990,"msg_id2":538127,"msg_type":9,"reply_ip":178854715,"time":1433158432,"content":[["font",{"size":10,"color":"000000","style":[0,0,0],"name":"\u5FAE\u8F6F\u96C5\u9ED1"}],"123 "]}}]}poll_type为消息类型,message为好友消息,group_message为群消息,sess_message为临时会话。同样的,我没去分析讨论组的消息类型,有兴趣的可以自己试试。

value内即为消息的基本信息。msg_id和msg_id2不知道有什么区别,不管不知道也不影响大局。from_uin为发送好友相对于你的uin,和你获取好友时他的uin一样,to_uin即是你自己的标识(QQ号),msg_type是哪几种类型我也不清楚,我一般也无视了,reply_ip应该是发送人的ip地址,不过处理过了,我不知道该如何解密。time即发送的说剑戳,content内即是msg的主要信息,同发送消息一样,提取出消息文字即可。

注:如果发送了表情消息,内容中会带上表情的格式 如[face],或自定义表情[cface],这个时候提取消息的过程会变的比较复杂,所以我在接收到带有图片的消息时都直接无视了。

3.群消息

{"retcode":0,"result":[{"poll_type":"group_message","value":{"msg_id":18042,"from_uin":2381142083,"to_uin":2368295990,"msg_id2":793507,"msg_type":43,"reply_ip":180064295,"group_code":478233785,"send_uin":2208444277,"seq":3615,"time":1433158906,"info_seq":189429357,"content":[["font",{"size":10,"color":"000000","style":[0,0,0],"name":"\u5FAE\u8F6F\u96C5\u9ED1"}],"123 "]}}]}如之前所说,poll_type为group_message,代表群消息,from_uin和上篇提到的gid一样即群标识,to_uin依旧是自己的标识,send_uin即发送人的uin,即群内成员相对于你的uin,和上篇介绍的获取群成员的uin一样。消息内容的格式同好友消息一致。

4.临时会话消息

{"retcode":0,"result":[{"poll_type":"sess_message","value":{"msg_id":2329,"from_uin":3921021009,"to_uin":2368295990,"msg_id2":62551,"msg_type":140,"reply_ip":180061935,"time":1433159288,"id":2381142083,"ruin":3277086849,"service_type":0,"flags":{"text":1,"pic":1,"file":1,"audio":1,"video":1},"content":[["font",{"size":9,"color":"000000","style":[0,0,0],"name":"\u5FAE\u8F6F\u96C5\u9ED1"}],"123 "]}}]}from_uin为这个陌生人相对于你的标识,其他参数没什么区别了。

前几天我也仔细看过关于聊天机器人的实现方式。事实上真正的智能聊天机器人(能学习,会成长)实现难度太大了。现在的QQ聊天机器人一般都是设定关键字和回复内容,在消息内容中出现指定字段匹配上了即发送设定好的回复内容,这样的机器人实在是无趣,太僵硬了。不过,若是只做一个客服机器人,那么还是挺合适的。用以上方法接收消息,回复制定内容给客户即可,也不需要多高的智商,回答内容自己设定好即可。

今天又看了下各种免费的API,在百度API开放接口上看到了图灵机器人的API。相对我们自己设计而言算不错了,词库也比较强大(毕竟每个人教它的内容,都入了同一个库,而我们调用的也是同一个库)。不仅能进行简单的聊天,也提供了很多其他功能,所以如果觉得自己设计麻烦,可以把程序当成一个中转站,在接收到消息内容后,调用图灵机器人的API,再将返回的数据发送回对象即可。(不过图灵机器人API返回的格式并不是固定的,因为功能比较强大,会有很多种类型的返回结果,我也不太懂它的API,所以我不知道该如何去控制返回结果,结果处理起来比较麻烦)

qq群发 java_qq聊天机器人 群发工具 (java版) (三)相关推荐

  1. java 开源 聊天机器人_用Java实现基于Web端的AI机器人聊天

    本文详细介绍了如何用Java实现Web聊天机器人.通过创建一个新项目来学习一下! 一.创建一个新项目 添加所需的依赖项 打开pom.xml文件在IDE中 将下列内容添加到区域 JCenterhttps ...

  2. java 聊天机器人_用Java实现基于Web端的AI机器人聊天

    本文详细介绍了如何用Java实现Web聊天机器人.通过创建一个新项目来学习一下! 一.创建一个新项目 添加所需的依赖项 打开pom.xml文件在IDE中 将下列内容添加到区域 JCenterhttps ...

  3. qq聊天机器人 群发工具 (java版) (一)

    这是最近因为感兴趣才写的小东西,网上大多是易语言版或C #版,java仅有的版本也偏老,老版webqq协议早失效了,所以现在我写了一个最新版本的.要实现群发和自动回复消息以及更多自定义功能,首先要实现 ...

  4. qq聊天机器人 群发工具 (java版) (二)

    上一篇介绍了如何借用webqq协议登陆qq,这一篇主要讲下如何实现群发消息.就目前我所知的消息类型有3种,分别是好友消息,群消息以及临时会话消息(这个一般是往群组成员群发).3种消息分别对应3种方法( ...

  5. “伪QQ”---一个即时聊天通讯的工具

    文章目录 前言 头文件 服务器端代码 客户端代码 字库源码头文件 头文件 字库源码 客户端主函数 前言 这里编写了一个即时通讯工具,不同的客户端可以通过连接服务器进行聊天互动,发表情和传文件: 数据量 ...

  6. 华为云,短信通信,群发推广运营短信,Java版

    华为云中短信服务 创建  SendMsg : import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  7. 微信公众平台开发教程Java版(三) 消息接收和发送

    前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息,发送消息) http://mp.weixin.qq.com/wiki/index.ph ...

  8. java 微信 接收消息_微信公众平台开发教程Java版(三) 消息接收和发送

    https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...

  9. 【算法面试必刷JAVA版三】链表中的节点每k个一组翻转

    盲目刷题,浪费大量时间,博主这里推荐一个面试必刷算法题库,刷完足够面试了.传送门:牛客网面试必刷TOP101

  10. java开发机器人聊天_聊天机器人与Web开发的未来

    java开发机器人聊天 Since Facebook launched their annual F8 conference for bot developers in 2016 and Micros ...

最新文章

  1. clickhouse批量写入_交互式分析领域,为何 ClickHouse 能够杀出重围?
  2. R删除数据列基于dplyr包
  3. [shell]shell中if语句的使用
  4. C、C++中的转义符
  5. spring 发送html邮件,Springboot2.0 发送HTML 格式的邮件。
  6. 服务器重启后,启动SAP ERP的步骤
  7. 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题
  8. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧
  9. 从Grunt测试Grunt插件
  10. 自定义控件-实现TextBox的禁止粘贴
  11. 投入10个亿,每人奖300万,腾讯给科学界发奖了!
  12. 安川伺服驱动器的常用故障代码
  13. java Date时间工具类
  14. 简书项目实战-main首页开发
  15. 2022最新LOGO在线制作系统源码
  16. 咚咚咚————【封装驱动】ADS1256驱动程序,分享交流自己编写的程序。
  17. 标准成本和实际成本的比较
  18. 计算机界五位巾帼英雄
  19. USB总线转串口芯片:沁恒CH340
  20. Alibaba Cloud Linux 3 正式发布!新特性来了!

热门文章

  1. Selenium认识与实战(学习版)
  2. iOS 动画篇 - pop动画库
  3. 实验-产生式系统(python)
  4. 多层感知机BP算法推导
  5. Matlab绘制直方图,横坐标间设置等间距的空格
  6. 单片机c语言编程定时,单片机C语言编程定时器的几种表达方式
  7. NotifyIcon控件的使用
  8. 计算机基础知识刷题app,计算机考试刷题app
  9. 1.16 隐藏不需要打印的内容 [原创Excel教程]
  10. wunderlist会提示找不到libffi.so.5