見出し画像

LINE公式アカウントのメッセージをDiscordに通知する方法

LINE公式アカウントのメッセージをDiscordに通知するアプリをChatGPTさんに作ってもらいました。GASなので、無料です。

以下の記事も、ChatGPTさんに「noteで公開したいから記事書いて」と言ったらまとめてくれました。
では、どうぞ。


この記事では、Google Apps Scriptを使ってLINE公式アカウントから受信したメッセージをDiscordに通知する方法を紹介します。スクリプトプロパティを使用して設定を管理し、簡単にカスタマイズできるようにしています。

必要なもの

  1. Googleアカウント

  2. LINE公式アカウント

  3. Discordアカウント

手順概要

  1. Google Apps Scriptプロジェクトを作成

  2. スクリプトプロパティの設定

  3. LINE DevelopersコンソールでWebhookを設定

  4. DiscordでWebhookを設定

  5. Google Apps Scriptのデプロイ

  6. テストと確認

1. Google Apps Scriptプロジェクトを作成

スクリプトの作成

  1. Googleドライブにアクセスし、「新規」→「その他」→「Google Apps Script」を選択します。

  2. 以下のスクリプトをコピーして貼り付けます。

// スクリプトプロパティを取得
var scriptProperties = PropertiesService.getScriptProperties();
var discordWebhookUrl = scriptProperties.getProperty('discordWebhookUrl');
var lineChannelAccessToken = scriptProperties.getProperty('lineChannelAccessToken');
var logFolderId = scriptProperties.getProperty('logFolderId');

// ログメッセージをGoogleドライブの指定フォルダに保存する関数
function logToFile(logMessage) {
  var folder = DriveApp.getFolderById(logFolderId);
  var logFile = folder.getFilesByName("line_discord_log.txt");
  var file;
  
  if (logFile.hasNext()) {
    file = logFile.next();
  } else {
    file = folder.createFile("line_discord_log.txt", "");
  }
  
  var content = file.getBlob().getDataAsString();
  content += new Date().toLocaleString() + " - " + logMessage + "\n";
  file.setContent(content);
}

// 日付と時刻をフォーマットする関数
function formatDate(date) {
  var year = date.getFullYear();
  var month = ("0" + (date.getMonth() + 1)).slice(-2);
  var day = ("0" + date.getDate()).slice(-2);
  var hours = ("0" + date.getHours()).slice(-2);
  var minutes = ("0" + date.getMinutes()).slice(-2);
  
  return month + "/" + day + " " + hours + ":" + minutes;
}

// ブラウザでアクセスした際の応答
function doGet(e) {
  logToFile("Webhook received via GET request");
  return ContentService.createTextOutput("Webhook received").setMimeType(ContentService.MimeType.TEXT);
}

// LINEからのPOSTリクエストを処理する関数
function doPost(e) {
  try {
    logToFile("Webhook request received via POST");
    logToFile("Request content: " + e.postData.contents); // リクエストの内容をログに記録

    var lineData = JSON.parse(e.postData.contents);
    logToFile("Parsed lineData: " + JSON.stringify(lineData));

    var userId = lineData.events[0].source.userId;
    logToFile("User ID: " + userId); // User IDをログに記録

    var userMessage = lineData.events[0].message.type === "text" ? lineData.events[0].message.text : "[スタンプ]";
    logToFile("User Message: " + userMessage); // User Messageをログに記録

    var timestamp = formatDate(new Date(lineData.events[0].timestamp));
    logToFile("Timestamp: " + timestamp); // Timestampをログに記録

    // ユーザー情報を取得する
    var userName = getUserName(userId) || "ユーザー名不明";
    logToFile("User Name: " + userName); // User Nameをログに記録

    var formattedMessage = 
      ':speech_balloon: **' + userName + '** | __' + timestamp + '__' + '\n' +
      userMessage + '\n'+ '--------------------------------';

    logToFile("Formatted Message: " + formattedMessage); // Formatted Messageをログに記録

    sendToDiscord(formattedMessage);

    return ContentService.createTextOutput(JSON.stringify({ "status": "success" })).setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    logToFile("Error: " + error.message);
    return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": error.message })).setMimeType(ContentService.MimeType.JSON);
  }
}

// ユーザーIDから名前を取得する関数
function getUserName(userId) {
  try {
    var url = 'https://api.line.me/v2/bot/profile/' + userId;
    logToFile("Profile URL: " + url); // Profile URLをログに記録

    var options = {
      'headers': {
        'Authorization': 'Bearer ' + lineChannelAccessToken
      },
      'method': 'get',
      'contentType': 'application/json'
    };

    var response = UrlFetchApp.fetch(url, options);
    logToFile("Profile Response: " + response.getContentText()); // Profile Responseをログに記録

    var userData = JSON.parse(response.getContentText());
    logToFile("User Data: " + JSON.stringify(userData)); // User Dataをログに記録

    return userData.displayName;
  } catch (error) {
    logToFile("Error fetching user profile: " + error.message);
    return null; // デフォルトの名前
  }
}

// Discordにメッセージを送信する関数
function sendToDiscord(message) {
  try {
    var payload = {
      'content': message
    };

    var options = {
      'method': 'post',
      'contentType': 'application/json',
      'payload': JSON.stringify(payload)
    };

    var response = UrlFetchApp.fetch(discordWebhookUrl, options);
    logToFile("Discord Response: " + response.getContentText()); // Discord Responseをログに記録
  } catch (error) {
    logToFile("Error sending to Discord: " + error.message);
  }
}

2. スクリプトプロパティの設定

スクリプトプロパティの設定方法

  1. Google Apps Scriptエディタで、トップメニューの「ファイル」から「プロジェクトのプロパティ」を選択します。

  2. 「スクリプトのプロパティ」タブを選択し、以下のプロパティを追加します:

    • discordWebhookUrl: DiscordのWebhook URL

    • lineChannelAccessToken: LINEチャネルアクセストークン

    • logFolderId: ログファイルを保存するフォルダのID

3. LINE DevelopersコンソールでWebhookを設定

  1. LINE Developersにログインします。

  2. 該当するプロバイダーを選択し、目的のLINE公式アカウントのチャネルを選択します。

  3. 「Messaging API」タブを開きます。

  4. 「Webhook URL」にGoogle Apps ScriptのウェブアプリURLを設定し、「更新」をクリックします。

    1. https://script.google.com/macros/s/あなたのデプロイURL/exec

  5. 「Webhook利用」を「利用する」に設定します。

4. DiscordでWebhookを設定

  1. Discordで通知を送りたいチャンネルを選び、「チャンネルを編集」→「連携サービス」→「ウェブフック」からウェブフックを作成します。

  2. ウェブフックURLをコピーし、スクリプトプロパティのdiscordWebhookUrlに設定します。

5. Google Apps Scriptのデプロイ

デプロイ手順

  1. スクリプトエディタの右上の「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。

  2. 「ウェブアプリ」を選択し、「次のユーザーとして実行」を「自分」に設定します。

  3. 「アクセスできるユーザー」を「全員(匿名ユーザーを含む)」に設定します。

  4. デプロイをクリックし、表示されたウェブアプリのURLを取得します。

6. テストと確認

ブラウザでの確認

  1. ウェブアプリのURLにブラウザでアクセスし、「Webhook received」のメッセージが表示されるか確認します。

LINE公式アカウントからのテストメッセージ

  1. LINE公式アカウントにテキストメッセージとスタンプを送信します。

  2. Googleドライブで、指定したフォルダIDの場所にline_discord_log.txtというファイルが作成されている

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?