如何正确调用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
相关产品推荐
相关产品推荐

