Skip to content

Loxily 开放平台

简介

Loxily 开放平台提供一系列 API 接口,帮助开发者在自己的系统中自动化管理翻译任务、发布翻译内容等。通过开放平台,您可以:

  • 创建和管理翻译任务
  • 查询翻译进度和状态
  • 发布翻译内容到 CDN
  • 获取项目语言和版本信息

快速开始

1. 获取凭证

在 Loxily 控制台中进入 项目设置 页面,获取以下信息:

  • App Key — 项目唯一标识符,用于标识请求来源
  • App Secret — 用于请求签名,请妥善保管,不要泄露

2. 了解签名机制

所有开放平台 API 请求都需要携带 sign 签名参数,以防止请求被篡改。

签名算法

步骤

  1. 将所有请求参数(不含 sign)按 key 的 ASCII 码升序排序
  2. 将排序后的参数拼接为 key1=value1&key2=value2&... 格式
  3. 在末尾追加 &appSecret=你的AppSecret
  4. 对整个字符串计算 MD5(小写十六进制),结果即为 sign

示例

假设参数如下:

参数
appKeyabc123
languagezh-CN
timestamp1700000000

App Secret 为 my_secret_key

Step 1:按 ASCII 排序拼接

appKey=abc123&language=zh-CN&timestamp=1700000000

Step 2:追加 appSecret

appKey=abc123&language=zh-CN&timestamp=1700000000&appSecret=my_secret_key

Step 3:MD5 计算

sign = MD5("appKey=abc123&language=zh-CN&timestamp=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 请求需包含以下公共参数:

参数类型必填说明
appKeystring项目 App Key
timestampnumber当前时间戳(秒或毫秒),有效窗口 5 分钟
signstring请求签名

响应格式

所有 API 统一返回 JSON 格式:

json
{
  "success": true,
  "code": 200,
  "msg": "OK",
  "data": { ... }
}

错误时:

json
{
  "success": false,
  "code": 401,
  "msg": "Invalid sign"
}

常见错误码

错误码说明
400请求参数错误
401签名校验失败或请求已过期
403App Secret 未配置
404App Key 无效
500服务器内部错误

API 接口

API 接口文档正在建设中,敬请期待。