发送 poll包

public static void Login_PostPoll()
{
try
{
string url = "http://d1.web2.qq.com/channel/poll2";
string dat = "{\"ptwebqq\":\"#{ptwebqq}\",\"clientid\":53999199,\"psessionid\":\"#{psessionid}\",\"key\":\"\"}";
dat = dat.Replace("#{ptwebqq}", Login_ptwebqq).Replace("#{psessionid}", Login_Psessionid);
dat = "r=" + HttpUtility.UrlEncode(dat);
HTTP.Post_Async_Action action = Message_Get;
HTTP.Post_Async(url, dat, action);
}
catch (Exception) { Login_PostPoll(); }
}
#endregion
#region 接收到消息的回调函数
/// <summary>
/// 接收到消息的回调函数
/// </summary>
/// <param name="data">接收到的数据(json)</param>
private static bool Running = true;
public static void Message_Get(string data)
{
Task.Run(() => Login_PostPoll());
if (Running)
Task.Run(() => Message_Process(data));//这个是处理收到信息的另外一个方法具体处理 在源码
}

以上就是poll包的处理以及 收到的信息处理

接下来是 发送的

上面是发送的连接以及 发送后返回的 poll包信息。代码如下

/// <summary>
///
/// </summary>
/// <param name="type">私聊0 群聊1 讨论组2</param>
/// <param name="uin">uin</param>
/// <param name="messageToSend">消息</param>
/// <param name="auto"></param>
/// <returns></returns>
public static bool Login_Postsend_buddy_msg(int type, string uin, string messageToSend)
{
if (messageToSend.Equals("") || uin.Equals(""))
return false;
string[] tmp = messageToSend.Split("{}".ToCharArray());
messageToSend = "";
for (int i = 0; i < tmp.Length; i++)
if (!tmp[i].Trim().StartsWith("..[face") || !tmp[i].Trim().EndsWith("].."))
messageToSend += "\\\"" + tmp[i] + "\\\",";
else
messageToSend += tmp[i].Replace("..[face", "[\\\"face\\\",").Replace("]..", "],");
messageToSend = messageToSend.Remove(messageToSend.LastIndexOf(','));
messageToSend = messageToSend.Replace("\r\n", "\n").Replace("\n\r", "\n").Replace("\r", "\n").Replace("\n", Environment.NewLine);
try
{
string to_groupuin_did, url;
switch (type)
{
case 0:
to_groupuin_did = "to";
url = "http://d1.web2.qq.com/channel/send_buddy_msg2";
break;
case 1:
to_groupuin_did = "group_uin";
url = "http://d1.web2.qq.com/channel/send_qun_msg2";
break;
case 2:
to_groupuin_did = "did";
url = "http://d1.web2.qq.com/channel/send_discu_msg2";
break;
default:
return false;
}
string postData = "{\"#{type}\":#{id},\"content\":\"[#{msg},[\\\"font\\\",{\\\"name\\\":\\\"繁体\\\",\\\"size\\\":10,\\\"style\\\":[0,0,0],\\\"color\\\":\\\"000000\\\"}]]\",\"face\":#{face},\"clientid\":53999199,\"msg_id\":#{msg_id},\"psessionid\":\"#{psessionid}\"}";
postData = "r=" + HttpUtility.UrlEncode(postData.Replace("#{type}", to_groupuin_did).Replace("#{id}", uin).Replace("#{msg}", messageToSend).Replace("#{face}", SelfInfo.face.ToString()).Replace("#{msg_id}", rand.Next(10000000, 99999999).ToString()).Replace("#{psessionid}", Login_Psessionid));

string dat = HTTP.Post(url, postData, "http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2");
return dat.Equals("{\"errCode\":0,\"msg\":\"send ok\"}");
}
catch (Exception)
{
return false;
}
}

这一讲费了很多时间,中间又去查了资料。特别是处理返回的 包的json ,不知道怎么格式化,只能替换出来,拿到想要的数据。

到现在为止,整个新手smart qq http 协议的教程 已经可以说完成了,因为这个协议的功能非常单一,并且很多都已经被TX去掉的,就像获取好友的 真实QQ也已经是报错的。接下来就可以做图形界面,还有部分业务了(qq机器人自动回复等)

第五讲 smart qq poll包处理 以及 私聊 群聊消息收发的更多相关文章

  1. 第六讲 smart qq C#开发总结

    smart qqC#开发总结: 整个开发下来其实一点都不是很难,从一开始二维码 获取到最终的收发消息,基本上都是模拟浏览器的操作.都是基于http通讯.一下就是 本次新手学习http协议的最关键的一个 ...

  2. 第三讲 smart qq 登录成功后获取 vfwebqq ,psessionid,hash

    public static void Login_GetPHV() { string urldata = "{\"ptwebqq\":\"#{ptwebqq}\ ...

  3. 第一讲 从头开始做一个web qq 机器人,第一步获取smart qq二维码

    新手教程: 前言:最近在看了一下很久很久以前做的qq机器人失效了,最近也在换工作目前还在职,时间很挺宽裕的.就决定从新搞一个web qq机器人 PC的协议解析出来有点费时间以后再做. 准备工作: 编译 ...

  4. 第四讲 smart qq 获取联系人信息 ,分组 好友 群聊

    首先从post一下  http://s.web2.qq.com/api/get_user_friends2 这个链接获取分组categories ,好友信息 friends,info. string ...

  5. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  6. 给自己的QQ群开启腾讯官方的群聊机器人

    看到腾讯有个机器人还不错 能聊天 能唱歌 方法:1.点击链接填写https://wj.qq.com/s/946969/64ac 群聊机器人内测邀请.按照提示填就行了 2.然后就是开启机器人了 http ...

  7. 二进制包部署Kubernetes集群

    今天这篇文章教给大家如何快速部署一套Kubernetes集群.K8S集群部署有几种方式:kubeadm.minikube和二进制包.前两者属于自动部署,简化部署操作,我们这里强烈推荐初学者使用二进制包 ...

  8. wireshark抓取qq数据包

    抓包接口设置成本地连接 点击start,登录qq,输入oicq进行过滤qq包 找到第一个OICQ,点击后,点击oicq-IM software 可以看到自己登录的QQ号码为765343409 本机IP ...

  9. 360浏览器7.1抓触屏QQ空间包

随机推荐

  1. C++ 虚函数的两个例子

    1. 第一个例子是朋友告诉我Qt中的某个实现 1 #include <iostream> 2 3 // Qt中的某个实现 4 class A{ 5 public: 6 A() = defa ...

  2. Node.js 开发指南

    1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...

  3. hive 添加和删除分区

    命令如下: 增加分区 ', p_loctype='MHA'); 删除分区 ALTER TABLE my_partition_test_table DROP IF EXISTS PARTITION (p ...

  4. 代码雨 html实现

    <!DOCTYPE html> <html>    <head>        <meta charset="utf-8">    ...

  5. Java并发编程实战

    代码中比较容易出现bug的场景: 不一致的同步,直接调用Thread.run,未被释放的锁,空的同步块,双重检查加锁,在构造函数中启动一个线程,notify或notifyAll通知错误,Object. ...

  6. Project Structure详解

    Project Structure “ 项目结构”对话框允许您管理项目和IDE级别的元素,例如Modules,Facets,Libraries, Artifacts和SDK. 在大多数情况下,左边部分 ...

  7. 笔记:Zygote和SystemServer进程启动过程

    简述 Android设备启动过程中,先是Linux内核加载完,接着Android中的第一个进程init启动,它会启动一些需要开机启动的进程. Zygote就是进程init启动起来的.Android中所 ...

  8. 基于TensorFlow的深度学习系列教程 1——Hello World!

    最近看到一份不错的深度学习资源--Stanford中的CS20SI:<TensorFlow for Deep Learning Research>,正好跟着学习一下TensorFlow的基 ...

  9. Windows环境下MySQL 5.6安装与配置

    1将MySQL压缩包解压到自定义目录下. 2.添加环境变量 右键单击我的电脑->属性->高级系统设置(高级)->环境变量. 点击系统变量下的新建按钮 1)    输入变量名:MYSQ ...

  10. 如何利用sqoop将hive数据导入导出数据到mysql

    运行环境  centos 5.6   hadoop  hive sqoop是让hadoop技术支持的clouder公司开发的一个在关系数据库和hdfs,hive之间数据导入导出的一个工具. 上海尚学堂 ...