Loxily 开放平台
简介
Loxily 开放平台提供一系列 API 接口,帮助开发者在自己的系统中自动化管理翻译任务、发布翻译内容等。通过开放平台,您可以:
- 创建和管理翻译任务
- 查询翻译进度和状态
- 发布翻译内容到 CDN
- 获取项目语言和版本信息
快速开始
1. 获取凭证
在 Loxily 控制台中进入 项目设置 页面,获取以下信息:
- App Key — 项目唯一标识符,用于标识请求来源
- App Secret — 用于请求签名,请妥善保管,不要泄露
2. 了解签名机制
所有开放平台 API 请求都需要携带 sign 签名参数,以防止请求被篡改。
签名算法
步骤
- 将所有请求参数(不含
sign)按 key 的 ASCII 码升序排序 - 将排序后的参数拼接为
key1=value1&key2=value2&...格式 - 在末尾追加
&appSecret=你的AppSecret - 对整个字符串计算 MD5(小写十六进制),结果即为
sign值
示例
假设参数如下:
| 参数 | 值 |
|---|---|
| appKey | abc123 |
| language | zh-CN |
| timestamp | 1700000000 |
App Secret 为 my_secret_key
Step 1:按 ASCII 排序拼接
appKey=abc123&language=zh-CN×tamp=1700000000Step 2:追加 appSecret
appKey=abc123&language=zh-CN×tamp=1700000000&appSecret=my_secret_keyStep 3:MD5 计算
sign = MD5("appKey=abc123&language=zh-CN×tamp=1700000000&appSecret=my_secret_key")代码示例
Java
java
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;
public class LoxilySign {
public static String generateSign(Map<String, String> params, String appSecret) throws Exception {
TreeMap<String, String> sorted = new TreeMap<>(params);
sorted.remove("sign");
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : sorted.entrySet()) {
if (sb.length() > 0) sb.append("&");
sb.append(entry.getKey()).append("=").append(entry.getValue());
}
sb.append("&appSecret=").append(appSecret);
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(sb.toString().getBytes("UTF-8"));
StringBuilder hex = new StringBuilder();
for (byte b : digest) {
hex.append(String.format("%02x", b));
}
return hex.toString();
}
}Python
python
import hashlib
def generate_sign(params: dict, app_secret: str) -> str:
filtered = {k: v for k, v in params.items() if k != "sign"}
sorted_keys = sorted(filtered.keys())
sign_str = "&".join(f"{k}={filtered[k]}" for k in sorted_keys)
sign_str += f"&appSecret={app_secret}"
return hashlib.md5(sign_str.encode("utf-8")).hexdigest()JavaScript / Node.js
javascript
const crypto = require('crypto');
function generateSign(params, appSecret) {
const keys = Object.keys(params)
.filter(k => k !== 'sign')
.sort();
const parts = keys.map(k => `${k}=${params[k]}`);
parts.push(`appSecret=${appSecret}`);
return crypto.createHash('md5')
.update(parts.join('&'), 'utf8')
.digest('hex');
}Go
go
package main
import (
"crypto/md5"
"fmt"
"sort"
"strings"
)
func GenerateSign(params map[string]string, appSecret string) string {
keys := make([]string, 0, len(params))
for k := range params {
if k != "sign" {
keys = append(keys, k)
}
}
sort.Strings(keys)
parts := make([]string, 0, len(keys)+1)
for _, k := range keys {
parts = append(parts, fmt.Sprintf("%s=%s", k, params[k]))
}
parts = append(parts, fmt.Sprintf("appSecret=%s", appSecret))
data := strings.Join(parts, "&")
return fmt.Sprintf("%x", md5.Sum([]byte(data)))
}公共参数
所有 API 请求需包含以下公共参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 项目 App Key |
| timestamp | number | 是 | 当前时间戳(秒或毫秒),有效窗口 5 分钟 |
| sign | string | 是 | 请求签名 |
响应格式
所有 API 统一返回 JSON 格式:
json
{
"success": true,
"code": 200,
"msg": "OK",
"data": { ... }
}错误时:
json
{
"success": false,
"code": 401,
"msg": "Invalid sign"
}常见错误码
| 错误码 | 说明 |
|---|---|
| 400 | 请求参数错误 |
| 401 | 签名校验失败或请求已过期 |
| 403 | App Secret 未配置 |
| 404 | App Key 无效 |
| 500 | 服务器内部错误 |
API 接口
API 接口文档正在建设中,敬请期待。