import api from './client'; import type { BasicSummary, AccountBulkSelection, AccountBulkTagRequest, HuyaAccountItem, HuyaAccountSummary, HuyaDeviceBindingListResult, HuyaDeviceBindingsBatchDeleteResult, HuyaAutoRegisterBatch, HuyaAutoRegisterRequest, HuyaAutoRegisterRetryRequest, HuyaConfig, HuyaCookieItem, HuyaCookieImportResult, HuyaGoodsItem, HuyaPasswordAccountImportResult, HuyaPasswordLoginBatchResult, HuyaPasswordLoginRequest, HuyaAppPasswordLoginRequest, HuyaPasswordLoginResult, HuyaPasswordLoginSelectedRequest, HuyaFetchSmsCodeResult, HuyaRechargeGoodsItem, HuyaRegisterSuccessLog, HuyaSmsCodeRequest, HuyaSmsCodeResult, HuyaSmsLoginRequest, HuyaSmsLoginResult, HuyaTaskBatchRequest, HuyaTaskBatchResult, HuyaTaskItem, HuyaBrowserExchangeKit, HuyaCollabAuditItem, HuyaCollabActivityBatchResult, HuyaCollabActivityItem, HuyaCollabActivityScope, HuyaCollabArchiveRequest, HuyaCollabArchiveResult, HuyaCollabArchiveScope, HuyaCollabCkExportResult, HuyaCollabCkPreview, HuyaCollabCkRequest, HuyaCollabCkStatusRequest, HuyaCollabFrequentGift, HuyaCollabGiftCatalog, HuyaCollabGiftCatalogCreate, HuyaCollabGiftCatalogUpdate, HuyaCollabImagesRequest, HuyaCollabImportResult, HuyaCollabMetric, HuyaCollabOrder, HuyaCollabOrderCreate, HuyaCollabOrderList, HuyaCollabOrderQuery, HuyaCollabOrderUpdate, HuyaCollabOwner, HuyaCollabRechargeRequest, HuyaCollabRechargeResult, HuyaCollabShop, HuyaCollabShopCreate, HuyaCollabShopUpdate, HuyaCollabStatusRequest, HuyaCollabStatusBatchRequest, HuyaCollabStatusBatchResult, HuyaCollabSummary, HuyaCollabVerifyResult, HuyaExchangeTargetKey, HuyaExternalCkImportRequest, HuyaExternalCkImportResult, HuyaWorkbenchTransferToCollabRequest, HuyaWorkbenchTransferToCollabResult, HuyaWorkbenchScope, MessageCountResponse, MessageDeletedResponse, MessageResponse, PageParams, PaginatedResponse, TaskSummary, } from './types'; export const huyaApi = { taskTypes: () => api.get, Record>('/huya/task-types'), listAccounts: (params?: { assigned_only?: boolean; tag?: string; has_cookie?: boolean; include_cookie?: boolean }) => api.get('/huya/accounts', { params }), listAccountsPaged: (params: PageParams & { assigned_only?: boolean; tag?: string; has_cookie?: boolean; search?: string; include_cookie?: boolean }) => api.get, PaginatedResponse>('/huya/accounts', { params }), listAccountIds: (params?: { search?: string; tag?: string; has_cookie?: boolean }) => api.get<{ account_ids: number[]; total: number }, { account_ids: number[]; total: number }>('/huya/accounts/ids', { params }), accountsSummary: () => api.get('/huya/accounts/summary'), /** 设备绑定: 账号 ↔ 环境列表 (画像+指纹状态+账号表合并) */ listDeviceBindings: () => api.get('/huya/device-bindings'), /** 解绑: 删除设备画像与 hydevice 指纹状态, 下次登录自动生成全新环境 */ deleteDeviceBinding: (account: string) => api.delete<{ ok: boolean; message: string }, { ok: boolean; message: string }>(`/huya/device-bindings/${encodeURIComponent(account)}`), /** 批量解绑: 一次删除多个账号的设备画像与指纹状态 */ deleteDeviceBindings: (accounts: string[]) => api.post('/huya/device-bindings/batch-delete', { accounts }), importCookies: (text: string, tag: string = '') => api.post('/huya/accounts/import-cookies', { text, tag }), importPasswordAccounts: (text: string, tag: string = '') => api.post('/huya/accounts/import-passwords', { text, tag }), passwordLogin: (data: HuyaPasswordLoginRequest) => api.post('/huya/accounts/password-login', data), passwordLoginSelected: (data: HuyaPasswordLoginSelectedRequest) => api.post( '/huya/accounts/password-login/selected', data, { timeout: 240000 }, ), appPasswordLogin: (data: HuyaAppPasswordLoginRequest) => api.post('/huya/accounts/app-password-login', data), appPasswordLoginSelected: (data: HuyaPasswordLoginSelectedRequest) => api.post( '/huya/accounts/app-password-login/selected', data, { timeout: 240000 }, ), smsCode: (data: HuyaSmsCodeRequest) => api.post('/huya/accounts/sms-code', data, { timeout: 120000 }), smsLogin: (data: HuyaSmsLoginRequest) => api.post('/huya/accounts/sms-login', data, { timeout: 120000 }), testSmsUrl: (sms_url: string) => api.post('/huya/accounts/test-sms-url', { sms_url }), fetchSmsCode: (accountId: number) => api.post(`/huya/accounts/${accountId}/fetch-sms-code`), autoSmsLogin: (accountId: number) => api.post(`/huya/accounts/${accountId}/auto-sms-login`), startAutoRegister: (data: HuyaAutoRegisterRequest) => api.post('/huya/register/batches', data), listAutoRegisterBatches: (limit = 50) => api.get('/huya/register/batches', { params: { limit } }), getAutoRegisterBatch: (batchId: string) => api.get(`/huya/register/batches/${batchId}`), stopAutoRegisterBatch: (batchId: string) => api.post(`/huya/register/batches/${batchId}/stop`), retryAutoRegisterBatch: (batchId: string, data?: HuyaAutoRegisterRetryRequest) => api.post(`/huya/register/batches/${batchId}/retry`, data || {}), exportAutoRegisterBatch: (batchId: string) => api.get(`/huya/register/batches/${batchId}/export`, { responseType: 'blob' }), listRegisterSuccessLogs: (params?: { batch_id?: string; tag?: string; limit?: number }) => api.get('/huya/register/success-logs', { params }), exportRegisterSuccessLogs: (params?: { batch_id?: string; tag?: string; limit?: number }) => api.get('/huya/register/success-logs/export', { responseType: 'blob', params }), stopBatch: (batchId: string) => api.post(`/huya/stop/${batchId}`), assign: (id: number, assigned_to: number | null) => api.put(`/huya/accounts/${id}/assign`, { assigned_to }), batchAssign: (account_ids: number[], assigned_to: number | null) => api.post('/huya/accounts/batch-assign', { account_ids, assigned_to }), assignmentsSummary: () => api.get<{ support_users: { id: number; username: string; assigned_count: number }[]; unassigned_count: number }, { support_users: { id: number; username: string; assigned_count: number }[]; unassigned_count: number }>('/huya/accounts/assignments/summary'), setTag: (id: number, tag: string) => api.put(`/huya/accounts/${id}/tag`, { tag }), batchTag: (account_ids: number[], tag: string) => api.put('/huya/accounts/batch-tag', { account_ids, tag }), batchTagSelection: (data: AccountBulkTagRequest) => api.put('/huya/accounts/batch-tag-selection', data), listTags: () => api.get('/huya/accounts/tags/list'), deleteAccount: (id: number) => api.delete(`/huya/accounts/${id}`), deleteAccounts: (accountIds: number[]) => api.delete('/huya/accounts/batch', { params: { account_ids: accountIds.join(',') } }), deleteAccountsSelection: (data: AccountBulkSelection) => api.post('/huya/accounts/batch-delete', data), listCookies: () => api.get('/huya/cookies'), listCookiesPaged: (params: PageParams & { include_cookie?: boolean }) => api.get, PaginatedResponse>('/huya/cookies', { params }), cookiesSummary: () => api.get('/huya/cookies/summary'), getCookie: (id: number) => api.get(`/huya/cookies/${id}`), exportCookies: (format?: string) => api.get('/huya/cookies/export', { responseType: 'blob', params: format ? { format } : {} }), deleteCookie: (id: number) => api.delete(`/huya/cookies/${id}`), deleteCookies: (accountIds: number[]) => api.delete('/huya/cookies/batch', { params: { account_ids: accountIds.join(',') } }), rebuildWebCookie: (accountId: number) => api.post(`/huya/cookies/${accountId}/rebuild`), getConfig: () => api.get('/huya/config'), updateConfig: (data: Partial) => api.put('/huya/config', data), listGoods: () => api.get('/huya/goods'), listRechargeGoods: () => api.get('/huya/recharge-goods'), /** 工作台导入外部 CK: 入库并把账号加入自己的工作台 (text 每行一条 CK) */ importWorkbenchCookies: (data: HuyaExternalCkImportRequest) => api.post('/huya/workbench-accounts/import-cookies', data), /** 精英宝典账号转入外部单协作:移出工作台并取回该账号网页 CK */ transferWorkbenchToCollab: (accountId: number) => api.post( '/huya/workbench-accounts/transfer-to-collab', { account_id: accountId } satisfies HuyaWorkbenchTransferToCollabRequest, ), listWorkbenchAccounts: (scope: HuyaWorkbenchScope = 'elite') => api.get<{ account_ids: number[]; configured: boolean }, { account_ids: number[]; configured: boolean }>( '/huya/workbench-accounts', { params: { handbook_scope: scope } }, ), updateWorkbenchAccounts: (accountIds: number[], scope: HuyaWorkbenchScope = 'elite') => api.put<{ account_ids: number[]; success: boolean }, { account_ids: number[]; success: boolean }>( '/huya/workbench-accounts', { handbook_scope: scope, account_ids: accountIds }, ), createTasks: (data: HuyaTaskBatchRequest) => api.post('/huya/tasks/batch', data), listTasks: (batchId?: string, scope?: 'legacy' | 'elite') => api.get('/huya/tasks', { // 列表轮询默认不带 base64 小程序码,避免每次 1MB+ 流量。 params: { ...(batchId ? { batch_id: batchId } : {}), ...(scope ? { handbook_scope: scope } : {}), include_images: false, }, }), tasksSummary: () => api.get('/huya/tasks/summary'), getTask: (taskId: number) => api.get(`/huya/tasks/${taskId}`), cleanupOrphans: () => api.post<{ message: string; cleaned: number; success: boolean }, { message: string; cleaned: number; success: boolean }>('/huya/tasks/cleanup-orphans'), /** 本机浏览器兑换: 获取目标页与登录脚本, 由用户在自己浏览器的控制台执行 (target 不传 = elite) */ createBrowserExchange: (accountId: number, target?: HuyaExchangeTargetKey) => api.post(`/huya/accounts/${accountId}/browser-exchange`, { target }), // ---- 虎牙外部 CK 协作台账(共享表,替代 Excel;业务规则见 docs/设计-虎牙外部CK协作台账.md)---- /** 列表:共享视图,默认不按人过滤(负责人只是筛选维度) */ listCollabOrders: (params: HuyaCollabOrderQuery = {}) => api.get('/huya/external-orders', { params }), /** 页头统计条:口径与当前归档/作废过滤一致 */ collabOrdersSummary: (params: { include_void?: boolean; archive_scope?: HuyaCollabArchiveScope; } = {}) => api.get('/huya/external-orders/summary', { params }), /** 负责人候选(全部活跃用户) */ collabOrderOwners: () => api.get('/huya/external-orders/owners'), /** 已用过的店铺(筛选下拉) */ collabOrderShops: () => api.get('/huya/external-orders/shops'), /** 已用过的礼包/皮肤名(筛选下拉) */ collabOrderGifts: () => api.get('/huya/external-orders/gifts'), /** * 常用礼包(台账里用得最多的几个):新建/补资料的礼包名快捷按钮。 * * 只来自历史记录,**是不是当前活动还在卖的**由页面拿礼包缓存比对后决定要不要显示。 */ collabFrequentGifts: (limit = 8) => api.get( '/huya/external-orders/gifts/frequent', { params: { limit } }, ), // ---- 店铺字典(新建协作单时点选;见业务规则 docs/设计-虎牙外部CK协作台账.md)---- /** 全部店铺(含停用的:管理弹窗要看到;新建下拉由页面按 is_active 过滤) */ listCollabShops: () => api.get('/huya/collab-shops'), createCollabShop: (data: HuyaCollabShopCreate) => api.post('/huya/collab-shops', data), updateCollabShop: (id: number, data: HuyaCollabShopUpdate) => api.put(`/huya/collab-shops/${id}`, data), deleteCollabShop: (id: number) => api.delete<{ success: boolean; name: string }, { success: boolean; name: string }>( `/huya/collab-shops/${id}`, ), // ---- 礼包字典(标准名称 + 所需积分;名称编辑会级联历史协作单)---- listCollabGiftCatalog: () => api.get('/huya/collab-gifts'), createCollabGift: (data: HuyaCollabGiftCatalogCreate) => api.post('/huya/collab-gifts', data), updateCollabGift: (id: number, data: HuyaCollabGiftCatalogUpdate) => api.put(`/huya/collab-gifts/${id}`, data), deleteCollabGift: (id: number) => api.delete< { success: boolean; id: number; name: string; points: number }, { success: boolean; id: number; name: string; points: number } >(`/huya/collab-gifts/${id}`), getCollabOrder: (id: number) => api.get(`/huya/external-orders/${id}`), createCollabOrder: (data: HuyaCollabOrderCreate) => api.post('/huya/external-orders', data), /** 编辑:必须带 expected_version(别人先改过会 409) */ updateCollabOrder: (id: number, data: HuyaCollabOrderUpdate) => api.put(`/huya/external-orders/${id}`, data), /** 推进/回退业务状态(回退必须显式 rollback) */ updateCollabOrderStatus: (id: number, data: HuyaCollabStatusRequest) => api.post(`/huya/external-orders/${id}/status`, data), /** 贴/换 CK(action=paste)或从 raw_cookie 重建(action=rebuild) */ updateCollabOrderCk: (id: number, data: HuyaCollabCkRequest) => api.post(`/huya/external-orders/${id}/ck`, data), /** 人工停用 / 恢复这份 CK(valid / invalid 只能由探针给) */ updateCollabOrderCkStatus: (id: number, data: HuyaCollabCkStatusRequest) => api.post(`/huya/external-orders/${id}/ck/status`, data), /** 整槽替换图片(提交 /api/files/upload 返回的 object_key 数组) */ updateCollabOrderImages: (id: number, data: HuyaCollabImagesRequest) => api.post(`/huya/external-orders/${id}/images`, data), /** 粘贴 CK 后的即时预览(只读):探针 + 拉活动礼包,一行都不写库 */ previewCollabCk: (ck_text: string, with_gifts = true) => api.post('/huya/external-orders/ck/preview', { ck_text, with_gifts, }), /** 验证 CK(只读探针):写 ck_status,并刷新绑定账号/角色快照 */ verifyCollabOrder: (id: number) => api.post(`/huya/external-orders/${id}/verify`), /** 批量验证 CK:人工触发、串行带间隔,一次最多 50 条 */ verifyCollabOrders: (ids: number[]) => api.post('/huya/external-orders/ck/verify', { ids }), /** Excel/文本粘贴批量导入(TSV,首行可为表头) */ importCollabOrders: (text: string) => api.post('/huya/external-orders/import', { text }), /** 操作时间线(直接读 audit_logs) */ collabOrderTimeline: (id: number) => api.get(`/huya/external-orders/${id}/timeline`), /** 勾选多行一次改业务状态(单个也走这里;回退要带 rollback) */ batchUpdateCollabOrderStatus: (data: HuyaCollabStatusBatchRequest) => api.post( '/huya/external-orders/status/batch', data, ), /** 充值核账:按绑定账号整组校验 CK + 积分,整组落「已充值 / 积分异常」 */ rechargeCollabOrders: (data: HuyaCollabRechargeRequest) => api.post( '/huya/external-orders/recharge', data, ), /** 归档抢购成功的订单(可带备注;archive_filtered 时按当前筛选批量归档) */ archiveCollabOrders: (data: HuyaCollabArchiveRequest) => api.post( '/huya/external-orders/archive', data, ), /** 取消归档,恢复回主台账 */ unarchiveCollabOrders: (ids: number[]) => api.post( '/huya/external-orders/unarchive', { ids }, ), /** 查这一单的积分 + 兑换记录(写一条生命周期快照,已上脚本的单会按结果自动改状态) */ queryCollabOrderActivity: (id: number) => api.post( `/huya/external-orders/${id}/activity/query`, ), /** * 勾选多行查积分 / 查兑换记录(串行带间隔)。 * * `scope` 决定查哪一半(页面上是两个独立按钮):`score` 只查积分、 * `records` 只查兑换记录、`both` 两个都查(默认,保持旧行为)。 */ batchQueryCollabOrderActivity: (ids: number[], scope: HuyaCollabActivityScope = 'both') => api.post( '/huya/external-orders/activity/query', { ids, scope }, ), /** 这一单的「账号全生命周期」时间线(每次查询的快照,新→旧) */ collabOrderMetrics: (id: number) => api.get(`/huya/external-orders/${id}/metrics`), /** 勾选导出 CK 明文(前端写剪贴板;单独权限点 huya:collab:ck_export,逐行写审计) */ exportCollabOrderCk: (ids: number[]) => api.post( '/huya/external-orders/ck/export', { ids }, ), /** 单行复制 CK(与批量导出共用 huya:collab:ck_export 权限) */ copyCollabOrderCk: (id: number) => api.post( `/huya/external-orders/${id}/ck/copy`, ), /** 删除一行(只给运营:huya:collab:manage) */ deleteCollabOrder: (id: number) => api.delete<{ success: boolean; order_no: string }, { success: boolean; order_no: string }>( `/huya/external-orders/${id}`, ), };