# 送信接口-getter `setter`是在`MsgSender`送信器中的常量:`GETTER`。`getter`的真实包路径和接口类型为`com.forte.qqrobot.sender.senderlist.SenderGetList`。 它在与接口的主要作用是获取一些信息,例如群成员列表等等。 >[warning] ***所有返回值为布尔类型的方法均代表消息是否发送成功*** >[warning] ***因为是获取信息,则必然会有返回值,而关于返回值的内容我将会写在本章节的子章节'返回值'中。*** ## **API方法** 以下为各个API以及其参数的类型、含义: * **取匿名成员信息** `AnonInfo getAnonInfo(String flag);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `flag` | `String` | 匿名标识 | >[success] 返回值:AnonInfo 匿名成员信息 <br> * **获取权限信息** `AuthInfo getAuthInfo();` | 参数 | 类型 | 含义 | | --- | --- | --- | | 无 | | | >[success] 返回值:AuthInfo 权限信息 <br> * **获取封禁成员列表** `BanList getBanList(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:BanList 封禁列表 <br> * **获取群文件信息** `FileInfo getFileInfo(String flag);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `flag` | `String` | 文件标识 | >[success] 返回值:FileInfo 群文件信息 <br> * **获取好友列表** `FriendList getFriendList();` | 参数 | 类型 | 含义 | | --- | --- | --- | | 无 | | | >[success] 返回值:FriendList 好友列表 <br> * **取群作业列表** `GroupHomeworkList getGroupHomeworkList(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:GroupHomeworkList 群作业列表 <br> * **取群信息** `GroupInfo getGroupInfo(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:GroupInfo 群信息 <br> * **取群链接列表** `GroupLinkList getGroupLinkList(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:GroupLinkList群链接列表 <br> * **取群列表** `GroupList getGroupList();` | 参数 | 类型 | 含义 | | --- | --- | --- | | 无 | | | >[success] 返回值:GroupList 群列表 <br> * **取群成员信息** `GroupMemberInfo getGroupMemberInfo(String group, String QQ);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | | `QQ` | `String` | QQ号 | >[success] 返回值:GroupMemberInfo 群成员信息 <br> * **取群成员列表** `GroupMemberList getGroupMemberList(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:GroupMemberList 群成员列表 <br> * **取群公告列表** `GroupNoteList getGroupNoteList(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:GroupNoteList 群公告列表 <br> * **取置顶群公告** `GroupTopNote getGroupTopNote(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:GroupTopNote 置顶群公告 <br> * **获取图片信息** `ImageInfo getImageInfo(String flag);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `flag` | `String` | 图片文件名或标识 | >[success] 返回值:ImageInfo 图片信息 <br> * **获取登录的QQ的信息** `LoginQQInfo getLoginQQInfo();` | 参数 | 类型 | 含义 | | --- | --- | --- | | 无 | | | >[success] 返回值:LoginQQInfo 登录的QQ的信息 <br> * **获取群共享文件列表** `ShareList getShareList(String group);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `group` | `String` | 群号 | >[success] 返回值:ShareList 群共享文件列表 <br> * **取陌生人信息** `StrangerInfo getStrangerInfo(String QQ);` | 参数 | 类型 | 含义 | | --- | --- | --- | | `QQ` | `String` | 陌生人的QQ号 | >[success] 返回值:StrangerInfo 陌生人信息 <br> ## **缓存转化** 在一次测试中发现,这部分获取各种信息的API如果在高频获取的情况下(例如说for循环连续获取100次)会腾讯暂时屏蔽,也就是说假如你获取的频率过高则将会有一段时间无法获取信息。 同时我也发现,为了避免这种情况,很多插件提供的接口都可以选择是否使用缓存( 例如HTTP API ),但是每次获取的时候都要填入额外的参数着实令人有些不爽。 于是在适配插件提供的缓存方法之外,我对`MsgSender`中的`GETTER`做了一些小小的修改,并提供了部分API来使得`GETTER`可以支持缓存。 >[info] 缓存的底层原理是通过`LocalDateTime`和动态代理来实现方法的返回值暂存。 在列举缓存API之前,我先提供一个最简单的实例代码: ```java //获取某个群的信息 GroupInfo groupInfo = sender.GETTER.cache().getGroupInfo("123456789"); ``` 通过以上代码可以发现,相对于以前对于`GETTER`的使用,这段代码在获取所需内容之前多了一个`cache()`方法。这个`cache`方法便是获取一个缓存GETTER。 ***以下为获取缓存GETTER的全部API:*** >[success] 所有的缓存API的返回值均为`GETTER`自身 * `**cache()`** | 参数 | 类型 | 含义 | | --- | --- | --- | | 无 | 无 | 无 | >[success] 当不存在参数时候,默认缓存时长为 缓存1小时 * `**cache(long time)`** | 参数 | 类型 | 含义 | | --- | --- | --- | | `time` | `long` | 缓存保存的秒时长 | >[success] 当仅存在一个long类型的time时,将默认认为此时间为秒值 * `**cache(long time, CacheTypes cacheTypes)`** | 参数 | 类型 | 含义 | | --- | --- | --- | | `time` | `long` | 缓存保存的时长 | | `cacheTypes` | `CacheTypes` | 指定缓存时长的时间类型,枚举类型,详情请查阅枚举章节 | >[success] 同时置顶时间长度和时间类型,是最完整的参数API,也推荐有时间需求的时候使用此API * `**cache(LocalDateTime to)`** | 参数 | 类型 | 含义 | | --- | --- | --- | | `to` | `LocalDateTime` | 一个指定的过期时间 | >[success] 使用LocalDateTime对象指定一个具体的过期时间。关于LocalDateTime的使用方式请百度`java8 LocalDateTime` 或使用其他方式查阅相关资料 ### **注意事项** >[danger] #### ※1. 缓存转化存在一个弊端,即假如某个getxxxxx方法是需要使用参数的,当你变更参数的时候缓存的内容并不会改变。也就是说,你第一次获取了QQ号为123456的信息,然后第二次获取666666的信息,由于缓存的影响将依旧获取到123456的信息。 > 这个问题将会在后续中修复,但是由于影响不是很大所以可能并不会立即修复。 >[danger] #### ※2. 由于缓存转化机制的原理限制,当你想要进行缓存转化的时候,请尽可能使这个GETTER始终使用在**同一个线程内**。 >[danger] #### ※3. 因为了解到了\`LocalThread\`的漏洞,目前暂时为以上缓存方法标注了过时,暂时**弃用**。并非不可使用,但是可能会造成**严重的资源浪费**。