javascript - 目前如何向 deepl 请求翻译?
问题描述
由于 DeepL 更新了他们的网站 ( https://www.deepl.com/translator ) 也使用的 API,因此当您通过 Java 或 Python 请求翻译时会出现错误。它说“请求太多”。一年前,来自 EmilioK 的答案(使用 DeepL API 翻译文本)奏效了。
由于他们的更新,API URL 更改为“ https://www2.deepl.com/jsonrpc ”。但反应是{"jsonrpc": "2.0","error":{"code":1042901,"message":"Too many requests."}}
。通过网站翻译工作,所以他们似乎已经实施了背景调查。我已经尝试调试他们的 JavaScript 代码,但我不明白我做错了什么。最后,我尝试通过分析主页的网络流量来重新构建请求。也没有用。此外,似乎其他人也有同样的问题(https://github.com/EmilioK97/pydeepl/issues/12,https://github.com/vsetka/deepl-translator/issues/9)。
我将 Java 8 与 Apache HttpClient 4.5.8 一起使用:
private static final String BASE_URL = "https://www2.deepl.com/jsonrpc";
private static AtomicInteger requestId = new AtomicInteger(10000 * (int) Math.round(10000 * Math.random()));
private static final CloseableHttpClient HTTP_CLIENT = HttpClients.createDefault();
public void example() {
HttpResponse httpResponse = HTTP_CLIENT.execute(generateRequest("Hello", "EN", "DE"), getContext());
JSONObject response = new JSONObject(EntityUtils.toString(httpResponse.getEntity()));
System.out.println(response.toString());
}
HttpContext getContext() {
CookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie = new BasicClientCookie("LMTBID", "3389513b-e369-4810-a2f3-73b9405e0b0d|403992a1240e1eca6c6e98b428849a3c");
cookie.setDomain(".deepl.com");
cookie.setPath("/");
cookie.setAttribute(ClientCookie.DOMAIN_ATTR, "true");
cookieStore.addCookie(cookie);
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore);
return localContext;
}
HttpPost generateRequest(String text, String from, String to) {
HttpPost request = new HttpPost(BASE_URL);
StringEntity params = new StringEntity(getJsonRequest(text, from, to).toString(), StandardCharsets.UTF_8);
request.addHeader(HttpHeaders.HOST, "www2.deepl.com");
request.addHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0");
request.addHeader(HttpHeaders.ACCEPT, "*/*");
request.addHeader(HttpHeaders.ACCEPT_LANGUAGE, "de,en-US;q=0.7,en;q=0.3");
request.addHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate, br");
request.addHeader(HttpHeaders.REFERER, "https://www.deepl.com/translator");
request.addHeader(HttpHeaders.CONTENT_TYPE, "text/plain");
request.addHeader(HttpHeaders.CONNECTION, "keep-alive");
request.addHeader("X-Requested-With", "XMLHttpRequest");
request.addHeader("Origin", "https://www.deepl.com");
request.addHeader("DNT", "1");
request.addHeader("TE", "Trailers");
request.setEntity(params);
request.setConfig(requestConfig);
return request;
}
private static JSONObject getJsonRequest(String text, String from, String to) {
JSONObject send = new JSONObject();
send.put("id", requestId.incrementAndGet());
send.put("jsonrpc", "2.0");
send.put("method", "LMT_handle_jobs");
JSONObject paramsObject = new JSONObject();
JSONArray jobsArray = new JSONArray();
JSONObject jobsObject = new JSONObject();
jobsObject.put("kind", "default");
jobsObject.put("quality", "fast");
jobsObject.put("raw_en_context_after", new JSONArray());
jobsObject.put("raw_en_context_before", new JSONArray());
jobsObject.put("raw_en_sentence", text);
jobsArray.put(jobsObject);
JSONObject langObject = new JSONObject();
JSONArray userPreferredLangsArray = new JSONArray();
userPreferredLangsArray.put(to);
userPreferredLangsArray.put(from);
langObject.put("source_lang_user_selected", from.getLanguageCode());
langObject.put("target_lang", to);
langObject.put("user_preferred_langs", userPreferredLangsArray);
paramsObject.put("jobs", jobsArray);
paramsObject.put("lang", langObject);
paramsObject.put("priority", -1);
paramsObject.put("timestamp", System.currentTimeMillis());
send.put("params", paramsObject);
return send;
}
结果应该是这样的,但我记不太清了:
{"result":{"source_lang":"EN","target_lang":"DE","translations":[{"beams":[{"postprocessed_sentence":"Hallo","score":0.5,"totalLogProb":0.3,"num_symbols":1},{"postprocessed_sentence":"Guten Tag","score":0.3,"totalLogProb":0.7,"num_symbols":2}]}]}}
解决方案
推荐阅读
- c# - 无法从根提供商解析范围服务 - 错误解决方案?
- opengl - 在 OpenGL 上下文之间同步资源时是否需要调用 glFinish?
- azure-logic-apps - Azure 逻辑应用到 ServiceNow 连接器:用户未通过身份验证
- nlp - 我如何准备使用整个维基百科进行自然语言处理?
- postgresql - 上个季度的时期 - postgresql
- swiftui - SwiftUI init 在视图结构中不起作用
- python - 熊猫数据框 groupby 制作一列的列表或数组
- docker - Gitlab Runner:在不同的机器上找不到 microdnf/yum 命令
- node.js - Mongodb 无法在短时间内处理多次保存
- javascript - 获取 2 次但无法设置状态