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

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">DeepLいいですよね。僕もよく喋るLINEグループにDeepL導入してますw <a href="https://twitter.com/hashtag/linedc?src=hash&amp;ref_src=twsrc%5Etfw">#linedc</a> <a href="https://t.co/ASxjn5wfkg">pic.twitter.com/ASxjn5wfkg</a></p>&mdash; ようかん / Yosuke Inoue (@inoue2002) <a href="https://twitter.com/inoue2002/status/1500784726583353346?ref_src=twsrc%5Etfw">March 7, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


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

### 使い方
[【3分クッキング】コピペとGASで作るLINEBot入門(2021/1)](https://qiita.com/inoue2002/items/0ccda626442921ec4eba)の記事と全く同じ手法で利用していただくことができます。以下ソースコードを貼って、キーを編集してデプロイするだけです！

### ソースコード
実際に運用していて、ただの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;
}
```