Files
live-hub-py/web/frontend/src/api/huya.ts
T

343 lines
19 KiB
TypeScript
Raw Blame History

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