LINE公式アカウントのメッセージをDiscordに通知する方法
LINE公式アカウントのメッセージをDiscordに通知するアプリをChatGPTさんに作ってもらいました。GASなので、無料です。
以下の記事も、ChatGPTさんに「noteで公開したいから記事書いて」と言ったらまとめてくれました。
では、どうぞ。
この記事では、Google Apps Scriptを使ってLINE公式アカウントから受信したメッセージをDiscordに通知する方法を紹介します。スクリプトプロパティを使用して設定を管理し、簡単にカスタマイズできるようにしています。
必要なもの
Googleアカウント
LINE公式アカウント
Discordアカウント
手順概要
Google Apps Scriptプロジェクトを作成
スクリプトプロパティの設定
LINE DevelopersコンソールでWebhookを設定
DiscordでWebhookを設定
Google Apps Scriptのデプロイ
テストと確認
1. Google Apps Scriptプロジェクトを作成
スクリプトの作成
Googleドライブにアクセスし、「新規」→「その他」→「Google Apps Script」を選択します。
以下のスクリプトをコピーして貼り付けます。
// スクリプトプロパティを取得
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. スクリプトプロパティの設定
スクリプトプロパティの設定方法
Google Apps Scriptエディタで、トップメニューの「ファイル」から「プロジェクトのプロパティ」を選択します。
「スクリプトのプロパティ」タブを選択し、以下のプロパティを追加します:
discordWebhookUrl: DiscordのWebhook URL
lineChannelAccessToken: LINEチャネルアクセストークン
logFolderId: ログファイルを保存するフォルダのID
3. LINE DevelopersコンソールでWebhookを設定
LINE Developersにログインします。
該当するプロバイダーを選択し、目的のLINE公式アカウントのチャネルを選択します。
「Messaging API」タブを開きます。
「Webhook URL」にGoogle Apps ScriptのウェブアプリURLを設定し、「更新」をクリックします。
https://script.google.com/macros/s/あなたのデプロイURL/exec
「Webhook利用」を「利用する」に設定します。
4. DiscordでWebhookを設定
Discordで通知を送りたいチャンネルを選び、「チャンネルを編集」→「連携サービス」→「ウェブフック」からウェブフックを作成します。
ウェブフックURLをコピーし、スクリプトプロパティのdiscordWebhookUrlに設定します。
5. Google Apps Scriptのデプロイ
デプロイ手順
スクリプトエディタの右上の「デプロイ」ボタンをクリックし、「新しいデプロイ」を選択します。
「ウェブアプリ」を選択し、「次のユーザーとして実行」を「自分」に設定します。
「アクセスできるユーザー」を「全員(匿名ユーザーを含む)」に設定します。
デプロイをクリックし、表示されたウェブアプリのURLを取得します。
6. テストと確認
ブラウザでの確認
ウェブアプリのURLにブラウザでアクセスし、「Webhook received」のメッセージが表示されるか確認します。
LINE公式アカウントからのテストメッセージ
LINE公式アカウントにテキストメッセージとスタンプを送信します。
Googleドライブで、指定したフォルダIDの場所にline_discord_log.txtというファイルが作成されている
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?