+
Skip to content

ikenxuan/amagi

Repository files navigation

amagi

抖音、bilibili 的 web 端相关数据接口基于 Node.js 的实现。支持最低 node 版本为 v18 🚀

我是真爱粉 🧩

"amagi" /ˈæmədʒi/ 名称灵感来源于网络谐音梗,在网络上 BV1St41137jm / BV1DL411X7jE 上广泛传播。🎤💃

项目简介 📝

本项目最初的代码从 kkkkkk-10086 抽离。主要负责相关数据接口的封装。

amagi 将作为一个独立的上游模块,提供给下游 karin-plugin-kkkkkkkkk-10086 进行视频解析相关业务使用。这两个项目已完成了几乎所有由 ikenxuan 安排的功能和任务,所以它们如果没有什么新的业务需求,本项目大概再也不会封装新的任何接口。

当然,如果你的下游有新的业务需求,欢迎提 issue 或 pr。(作者本人很菜,issue 不一定能解决)

安装/更新 📦

pnpm add @ikenxuan/amagi@latest

版本说明 📋

v4 版本 (推荐) 🔄

v4 版本保持向后兼容,是默认导入版本,适合现有项目的平滑迁移。

v5 版本 (测试中 慎用) 🆕

v5 版本是当前的主要开发版本,提供了更好的错误处理、统一的响应格式和更强的类型安全性。

快速开始 (v4 版本) 🚀

基本用法 ✨

主要就两个方法,getDouyinDatagetBilibiliData

它接收三个参数,

  • 第一个参数是对应平台封装好的数据接口名称
  • 第二个参数是接口所需的参数
  • 第三个参数是用户的 cookies。
  • 得益于函数重载,参数二和参数三可以互换位置

你可以通过直接导入或者构造器创建实例。 若通过构造器创建实例,就不需要传入 cookies 参数了,参数二默认接口所需参数。

import Client from '@ikenxuan/amagi'
// or
// import { getDouyinData, getBilibiliData } from '@ikenxuan/amagi'

// you can use it as a class/function/object
const amagi = Client({...options})
const amagi = new Client({...options})

// 使用示例
async function example() {
  // 获取抖音搜索数据
  const searchData = await amagi.getDouyinData(
    '搜索数据',
    { ...opt }
    )

  // 获取B站视频数据
  const videoData = await amagi.getBilibiliData(
    '单个视频作品数据',
    { ...opt }
    )

  console.log(searchData)
}

example()

v5 版本完整指南 🆕

v5 版本使用方式

// v5 版本导入方式
import { createAmagiClient } from '@ikenxuan/amagi/v5'
// 或者
import amagi from '@ikenxuan/amagi/v5'

const client = createAmagiClient({ douyin: 'your_cookie' })
const result = await client.getDouyinData('搜索数据', { keyword: '测试' })

v5 版本主要变化

1. 统一的响应格式 📦

v5 版本所有 API 返回统一的响应格式:

interface ApiResponse<T> {
  data: T | null           // 实际数据
  message: string          // 响应消息
  code: number             // 状态码
  requestPath?: string     // 请求路径
}

2. 更好的错误处理 🛡️

// v5 版本错误处理
const result = await client.getDouyinData('搜索数据', { keyword: '测试' })
if (result.success) {
  console.log('数据:', result.data)
} else {
  console.error('错误:', result.message)
}

3. 类型模式控制 🎯

支持 strictloose 两种类型模式:

// 严格模式 - 完整类型检查
const strictResult = await client.getDouyinData(
  '搜索数据', 
  { keyword: '测试', typeMode: 'strict' }
)

// 宽松模式 - 灵活的类型处理
const looseResult = await client.getDouyinData(
  '搜索数据', 
  { keyword: '测试', typeMode: 'loose' }
)

4. 强化的参数验证 🔍

v5 版本引入了 Zod 进行运行时参数验证,确保数据类型安全和参数完整性。 PS: 当前更改已在 v4.5.0 往后的版本实装

// 自动参数验证
const result = await client.getDouyinData('搜索数据', {
  keyword: '测试',        // ✅ 必需参数
  offset: 0,             // ✅ 可选参数,类型正确
  count: 20              // ✅ 可选参数,类型正确
})

// 参数验证失败示例
const invalidResult = await client.getDouyinData('搜索数据', {
  // ❌ 缺少必需参数 keyword
  offset: 'invalid'      // ❌ 类型错误,应为 number
})
// 返回: { success: false, message: '参数验证失败: ...', code: 400 }

验证特性:

  • 🔒 类型安全 :确保参数类型正确
  • ✅ 必需参数检查 :自动验证必需参数是否存在
  • 🎯 值范围验证 :验证数值范围、字符串长度等
  • 🛡️ 注入防护 :防止恶意参数注入
  • 📝 详细错误信息 :提供具体的验证失败原因
// 验证错误响应示例
{
  code: 400,
  message: "参数验证失败",
  data: null,
  errors: [
    {
      path: ["keyword"],
      message: "必需参数",
      code: "invalid_type"
    },
    {
      path: ["offset"],
      message: "期望 number 类型,收到 string",
      code: "invalid_type"
    }
  ]
}

v5 版本兼容性更改 🔄

向后兼容性 ✅

  • v4 API 完全兼容:现有的 v4 代码无需修改即可继续使用
  • 默认导入保持 v4import Client from '@ikenxuan/amagi' 仍然使用 v4 版本
  • 渐进式迁移:可以逐步迁移到 v5 版本,无需一次性重写

迁移指南 📖

从 v4 迁移到 v5
  1. 更新导入语句
// v4
import Client from '@ikenxuan/amagi'

// v5
import Client from '@ikenxuan/amagi/v5'
  1. 处理响应格式
// v4 - 直接返回数据
const data = await amagi.getDouyinData('搜索数据', { keyword: '测试' })

// v5 - 包装的响应格式
const response = await client.getDouyinData('搜索数据', { keyword: '测试' })
const data = response.data

破坏性变更 ⚠️

v5 版本的破坏性变更:

  1. 响应格式变更:所有 API 返回包装的响应对象而非直接数据
  2. 服务器方法重命名startClient() 重命名为 startServer()
  3. 错误处理方式:错误不再抛出异常,而是在响应对象中返回

高级用法 🔧

启动本地 HTTP 服务 🌐

import Client from '@ikenxuan/amagi'

const amagi = new Client({...options})

// 启动本地服务,默认端口 4567
const app = amagi.startClient()
// 或指定端口
// const app = amagi.startClient(8080)

启动后可通过以下路径访问 API:

  • 抖音 API: http://localhost:4567/api/douyin/... 📱
  • bilibili API: http://localhost:4567/api/bilibili/... 📺

API 文档: https://amagi.apifox.cn 📝

平台功能模块 🧩

PS: 以下功能模块的使用方法与上述基本用法类似,我也不知道为什么要写这个。。。

抖音功能模块 📱

抖音相关功能模块提供了一系列工具和 API 接口,用于获取抖音平台的数据。

import { douyinUtils } from '@ikenxuan/amagi'

// 使用签名算法
const mstoken = douyinUtils.sign.Mstoken(107)
const verifyFp = douyinUtils.sign.VerifyFpManager()
const abSign = douyinUtils.sign.AB('需要签名的地址')

// 使用 API 接口
const videoData = await douyinUtils.api.getWorkInfo(
  { ...opt },
  'cookies'
)

const userInfo = await douyinUtils.api.getUserProfile(
  { ...opt },
  'cookies'
)

// 直接获取数据
const searchResult = await douyinUtils.getDouyinData(
  '搜索数据',
  { ...opt }
  )

主要功能:

  • 📹 视频/图集作品数据获取
  • 👤 用户信息获取
  • 💬 评论数据获取
  • 🔍 搜索功能
  • 🎬 直播间信息
  • 🎵 音乐数据
  • 😄 表情数据

bilibili 功能模块 📺

bilibili 相关功能模块提供了获取 bilibili 平台数据的工具和 API。

import { bilibiliUtils } from '@ikenxuan/amagi'

// 获取视频信息
const videoInfo = await bilibiliUtils.api.getVideoInfo({ ...opt })

// 获取评论数据
const comments = await bilibiliUtils.api.getComments({ ...opt })

// 直接获取数据
const userInfo = await bilibiliUtils.getBilibiliData(
  '用户主页数据',
  { ...opt }
  )

主要功能:

  • 📹 视频信息获取
  • 💬 评论数据获取
  • 👤 用户信息获取
  • 🎬 番剧信息获取
  • 📡 直播间信息
  • 📊 动态数据获取
  • 🔄 AV/BV 号转换

类型支持 🧰

该库提供完整的 TypeScript 类型支持,可以获得良好的代码提示和类型检查。✅ 虽有类型但写得和迷宫一样

许可证 📜

GPL-3.0 ⚖️

免责声明 ⚠️

  • ⭐ 这个项目免费开源,不存在收费。
  • 🛡️ 本项目的作者不承担任何责任,包括但不限于因使用本项目而导致的任何损失或损害。
  • 📚 本项目仅供学习和研究使用,不得用于任何商业目的。
  • 🔒 本项目的作者不对因使用本项目而产生的任何后果负责。
  • 📝 本项目的使用者在下载、安装、运行或使用本工具时,即表示已阅读并同意本免责声明。如有异议,请立即停止使用本工具,并删除所有相关文件。
  • 🔄 本项目的作者保留随时修改、更新、删除或终止本工具的权利,无需事先通知或承担任何义务。

🔐 本仓库没有后门,本仓库不会上传有关你的任何信息到第三方。

🍪 所传递的用户 cookies 只会用于请求官方 API 接口

鸣谢 🙏

amagi 的诞生参考了以下开源项目:

About

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

Resources

License

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •  
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载