基于 Node.js + Canvas 的 KARDS 卡组图片生成服务,由KARDS 军械库提供。
点击下方按钮跳转 Render:
- 克隆仓库
- 安装依赖:
npm install- 启动服务:
npm start· Node.js 18.x
· 系统依赖(Render 已自动安装):
· libcairo2-dev
· libjpeg-dev
· libpango1.0-dev
· libgif-dev
· build-essential
https://kapi-v7wl.onrender.com/generate
生成卡组图片
端点: POST /generate
Content-Type: application/json
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| deckCode | string | - | 必填,KARDS卡组代码 |
| version | string | DEFAULT_VERSION |
卡牌版本 |
| cols | number | 10 | 每行卡牌数量 |
| scale | number | 100 | 缩放比例(25-100) |
| lang | string | zh-Hans | 语言代码 |
| bgColor | string | transparent | 背景颜色(十六进制颜色码) |
| addStatsCard | boolean | true | 统计卡 |
| foldEnabled | boolean | false | 折叠重复卡牌 |
| qrEnabled | boolean | false | 二维码卡 |
| statsTitle | string | 卡组统计 | 统计卡标题 |
| qrTitle | string | 卡组二维码 | 二维码卡标题 |
| spacingX | number | 0 | 水平间距 |
| spacingY | number | 0 | 垂直间距 |
| emptySlots | array | [] | 空位索引数组 |
| hq | string | - | 总部cardId(如moscow) |
| statsChartToggle | boolean | false | 是否生成额外统计图 |
| cardOverrides | object | {} | 单卡覆盖配置 |
{
"cardId": {
"version": "v52",
"cost": 3,
"star": true
}
}| 代码 | 语言 |
|---|---|
| zh-Hans | 简体中文 |
| zh-Hant | 繁体中文 |
| en-EN | English |
| fr-FR | Français |
| de-DE | Deutsch |
| pl-PL | Polski |
| pt-BR | Português |
| ru-RU | Pусский |
| it-IT | Italiano |
| es-ES | Español |
| ko-KR | 한국어 |
| ja-JP | 日本語 |
{
"mainImage": "data:image/png;base64,...",
"statsChart": "data:image/png;base64,..."
}| 字段 | 描述 |
|---|---|
| mainImage | 卡组图片(Base64) |
| statsChart | 额外统计图(仅当 statsChartToggle: true 时返回) |
{
"error": "错误描述"
}curl -X POST https://your-service.onrender.com/generate \
-H "Content-Type: application/json" \
-d '{
"deckCode": "%%15|;;bK;bKbKbKbKbKbKbKbKbK",
"cols": 8,
"lang": "zh-Hans"
}'import fs from 'fs';
const response = await fetch('https://your-service.onrender.com/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
deckCode: '%%15|;;bK;bKbKbKbKbKbKbKbKbK',
cols: 8,
lang: 'zh-Hans'
})
});
const data = await response.json();
// 提取 Base64 数据
const base64Data = data.mainImage.replace(/^data:image\/png;base64,/, '');
fs.writeFileSync('deck.png', Buffer.from(base64Data, 'base64'));import requests
import base64
response = requests.post('https://your-service.onrender.com/generate', json={
'deckCode': '%%15|;;bK;bKbKbKbKbKbKbKbKbK',
'cols': 8,
'lang': 'zh-Hans'
})
data = response.json()
base64_data = data['mainImage'].split(',')[1]
with open('deck.png', 'wb') as f:
f.write(base64.b64decode(base64_data))├── server.js # 服务入口
├── deckRenderer.js # 核心渲染逻辑
├── cardData.js # 卡牌数据加载
├── package.json # 项目配置
├── render.yaml # Render 部署配置
├── font.ttf # 中文字体文件
├── data.json # 卡牌数据库
├── germany.svg # 阵营图标
├── britain.svg
└── ...
使用wsrv.nl代理卡图避免跨域问题,如果服务器在国内。
使用weserv目录下的文件替换:
├── deckRenderer.js
├── package.json
└── render.yaml
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| quality | number | 20 | 图片质量(1-100) |
控制Weserv的画质参数
- 卡牌数据:需同步更新
data.json - 阵营图标:
{faction}.svg文件 - 部署环境:本API使用 Render 免费计划,启动速度快如故障机器人
MIT