You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确调用DeepL API解析翻译返回结果?求PHP/Python实现方案

DeepL API 调用错误修正与正确实现

原有代码核心问题

  • PHP端问题:
    • 直接用get_headers判断状态不可靠,file_get_contents遇到4xx/5xx错误会直接抛出警告且返回布尔值false,无法触发else逻辑
    • 多余执行str_replace(' ', '', $translated)删除了翻译结果的正常空格,会导致返回内容异常
    • passthru传递参数时未做转义处理,若输入内容包含特殊字符(空格、引号等)会导致Python脚本参数接收错误
    • 若使用免费版DeepL密钥,需确认接口域名是api-free.deepl.com而非付费版域名
  • Python端问题:
    • 错误的参数取值:str(sys.argv)[1]是将参数列表转为字符串后取第二个字符,正确写法是直接取sys.argv[1]
    • 未适配Python版本:Python3中print语句必须加括号,否则会触发语法错误
    • 未区分免费/付费接口域名:免费密钥调用api.deepl.com会直接返回鉴权失败
    • 无错误捕获逻辑:接口返回错误时直接访问r.json()["translations"]会触发KeyError异常

正确实现方案

PHP实现(翻译后调用Python脚本)

使用cURL代替file_get_contents,兼容性和错误处理能力更强:

<?php
// 配置项,替换为自己的DeepL密钥
$authKey = 'YOUR_DEEPL_AUTH_KEY';
// 免费版用api-free.deepl.com,付费版替换为https://api.deepl.com/v2/translate
$apiUrl = 'https://api-free.deepl.com/v2/translate';
$original = trim($_GET['searchterm'] ?? '');

if (empty($original)) {
    exit('搜索词不能为空');
}

// 发起接口请求
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $apiUrl,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'auth_key' => $authKey,
        'text' => $original,
        'target_lang' => 'EN'
    ]),
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_TIMEOUT => 10
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode !== 200) {
    exit('翻译接口请求失败,错误码:' . $httpCode);
}

$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE || empty($result['translations'])) {
    exit('翻译结果解析失败');
}

$translated = $result['translations'][0]['text'];
// 转义参数后调用Python脚本,避免特殊字符导致的参数错误
$originalEscaped = escapeshellarg($original);
$translatedEscaped = escapeshellarg($translated);
$output = passthru("python search.py $originalEscaped $translatedEscaped");
?>

Python实现(独立调用版,无需PHP中转)

如果不需要PHP层,可以直接用Python完成翻译+后续逻辑:

#!/usr/bin/env python3
import sys
import requests

def deepl_translate(input_text, auth_key, is_free_account=True):
    # 区分免费/付费接口域名
    api_host = "api-free.deepl.com" if is_free_account else "api.deepl.com"
    api_url = f"https://{api_host}/v2/translate"
    try:
        resp = requests.post(
            url=api_url,
            data={
                "target_lang": "EN",
                "auth_key": auth_key,
                "text": input_text
            },
            timeout=10
        )
        # 接口返回非200状态时直接抛出异常
        resp.raise_for_status()
        resp_json = resp.json()
        return resp_json["translations"][0]["text"]
    except Exception as e:
        print(f"翻译失败: {str(e)}")
        return None

if __name__ == "__main__":
    # 替换为自己的DeepL密钥
    MY_AUTH_KEY = "YOUR_DEEPL_AUTH_KEY"
    if len(sys.argv) < 2:
        print("请传入要翻译的内容")
        sys.exit(1)
    original_text = sys.argv[1]
    translated_text = deepl_translate(original_text, MY_AUTH_KEY, is_free_account=True)
    if translated_text:
        print(f"原文: {original_text}")
        print(f"译文: {translated_text}")
        # 此处可添加后续的业务逻辑

cURL命令行测试版

可以直接用以下命令快速验证接口是否能正常调用:

# 免费版接口测试,替换MYKEY为实际密钥,替换"测试文本"为要翻译的内容
curl -X POST 'https://api-free.deepl.com/v2/translate' \
  --data-urlencode 'auth_key=MYKEY' \
  --data-urlencode 'text=测试文本' \
  --data-urlencode 'target_lang=EN'

额外提示

如果你的逻辑是PHP完成翻译后传递参数给Python,Python脚本不需要重复调用DeepL接口,直接通过sys.argv[1]取原文、sys.argv[2]取译文做后续处理即可。

内容的提问来源于stack exchange,提问作者alma korte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:24:06