🙆‍♀️

QiitaのOrganizationに記事を投稿すると自動でDiscordに通知させる

2024/08/23に公開

IFTTTを使用する方法もあるのですがこちらは有料になるので、今回はGoogleAppScriptを使用してこのプロセスを自動化します。

必要なもの

  1. Googleアカウント
  2. DiscordのWebhook URL
  3. QiitaのRSSフィード

RSSとは?

ニュースやブログなど各種のウェブサイトの更新情報を配信するための文書フォーマットの総称である。(参照

要するに記事情報を取得するためのフォーマットだと思います。(間違っていたらすみません)

Webhookとは?

Webhookとは、Web アプリケーションやサービスなどの更新情報を他のアプリケーションへ特定のイベント等が発生した際にリアルタイムで HTTP プロトコルを使用して通知するシステム。
参考

Webhookを取得

  1. Discordを開く
  2. サーバー設定の連携サービスを開く
  3. 「新しいウェブフック」ボタンから作成しURLを取得する

RSSフィードを取得する

組織のURLの最後尾に「/activities.atom」を付けたものが組織のRSSフィードになります。

https://qiita.com/organizations/<組織名>/activities.atom

GoogleAppScriptの作成

手順1

GoogleDriveを開く。

手順2

新規をクリックし、その他から新しいGoogleAppScriptを作成します。

手順3

以下のコードを入力してください。

QiitaToDiscordNotifier.gs
const DISCORD_WEBHOOK_URL = 'Discordで取得したWebhookを入力';
const RSS_FEED_URL = 'RSSフィードを入力';

function checkQiitaFeed() {
  try {
    const response = UrlFetchApp.fetch(RSS_FEED_URL);
    const xml = response.getContentText();
    const document = XmlService.parse(xml);
    const root = document.getRootElement();
    
    Logger.log('Root element: ' + root.getName());

    const namespace = XmlService.getNamespace('http://www.w3.org/2005/Atom');
    const entries = root.getChildren('entry', namespace);
    Logger.log('Number of entries: ' + entries.length);

    const lastCheck = PropertiesService.getScriptProperties().getProperty('lastCheck');
    const lastCheckDate = lastCheck ? new Date(lastCheck) : new Date(0);

    entries.forEach(entry => {
      const publishedDate = new Date(entry.getChild('published', namespace).getText());
      if (publishedDate > lastCheckDate) {
        const title = entry.getChild('title', namespace).getText();
        const link = entry.getChild('link', namespace).getAttribute('href').getValue();
        sendDiscordNotification(title, link);
      }
    });

    PropertiesService.getScriptProperties().setProperty('lastCheck', new Date().toISOString());
  } catch (e) {
    Logger.log('Error fetching or parsing RSS feed: ' + e.message);
  }
}

function sendDiscordNotification(title, link) {
  try {
    const payload = {
      content: `新しいQiita記事が投稿されました: ${title} ${link}`
    };
    const options = {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify(payload)
    };
    UrlFetchApp.fetch(DISCORD_WEBHOOK_URL, options);
    Logger.log(`Notification sent: ${title} - ${link}`);
  } catch (e) {
    Logger.log('Error sending Discord notification: ' + e.message);
  }
}

手順4

トリガーを設定します。
左のタブからトリガーを選択し、
右下のトリガーを追加をクリックしてください。
スクリーンショット 2024-06-20 170614.png
開いたら以下のように設定してください。
チェックを行う時間間隔はお好みで設定してください。
スクリーンショット 2024-06-20 171614.png

終わり

これでスクリプトが定期的に実行され、Qiitaの組織に新しい記事が投稿されると自動的にDiscordに通知されるようになりました。

Discussion