DeepLいいですよね。僕もよく喋るLINEグループにDeepL導入してますw #linedc pic.twitter.com/ASxjn5wfkg
— ようかん / Yosuke Inoue (@inoue2002) March 7, 2022
はじめに
遊びで作ってみたので、ソースコードを公開します。
自分で送った日本語が、友達から送られてくる日本語が、英語とともに送られてくるので、より実践的な英語学習になるかもしれませんよ。
使い方
【3分クッキング】コピペとGASで作るLINEBot入門(2021/1)の記事と全く同じ手法で利用していただくことができます。以下ソースコードを貼って、キーを編集してデプロイするだけです!
ソースコード
実際に運用していて、ただのURLだけのメッセージも翻訳するのが鬱陶しかったのhttps://
で始まっているメッセージは無視するようにしています。
main.gs
const ACCESS_TOKEN = "LINEのアクセストークン";
const API_KEY = "deepLのAPIトークン";
const API_URL = 'https://api-free.deepl.com/v2/translate';
const FETCH_WAIT = 200;
// DeepL翻訳関数
function deepltranslate(text, src, tgt) {
let t = text.toString();
let url = API_URL;
let content = encodeURI('auth_key=' + API_KEY + '&text=' + t + '&source_lang=' + src + '&target_lang=' + tgt);
const postheader = {
"accept": "gzip, */*",
"timeout": "20000",
"Content-Type": "application/x-www-form-urlencoded"
}
const parameters = {
"method": "post",
"headers": postheader,
'payload': content
}
// スプレッドシートから大量に呼ばれる可能性があるのでウェイトを入れておく
Utilities.sleep(FETCH_WAIT);
let response = ''
try {
response = UrlFetchApp.fetch(url, parameters);
}
catch (e) {
Logger.log(e.toString());
return 'DeepL:Exception';
}
let response_code = response.getResponseCode().toString();
Logger.log(response_code + ':' + url);
if (response_code != 200) return 'DeepL:HTTP Error(' + response_code + ')'
// JSONからテキストを取り出す
let json = JSON.parse(response.getContentText('UTF-8'));
return json.translations[0].text;
}
function deepltranslateje(text) {
return deepltranslate(text, 'ja', 'en');
}
/*
function deepltranslateej(text) {
return deepltranslate(text, 'en', 'ja');
}
*/
async function doPost(e) {
for (let i = 0; i < JSON.parse(e.postData.contents).events.length; i++) {
const event = JSON.parse(e.postData.contents).events[i];
const message = await eventHandle(event);
//応答するメッセージがあった場合
if (message !== undefined) {
const replyToken = event.replyToken;
const replyUrl = "https://api.line.me/v2/bot/message/reply";
UrlFetchApp.fetch(replyUrl, {
headers: {
"Content-Type": "application/json; charset=UTF-8",
Authorization: "Bearer " + ACCESS_TOKEN,
},
method: "post",
payload: JSON.stringify({
replyToken: replyToken,
messages: [message],
}),
});
}
}
return ContentService.createTextOutput(
JSON.stringify({ content: "post ok" })
).setMimeType(ContentService.MimeType.JSON);
}
async function eventHandle(event) {
let message;
console.log(event)
switch (event.type) {
case "message":
message = await messagefunc(event);
break;
case "postback":
message = await postbackFunc(event);
break;
case "follow":
message = await followFunc(event);
break;
case "unfollow":
message = unfolowFunc(event);
break;
}
return message;
}
//メッセージイベントの処理
async function messagefunc(event) {
if (event.message.type !== 'text') {
return;
}
if (event.message.text.slice(0, 8) === 'https://') {
return;
}
const message = deepltranslateje(event.message.text)
return { type: "text", text: message };
}
//ポストバックイベントの処理
async function postbackFunc(event) {
return { type: "text", text: event.postback.data };
}
//友達登録時の処理
async function followFunc(event) {
return { type: "text", text: "友達登録ありがとうございます!!" };
}
//友達解除後の処理
async function unfollowFunc() {
return undefined;
}