2
Help us understand the problem. What are the problem?

posted at

updated at

Organization

LINEBot x GAS x DeepLで英語に触れよう

はじめに

遊びで作ってみたので、ソースコードを公開します。
自分で送った日本語が、友達から送られてくる日本語が、英語とともに送られてくるので、より実践的な英語学習になるかもしれませんよ。

使い方

【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;
}

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?