再来说说LumaQQ.NET怎么发群消息

摘要:
}然后添加代码以获取登录成功事件中的分组信息:LumaQQ。NET。事件。QQEventArgs<WriteError(“开始阅读朋友信息”);e、 QQClient.FriendManager.GetUserInfo(e.QQClient.QQUser.QQ);假);(实际上,这里的friend.QQ是群的内部ID。

        QQ群有两个ID,内部ID和外部ID。外部ID就是我们平时常见的ID,搜索啊,查看啊,都是这个ID。

        而内部ID就不常见了,应该说用QQ的人是从来不知道还有这个ID的。但是,这个ID是这篇文章的重点。因为发群信息必须用到这个ID。

        用过LumaQQ.NET的人,尝试过用QQ上可见的群号码发群消息,相信都是超时失败的。为什么呢?因为发群消息应该用群内部ID
        那么怎么得到群内部ID呢?它和群外部ID有什么联系?

        很遗憾,两者没有任何联系……

        不过我们有办法将两者联系起来,那就是在登录时手动去保存对应关系表:

        先要定义一个字典:

   1: public static Dictionary<int, int> ClusterDict { get; private set; }

        然后在登录成功事件里添加获取分组信息的代码:

   1: void LoginManager_LoginSuccessed(object sender, LumaQQ.NET.Events.QQEventArgs<LumaQQ.NET.Packets.In.LoginReplyPacket, LoginPacket> e)
   2: {
   3:     WriteError("登录成功");
   4:     WriteError("开始读取好友信息");
   5:     e.QQClient.FriendManager.GetFriendList();
   6:     e.QQClient.FriendManager.GetUserInfo(e.QQClient.QQUser.QQ);
   7:     e.QQClient.FriendManager.DownloadGroupFriends(0);//下载分组信息,这里是为了得到群的内部号码。
   8:  
   9:     //改变状态为离开状态
  10:     e.QQClient.FriendManager.ChangeStatus(QQStatus.AWAY, false);
  11:     //读取天气预报
  12:     e.QQClient.PrivateManager.GetWeather();
  13: }

        当下载分组信息成功后,判断是不是群,是群的话,就去获取群信息。(其实这里的friend.QQ就是群内部ID了,只不过我们不知道它的外部ID是什么)

   1: void FriendManager_DownloadGroupFriendSuccessed(object sender, QQEventArgs<DownloadGroupFriendReplyPacket, DownloadGroupFriendPacket> e)
   2: {
   3:     foreach (DownloadFriendEntry friend in e.InPacket.Friends)
   4:     {
   5:         if (friend.Type == FriendType.IS_CLUSTER)
   6:         {
   7:             e.QQClient.ClusterManager.GetClusterInfo((int)friend.QQ);
   8:         }
   9:     }
  10: }

          最后,在获取群信息成功的事件里,就能得到外部ID了,我们保存下来

   1: void ClusterManager_GetClusterInfoSuccessed(object sender, QQEventArgs<ClusterCommandReplyPacket, ClusterGetInfoPacket> e)
   2: {
   3:     if (!ClusterDict.ContainsKey((int)e.InPacket.Info.ExternalId))
   4:         ClusterDict.Add((int)e.InPacket.Info.ExternalId, (int)e.InPacket.Info.ClusterId);
   5:     else
   6:         ClusterDict[(int)e.InPacket.Info.ExternalId] = (int)e.InPacket.Info.ClusterId;
   7:     WriteError("得到群{0}的外部ID:{1},内部ID:{2}", e.InPacket.Info.Name,e.InPacket.Info.ExternalId,e.InPacket.Info.ClusterId);
   8: }

        这样,以后我们发群消息时,根据群外部ID从字典里取到对应的内部ID就能发送信息了。

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇集群Cluster介绍线程优先级,设置,setPriority()方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Nginx 出现504 Gateway Time-out的解决方法

nginx+tomcat后端为tomcat,nginx代理报504超时错误。 问题处理:1、修改/etc/nginx/nginx.conf,添加如下信息: http {     include       /etc/nginx/mime.types;     default_type  application/octet-stream;     ...

Java生成excel导出文件(使用poi+JXL)

1.使用poi生成文件 package com.mi.entity; import java.util.Date; public class Student { private int id; private String name; private int age; private Date birth;...

springboot 扫描不到包 @SpringBootApplication 自动配置原理

解决方案### 在main类中增加注解 @ComponentScan("com.test.test.*") 扫描具体的包 @ComponentScan(basePackages = {"com.test.test"}) 扫描父类之后的包 SpringBoot的启动类最好是放在root package下 原因### @SpringBootAppli...

通过经纬度获取地址信息

摘要 Google Maps API Web Services,是一个为您的地图应用程序提供地理数据的 Google 服务的 HTTP 接口集合。具体包括:Google Geocoding API、Google Directions API、Google Elevation API、Google Places API。本文将探讨如何通过Google Ge...

由mv命令引发的对inode的思考

一场机器迁移引起的思考 最近团队一台机器老化了,准备做全量迁移,一不小心,就把100多个G的/data目录放到了新机器的/data/data目录下,上愁了,怎么削减一层data目录呢?难倒像Windows一样剪切过来吗?可是有100多个G啊?!抱着试试的心态,运行mv命令,没想到系统瞬间就完成了。为什么Linux可以这么快速剪切呢?这一切都要从Linux对...

objdump命令

  转载于:http://man.linuxde.net/objdump        objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。 选项 --archive-headers -a 显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname --target=bfdname 指定目标码...