UNPKG

@ikenxuan/amagi

Version:

抖音、B站的 web 端相关数据接口基于 Node.js 的实现

1,740 lines (1,739 loc) 713 kB
import { EventEmitter } from "node:events"; import zod from "zod"; import { AxiosRequestConfig, AxiosResponse, RawAxiosResponseHeaders } from "axios"; import { ChalkInstance } from "chalk"; import express from "express"; //#region src/platform/bilibili/sign/wbi.d.ts /** * 对请求链接进行 WBI 签名 * @param BASEURL - 完整的请求地址,可以是字符串或 URL 对象 * @param cookie - 有效的用户 Cookie 字符串 * @returns 返回包含 WBI 签名的查询字符串 * @throws 当获取 WBI 密钥失败或 URL 解析失败时抛出错误 */ declare const wbi_sign: (BASEURL: string | URL, cookie: string) => Promise<string>; //#endregion //#region src/platform/bilibili/sign/bv2av.d.ts /** * av号转bv号 * @param aid av号 * @returns */ declare const av2bv: (aid: number) => `BV1${string}`; /** * bv号转av号 * @param bvid bv号 * @returns */ declare const bv2av: (bvid: string) => number; //#endregion //#region src/types/ReturnDataType/Bilibili/ProtobufDanmaku/ProtobufDanmaku_V0.d.ts type BiliProtobufDanmaku_V0 = { code: number; data: DataData$28; message: string; [property: string]: any; }; type DataData$28 = { elems: Elem[]; [property: string]: any; }; type Elem = { action: string; animation: string; attr: number; color: number; content: string; ctime: string; fontsize: number; id: string; idStr: string; midHash: string; mode: number; pool: number; progress: number; weight: number; [property: string]: any; }; //#endregion //#region src/types/ReturnDataType/Bilibili/ProtobufDanmaku/index.d.ts type BiliProtobufDanmaku = BiliProtobufDanmaku_V0; //#endregion //#region src/platform/bilibili/sign/danmaku_proto.d.ts /** * 解析弹幕分段响应 * @param data - 二进制 protobuf 数据 * @returns 解析后的弹幕数据 */ declare function parseDmSegMobileReply(data: ArrayBuffer | Uint8Array): BiliProtobufDanmaku['data']['elems'][number]; //#endregion //#region src/types/BilibiliAPIParams.d.ts /** * B站 API 参数类型定义 * * 定义所有 B站 API 方法的参数接口和类型映射 * * @module types/BilibiliAPIParams */ /** * B站 API 方法参数映射接口 * * 每个键对应一种 API 方法,值为该方法所需的参数接口 */ interface BilibiliMethodOptionsMap { /** 获取单个视频信息 */ VideoInfoParams: { methodType: 'videoInfo'; /** 稿件BVID */ bvid: string; }; /** 获取视频流下载信息 */ VideoStreamParams: { methodType: 'videoStream'; /** 稿件AVID */ avid: number; /** 稿件cid */ cid: number; }; /** 获取评论数据 */ CommentParams: { methodType: 'comments'; /** 评论区类型代码,详见 [评论区类型代码](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/readme.md#%E8%AF%84%E8%AE%BA%E5%8C%BA%E7%B1%BB%E5%9E%8B%E4%BB%A3%E7%A0%81) */ type: CommentType; /** 稿件ID,也就是AV号去除前缀后的内容 */ oid: string; /** * 获取的评论数量,默认20 * @defaultValue 20 */ number?: number; /** * 排序方式 * 默认为3 * 0和3: 仅热度 * 1: 按热度+按时间 * 2: 仅时间 * @defaultValue 3 */ mode?: 0 | 1 | 2 | 3; /** * 翻页信息,用于懒加载分页 * 首次请求时不传,后续请求使用上次响应中的 data.cursor.pagination_reply.next_offset */ pagination_str?: string; /** * 平台类型 * @defaultValue 1 */ plat?: number; /** 当获取第一页评论时存在 */ seek_rpid?: string; /** * web位置参数 * @defaultValue 1315875 */ web_location?: string; }; /** 获取指定评论的回复 */ CommentReplyParams: { methodType: 'commentReplies'; /** 评论区类型代码,详见 [评论区类型代码](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/readme.md#%E8%AF%84%E8%AE%BA%E5%8C%BA%E7%B1%BB%E5%9E%8B%E4%BB%A3%E7%A0%81) */ type: CommentType; /** 目标评论区 ID,也就是AV号去除前缀后的内容 */ oid: string; /** 根评论ID */ root: string; /** * 获取的评论数量,默认20 * @defaultValue 20 */ number?: number; }; /** 获取用户相关数据 */ UserParams: { methodType: 'userCard' | 'userDynamicList' | 'uploaderTotalViews' | 'userSpaceInfo'; /** UP主UID */ host_mid: number; }; /** 获取动态数据 */ DynamicParams: { methodType: 'dynamicDetail' | 'dynamicCard'; /** 动态ID */ dynamic_id: string; }; /** 获取番剧基本信息 */ BangumiInfoParams: { methodType: 'bangumiInfo'; /** 稿件ep_id,其含义为 {@link https://www.bilibili.com/anime/index | 番剧索引} 或 **我的追番** 中的番剧,对应网址中包含ss号,如:{@link https://www.bilibili.com/bangumi/play/ss33802} */ season_id?: string; /** 稿件ep_id,番剧的某一集,对应网址中包含ep号,如:{@link https://www.bilibili.com/bangumi/play/ep330798} */ ep_id?: string; }; /** 获取番剧视频流信息 */ BangumiStreamParams: { methodType: 'bangumiStream'; /** 稿件cid */ cid: number; /** 稿件ep_id,番剧的某一集,对应网址中包含ep号,如:{@link https://www.bilibili.com/bangumi/play/ep330798} */ ep_id: string; }; /** 获取直播间信息 */ LiveRoomParams: { methodType: 'liveRoomInfo' | 'liveRoomInit'; /** 直播间ID */ room_id: string; }; /** 查询二维码状态 */ QrcodeParams: { methodType: 'qrcodeStatus'; /** 扫码登录秘钥 */ qrcode_key: string; }; /** 获取表情列表 */ EmojiParams: { methodType: 'emojiList'; }; /** 获取登录基本信息 */ LoginBaseInfoParams: { methodType: 'loginStatus'; }; /** 申请登录二维码 */ GetQrcodeParams: { methodType: 'loginQrcode'; }; /** BV号转AV号 */ Bv2AvParams: { methodType: 'bvToAv'; /** 视频BV号 */ bvid: string; }; /** AV号转BV号 */ Av2BvParams: { methodType: 'avToBv'; /** 视频AV号 */ avid: number; }; /** 获取专栏正文内容 */ ArticleParams: { methodType: 'articleContent'; /** * 专栏ID * 如:{@link https://www.bilibili.com/read/cv43496899/?jump_opus=1} * 43496899 就是专栏ID * API Docs {@link https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/article/view.md#获取专栏正文内容} */ id: string; }; /** 获取专栏显示卡片信息 */ ArticleCardParams: { methodType: 'articleCards'; /** * 被查询的 id 列表 * 可传视频 **完整** AV/BV 号, 专栏 CV 号, 直播间长短 lv 号 * API Docs {@link https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/article/card.md#获取专栏显示卡片信息} */ ids: string[] | string; }; /** 获取专栏文章基本信息 */ ArticleInfoParams: { methodType: 'articleInfo'; /** * 专栏ID * 如:{@link https://www.bilibili.com/read/cv43496899/?jump_opus=1} * 43496899 就是专栏ID * API Docs {@link https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/article/view.md#获取专栏文章基本信息} */ id: string; }; /** 获取文集基本信息 */ ColumnInfoParams: { methodType: 'articleListInfo'; /** * 文集rlid * 如:{@link https://www.bilibili.com/read/cv208340/?jump_opus=1} * 208340 就是文集rlid * API Docs {@link https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/article/articles.md#获取文集基本信息} */ id: string; }; /** * 获取实时弹幕 * @see https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/danmaku/danmaku_proto.md */ DanmakuParams: { methodType: 'videoDanmaku'; /** 稿件cid */ cid: number; /** * 分段序号(从1开始),每6分钟为一段 * @defaultValue 1 */ segment_index?: number; }; /** 从 v_voucher 申请验证码 */ ApplyVoucherCaptchaParams: { methodType: 'captchaFromVoucher'; /** CSRF Token (位于 Cookie 的 bili_jct) */ csrf?: string; /** 结构为字符串 voucher_ 尾随一串以 - 为分隔符的小写 UUID */ v_voucher: string; }; /** 验证验证码结果 */ ValidateCaptchaParams: { methodType: 'validateCaptcha'; /** CSRF Token (位于 Cookie 的 bili_jct) */ csrf?: string; /** 极验3 https://www.geetest.com 的验证码 challenge */ challenge: string; /** 验证码 token */ token: string; /** 人机验证成功后的 validate 参数 */ validate: string; /** 人机验证成功后的 seccode 参数,{validate}|jordan */ seccode: string; }; } /** * 评论区类型枚举 * * 对应 CommentParams.type 与 CommentReplyParams.type * @see https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/comment/readme.md#评论区类型代码 */ declare enum CommentType { /** 视频稿件:oid 为稿件 avid */ Video = 1, /** 话题:oid 为话题 id */ Topic = 2, /** 活动:oid 为活动 id */ Activity = 4, /** 小视频:oid 为小视频 id */ SmallVideo = 5, /** 小黑屋封禁信息:oid 为封禁公示 id */ BlockInfo = 6, /** 公告信息:oid 为公告 id */ Announcement = 7, /** 直播活动:oid 为直播间 id */ LiveActivity = 8, /** 活动稿件:oid 含义未知 */ ActivityVideo = 9, /** 直播公告:oid 含义未知 */ LiveAnnouncement = 10, /** 相簿(图片动态):oid 为相簿 id */ Album = 11, /** 专栏:oid 为专栏 cvid */ Article = 12, /** 票务:oid 含义未知 */ Ticket = 13, /** 音频:oid 为音频 auid */ Audio = 14, /** 风纪委员会:oid 为众裁项目 id */ Jury = 15, /** 点评:oid 含义未知 */ Review = 16, /** 动态(纯文字动态&分享):oid 为动态 id */ Dynamic = 17, /** 播单:oid 含义未知 */ Playlist = 18, /** 音乐播单:oid 含义未知 */ MusicPlaylist = 19, /** 漫画:oid 含义未知 */ Comic1 = 20, /** 漫画:oid 含义未知 */ Comic2 = 21, /** 漫画:oid 为漫画 mcid */ Comic = 22, /** 课程:oid 为课程 epid */ Course = 33 } /** * B站方法类型到参数的映射 * * 用于根据 methodType 字符串获取对应的参数类型 */ type BilibiliMethodOptMap = { videoInfo: BilibiliMethodOptionsMap['VideoInfoParams']; videoStream: BilibiliMethodOptionsMap['VideoStreamParams']; comments: BilibiliMethodOptionsMap['CommentParams']; commentReplies: BilibiliMethodOptionsMap['CommentReplyParams']; userCard: BilibiliMethodOptionsMap['UserParams']; userDynamicList: BilibiliMethodOptionsMap['UserParams']; userSpaceInfo: BilibiliMethodOptionsMap['UserParams']; uploaderTotalViews: BilibiliMethodOptionsMap['UserParams']; emojiList: BilibiliMethodOptionsMap['EmojiParams']; bangumiInfo: BilibiliMethodOptionsMap['BangumiInfoParams']; bangumiStream: BilibiliMethodOptionsMap['BangumiStreamParams']; dynamicDetail: BilibiliMethodOptionsMap['DynamicParams']; dynamicCard: BilibiliMethodOptionsMap['DynamicParams']; liveRoomInfo: BilibiliMethodOptionsMap['LiveRoomParams']; liveRoomInit: BilibiliMethodOptionsMap['LiveRoomParams']; loginStatus: BilibiliMethodOptionsMap['LoginBaseInfoParams']; loginQrcode: BilibiliMethodOptionsMap['GetQrcodeParams']; qrcodeStatus: BilibiliMethodOptionsMap['QrcodeParams']; avToBv: BilibiliMethodOptionsMap['Av2BvParams']; bvToAv: BilibiliMethodOptionsMap['Bv2AvParams']; articleContent: BilibiliMethodOptionsMap['ArticleParams']; articleCards: BilibiliMethodOptionsMap['ArticleCardParams']; articleInfo: BilibiliMethodOptionsMap['ArticleInfoParams']; articleListInfo: BilibiliMethodOptionsMap['ColumnInfoParams']; captchaFromVoucher: BilibiliMethodOptionsMap['ApplyVoucherCaptchaParams']; validateCaptcha: BilibiliMethodOptionsMap['ValidateCaptchaParams']; videoDanmaku: BilibiliMethodOptionsMap['DanmakuParams']; }; //#endregion //#region src/validation/bilibili.d.ts /** 视频信息参数验证 */ declare const BilibiliVideoParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['VideoInfoParams']>; /** 视频流参数验证 */ declare const BilibiliVideoDownloadParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['VideoStreamParams']>; /** 评论参数验证 */ declare const BilibiliCommentParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['CommentParams']>; /** 评论回复参数验证 */ declare const BilibiliCommentReplyParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['CommentReplyParams']>; /** 用户参数验证 */ declare const BilibiliUserParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['UserParams']>; /** 表情参数验证 */ declare const BilibiliEmojiParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['EmojiParams']>; /** 番剧信息参数验证 */ declare const BilibiliBangumiInfoParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['BangumiInfoParams']>; /** 番剧流参数验证 */ declare const BilibiliBangumiStreamParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['BangumiStreamParams']>; /** 动态参数验证 */ declare const BilibiliDynamicParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['DynamicParams']>; /** 直播间参数验证 */ declare const BilibiliLiveParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['LiveRoomParams']>; /** 登录状态参数验证 */ declare const BilibiliLoginParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['LoginBaseInfoParams']>; /** 申请二维码参数验证 */ declare const BilibiliQrcodeParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['GetQrcodeParams']>; /** 二维码状态参数验证 */ declare const BilibiliQrcodeStatusParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['QrcodeParams']>; /** AV转BV参数验证 */ declare const BilibiliAv2BvParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['Av2BvParams']>; /** BV转AV参数验证 */ declare const BilibiliBv2AvParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['Bv2AvParams']>; /** 专栏内容参数验证 */ declare const BilibiliArticleParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['ArticleParams']>; /** 专栏卡片参数验证 */ declare const BilibiliArticleCardParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['ArticleCardParams']>; /** 专栏信息参数验证 */ declare const BilibiliArticleInfoParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['ArticleInfoParams']>; /** 文集信息参数验证 */ declare const BilibiliColumnInfoParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['ColumnInfoParams']>; /** 验证码申请参数验证 */ declare const BilibiliApplyCaptchaParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['ApplyVoucherCaptchaParams']>; /** 验证码验证参数验证 */ declare const BilibiliValidateCaptchaParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['ValidateCaptchaParams']>; /** 弹幕参数验证 */ declare const BilibiliDanmakuParamsSchema: zod.ZodType<BilibiliMethodOptionsMap['DanmakuParams']>; /** B站参数验证模式映射 */ declare const BilibiliValidationSchemas: { readonly videoInfo: zod.ZodType<{ methodType: "videoInfo"; bvid: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoInfo"; bvid: string; }, unknown>>; readonly videoStream: zod.ZodType<{ methodType: "videoStream"; avid: number; cid: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoStream"; avid: number; cid: number; }, unknown>>; readonly comments: zod.ZodType<{ methodType: "comments"; type: CommentType; oid: string; number?: number; mode?: 0 | 1 | 2 | 3; pagination_str?: string; plat?: number; seek_rpid?: string; web_location?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "comments"; type: CommentType; oid: string; number?: number; mode?: 0 | 1 | 2 | 3; pagination_str?: string; plat?: number; seek_rpid?: string; web_location?: string; }, unknown>>; readonly commentReplies: zod.ZodType<{ methodType: "commentReplies"; type: CommentType; oid: string; root: string; number?: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "commentReplies"; type: CommentType; oid: string; root: string; number?: number; }, unknown>>; readonly userCard: zod.ZodType<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown>>; readonly userDynamicList: zod.ZodType<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown>>; readonly userSpaceInfo: zod.ZodType<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown>>; readonly emojiList: zod.ZodType<{ methodType: "emojiList"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "emojiList"; }, unknown>>; readonly bangumiInfo: zod.ZodType<{ methodType: "bangumiInfo"; season_id?: string; ep_id?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "bangumiInfo"; season_id?: string; ep_id?: string; }, unknown>>; readonly bangumiStream: zod.ZodType<{ methodType: "bangumiStream"; cid: number; ep_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "bangumiStream"; cid: number; ep_id: string; }, unknown>>; readonly dynamicDetail: zod.ZodType<{ methodType: "dynamicDetail" | "dynamicCard"; dynamic_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "dynamicDetail" | "dynamicCard"; dynamic_id: string; }, unknown>>; readonly dynamicCard: zod.ZodType<{ methodType: "dynamicDetail" | "dynamicCard"; dynamic_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "dynamicDetail" | "dynamicCard"; dynamic_id: string; }, unknown>>; readonly liveRoomInfo: zod.ZodType<{ methodType: "liveRoomInfo" | "liveRoomInit"; room_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "liveRoomInfo" | "liveRoomInit"; room_id: string; }, unknown>>; readonly liveRoomInit: zod.ZodType<{ methodType: "liveRoomInfo" | "liveRoomInit"; room_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "liveRoomInfo" | "liveRoomInit"; room_id: string; }, unknown>>; readonly loginStatus: zod.ZodType<{ methodType: "loginStatus"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "loginStatus"; }, unknown>>; readonly loginQrcode: zod.ZodType<{ methodType: "loginQrcode"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "loginQrcode"; }, unknown>>; readonly qrcodeStatus: zod.ZodType<{ methodType: "qrcodeStatus"; qrcode_key: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "qrcodeStatus"; qrcode_key: string; }, unknown>>; readonly uploaderTotalViews: zod.ZodType<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userCard" | "userDynamicList" | "uploaderTotalViews" | "userSpaceInfo"; host_mid: number; }, unknown>>; readonly avToBv: zod.ZodType<{ methodType: "avToBv"; avid: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "avToBv"; avid: number; }, unknown>>; readonly bvToAv: zod.ZodType<{ methodType: "bvToAv"; bvid: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "bvToAv"; bvid: string; }, unknown>>; readonly articleContent: zod.ZodType<{ methodType: "articleContent"; id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "articleContent"; id: string; }, unknown>>; readonly articleCards: zod.ZodType<{ methodType: "articleCards"; ids: string[] | string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "articleCards"; ids: string[] | string; }, unknown>>; readonly articleInfo: zod.ZodType<{ methodType: "articleInfo"; id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "articleInfo"; id: string; }, unknown>>; readonly articleListInfo: zod.ZodType<{ methodType: "articleListInfo"; id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "articleListInfo"; id: string; }, unknown>>; readonly captchaFromVoucher: zod.ZodType<{ methodType: "captchaFromVoucher"; csrf?: string; v_voucher: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "captchaFromVoucher"; csrf?: string; v_voucher: string; }, unknown>>; readonly validateCaptcha: zod.ZodType<{ methodType: "validateCaptcha"; csrf?: string; challenge: string; token: string; validate: string; seccode: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "validateCaptcha"; csrf?: string; challenge: string; token: string; validate: string; seccode: string; }, unknown>>; readonly videoDanmaku: zod.ZodType<{ methodType: "videoDanmaku"; cid: number; segment_index?: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoDanmaku"; cid: number; segment_index?: number; }, unknown>>; }; /** B站方法路由映射 */ declare const BilibiliMethodRoutes: { readonly videoInfo: "/fetch_one_video"; readonly videoStream: "/fetch_video_playurl"; readonly comments: "/fetch_work_comments"; readonly commentReplies: "/fetch_comment_reply"; readonly userCard: "/fetch_user_profile"; readonly userDynamicList: "/fetch_user_dynamic"; readonly userSpaceInfo: "/fetch_user_space_info"; readonly emojiList: "/fetch_emoji_list"; readonly bangumiInfo: "/fetch_bangumi_video_info"; readonly bangumiStream: "/fetch_bangumi_video_playurl"; readonly dynamicDetail: "/fetch_dynamic_info"; readonly dynamicCard: "/fetch_dynamic_card"; readonly liveRoomInfo: "/fetch_live_room_detail"; readonly liveRoomInit: "/fetch_liveroom_def"; readonly loginStatus: "/login_basic_info"; readonly loginQrcode: "/new_login_qrcode"; readonly qrcodeStatus: "/check_qrcode"; readonly uploaderTotalViews: "/fetch_user_full_view"; readonly avToBv: "/av_to_bv"; readonly bvToAv: "/bv_to_av"; readonly articleContent: "/fetch_article_content"; readonly articleCards: "/fetch_article_card"; readonly articleInfo: "/fetch_article_info"; readonly articleListInfo: "/fetch_column_info"; readonly captchaFromVoucher: "/apply_captcha"; readonly validateCaptcha: "/validate_captcha"; readonly videoDanmaku: "/fetch_danmaku"; }; /** B站方法类型 */ type BilibiliMethodType = keyof typeof BilibiliValidationSchemas; //#endregion //#region src/types/DouyinAPIParams.d.ts /** * 抖音 API 参数类型定义 * * 定义所有抖音 API 方法的参数接口和类型映射 * * @module types/DouyinAPIParams */ /** * 抖音 API 方法参数映射接口 * * 每个键对应一种 API 方法,值为该方法所需的参数接口 */ interface DouyinMethodOptionsMap { /** 获取指定评论的回复 */ CommentReplyParams: { methodType: 'commentReplies'; /** 视频ID */ aweme_id: string; /** 评论ID */ comment_id: string; /** * 获取的评论数量 * 默认情况下,如果指定的数量不足,则获取实际的评论数量。 * @defaultValue 5 */ number?: number; /** * 游标,作用类似于翻页,根据上一次评论数量递增 * @defaultValue 0 */ cursor?: number; }; /** 获取用户相关数据 */ UserParams: { methodType: 'userProfile'; /** 用户ID */ sec_uid: string; }; /** 获取用户列表数据(视频列表、喜欢列表、推荐列表) */ UserListParams: { methodType: 'userVideoList' | 'userFavoriteList' | 'userRecommendList'; /** 用户ID */ sec_uid: string; /** * 获取的数量 * @defaultValue 18 */ number?: number; /** 游标,用于获取下一页,不用填。 */ max_cursor?: string; }; /** 获取作品数据 */ WorkParams: { methodType: 'videoWork' | 'imageAlbumWork' | 'slidesWork' | 'parseWork' | 'textWork'; /** 视频ID、图集ID、合辑ID */ aweme_id: string; }; /** 获取评论数据 */ CommentParams: { methodType: 'comments'; /** 视频ID */ aweme_id: string; /** * 获取的评论数量 * 默认情况下,如果指定的数量不足,则获取实际的评论数量。 * @defaultValue 50 */ number?: number; /** * 游标,作用类似于翻页,根据上一次评论数量递增 * @defaultValue 0 */ cursor?: number; }; /** 获取音乐数据 */ MusicParams: { methodType: 'musicInfo'; /** 音乐ID */ music_id: string; }; /** 获取直播间信息 */ LiveRoomParams: { methodType: 'liveRoomInfo'; /** 直播间ID,可从用户主页信息信息响应中的room_id_str值取得 */ room_id: string; /** 直播间真实房间号(可通过live.douyin.com/{web_rid}直接访问直播间),可在在用户主页信息响应中的room_data中获取 */ web_rid: string; }; /** 申请登录二维码 */ QrcodeParams: { methodType: 'loginQrcode'; /** fp指纹 */ verify_fp: string; }; /** 获取热点词数据 */ HotWordsParams: { methodType: 'suggestWords'; /** 搜索词 */ query: string; }; /** 搜索数据 */ SearchParams: { methodType: 'search'; /** 搜索词 */ query: string; /** * 搜索类型 * @default 'general' */ type?: 'general' | 'user' | 'video'; /** * 搜索数量 * @default 10 */ number?: number; /** 上次搜索的游标值 */ search_id?: string; }; /** 获取表情列表 */ EmojiListParams: { methodType: 'emojiList'; }; /** 获取动态表情数据 */ EmojiProParams: { methodType: 'dynamicEmojiList'; }; /** 获取弹幕数据 */ DanmakuParams: { methodType: 'danmakuList'; /** 视频ID */ aweme_id: string; /** * 弹幕查询的开始时间(毫秒) * 例如:设置为5000表示从视频第5秒开始获取弹幕 * 不设置则从视频开头(0秒)开始获取 * @default 0 */ start_time?: number; /** * 弹幕查询的结束时间(毫秒) * 例如:设置为10000表示获取到视频第10秒的弹幕 * 不设置则获取到视频结束 */ end_time?: number; /** 视频总时长 */ duration: number; }; /** 获取视频作品数据 */ VideoWorkParams: { methodType: 'videoWork'; /** 视频ID */ aweme_id: string; }; /** 获取图集作品数据 */ ImageAlbumWorkParams: { methodType: 'imageAlbumWork'; /** 图集ID */ aweme_id: string; }; /** 获取合辑作品数据 */ SlidesWorkParams: { methodType: 'slidesWork'; /** 合辑ID */ aweme_id: string; }; } /** * 抖音方法类型到参数的映射 * * 用于根据 methodType 字符串获取对应的参数类型 */ type DouyinMethodOptMap = { textWork: DouyinMethodOptionsMap['WorkParams']; videoWork: DouyinMethodOptionsMap['WorkParams']; imageAlbumWork: DouyinMethodOptionsMap['WorkParams']; slidesWork: DouyinMethodOptionsMap['WorkParams']; parseWork: DouyinMethodOptionsMap['WorkParams']; comments: DouyinMethodOptionsMap['CommentParams']; userProfile: DouyinMethodOptionsMap['UserParams']; userVideoList: DouyinMethodOptionsMap['UserListParams']; userFavoriteList: DouyinMethodOptionsMap['UserListParams']; userRecommendList: DouyinMethodOptionsMap['UserListParams']; suggestWords: DouyinMethodOptionsMap['HotWordsParams']; search: DouyinMethodOptionsMap['SearchParams']; musicInfo: DouyinMethodOptionsMap['MusicParams']; liveRoomInfo: DouyinMethodOptionsMap['LiveRoomParams']; loginQrcode: DouyinMethodOptionsMap['QrcodeParams']; emojiList: DouyinMethodOptionsMap['EmojiListParams']; dynamicEmojiList: DouyinMethodOptionsMap['EmojiProParams']; commentReplies: DouyinMethodOptionsMap['CommentReplyParams']; danmakuList: DouyinMethodOptionsMap['DanmakuParams']; }; //#endregion //#region src/validation/douyin.d.ts /** 作品参数验证 */ declare const DouyinWorkParamsSchema: zod.ZodType<DouyinMethodOptionsMap['WorkParams']>; /** 评论参数验证 */ declare const DouyinCommentParamsSchema: zod.ZodType<DouyinMethodOptionsMap['CommentParams']>; /** 热点词参数验证 */ declare const DouyinHotWordsParamsSchema: zod.ZodType<DouyinMethodOptionsMap['HotWordsParams']>; /** 搜索参数验证 */ declare const DouyinSearchParamsSchema: zod.ZodType<DouyinMethodOptionsMap['SearchParams']>; /** 评论回复参数验证 */ declare const DouyinCommentReplyParamsSchema: zod.ZodType<DouyinMethodOptionsMap['CommentReplyParams']>; /** 用户参数验证 */ declare const DouyinUserParamsSchema: zod.ZodType<DouyinMethodOptionsMap['UserParams']>; /** 用户列表参数验证(视频列表、喜欢列表、推荐列表) */ declare const DouyinUserListParamsSchema: zod.ZodType<DouyinMethodOptionsMap['UserListParams']>; /** 音乐参数验证 */ declare const DouyinMusicParamsSchema: zod.ZodType<DouyinMethodOptionsMap['MusicParams']>; /** 直播间参数验证 */ declare const DouyinLiveRoomParamsSchema: zod.ZodType<DouyinMethodOptionsMap['LiveRoomParams']>; /** 二维码参数验证 */ declare const DouyinQrcodeParamsSchema: zod.ZodType<DouyinMethodOptionsMap['QrcodeParams']>; /** 表情列表参数验证 */ declare const DouyinEmojiListParamsSchema: zod.ZodType<DouyinMethodOptionsMap['EmojiListParams']>; /** 动态表情参数验证 */ declare const DouyinEmojiProParamsSchema: zod.ZodType<DouyinMethodOptionsMap['EmojiProParams']>; /** 弹幕参数验证 */ declare const DouyinDanmakuParamsSchema: zod.ZodType<DouyinMethodOptionsMap['DanmakuParams']>; /** 抖音参数验证模式映射 */ declare const DouyinValidationSchemas: { readonly textWork: zod.ZodType<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown>>; readonly parseWork: zod.ZodType<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown>>; readonly videoWork: zod.ZodType<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown>>; readonly imageAlbumWork: zod.ZodType<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown>>; readonly slidesWork: zod.ZodType<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoWork" | "imageAlbumWork" | "slidesWork" | "parseWork" | "textWork"; aweme_id: string; }, unknown>>; readonly comments: zod.ZodType<{ methodType: "comments"; aweme_id: string; number?: number; cursor?: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "comments"; aweme_id: string; number?: number; cursor?: number; }, unknown>>; readonly userProfile: zod.ZodType<{ methodType: "userProfile"; sec_uid: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userProfile"; sec_uid: string; }, unknown>>; readonly userVideoList: zod.ZodType<{ methodType: "userVideoList" | "userFavoriteList" | "userRecommendList"; sec_uid: string; number?: number; max_cursor?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userVideoList" | "userFavoriteList" | "userRecommendList"; sec_uid: string; number?: number; max_cursor?: string; }, unknown>>; readonly userFavoriteList: zod.ZodType<{ methodType: "userVideoList" | "userFavoriteList" | "userRecommendList"; sec_uid: string; number?: number; max_cursor?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userVideoList" | "userFavoriteList" | "userRecommendList"; sec_uid: string; number?: number; max_cursor?: string; }, unknown>>; readonly userRecommendList: zod.ZodType<{ methodType: "userVideoList" | "userFavoriteList" | "userRecommendList"; sec_uid: string; number?: number; max_cursor?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userVideoList" | "userFavoriteList" | "userRecommendList"; sec_uid: string; number?: number; max_cursor?: string; }, unknown>>; readonly suggestWords: zod.ZodType<{ methodType: "suggestWords"; query: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "suggestWords"; query: string; }, unknown>>; readonly search: zod.ZodType<{ methodType: "search"; query: string; type?: "general" | "user" | "video"; number?: number; search_id?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "search"; query: string; type?: "general" | "user" | "video"; number?: number; search_id?: string; }, unknown>>; readonly musicInfo: zod.ZodType<{ methodType: "musicInfo"; music_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "musicInfo"; music_id: string; }, unknown>>; readonly liveRoomInfo: zod.ZodType<{ methodType: "liveRoomInfo"; room_id: string; web_rid: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "liveRoomInfo"; room_id: string; web_rid: string; }, unknown>>; readonly loginQrcode: zod.ZodType<{ methodType: "loginQrcode"; verify_fp: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "loginQrcode"; verify_fp: string; }, unknown>>; readonly emojiList: zod.ZodType<{ methodType: "emojiList"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "emojiList"; }, unknown>>; readonly dynamicEmojiList: zod.ZodType<{ methodType: "dynamicEmojiList"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "dynamicEmojiList"; }, unknown>>; readonly commentReplies: zod.ZodType<{ methodType: "commentReplies"; aweme_id: string; comment_id: string; number?: number; cursor?: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "commentReplies"; aweme_id: string; comment_id: string; number?: number; cursor?: number; }, unknown>>; readonly danmakuList: zod.ZodType<{ methodType: "danmakuList"; aweme_id: string; start_time?: number; end_time?: number; duration: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "danmakuList"; aweme_id: string; start_time?: number; end_time?: number; duration: number; }, unknown>>; }; /** 抖音方法路由映射 */ declare const DouyinMethodRoutes: { readonly parseWork: "/fetch_one_work"; readonly textWork: "/fetch_one_work"; readonly videoWork: "/fetch_one_work"; readonly imageAlbumWork: "/fetch_one_work"; readonly slidesWork: "/fetch_one_work"; readonly comments: "/fetch_work_comments"; readonly commentReplies: "/fetch_video_comment_replies"; readonly userProfile: "/fetch_user_info"; readonly userVideoList: "/fetch_user_post_videos"; readonly userFavoriteList: "/fetch_user_favorite_list"; readonly userRecommendList: "/fetch_user_recommend_list"; readonly search: "/fetch_search_info"; readonly suggestWords: "/fetch_suggest_words"; readonly musicInfo: "/fetch_music_work"; readonly emojiList: "/fetch_emoji_list"; readonly dynamicEmojiList: "/fetch_emoji_pro_list"; readonly liveRoomInfo: "/fetch_user_live_videos"; readonly danmakuList: "/fetch_work_danmaku"; readonly loginQrcode: "/fetch_login_qrcode"; }; /** 抖音方法类型 */ type DouyinMethodType = keyof typeof DouyinValidationSchemas; //#endregion //#region src/types/KuaishouAPIParams.d.ts /** * 快手 API 方法参数映射 */ interface KuaishouMethodOptionsMap { VideoInfoParams: { methodType: 'videoWork'; /** 作品ID */ photoId: string; }; CommentParams: { methodType: 'comments'; /** 作品ID */ photoId: string; }; UserProfileParams: { methodType: 'userProfile'; /** 用户主页 principalId,可直接取 profile 页 URL 末段 */ principalId: string; }; UserWorkListParams: { methodType: 'userWorkList'; /** 用户主页 principalId,可直接取 profile 页 URL 末段 */ principalId: string; /** 分页游标;为空时请求首屏作品列表 */ pcursor?: string; /** 每页数量,默认 12 */ count?: number; }; LiveRoomInfoParams: { methodType: 'liveRoomInfo'; /** 直播间 principalId,可直接取 /u/{principalId} URL 末段 */ principalId: string; }; EmojiListParams: { methodType: 'emojiList'; }; } /** * 快手方法类型到参数的映射 */ type KuaishouMethodOptMap = { videoWork: KuaishouMethodOptionsMap['VideoInfoParams']; comments: KuaishouMethodOptionsMap['CommentParams']; userProfile: KuaishouMethodOptionsMap['UserProfileParams']; userWorkList: KuaishouMethodOptionsMap['UserWorkListParams']; liveRoomInfo: KuaishouMethodOptionsMap['LiveRoomInfoParams']; emojiList: KuaishouMethodOptionsMap['EmojiListParams']; }; //#endregion //#region src/validation/kuaishou.d.ts /** * 快手视频参数验证模式 */ declare const KuaishouVideoParamsSchema: zod.ZodType<KuaishouMethodOptionsMap['VideoInfoParams']>; /** * 快手评论参数验证模式 */ declare const KuaishouCommentParamsSchema: zod.ZodType<KuaishouMethodOptionsMap['CommentParams']>; /** * 快手用户主页参数验证模式 */ declare const KuaishouUserProfileParamsSchema: zod.ZodType<KuaishouMethodOptionsMap['UserProfileParams']>; /** * 快手用户作品列表参数验证模式 */ declare const KuaishouUserWorkListParamsSchema: zod.ZodType<KuaishouMethodOptionsMap['UserWorkListParams']>; /** * 快手直播间信息参数验证模式 */ declare const KuaishouLiveRoomInfoParamsSchema: zod.ZodType<KuaishouMethodOptionsMap['LiveRoomInfoParams']>; /** * 快手表情参数验证模式 */ declare const KuaishouEmojiParamsSchema: zod.ZodType<KuaishouMethodOptionsMap['EmojiListParams']>; /** * 快手参数验证模式映射 */ declare const KuaishouValidationSchemas: { readonly videoWork: zod.ZodType<{ methodType: "videoWork"; photoId: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "videoWork"; photoId: string; }, unknown>>; readonly comments: zod.ZodType<{ methodType: "comments"; photoId: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "comments"; photoId: string; }, unknown>>; readonly userProfile: zod.ZodType<{ methodType: "userProfile"; principalId: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userProfile"; principalId: string; }, unknown>>; readonly userWorkList: zod.ZodType<{ methodType: "userWorkList"; principalId: string; pcursor?: string; count?: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userWorkList"; principalId: string; pcursor?: string; count?: number; }, unknown>>; readonly liveRoomInfo: zod.ZodType<{ methodType: "liveRoomInfo"; principalId: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "liveRoomInfo"; principalId: string; }, unknown>>; readonly emojiList: zod.ZodType<{ methodType: "emojiList"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "emojiList"; }, unknown>>; }; /** * 快手方法路由映射 */ declare const KuaishouMethodRoutes: { readonly videoWork: "/fetch_one_work"; readonly comments: "/fetch_work_comments"; readonly userProfile: "/fetch_user_profile"; readonly userWorkList: "/fetch_user_work_list"; readonly liveRoomInfo: "/fetch_live_room_info"; readonly emojiList: "/fetch_emoji_list"; }; type KuaishouMethodType = keyof typeof KuaishouValidationSchemas; //#endregion //#region src/types/XiaohongshuAPIParams.d.ts /** * 小红书 API 方法参数映射 */ interface XiaohongshuMethodOptionsMap { HomeFeedParams: { methodType: 'homeFeed'; /** 游标分数,用于分页 */ cursor_score?: string; /** 每次请求的数量 */ num?: number; /** 刷新类型 */ refresh_type?: number; /** 笔记索引 */ note_index?: number; /** 分类 */ category?: string; /** 搜索关键词 */ search_key?: string; }; NoteParams: { methodType: 'noteDetail'; /** 笔记ID */ note_id: string; /** 反爬的 X-Sec-Token 可从web地址中获取 */ xsec_token: string; }; CommentParams: { methodType: 'noteComments'; /** 笔记ID */ note_id: string; /** 游标 */ cursor?: string; /** 反爬的 X-Sec-Token 可从web地址中获取 */ xsec_token: string; }; UserParams: { methodType: 'userProfile'; /** 用户ID */ user_id: string; }; UserNoteParams: { methodType: 'userNoteList'; /** 用户ID */ user_id: string; /** 上一页最后一条笔记的ID */ cursor?: string; /** * 每次请求的数量 * @default 30 */ num?: number; }; EmojiListParams: { methodType: 'emojiList'; }; SearchNoteParams: { methodType: 'searchNotes'; /** 搜索关键词 */ keyword: string; /** 页码 */ page?: number; /** 每页数量 */ page_size?: number; /** 排序类型 */ sort?: SearchSortType; /** 笔记类型 */ note_type?: SearchNoteType; }; } /** * 小红书方法类型到参数的映射 */ type XiaohongshuMethodOptMap = { homeFeed: XiaohongshuMethodOptionsMap['HomeFeedParams']; noteDetail: XiaohongshuMethodOptionsMap['NoteParams']; noteComments: XiaohongshuMethodOptionsMap['CommentParams']; userProfile: XiaohongshuMethodOptionsMap['UserParams']; userNoteList: XiaohongshuMethodOptionsMap['UserNoteParams']; emojiList: XiaohongshuMethodOptionsMap['EmojiListParams']; searchNotes: XiaohongshuMethodOptionsMap['SearchNoteParams']; }; //#endregion //#region src/platform/xiaohongshu/API.d.ts /** * 根据 XiaohongshuMethodOptionsMap 创建一个新的类型,去除每个字段中的 methodType */ type XiaohongshuMethodOptionsWithoutMethodType = { [K in keyof XiaohongshuMethodOptionsMap]: Omit<XiaohongshuMethodOptionsMap[K], 'methodType'> }; /** * 搜索排序类型枚举 */ declare enum SearchSortType { /** * 默认排序 */ GENERAL = "general", /** * 最受欢迎(按热度降序) */ MOST_POPULAR = "popularity_descending", /** * 最新发布(按时间降序) */ LATEST = "time_descending" } /** * 搜索笔记类型枚举 */ declare enum SearchNoteType { /** * 默认(全部类型) */ ALL = 0, /** * 仅视频 */ VIDEO = 1, /** * 仅图片 */ IMAGE = 2 } /** * 小红书API地址配置 */ declare const xiaohongshuApiUrls: { /** * 获取首页推荐数据的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ homeFeed(data?: XiaohongshuMethodOptionsWithoutMethodType["HomeFeedParams"]): { apiPath: string; Url: string; Body: { cursor_score: string; num: number; refresh_type: number; note_index: number; category: string; search_key: string; image_formats: string[]; }; }; /** * 获取单个笔记数据的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ noteDetail(data: XiaohongshuMethodOptionsWithoutMethodType["NoteParams"]): { apiPath: string; Url: string; Body: { source_note_id: string; image_formats: string[]; extra: { need_body_topic: string; }; xsec_source: string; xsec_token: string; }; }; /** * 获取评论数据的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ noteComments(data: XiaohongshuMethodOptionsWithoutMethodType["CommentParams"]): { apiPath: string; Url: string; }; /** * 获取用户数据的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ userProfile(data: XiaohongshuMethodOptionsWithoutMethodType["UserParams"]): { apiPath: string; Url: string; }; /** * 获取用户笔记数据的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ userNoteList(data: XiaohongshuMethodOptionsWithoutMethodType["UserNoteParams"]): { apiPath: string; Url: string; }; /** * 获取笔记表情列表的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ emojiList(data: XiaohongshuMethodOptionsWithoutMethodType["EmojiListParams"]): { apiPath: string; Url: string; }; /** * 搜索笔记的接口地址 * @param data - 请求参数 * @returns 完整的接口URL */ searchNotes(data: XiaohongshuMethodOptionsWithoutMethodType["SearchNoteParams"]): { apiPath: string; Body: { keyword: string; page: number; page_size: number; sort: SearchSortType; note_type: SearchNoteType; search_id: string; image_formats: string[]; }; Url: string; }; }; //#endregion //#region src/validation/xiaohongshu.d.ts /** * 小红书验证模式映射 */ declare const XiaohongshuValidationSchemas: { readonly homeFeed: zod.ZodType<{ methodType: "homeFeed"; cursor_score?: string; num?: number; refresh_type?: number; note_index?: number; category?: string; search_key?: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "homeFeed"; cursor_score?: string; num?: number; refresh_type?: number; note_index?: number; category?: string; search_key?: string; }, unknown>>; readonly noteDetail: zod.ZodType<{ methodType: "noteDetail"; note_id: string; xsec_token: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "noteDetail"; note_id: string; xsec_token: string; }, unknown>>; readonly noteComments: zod.ZodType<{ methodType: "noteComments"; note_id: string; cursor?: string; xsec_token: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "noteComments"; note_id: string; cursor?: string; xsec_token: string; }, unknown>>; readonly userProfile: zod.ZodType<{ methodType: "userProfile"; user_id: string; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userProfile"; user_id: string; }, unknown>>; readonly userNoteList: zod.ZodType<{ methodType: "userNoteList"; user_id: string; cursor?: string; num?: number; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "userNoteList"; user_id: string; cursor?: string; num?: number; }, unknown>>; readonly emojiList: zod.ZodType<{ methodType: "emojiList"; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "emojiList"; }, unknown>>; readonly searchNotes: zod.ZodType<{ methodType: "searchNotes"; keyword: string; page?: number; page_size?: number; sort?: SearchSortType; note_type?: SearchNoteType; }, unknown, zod.core.$ZodTypeInternals<{ methodType: "searchNotes"; keyword: string; page?: number; page_size?: number; sort?: SearchSortType; note_type?: SearchNoteType; }, unknown>>; }; /** * 小红书方法路由映射 */ declare const XiaohongshuMethodRoutes: { readonly homeFeed: "/fetch_home_feed"; readonly noteDetail: "/fetch_one_note"; readonly noteComments: "/fetch_note_comments"; readonly userProfile: "/fetch_user_profile"; readonly userNoteList: "/fetch_user_notes"; readonly emojiList: "/fetch_emoji_list"; readonly searchNotes: "/fetch_search_notes"; }; type XiaohongshuMethodType = keyof typeof XiaohongshuValidationSchemas; //#endregion //#region src/types/NetworksConfigType.d.ts type NetworksConfigType = { /** * 请求地址 */ url: string; /** * 请求方法 */ method?: string; /** * 请求头 */ headers?: any; /** * 返回数据类型,默认json */ responseType?: string; /** * 请求体 */ body?: object | string; /** * 超时时间,单位毫秒 */ timeout?: number; /** * 默认跟随重定向到: 'follow',不跟随: manual */ redirect?: RequestRedirect; /** * 拓展参数,该次请求数据什么数据类型,注意是平台接口的类型定义,不是请求参数 */ methodType?: string; }; /** API标准化HTTP请求错误类型 */ type ErrorDetail = { /** * 错误描述信息 */ errorDescription: string; /** * 请求类型 */ requestType: string; /** * 请求URL地址 */ requestUrl: string; /** * 接口响应数据的 code 属性 * 个别平台可能不存在 */ responseCode?: string; }; /** 未知错误 */ declare enum amagiAPIErrorCode { /** 未知错误 */ UNKNOWN = "UNKNOWN_ERROR" } /** 抖音平台API错误码 */ declare enum douoyinAPIErrorCode { /** Cookie无效或已过期 */ COOKIE = "INVALID_COOKIE", /** 内容被隐藏或下架 */ FILTER = "CONTENT_FILTERED", /** 当前用户未开播 */ NOT_LIVE = "USER_NOT_LIVE", /** 未知错误 */ UNKNOWN = "UNKNOWN_ERROR" } /** B站平台API错误码 */ declare enum bilibiliAPIErrorCode { /** 应用程序不存在或已被封禁 */ APP_NOT_FOUND = "-1", /** Access Key 错误 */ ACCESS_KEY_ERROR = "-2", /** API 校验密匙错误 */ API_KEY_ERROR = "-3", /** 调用方对该Method没有权限 */ METHOD_NOT_PERMITTED = "-4", /** 账号未登录 */ NOT_LOGGED_IN = "-101", /** 账号被封停 */ ACCOUNT_BANNED = "-102", /** 积分不足 */ POINTS_INSUFFICIENT = "-103", /** 硬币不足 */ COINS_INSUFFICIENT = "-104", /** 验证码错误 */ CAPTCHA_ERROR = "-105", /** 账号非正式会员或在适应期 */ MEMBERSHIP_LIMITED = "-106", /** 应用不存在或者被封禁 */ APP_BANNED = "-107", /** 未绑定手机 */ PHONE_NOT_BOUND = "-108", /** 未绑定手机 */ PHONE_NOT_BOUND_2 = "-110", /** csrf 校验失败 */ CSRF_ERROR = "-111", /** 系统升级中 */ SYSTEM_UPDATING = "-112", /** 账号尚未实名认证 */ NOT_REAL_NAME_VERIFIED = "-113", /** 请先绑定手机 */ NEED_BIND_PHONE = "-114", /** 请先完成实名认证 */ NEED_REAL_NAME_VERIFICATION = "-115", /** 木有改动 */ NO_CHANGE = "-304", /** 撞车跳转 */ CONFLICT_REDIRECT = "-307", /** 风控校验失败 (UA 或 wbi 参数不合法) */ RISK_CONTROL_FAILED = "-352", /** 请求错误 */ BAD_REQUEST = "-400", /** 未认证 (或非法请求) */ UNAUTHORIZED = "-401", /** 访问权限不足 */ FORBIDDEN = "-403", /** 啥都木有 */ NOT_FOUND = "-404", /** 不支持该方法 */ METHOD_NOT_ALLOWED = "-405", /** 冲突 */ CONFLICT = "-409", /** 请求被拦截 (客户端 ip 被服务端风控) */ IP_BLOCKED = "-412", /** 服务器错误 */ SERVER_ERROR = "-500", /** 过载保护,服务暂不可用 */ SERVICE_UNAVAILABLE = "-503", /** 服务调用超时 */ GATEWAY_TIMEOUT = "-504", /** 超出限制 */ RATE_LIMITED = "-509", /** 上传文件不存在 */ FILE_NOT_FOUND = "-616", /** 上传文件太大 */ FILE_TOO_LARGE = "-617", /** 登录失败次数太多 */ LOGIN_ATTEMPTS_EXCEEDED = "-625", /** 用户不存在 */ USER_NOT_FOUND = "-626", /** 密码太弱 */ WEAK_PASSWORD = "-628", /** 用户名或密码错误 */ INVALID_CREDENTIALS = "-629", /** 操作对象数量限制 */ OBJECT_LIMIT_EXCEEDED = "-632", /** 被锁定 */ ACCOUNT_LOCKED = "-643", /** 用户等级太低 */ USER_LEVEL_TOO_LOW = "-650", /** 重复的用户 */ DUPLICATE_USER = "-652", /** Token 过期 */ TOKEN_EXPIRED = "-658", /** 密码时间戳过期 */ PASSWORD_TIMESTAMP_EXPIRED = "-662", /** 地理区域限制 */ GEO_RESTRICTED = "-688", /** 版权限制 */ COPYRIGHT_RESTRICTED = "-689", /** 扣节操失败 */ REPUTATION_DEDUCTION_FAILED = "-701", /** 请求过于频繁,请稍后再试 */ TOO_MANY_REQUESTS = "-799", /** 服务器开小差了 */ SERVER_TEMPORARILY_UNAVAILABLE = "-8888", /** 未知错误 */ UNKNOWN = "UNKNOWN" } /** 快手平台API错误码 */ declare enum kuaishouAPIErrorCode { /** Cookie无效或已过期 */ COOKIE = "INVALID_COOKIE", /** 未知错误 */ UNKNOWN = "UNKNOWN_ERROR" } /** 小红书平台API错误码 */ declare enum xiaohongshuAPIErrorCode { /** Cookie无效或已过期 */ COOKIE = "INVALID_COOKIE", /** 未知错误 */ UNKNOWN = "UNKNOWN_ERROR", /** 非法请求 */ ILLEGAL_REQUEST = 500, /** 检测到帐号异常,请稍后重试 */ ACCOUNT_ABNORMAL = 300011, /** 网络连接异常,请检查网络设置后重试 */ NETWORK_ERROR = 300012, /** 访问频次异常,请勿频繁操作 */ FREQUENCY_ERROR = 300013, /** 浏览器异常,请尝试更换浏览器后重试 */ BROWSER_ERROR = 300015 } //#endregion //#region src/validation/index.d.ts /** * 基础响应类型 */ type BaseResponse = { /** 响应消息 */message: string; /** 响应状态码 */ code: number; }; /** * 成功响应类型 * @template T - 响应数据的类型,默认为any */ type SuccessResult<T = any> = BaseResponse & { /** 响应状态 */success: true; /** 响应数据,类型由泛型 T 决定 */ data: T; /** 成功响应时错误信息为空 */ error: never; }; /** * 错误响应类型 */ type ErrorResult = BaseResponse & { /** 响应状态 */success: false; /** API 错误类型 */ error: APIErrorType; /** 错误响应时数据为空 */ data: never; }; /** * 通用API响应类型 * @template T - 成功响应数据的类型,默认为any */ type Result<T> = SuccessResult<T> | ErrorResult; /** * 通用API响应类型 * @template T - 成功响应数据的类型,默认为any * @deprecated 请使用 Result<T> 替代 */ type ApiResponse<T> = Result<T>; /** * 验证抖音参数 * @param methodType - 抖音方法类型 * @param params - 待验证的参数 * @returns 验证后的参数,符合原始API期望的类型 */ declare const validateDouyinParams: <T extends DouyinMethodType>(methodType: T, params: unknown) => zod.infer<(typeof DouyinValidationSchemas)[T]>; /** * 验证哔哩哔哩参数 * @param methodType - 哔哩哔哩方法类型 * @param params - 待验证的参数 * @returns 验证后的参数,符合原始API期望的类型 */ declare const validateBilibiliParams: <T extends BilibiliMethodType>(methodType: T, params: unknown) => zod.infer<(typeof BilibiliValidationSchemas)[T]>; /** * 验证快手参数 * @param methodType - 快手方法类型 * @param params - 待验证的参数 * @returns 验证后的参数,符合原始API期望的类型 */ declare const validateKuaishouParams: <T extends KuaishouMethodType>(methodType: T, params: unknown) => zod.infer<(typeof KuaishouValidationSchemas)[T]>; /** * 验证小红书参数 * @param methodType - 小红书方法类型 * @param params - 待验证的参数 * @returns 验证后的参数 */ declare const validateXiaohongshuParams: <T ex