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

        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就能发送信息了。

posted @ 2008-04-29 16:21 蓝色的风之精灵 阅读(2173) 评论(8)  编辑 收藏

  回复  引用  查看    
#1楼2008-04-29 17:20 | airwolf2026      
支持一个
  回复  引用  查看    
#2楼2008-04-29 18:06 | chunfeng      
我想研究LumaQQ.NET,从那里下载源代码,给个地址我,谢谢
  回复  引用  查看    
#4楼2008-04-30 09:53 | 镜涛      
支持,研究一下!
  回复  引用  查看    
#5楼2009-01-08 22:06 | 永恒沸点      
我一直关注你的博客,遇到个问题 就想到你了。你有没有遇到过新加群的时候?那个时候无论用哪个命令 都不能获得。不知道有没有解决办法啊。比如我2个群,有一个群加我 或者我加某个群。但是更新后还是2个群,除非重新登陆。
  回复  引用  查看    
#6楼2009-01-10 13:21 | IT乌吉线      
这个方法只能对固定群有用,
对于讨论组(代码称临时群)不起作用,至少我没办法获得讨论组的的内部ID。

  回复  引用  查看    
#7楼2009-01-10 13:24 | IT乌吉线      
@永恒沸点
试一试在你接到被加入群或者加入群的信息的时候更新
DownloadGroupFriends
这个可以用event来做。

  回复  引用  查看    
#8楼2009-01-12 08:40 | 永恒沸点      
我确实这么做了,其他的方法也试了,登录前存在的组都没问题,但是登录后新增的组就获得不到。奇怪的很。



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1176404




相关文章:

相关链接: