Browse Source

添加qq接口

kindring 2 years ago
parent
commit
b64e579495
30 changed files with 844 additions and 0 deletions
  1. 1 0
      package.json
  2. 3 0
      src/app.ts
  3. 33 0
      src/types/goQQ/GeneralEventTypes.ts
  4. 60 0
      src/types/goQQ/GeneralPostType.ts
  5. 17 0
      src/types/goQQ/Mod/BaseModType.ts
  6. 13 0
      src/types/goQQ/Mod/MessageModType.ts
  7. 127 0
      src/types/goQQ/Mod/NoticeModType.ts
  8. 20 0
      src/types/goQQ/Mod/index.ts
  9. 18 0
      src/types/goQQ/PostMessageType/FriendMessageType.ts
  10. 35 0
      src/types/goQQ/PostMessageType/GroupMessageType.ts
  11. 18 0
      src/types/goQQ/PostMessageType/MessageSenderType.ts
  12. 27 0
      src/types/goQQ/PostNoticeType/ClientStatusUpdateType.ts
  13. 13 0
      src/types/goQQ/PostNoticeType/FriendAddType.ts
  14. 17 0
      src/types/goQQ/PostNoticeType/FriendMessageRecallType.ts
  15. 25 0
      src/types/goQQ/PostNoticeType/FriendPokeType.ts
  16. 21 0
      src/types/goQQ/PostNoticeType/GroupAdminUpdateType.ts
  17. 29 0
      src/types/goQQ/PostNoticeType/GroupBanType.ts
  18. 26 0
      src/types/goQQ/PostNoticeType/GroupCardUpdateType.ts
  19. 23 0
      src/types/goQQ/PostNoticeType/GroupEssenceType.ts
  20. 13 0
      src/types/goQQ/PostNoticeType/GroupHonorUpdateType.ts
  21. 18 0
      src/types/goQQ/PostNoticeType/GroupLuckyKingType.ts
  22. 25 0
      src/types/goQQ/PostNoticeType/GroupMemberDecreaseType.ts
  23. 25 0
      src/types/goQQ/PostNoticeType/GroupMemberIncreaseType.ts
  24. 25 0
      src/types/goQQ/PostNoticeType/GroupMessageRecallType.ts
  25. 22 0
      src/types/goQQ/PostNoticeType/GroupPokeType.ts
  26. 28 0
      src/types/goQQ/PostNoticeType/GroupUploadFileType.ts
  27. 25 0
      src/types/goQQ/PostNoticeType/ReceiveOfflineFileType.ts
  28. 71 0
      src/types/goQQ/Structure.ts
  29. 2 0
      src/webRouter/apiIndex.ts
  30. 64 0
      src/webRouter/qqHook.ts

+ 1 - 0
package.json

@@ -4,6 +4,7 @@
   "description": "> typescript",
   "dependencies": {
     "@types/morgan": "^1.9.4",
+    "body-parser": "^1.20.2",
     "express": "^4.18.2",
     "morgan": "^1.10.0",
     "nodemon": "^2.0.22",

+ 3 - 0
src/app.ts

@@ -1,4 +1,5 @@
 import express, { Application, Request, Response, NextFunction } from 'express'
+import bodyParser from 'body-parser';
 import {loadServerConfig} from './until/loadConfig'
 import logger from "./lib/logger"
 import morganMiddleware from './middleware/morganMiddleware'
@@ -13,6 +14,8 @@ function main():void{
     }
     const app:Application = express();
     app.use(morganMiddleware);
+    app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }));
+    app.use(bodyParser.json({ limit: '10mb' }));
     app.get('/', (req:Request, res:Response, next:NextFunction) => {
         res.send('Hello this website is a FC');
     });

+ 33 - 0
src/types/goQQ/GeneralEventTypes.ts

@@ -0,0 +1,33 @@
+export type GeneralEventTypes = 'message' | 'request' | 'notice' | 'meta_event';
+
+/**
+ * 消息上报子类型
+ */
+export type PostMessageType = 'group' | 'private';
+
+/**
+ * https://docs.go-cqhttp.org/reference/data_struct.html#post-notice-type
+ */
+export type PostNoticeType =
+    | 'group_upload'
+    | 'group_admin'
+    | 'group_decrease'
+    | 'group_increase'
+    | 'group_ban'
+    | 'friend_add'
+    | 'group_recall'
+    | 'friend_recall'
+    | 'group_card'
+    | 'offline_file'
+    | 'client_status'
+    | 'essence'
+    | 'notify';
+
+export type PostRequestType = 'friend' | 'group';
+
+/**
+ * 元事件类型.
+ */
+export type PostMetaEventType =
+    'lifecycle' // 生命周期
+    | 'heartbeat' // 心跳

+ 60 - 0
src/types/goQQ/GeneralPostType.ts

@@ -0,0 +1,60 @@
+import type {
+    GeneralEventTypes,
+    PostMessageType,
+    PostNoticeType,
+    PostRequestType,
+} from './GeneralEventTypes';
+import { MessageSender } from './PostMessageType/MessageSenderType';
+import {PostMetaEventType} from "./GeneralEventTypes";
+export type GeneralPost = {
+    /**
+     * 事件发生的时间戳
+     */
+    time: number;
+    /**
+     * 收到机器人的qq
+     */
+    self_id: number;
+    /**
+     * 上报的类型
+     */
+    post_type: GeneralEventTypes;
+    /**
+     * 绑定属性
+     */
+};
+
+export type GeneralMessagePost = GeneralPost & {
+    post_notice: 'message';
+    sub_type: string;
+    message_id: number;
+    user_id: number;
+    message: string;
+    raw_message: string;
+    font: number;
+    sender: MessageSender.Friend | MessageSender.Group;
+    /**
+     * 消息的类型
+     */
+    message_type: PostMessageType;
+};
+
+export type GeneralNoticePost = GeneralPost & {
+    post_type: 'notice';
+    notice_type: PostNoticeType;
+};
+
+
+export type NotifyTypePost = GeneralNoticePost & {
+    sub_type: 'honor' | 'poke' | 'lucky_king';
+};
+
+export type GeneralRequestPost = GeneralPost & {
+    post_type: 'request';
+    request_type: PostRequestType;
+};
+
+export type GeneralMetaPost = GeneralPost & {
+    post_type: 'meta_event';
+    post_MetaEvent_Type: PostMetaEventType;
+};

+ 17 - 0
src/types/goQQ/Mod/BaseModType.ts

@@ -0,0 +1,17 @@
+/**
+ * 白名单
+ * 名字
+ */
+export type BaseWhiteListModType = {
+	/**
+	 * 设置mod的name,便于监控
+	 */
+	name: string;
+	whiteList: number[] | false;
+};
+/**
+ * 名字
+ */
+export type BaseModType = {
+	name: string;
+};

+ 13 - 0
src/types/goQQ/Mod/MessageModType.ts

@@ -0,0 +1,13 @@
+import { FriendMessageType } from '../PostMessageType/FriendMessageType';
+import { GroupMessageType } from '../PostMessageType/GroupMessageType';
+import { BaseWhiteListModType } from './BaseModType';
+
+export type FriendMessageModType = BaseWhiteListModType & {
+	type: 'friendMessageMod';
+	handler: (msg: FriendMessageType) => void;
+};
+
+export type GroupMessageModType = BaseWhiteListModType & {
+	type: 'groupMessageMod';
+	handler: (msg: GroupMessageType) => void;
+};

+ 127 - 0
src/types/goQQ/Mod/NoticeModType.ts

@@ -0,0 +1,127 @@
+import { ClientStatusUpdateType } from '../PostNoticeType/ClientStatusUpdateType';
+import { FriendMessageRecallType } from '../PostNoticeType/FriendMessageRecallType';
+import { FriendPokeType } from '../PostNoticeType/FriendPokeType';
+import { GroupAdminUpdateType } from '../PostNoticeType/GroupAdminUpdateType';
+import { GroupBanType } from '../PostNoticeType/GroupBanType';
+import { GroupCardUpdateType } from '../PostNoticeType/GroupCardUpdateType';
+import { GroupHonorUpdateType } from '../PostNoticeType/GroupHonorUpdateType';
+import { GroupMemberDecreaseType } from '../PostNoticeType/GroupMemberDecreaseType';
+import { GroupMemberIncreaseType } from '../PostNoticeType/GroupMemberIncreaseType';
+import { GroupMessageRecallType } from '../PostNoticeType/GroupMessageRecallType';
+import { GroupPokeType } from '../PostNoticeType/GroupPokeType';
+import { GroupUploadFileType } from '../PostNoticeType/GroupUploadFileType';
+import { ReceiveOfflineFileType } from '../PostNoticeType/ReceiveOfflineFileType';
+import { BaseModType, BaseWhiteListModType } from './BaseModType';
+/**
+ * 客户端状态信息变更
+ */
+export type ClientStatusUpdateModType = BaseModType & {
+	type: 'clientStatusUpdateMod';
+	handler: (notice: ClientStatusUpdateType) => void;
+};
+/**
+ * 好友添加
+ */
+export type FriendAddModType = BaseModType & {
+	type: 'friendAddMod';
+	handler: (notice: ClientStatusUpdateType) => void;
+};
+
+/**
+ * 好友消息撤回
+ */
+export type FriendMessageRecallModType = BaseWhiteListModType & {
+	type: 'friendRecallMod';
+	handler: (notice: FriendMessageRecallType) => void;
+};
+/**
+ * 好友戳一戳
+ */
+export type FriendPokeModType = BaseWhiteListModType & {
+	type: 'friendPokeMod';
+	handler: (notice: FriendPokeType) => void;
+};
+/**
+ * 群管理员变更
+ */
+export type GroupAdminUpdateModType = BaseWhiteListModType & {
+	type: 'groupAdminUpdateMod';
+	handler: (notice: GroupAdminUpdateType) => void;
+};
+/**
+ * 群禁言
+ */
+export type GroupBanModType = BaseWhiteListModType & {
+	type: 'groupBanMod';
+	handler: (notice: GroupBanType) => void;
+};
+/**
+ * 群成员卡片更新
+ */
+export type GroupCardUpdateModType = BaseWhiteListModType & {
+	type: 'groupCardUpdateMod';
+	handler: (notice: GroupCardUpdateType) => void;
+};
+/**
+ * 群精华消息事件
+ */
+export type GroupEssenceModType = BaseWhiteListModType & {
+	type: 'groupEssenceMod';
+	handler: (notice: GroupEssenceModType) => void;
+};
+/**
+ * 群成员荣誉等级变更
+ */
+export type GroupHonorUpdateModType = BaseWhiteListModType & {
+	type: 'groupHonorUpdateMod';
+	handler: (notice: GroupHonorUpdateType) => void;
+};
+/**
+ * 群红包幸运王
+ */
+export type GroupLuckyKingModType = BaseWhiteListModType & {
+	type: 'groupLuckyKingMod';
+	handler: (notice: GroupLuckyKingModType) => void;
+};
+/**
+ * 群成员减少
+ */
+export type GroupMemberDecreaseModType = BaseWhiteListModType & {
+	type: 'groupMemberDecreaseMod';
+	handler: (notice: GroupMemberDecreaseType) => void;
+};
+/**
+ * 群成员增加
+ */
+export type GroupMemberIncreaseModType = BaseWhiteListModType & {
+	type: 'groupMemberIncreaseMod';
+	handler: (notice: GroupMemberIncreaseType) => void;
+};
+/**
+ * 群消息撤回
+ */
+export type GroupMessageRecallModType = BaseWhiteListModType & {
+	type: 'groupMessageRecallMod';
+	handler: (notice: GroupMessageRecallType) => void;
+};
+/**
+ * 群戳一戳
+ */
+export type GroupPokeModType = BaseWhiteListModType & {
+	type: 'groupPokeMod';
+	handler: (notice: GroupPokeType) => void;
+};
+/**
+ * 群文件上传
+ */
+export type GroupUploadFileModType = BaseWhiteListModType & {
+	type: 'groupUploadFileMod';
+	handler: (notice: GroupUploadFileType) => void;
+};
+/**
+ * 接受离线消息
+ */
+export type ReceiveOfflineFileModType = BaseWhiteListModType & {
+	type: 'receiveOfflineFileMod';
+	handler: (notice: ReceiveOfflineFileType) => void;
+};

+ 20 - 0
src/types/goQQ/Mod/index.ts

@@ -0,0 +1,20 @@
+export {
+	ClientStatusUpdateModType,
+	FriendAddModType,
+	FriendMessageRecallModType,
+	FriendPokeModType,
+	GroupAdminUpdateModType,
+	GroupBanModType,
+	GroupCardUpdateModType,
+	GroupEssenceModType,
+	GroupHonorUpdateModType,
+	GroupLuckyKingModType,
+	GroupMemberDecreaseModType,
+	GroupMemberIncreaseModType,
+	GroupMessageRecallModType,
+	GroupPokeModType,
+	GroupUploadFileModType,
+	ReceiveOfflineFileModType,
+} from './NoticeModType';
+
+export { FriendMessageModType, GroupMessageModType } from './MessageModType';

+ 18 - 0
src/types/goQQ/PostMessageType/FriendMessageType.ts

@@ -0,0 +1,18 @@
+import { GeneralMessagePost } from '../GeneralPostType';
+import { MessageSender } from './MessageSenderType';
+
+/**
+ * https://docs.go-cqhttp.org/api/#%E5%8F%91%E9%80%81%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF
+ */
+export type FriendMessageType = GeneralMessagePost & {
+	sub_type: 'friend' | 'group' | 'group_self' | 'other';
+	/**
+	 * 临时消息来源
+	 */
+	temp_source: number;
+	sender: MessageSender.Friend;
+	/**
+	 * 快速回复
+	 */
+	reply: (replyMessage: string | number, autoEscape?: boolean) => void;
+};

+ 35 - 0
src/types/goQQ/PostMessageType/GroupMessageType.ts

@@ -0,0 +1,35 @@
+import { GeneralMessagePost } from '../GeneralPostType';
+import { Anonymous } from '../Structure';
+import { MessageSender } from './MessageSenderType';
+
+/**
+ * https://docs.go-cqhttp.org/api/#%E5%8F%91%E9%80%81%E7%BE%A4%E6%B6%88%E6%81%AF
+ */
+export type GroupMessageType = GeneralMessagePost & {
+	sub_type: 'normal' | 'anonymous' | 'notice';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 匿名信息
+	 */
+	anonymous: Anonymous | null;
+	sender: MessageSender.Group;
+	/**
+	 * 快速回复
+	 */
+	reply: (
+		replyMessage: string | number,
+		isAt?: boolean,
+		// 撤销这条消息
+		isDelete?: boolean,
+		/**
+		 * 发送者踢出群聊
+		 */
+		isKick?: boolean,
+		ban?: boolean,
+		ban_duration?: number,
+		autoEscape?: boolean
+	) => void;
+};

+ 18 - 0
src/types/goQQ/PostMessageType/MessageSenderType.ts

@@ -0,0 +1,18 @@
+import { Role, Sex } from '../Structure';
+
+export namespace MessageSender {
+	type BaseSender = {
+		user_id: number;
+		nickname: string;
+		sex: Sex;
+		age: number;
+	};
+	export type Friend = BaseSender & {};
+	export type Group = BaseSender & {
+		card: string;
+		area: string;
+		level: string;
+		role: Role;
+		title: string;
+	};
+}

+ 27 - 0
src/types/goQQ/PostNoticeType/ClientStatusUpdateType.ts

@@ -0,0 +1,27 @@
+import { PostNoticeType } from '../GeneralEventTypes';
+
+/**
+ * 其他客户端在线状态变更
+ * https://docs.go-cqhttp.org/event/#%E5%85%B6%E4%BB%96%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%A8%E7%BA%BF%E7%8A%B6%E6%80%81%E5%8F%98%E6%9B%B4
+ */
+export type ClientStatusUpdateType = PostNoticeType & {
+	notice_type: 'client_status';
+	/**
+	 * 客户端信息
+	 */
+	client: {
+		/**
+		 * 客户端id
+		 */
+		app_id: number;
+		/**
+		 * 设备名称
+		 */
+		device_name: string;
+		/**
+		 * 设备类型
+		 */
+		device_kind: string;
+	};
+	online: boolean;
+};

+ 13 - 0
src/types/goQQ/PostNoticeType/FriendAddType.ts

@@ -0,0 +1,13 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 好友添加
+ * https://docs.go-cqhttp.org/event/#%E5%A5%BD%E5%8F%8B%E6%B7%BB%E5%8A%A0
+ */
+export type FriendAddType = GeneralNoticePost & {
+	notice_type: 'friend_add';
+	/**
+	 * 新添加好友的qq
+	 */
+	user_id: number;
+};

+ 17 - 0
src/types/goQQ/PostNoticeType/FriendMessageRecallType.ts

@@ -0,0 +1,17 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 好友消息撤回
+ * https://docs.go-cqhttp.org/event/#%E5%A5%BD%E5%8F%8B%E6%B6%88%E6%81%AF%E6%92%A4%E5%9B%9E
+ */
+export type FriendMessageRecallType = GeneralNoticePost & {
+	notice_type: 'friend_recall';
+	/**
+	 * 好友qq
+	 */
+	use_id: number;
+	/**
+	 * 被撤回的消息id
+	 */
+	message_id: number;
+};

+ 25 - 0
src/types/goQQ/PostNoticeType/FriendPokeType.ts

@@ -0,0 +1,25 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * https://docs.go-cqhttp.org/event/#%E5%A5%BD%E5%8F%8B%E6%88%B3%E4%B8%80%E6%88%B3
+ * 好友戳一戳
+ */
+export type FriendPokeType = GeneralNoticePost & {
+	notice_type: 'notify';
+	/**
+	 * 戳一戳
+	 */
+	sub_type: 'poke';
+	/**
+	 * 发送者qq
+	 */
+	sender_id: number;
+	/**
+	 * 发送者qq
+	 */
+	user_id: number;
+	/**
+	 * 被戳者qq
+	 */
+	target_id: number;
+};

+ 21 - 0
src/types/goQQ/PostNoticeType/GroupAdminUpdateType.ts

@@ -0,0 +1,21 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群管理员变动
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E7%AE%A1%E7%90%86%E5%91%98%E5%8F%98%E5%8A%A8
+ */
+export type GroupAdminUpdateType = GeneralNoticePost & {
+	notice_type: 'group_admin';
+	/**
+	 * 设置 或 取消设置管理员
+	 */
+	sub_type: 'set' | 'unset';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 管理员qq
+	 */
+	user_id: number;
+};

+ 29 - 0
src/types/goQQ/PostNoticeType/GroupBanType.ts

@@ -0,0 +1,29 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群禁言
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E7%A6%81%E8%A8%80
+ */
+export type GroupBanType = GeneralNoticePost & {
+	notice_type: 'group_ban';
+	/**
+	 * 禁言、解除禁言
+	 */
+	sub_type: 'ban' | 'lift_ban';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 操作者qq
+	 */
+	operator_id: number;
+	/**
+	 * 被禁言qq
+	 */
+	user_id: number;
+	/**
+	 * 禁言时长 秒
+	 */
+	duration: number;
+};

+ 26 - 0
src/types/goQQ/PostNoticeType/GroupCardUpdateType.ts

@@ -0,0 +1,26 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群成员名片更新。仅在收到消息时校验卡片
+ * 当名片为空时 card_xx 字段为空字符串, 并不是昵称
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E6%88%90%E5%91%98%E5%90%8D%E7%89%87%E6%9B%B4%E6%96%B0
+ */
+export type GroupCardUpdateType = GeneralNoticePost & {
+	notice_type: 'group_card';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 成员id
+	 */
+	user_id: number;
+	/**
+	 * 新名片
+	 */
+	card_new: string;
+	/**
+	 * 旧名片
+	 */
+	card_old: string;
+};

+ 23 - 0
src/types/goQQ/PostNoticeType/GroupEssenceType.ts

@@ -0,0 +1,23 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+/**
+ * 精华消息
+ */
+export type GroupEssenceType = GeneralNoticePost & {
+	notice_type: 'essence';
+	/**
+	 * 添加精华消息、移除精华消息
+	 */
+	sub_type: 'add' | 'delete';
+	/**
+	 * 消息发送者id
+	 */
+	sender_id: number;
+	/**
+	 * 操作者id
+	 */
+	operator_id: number;
+	/**
+	 * 消息id
+	 */
+	message_id: number;
+};

+ 13 - 0
src/types/goQQ/PostNoticeType/GroupHonorUpdateType.ts

@@ -0,0 +1,13 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+import { GroupHonorType } from '../Structure';
+
+/**
+ * 群内荣誉等级变更提示
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E6%88%90%E5%91%98%E8%8D%A3%E8%AA%89%E5%8F%98%E6%9B%B4%E6%8F%90%E7%A4%BA
+ */
+export type GroupHonorUpdateType = GeneralNoticePost & {
+	notice_type: 'notify';
+	sub_type: 'honor';
+	user_id: number;
+	honor_type: GroupHonorType;
+};

+ 18 - 0
src/types/goQQ/PostNoticeType/GroupLuckyKingType.ts

@@ -0,0 +1,18 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+export type GroupLuckyKingType = GeneralNoticePost & {
+	notice_type: 'notify';
+	sub_type: 'lucky_king';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 红包发送者qq
+	 */
+	user_id: number;
+	/**
+	 * 运气王qq
+	 */
+	target_id: number;
+};

+ 25 - 0
src/types/goQQ/PostNoticeType/GroupMemberDecreaseType.ts

@@ -0,0 +1,25 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群成员减少
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E6%88%90%E5%91%98%E5%87%8F%E5%B0%91
+ */
+export type GroupMemberDecreaseType = GeneralNoticePost & {
+	notice_type: 'group_decrease';
+	/**
+	 * 主动退群、成员被踢、自己被踢
+	 */
+	sub_type: 'leave' | 'kick' | 'kick_me';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 操作者qq 如果是主动退群,则和use_id相等
+	 */
+	operator_id: number;
+	/**
+	 * 离开号qq
+	 */
+	user_id: number;
+};

+ 25 - 0
src/types/goQQ/PostNoticeType/GroupMemberIncreaseType.ts

@@ -0,0 +1,25 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群成员增加
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E6%88%90%E5%91%98%E5%A2%9E%E5%8A%A0
+ */
+export type GroupMemberIncreaseType = GeneralNoticePost & {
+	notice_type: 'group_increase';
+	/**
+	 * 管理员已同意入群、管理员邀请入群
+	 */
+	sub_type: 'approve' | 'invite';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 操作者qq
+	 */
+	operator_id: number;
+	/**
+	 * 加入者qq
+	 */
+	user_id: number;
+};

+ 25 - 0
src/types/goQQ/PostNoticeType/GroupMessageRecallType.ts

@@ -0,0 +1,25 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群消息撤回
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E6%B6%88%E6%81%AF%E6%92%A4%E5%9B%9E
+ */
+export type GroupMessageRecallType = GeneralNoticePost & {
+	notice_type: 'group_recall';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 消息发送者QQ
+	 */
+	user_id: number;
+	/**
+	 * 操作人QQ
+	 */
+	operator_id: number;
+	/**
+	 * 被撤回的消息的id
+	 */
+	message_id: number;
+};

+ 22 - 0
src/types/goQQ/PostNoticeType/GroupPokeType.ts

@@ -0,0 +1,22 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * 群内戳一戳
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E5%86%85%E6%88%B3%E4%B8%80%E6%88%B3
+ */
+export type GroupPokeType = GeneralNoticePost & {
+	notice_type: 'notify';
+	sub_type: 'poke';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 发送者qq
+	 */
+	user_id: number;
+	/**
+	 * 被戳者qq
+	 */
+	target_id: number;
+};

+ 28 - 0
src/types/goQQ/PostNoticeType/GroupUploadFileType.ts

@@ -0,0 +1,28 @@
+import { GeneralNoticePost } from '../GeneralPostType';
+
+/**
+ * https://docs.go-cqhttp.org/event/#%E7%BE%A4%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0
+ */
+export type GroupUploadFileType = GeneralNoticePost & {
+	notice_type: 'group_upload';
+	/**
+	 * 群号
+	 */
+	group_id: number;
+	/**
+	 * 发送者qq
+	 */
+	user_id: number;
+	file: {
+		id: string;
+		name: string;
+		/**
+		 * 字节数
+		 */
+		size: number;
+		/**
+		 * 暂时不知道有什么用
+		 */
+		busid: number;
+	};
+};

+ 25 - 0
src/types/goQQ/PostNoticeType/ReceiveOfflineFileType.ts

@@ -0,0 +1,25 @@
+import { GeneralPost } from '../GeneralPostType';
+
+export type ReceiveOfflineFileType = GeneralPost & {
+	/**
+	 * 发送者qq
+	 */
+	user_id: number;
+	/**
+	 * 文件数据
+	 */
+	file: {
+		/**
+		 * 文件名
+		 */
+		name: string;
+		/**
+		 * 文件大小
+		 */
+		size: number;
+		/**
+		 * 下载链接
+		 */
+		url: string;
+	};
+};

+ 71 - 0
src/types/goQQ/Structure.ts

@@ -0,0 +1,71 @@
+export type Sex = 'male' | 'female' | 'unknown';
+export type Role = 'owner' | 'admin' | 'member';
+/**
+ * 群荣誉类型
+ */
+export type GroupHonorType =
+	| 'talkative'
+	| 'performer'
+	| 'legend'
+	| 'strong_newbie'
+	| 'emotion';
+/**
+ * 匿名消息对象
+ */
+export type Anonymous = {
+	id: number;
+	name: string;
+	flase: string;
+};
+
+/**
+ * 合并消息转发节点
+ */
+export type ForwardNode = {
+	id: number;
+	name: string;
+	/**
+	 * 发送者qq
+	 */
+	uin: number;
+	content: string;
+	seq: string;
+};
+
+/**
+ * 合并转发消息内容
+ */
+export type ForwardMessage = {
+	content: string;
+	sender: {
+		nickname: string;
+		user_id: number;
+	};
+	time: number;
+};
+
+/**
+ * https://docs.go-cqhttp.org/api/#%E8%8E%B7%E5%8F%96%E7%BE%A4%E6%96%87%E4%BB%B6%E8%B5%84%E6%BA%90%E9%93%BE%E6%8E%A5
+ */
+export type File = {
+	group_id: number;
+	file_id: string;
+	file_name: string;
+	busid: number;
+	file_size: number;
+	upload_time: number;
+	dead_time: number;
+	modify_time: number;
+	download_times: number;
+	uploader: number;
+	uploader_name: number;
+};
+export type Folder = {
+	group_id: number;
+	folder_id: string;
+	folder_name: string;
+	create_time: number;
+	creator: number;
+	creator_name: string;
+	total_file_count: number;
+};

+ 2 - 0
src/webRouter/apiIndex.ts

@@ -1,6 +1,8 @@
 // const router = require('express').Router();
 import {Router} from "express"
 import fs from "./fs"
+import qqHook from "./qqHook";
 const router = Router();
 router.use("/fs",fs);
+router.use("/iq",qqHook);
 export default router;

+ 64 - 0
src/webRouter/qqHook.ts

@@ -0,0 +1,64 @@
+import {Router} from "express"
+
+import logger from "../lib/logger"
+import errCode from "../types/IErrorCode";
+import {createCheckHandle} from "../middleware/checkParamsMiddleware"
+import {loadFileConfig} from "../until/loadConfig";
+import {GeneralPost, GeneralMessagePost, GeneralMetaPost, GeneralNoticePost} from "../types/goQQ/GeneralPostType";
+import {ReceiveOfflineFileModType} from "../types/goQQ/Mod"
+const router = Router();
+
+router.use('/b',((req, res) => {
+    // 1. 事件类型处理
+    // 2. 执行不同函数
+    const data: GeneralPost = req.body;
+    switch (data.post_type){
+        case "message":
+            const message: GeneralMessagePost = data as any;
+
+            if (message.message_type === 'private') {
+                // bindFriendMessageReply(CqWebsocket, message as FriendMessageType);
+                // friendMessageHandler(message as any);
+                logger.info(`收到用户${message.user_id}信息${message.message}`);
+            } else if (message.message_type === 'group') {
+                logger.info(`收到群聊${message.user_id}信息${message.message}`);
+                // bindGroupMessageReply(CqWebsocket, message as GroupMessageType);
+                // groupMessageHandler(message as any);
+            }
+            break
+        case "meta_event":
+            // logger.info(`收到群聊${message.user_id}信息${message.message}`);
+            const GeneralMeta: GeneralMetaPost = data as any;
+            logger.info(GeneralMeta);
+            logger.info(`收到元数据,含义${GeneralMeta.post_MetaEvent_Type==='heartbeat'?'心跳':'生命周期'}`)
+            break
+        case "notice":
+            const noticeData: GeneralNoticePost = data as any;
+
+            logger.info(noticeData);
+            if(noticeData.notice_type === 'offline_file'){
+                // const offline: ReceiveOfflineFileType = noticeData
+                const receiveOfflineMods: ReceiveOfflineFileModType[] = [];
+                // logger.info(`收到用户${noticeData.user_id}的离线文件`)
+                receiveOfflineMods.forEach((item : ReceiveOfflineFileModType)=>{
+                    logger.info(`离线文件: ${item.name}`)
+                    logger.info(item);
+                })
+
+            }
+            break
+        case "request":
+            break
+    }
+    // switch (jsonData.Post_Type) {
+    //
+    // }
+    res.json(errCode.SUCCESS);
+}));
+
+router.use('*',((req, res) => {
+    logger.info(req.query);
+    logger.info(req.body);
+    res.json(errCode.SUCCESS);
+}));
+export default router;