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

  • 相关阅读:
    codeforces #595 div3 题解
    codeforces #593 div2 ABCD 题解
    codeforces #594 div2 ABCD1F
    codeforces gym102040 前四题签到题解
    struts2.5 使用i18n国际化时中文乱码的一种解决方案
    2019 南昌 ICPC网络赛 H The Nth Item (矩阵快速幂/二次剩余+记忆化)
    Cubes UVA10601 POLYA定理
    TODO-LIST
    线性基模板整理
    2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)
  • 原文地址:https://www.cnblogs.com/lersh/p/1176404.html
Copyright © 2020-2023  润新知