ゆるりとねっと。

ヲタクなワーママのゆるゆる雑記ブログ

【Slack+GAS】ブログで特定のキーワードを含む記事が更新されたらSlackに通知する

最近は、園生活の様子を伝えるブログを持っている保育園・幼稚園があります。

次女の保育園もブログを運営しており、時々覗いては「あぁ可愛い…」と癒やされています。

しかしブログのカテゴリ分けがきちんとされておらず、不定期更新の中でどのクラスの話題が登場するかは完全ランダム。たまにチェックしても違うクラスの話題だった…なんてことが茶飯事でした。

そこで、自分のクラスの記事が出たときだけSlackに通知できたら楽なんじゃないかと思い立ち、久々にGoogleAppScript(GAS)いじりをしてみることにしました。

保育園ブログで次女クラスの記事更新だけを通知する

構成

チェックしたいブログのXMLフィードを取得し、条件に合致する記事があればそのURLをSlackに通知する、というシンプルな構成です。

今回の条件は以下の通りです。

  • 概要に特定のキーワードが含まれている。
  • 投稿日時が、現在から24時間以内である。

特定のキーワードは、記事の冒頭に書かれる"次女のクラス名"を設定しています。

作成したGASのコード

var bot_name = 'ボット名';
var bot_icon = 'ボットのアイコン';
var post_channel = '投稿先チャンネル';
var feedURL = 'ブログのFeed';
var keyword = '拾いたいキーワード';

function parseXml() {

  // フィードを取得
  var response = UrlFetchApp.fetch(feedURL);
 
  // XMLをパース
  var xml = XmlService.parse(response.getContentText());
 
  // 各データの要素を取得
  var entries = xml.getRootElement().getChildren('channel')[0].getChildren('item');
 
  var length = entries.length;
 
  for(var i = 0; i < length; i++) {
    
    var description = entries[i].getChildText('description');

    if(keywordExists(description, keyword)) {
      var title   = entries[i].getChildText('title');
      var link    = entries[i].getChildText('link');
      var pubDate = entries[i].getChildText('pubDate');
      var date_ja = Moment.moment(pubDate).format('llll');
      var date_ms = Moment.moment(pubDate).format('X');
      var yesterday = Moment.moment().add(-1, 'days').format('X');

      // 24時間以内の記事であればSlackに投稿
      if(date_ms >= yesterday){
        var content = [title,link,date_ja];
        postSlack(content);
      }
    }
  }
}

// 特定のキーワードがあるかどうか
function keywordExists(str,needle) {
  if(str.indexOf(needle) == -1){
    return false;
  }
  return true;
}

// Slackに投稿
function postSlack(content){
  var prop = PropertiesService.getScriptProperties().getProperties();
  var app = SlackApp.create(prop.slackToken);
  var message = content[0] + '(' + content[2] + '更新)\n' + content[1];

  return app.postMessage( post_channel, message, {
    username: bot_name,
    icon_emoji: bot_icon,
    unfurl_links: true
  });
}

これを日時のトリガーで自動実行します。

つまずいた点

スクリプトエディタが新しくなっていた

GASのIDEが2020年12月に刷新されていました。

操作性はいい感じになった気がしますが、前にあったあの機能はどこだっけ?といったことが度々あり、地味につまずいてました。

プロジェクトキーが使えない

スクリプトを作る際、便利なライブラリを利用できます。

以前はプロジェクトキーを使って登録できたのですが、新しいIDEでは使用できなくなっています。新しいIDEではスクリプトIDで登録します。

qiita.com

今回のスクリプトで使っているライブラリ「SlackApp」「Moment」のスクリプトIDは以下の通りです。

SlackApp

プロジェクトキーM3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
スクリプトID1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq

Moment

プロジェクトキーMHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48
スクリプトID15hgNOjKHUG4UtyZl9clqBbl23sDvWMS8pfDJOyIapZk5RBqwL3i-rlCo

スクリプトプロパティがみつからない

以前のエディタではスクリプトプロパティの設定画面があり、環境変数やAPIキーなどコード上に直書きしたくないものをそこに定義しておくことができました。

が、新しいエディタにそれらしきものが見当たらず困っています。。ググってみたらGUIとして提供されていないっぽいみたい…

しかし上記のスクリプトは、この記述のみで正常に動いてます。なんで!?前に作ったスクリプトで定義したものがそのまま引き継がれてるのか…?(ここあまり自信ありません)

新旧IDEの比較はこちらの記事が詳しいです。

admin-it.xyz

リンクのプレビューが出ない

SlackにURLを貼りつけるとリンクのプレビューが自動展開されますが、スクリプトから実行するとプレビューが展開されませんでした。

これはpayloadに「unfurl_links: true」を入れることで解消されました。