236 lines
8.4 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---@class Youdao: TransOnlineBackend
---@field uri string api uri
---@field salt string
---@field app_id string
---@field app_passwd string
---@field disable boolean
local M = {
uri = 'https://openapi.youdao.com/api',
salt = tostring(math.random(bit.lshift(1, 15))),
name = 'youdao',
method = 'get',
}
---@class YoudaoQuery
---@field q string
---@field from string
---@field to string
---@field appid string
---@field salt string
---@field sign string
---Get content for query
---@param data TransData
---@return YoudaoQuery
function M.get_query(data)
local str = data.str
local app_id = M.app_id
local salt = M.salt
local curtime = tostring(os.time())
local chars = vim.str_utf_pos(str)
local count = #chars
local input = count <= 20 and str or
str:sub(1, chars[11] - 1) .. #chars .. str:sub(chars[count - 9])
-- sign=sha256(应用ID+input+salt+curtime+应用密钥) 一二三四五六七八九十
local hash = app_id .. input .. salt .. curtime .. M.app_passwd
local sign = vim.fn.sha256(hash)
return {
q = str,
to = data.from == 'zh' and 'en' or 'zh-CHS',
from = 'auto',
signType = 'v3',
appKey = app_id,
salt = M.salt,
curtime = curtime,
sign = sign,
}
end
local function check_untracked_field(body)
local field = {
"phonetic",
'usPhonetic',
"ukPhonetic",
"text", -- text 短语
"explain", -- String Array 词义解释列表
"wordFormats", -- Object Array 单词形式变化列表
"name", -- String 形式名称,例如:复数
"phrase", -- String 词组
"meaning", -- String 含义
"synonyms", -- JSONObject 近义词
"pos", -- String 词性
"words", -- String Array 近义词列表
"trans", -- String 释义
"antonyms", -- ObjectArray 反义词
"relatedWords", -- JSONArray 相关词
"wordNet", -- JSONObject 汉语词典网络释义
"phonetic", -- String 发音
"meanings", -- ObjectArray 释义
"meaning", -- String 释义
"example", -- array 示例
"sentenceSample", -- text 例句
"sentence", -- text 例句
"sentenceBold", -- text 将查询内容加粗的例句
"wfs", -- text 单词形式变化
"exam_type", -- text 考试类型
}
for _, f in ipairs(field) do
if body[f] then
print(('%s found : %s'):format(f, vim.inspect(body[f])))
end
end
end
function M.debug(body)
if not body then
vim.notify('Unknown errors, nil body', vim.log.levels.ERROR)
end
local debug_msg = ({
[101] = "缺少必填的参数,首先确保必填参数齐全,然后确认参数书写是否正确。",
[102] = "不支持的语言类型",
[103] = "翻译文本过长",
[104] = "不支持的API类型",
[105] = "不支持的签名类型",
[106] = "不支持的响应类型",
[107] = "不支持的传输加密类型",
[108] = "应用ID无效注册账号登录后台创建应用和实例并完成绑定可获得应用ID和应用密钥等信息",
[109] = "batchLog格式不正确",
[110] = "无相关服务的有效实例,应用没有绑定服务实例可以新建服务实例绑定服务实例。注某些服务的翻译结果发音需要tts实例需要在控制台创建语音合成实例绑定应用后方能使用。",
[111] = "开发者账号无效",
[113] = "q不能为空",
[120] = "不是词,或未收录",
[201] = "解密失败可能为DES,BASE64,URLDecode的错误",
[202] = "签名检验失败",
[203] = "访问IP地址不在可访问IP列表",
[205] = "请求的接口与应用的平台类型不一致确保接入方式Android SDK、IOS SDK、API与创建的应用平台类型一致。如有疑问请参考入门指南",
[206] = "因为时间戳无效导致签名校验失败",
[207] = "重放请求",
[301] = "辞典查询失败",
[302] = "翻译查询失败",
[303] = "服务端的其它异常",
[305] = "批量翻译部分成功",
[401] = "账户已经欠费,请进行账户充值",
[411] = "访问频率受限,请稍后访问",
[412] = "长请求过于频繁,请稍后访问",
[390001] = "词典名称不正确",
})[tonumber(body.errorCode)]
vim.notify('Youdao API Error: ' .. (debug_msg or vim.inspect(body)), vim.log.levels.ERROR)
end
---@overload fun(TransData): TransResult
---Query Using Youdao API
---@param body table Youdao ouput
---@param data TransData Data obj
---@return table|false?
function M.formatter(body, data)
if body.errorCode ~= "0" then return false end
check_untracked_field(body)
if not body.isWord then
return {
title = body.query,
[data.from == 'en' and 'translation' or 'definition'] = body.translation,
}
end
return {
title = {
word = body.query,
phonetic = body.basic.phonetic,
},
web = body.web,
explains = body.basic.explains,
-- phrases = body.phrases,
-- synonyms = body.synonyms,
-- sentenceSample = body.sentenceSample,
[data.from == 'en' and 'translation' or 'definition'] = body.translation,
}
end
---@class TransBackend
---@field youdao Youdao
return M
-- INFO :Query Result Example
-- {
-- basic = {
-- explains = { "normal", "regular", "normality" },
-- phonetic = "zhèng cháng"
-- },
-- dict = {
-- url = "yddict://m.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8"
-- },
-- errorCode = "0",
-- isWord = true,
-- l = "zh-CHS2en",
-- mTerminalDict = {
-- url = "https://m.youdao.com/m/result?lang=zh-CHS&word=%E6%AD%A3%E5%B8%B8"
-- },
-- query = "正常",
-- requestId = "a8a40c0e-0d3b-49d5-a8fe-b1cd211ff5db",
-- returnPhrase = { "正常" },
-- speakUrl = "https://openapi.youdao.com/ttsapi?q=%E6%AD%A3%E5%B8%B8&langType=zh-CHS&sign=164F6EFF2EFFC7626FB70DBCF796AE70&salt=1678931501049&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false",
-- tSpeakUrl = "https://openapi.youdao.com/ttsapi?q=normal&langType=en-USA&sign=6A0CF2EF076EA8D82453956B33F69A51&salt=1678931501049&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false",
-- translation = { "normal" },
-- web = { {
-- key = "正常",
-- value = { "normal", "ordinary", "normo", "regular" }
-- }, {
-- key = "正常利润",
-- value = { "normal profits" }
-- }, {
-- key = "邦交正常化",
-- value = { "normalize relations", "normalization of diplomatic relations" }
-- } },
-- webdict = {
-- url = "http://mobile.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8"
-- }
-- }
-- {
-- basic = {
-- explains = { "normal profit" }
-- },
-- dict = {
-- url = "yddict://m.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6"
-- },
-- errorCode = "0",
-- isWord = true,
-- l = "zh-CHS2en",
-- mTerminalDict = {
-- url = "https://m.youdao.com/m/result?lang=zh-CHS&word=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6"
-- },
-- query = "正常利润",
-- requestId = "87a0b1bf-a5a2-46d1-8604-cd765cd06a90",
-- returnPhrase = { "正常利润" },
-- speakUrl = "https://openapi.youdao.com/ttsapi?q=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6&langType=zh-CHS&sign=5DC3A57D7D4CB21892D0D77E6968F03D&salt=1678950274137&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false",
-- tSpeakUrl = "https://openapi.youdao.com/ttsapi?q=Normal+profit&langType=en-USA&sign=325FA5994D5D3B859DF21E3522577AFB&salt=1678950274137&voice=4&format=mp3&appKey=1858465a8708c121&ttsVoiceStrict=false",
-- translation = { "Normal profit" },
-- web = { {
-- key = "正常利润",
-- value = { "normal profits" }
-- }, {
-- key = "非正常利润",
-- value = { "abnormal profits" }
-- }, {
-- key = "正常利润率",
-- value = { "normal profit rate" }
-- } },
-- webdict = {
-- url = "http://mobile.youdao.com/dict?le=eng&q=%E6%AD%A3%E5%B8%B8%E5%88%A9%E6%B6%A6"
-- }
-- }