百度翻译 API 文档

* 百度翻译文档
BaiduApi: 百度文档翻译返回接口
@form { str }
[检视源码]
async function() {
	/*
	await db().create("baidu", [
		[ "id integer", null, true ], "sign varchar(32), error_code integer, fileSrcUrl varchar(2000), amount integer, charCount integer, requestId integer", [ "dateline timestamp", "datetime('now', 'localtime')" ]
		]);
	await db().none("create index baidu_requestId on baidu(requestId)");
	*/
	var res = qstr();
	delete res.r; delete res.error_msg;
	await db().insert("baidu", res);
	return { msg: "ok" };
}
Baidu: 百度文档翻译调取数据库
@form { requestId }
[检视源码]
async function() {
	var res = form();
	var data = await db().table("baidu").where("requestId=@requestId").fetch({ requestId: res.requestId });
	return data.fileSrcUrl;
}
Unipush: unipush
@form { }
[检视源码]
async function() {
	var res = form();
	var data = await dbg().trace(res);
	return data;
}
Pictrans: 百度图片翻译
@form { from, to ,str }
*wwwroot/bbs-async/baidu/test.jpg
[检视源码]
async function() {
	var res = form(), from = res.from || "auto", to = res.to || "zh", str = res.str || "wwwroot/bbs-async/baidu/test.jpg";
	var appid = sys.baidu_appid, seckey = sys.baidu_seckey;
	var salt = (new Date).getTime();
	var cuid = "APICUID", mac = "mac", version = 3;
	var file = fs.readFileSync(path.resolve(__dirname, str));
	var sign = md5(appid + md5(file, 32) + salt + cuid + mac + seckey, 32);
	var url = "https://fanyi-api.baidu.com/api/trans/sdk/picture";
	var data = await urllib.request(url, {
		method: "POST",
		contentType: "multipart/form-data",
		dataType: "json",
		data: { from, to, appid, salt, cuid, mac, version, sign },
		files: { image: file }
	});
	return data.data.data.sumDst;
}
Doctrans: 百度文档翻译
@form { from, to, type, str }
*wwwroot/bbs-async/baidu/1.pdf
[检视源码]
async function(from, to, type, str) {
	var res = form();
	if(!from) from = res.from || "auto";
	if(!to) to = res.to || "zh";
	if(!type) type = res.type || "pdf";
	if(!str) str = res.str || "wwwroot/bbs-async/baidu/1.pdf";
	var timestamp = parseInt(new Date / 1000);
	var file = fs.readFileSync(path.resolve(__dirname, str));
	var appid = sys.baidu_appid, seckey = sys.baidu_seckey;
	var params = [
		"appid=" + appid,
		"from=" + from,
		"to=" + to,
		"timestamp=" + timestamp,
		"type=" + type
	];
	params.sort();
	var querySign = params.join("&") + "&" + md5(file, 32) + seckey;
	var sign = md5(querySign, 32);
	var url = "https://fanyi-api.baidu.com/api/trans/vip/doctrans";
	var data = await urllib.request(url, {
		method: "POST",
		contentType: "multipart/form-data",
		dataType: "json",
		data: { appid, from, to, timestamp, type, sign },
		files: { file: fs.createReadStream(path.resolve(__dirname, str)) }
	});
	const sleep = time => new Promise(resolve => setTimeout(resolve, time));
	async function doc(id) {
		await sleep(1000);
		var data = await db().table("baidu").where("requestId=@requestId").fetch({ requestId: id });
		if(data) return data.fileSrcUrl;
		else return doc(id);
	}
	return doc(data.data.data.requestId);
}
Hasjapanese: 是否含有日文
@form { str }
[检视源码]
async function() {
	var res = form(), str = res.str;
	var result = await Kuroshiro.default.Util.hasJapanese(str);
	return { msg: result };
}
Kuroshiro: 日语汉字标注假名
@form { str, to, mode, [romajiSystem], delimiter_start, delimiter_end }
to: hiragana 平假名, katakana 片假名, romaji 罗马字
mode: normal 标准模式, spaced 空格分组, okurigana 括号假名, furigana 注音假名
*[romajiSystem] 仅当to参数设置为 romaji 时生效: nippon 日本式, passport 护照式, hepburn 平文式
delimiter 分隔符,默认()
[检视源码]
async function() {
	var res = form(), str = res.str;
	var data = {
		to: res.to,
		mode: res.mode,
		romajiSystem: res.romajiSystem,
		delimiter_start: res.delimiter_start,
		delimiter_end: res.delimiter_end
	}
	// 取得res.str里用包裹的字符
	var span = str.match(/(.*?)<\/span>/g);
	// 如果span存在,将包裹的字符替换为特殊字符作为位置顺序标识以便后续处理
	if(span) {
		for(var i = 0; i < span.length; i++) {
			str = str.replace(span[i], "&#" + i + ";");
		}
	}
	var result = await kuroshiro.convert(str, data);
	// isHiragana(char) 是否是平假名, isKatakana(char) 是否是片假名, isKana(char) 是否是假名, isKanji(char) 是否是日文汉字, isJapanese(char) 是否是日文
	// hasHiragana(str) 是否含有平假名, hasKatakana(str) 是否含有片假名, hasKana(str) 是否含有假名, hasKanji(str) 是否含有日文汉字, hasJapanese(str) 是否含有日文
	// kanaToHiragna(str) 转平假名, kanaToKatakana(str) 转片假名, kanaToRomaji(str, system) 转罗马字、参数system可选值为"nippon", "passport", "hepburn" (默认值: “hepburn”)
	// var result = Kuroshiro.default.Util.isHiragana(res.str);
	// var result = Kuroshiro.default.Util.hasKanji(res.str);
	// 取得结果中的特殊字符位置顺序标识
	var pos = result.match(/&#\d+;/g);
	// 将结果中的非中文字符还原,从span数组中取得对应的字符
	if(pos) {
		for(var i = 0; i < pos.length; i++) {
			result = result.replace("&#" + i + ";", span[i]);	// replace 一共可以传入3个参数,第一个为匹配的字符串,第二个为匹配字符串的起始位置,第三个为调用replace方法的字符串本身
		}
	}
	result = result.replace(/.+/g, "
$&
"); // $& 表示与 regexp 相匹配的子串 return { msg: result }; }
Upload: 上传接口
@form { file }
[检视源码]
async function() {
	// if(!me().isLogin) return { err: "需要登录" };
	// if(me().jifen < 50 && me().roleid < 2) return { err: "您的积分不到50,暂不允许上传文件" };
	var filter = /\.(doc|docx|xls|xlsx|ppt|pptx|xml|html|htm|txt|pdf)$/i;
	var maxSize = 8 * 1024 * 1024;	// 允许 8M
	if(!form().file) return { err: "请选择文件" };
	if(!filter.test(form().file.name)) return { err: form().file.name + "文件格式不正确" };
	var ext = RegExp.$1.toLowerCase();
	if(form().file.size > maxSize) return { err: "文件大小不能超过 8M" };
	var savePath = "baidu/" + sys.sTime.toString("yyyy/MM/dd");
	// 判断目录 savePath 是否存在,不存在则递归建立目录
	var mapdir = ensureDir(savePath);
	var fname = sys.sTime.toString("hhmmss") + Math.random().toString(36).substr(1, 6) + "." + ext;
	fs.writeFileSync(mapdir + "/" + fname, form().file.data);
	var doc = await this.doctrans("auto", "zh", ext, "wwwroot/exop.cn/" + savePath + "/" + fname);
	return { path: doc };
}
参数录入
执行
取消