3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-07

はじめに

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

使い方

【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;
}
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?