再来说说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  蓝色的风之精灵  阅读(2990)  评论(9编辑  收藏  举报