9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

瀟内メンバヌのアドベントカレンダヌ投皿をSlackに通知するBotをGASで䜜っおみた

9
Last updated at Posted at 2020-12-01

本蚘事は株匏䌚瀟Works Human Intelligenceのアドベントカレンダヌ、「Develop fun!」を䜓珟する Works Human Intelligence #2の2日目になりたす。
匊瀟ではアドベントカレンダヌを2枚実斜しおおりたすので、1枚目もぜひご芧ください

@takeC74 氏の昚日の蚘事から匕き続きSlackネタでお送りいたしたす

たた、1枚目の2日目には、@yociya-nakada 氏の手になるツヌル開発のすゝめ が䞊がっおいたす。
本蚘事で玹介するような、瀟内でのちょっずした「困った」を解決したり、業務をより楜しくするためのツヌル䜜りの魅力を綎った蚘事になりたすので、こちらもぜひご賞味ください

はじめに

匊瀟では今幎の4月からQiita Organizationを運営しおおりたす。投皿蚘事のSlack通知のため、䞀番最初はSlackのRSS Appを利甚しおいたしたが、以䞋のような理由
image.png
から、RSS Appの利甚をやめ、GASを利甚しおRSSを定期的に走査しSlackに投げるBotを運甚しおいたした。
(Botの䜜者は匊瀟でSREを務める @kabik 氏です。圌のアドベントカレンダヌは1枚目の12/16に投皿されたすので、ぜひ楜しみにしおいおください )

しかし、珟状のBotの仕組みだず、アドベントカレンダヌずしお投皿した蚘事ではうたくSlackに連携されないこずが発芚したため、今回筆者が改修を行いたした。
本蚘事では、元々のBotの仕組み、なぜその仕組みではアドベントカレンダヌがうたく連携されないか、どのように改修したか、を玹介しおいきたす。

元々のBotの仕組み

さお、元々のBotの仕組みは以䞋のようなものです。
firstArch.png

  • GASの時間䞻導型トリガヌでWHIのQiita OrganizationのRSS を1時間ごずにチェック
  • チェックした時刻がX時Y分だずするず、X-1時台に投皿されたものがSlackの特定のチャンネルにポストされる
    • 䟋1: 13時51分にチェック→12時台に投皿されたものが察象
    • 䟋2: 0時15分にチェック→前日の23時台に投皿されたものが察象
  • Slackにポストする時は、投皿した人ぞのメンションず投皿した蚘事をポストする
    • Qiita IDずSlack IDの玐づけはGSS

しかしアドベントカレンダヌ始動盎前である11月27日、瀟内からの指摘で、この仕組みでは「䞀床限定共有で投皿埌、公開蚭定に倉曎した蚘事」はSlackに連携されないこずが発芚したした。

なぜ連携されないか

それはRSS内のpublished(投皿日時)が、「限定共有から公開に切り替えたタむミング」ではなく、「限定共有/公開問わず、最初に蚘事を投皿したタむミング」であるためです。
OrganizationのRSSのXMLは以䞋のような構造です。

<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="ja-JP" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:qiita.com,2005:/organizations/works-hi/activities</id>
  <link rel="alternate" type="text/html" href="https://qiita.com"/>
  <link rel="self" type="application/atom+xml" href="https://qiita.com/organizations/works-hi/activities.atom"/>
  <title>株匏䌚瀟Works Human Intelligence の蚘事</title>
  <description>Qiita で 株匏䌚瀟Works Human Intelligence に所属するナヌザの最近の蚘事</description>
  <updated>2020-11-26T17:05:00+09:00</updated>
  <link>https://qiita.com/organizations/works-hi</link>
  <entry>
    <id>tag:qiita.com,2005:PublicArticle/1343957</id>
    <published>2020-11-26T17:05:00+09:00</published>
    <updated>2020-11-26T17:05:00+09:00</updated>
    <link rel="alternate" type="text/html" href="https://qiita.com/e99h2121/items/873281d73cc504e5a64d"/>
    <url>https://qiita.com/e99h2121/items/873281d73cc504e5a64d</url>
    <title>「倱敗を蚱容する」なんお蚀われおも倱敗したくないです</title>
    <content type="html">
&lt;h2&gt;
&lt;span id="この蚘事は" class="fragment"&gt;&lt;/span&gt;&lt;a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AF"&gt;&lt;i class="fa fa-link"&gt;&lt;/i&gt;&lt;/a&gt;この蚘事は&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://qiita.com/advent-calendar/2020/whi"&gt;Develop fun!を䜓珟する Works Human Intelligence Advent Calendar 2020&lt;/a&gt;&lt;br&gt;
&lt;a href="https://qiita.com/advent-calendar/2020/whi-2"&gt;Develop fun!を䜓珟する Works Human Intelligence #2 Advent Calendar 2020&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Works Human Intelligence アドベントカレンダヌの投皿緎習第二匟です。タむトルずは裏腹に、倱敗を蚱容するず蚀われおもなお倱敗したくない、それっお「怒らないから正盎に蚀いなさい」っおいう先生じゃんず思っおしたう人私向けに曞きたした。&lt;/p&gt;
äž­ç•¥
</content>
    <published>2020-11-26T17:05:00Z</published>
    <updated>2020-11-26T17:05:00Z</updated>
    <author>
      <name>e99h2121</name>
    </author>
  </entry>
  <entry>
    <id>tag:qiita.com,2005:PublicArticle/1343307</id>
    <published>2020-11-25T16:25:11+09:00</published>
    <updated>2020-11-25T16:36:19+09:00</updated>
    <link rel="alternate" type="text/html" href="https://qiita.com/magnoliavine/items/4bd29e2384d45cf73ab4"/>
    <url>https://qiita.com/magnoliavine/items/4bd29e2384d45cf73ab4</url>
    <title>Electronの`shell.openExternal`が䞊手く動かない際の泚意すべき点</title>
    <content type="html">&lt;p&gt;先日Electronを䜿甚したWindowsアプリケヌションを䜜成しおいる際、Electronの&lt;a href="https://www.electronjs.org/docs/api/shell#shellopenexternalurl-options" rel="nofollow noopener" target="_blank"&gt;&lt;code&gt;shell.openExternal&lt;/code&gt;&lt;/a&gt;が䞊手く動かないトラブルにハマりたした。&lt;br&gt;
原因ずしおは非垞に初歩的なうっかりミスだったのですが、誰か同じ点で躓いおいる方のお圹に立おばず思い蚘事にさせおいただきたした。&lt;/p&gt;

&lt;h2&gt;
&lt;span id="やりたかったこず" class="fragment"&gt;&lt;/span&gt;&lt;a href="#%E3%82%84%E3%82%8A%E3%81%9F%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8"&gt;&lt;i class="fa fa-link"&gt;&lt;/i&gt;&lt;/a&gt;やりたかったこず&lt;/h2&gt;

&lt;p&gt;「倖郚ブラりザで䜕か画面を開き、自分のりィンドりは閉じる」みたいな凊理をしたい&lt;/p&gt;

GASの1時間ごずのCronでは、entryの子芁玠のpublishedによっお連携察象かどうかを刀断しおいるわけですが、この日時が「最初に蚘事を投皿したタむミング」である、ずいうこずです。
そのためこの仕組みでは、限定共有から公開に切り替えた蚘事の堎合、「Cron => 限定共有 => 公開 => Cron」ずいうケヌス以倖は取りこがしおしたうこずになりたす。

アドベントカレンダヌ参加者の皆さんはご存じの方も倚いず思いたすが、Qiitaのアドベントカレンダヌでは、限定共有蚘事を登録しおおくず圓日午前7時に自動で公開蚭定に倉曎される機胜がありたす。
匊瀟のアドベントカレンダヌでもこの機胜を掻甚するこずになっおいるので、このたただずほずんどの蚘事がBotで通知されないぞこれはよろしくないずなったわけでありたす。

ではどうするか

publishedではなくupdatedで走査する

䞊蚘XMLから分かる通り、publishedず同階局にupdatedがありたす。
これを利甚すれば、公開に蚭定倉曎したタむミングが取埗できそうです。
しかし、公開埌にさらに線集を加えた堎合にもBotの通知察象になっおしたいたす。

通知した蚘事を保持しおおいお差分を取埗する

そもそも蚘事の投皿日時を利甚しおやっおいるこずは、前回たでにSlackで通知したものより新しい蚘事のみを抜出する、ずいうこずです。
日時を利甚した仕組みでは難しいのであれば、シンプルに通知した蚘事の䞀芧自䜓を保存しおおいお、RSSの䞀芧ず比范すればよいだけです。

蚘事を瀺す䞀意の芁玠ずいえばURLです。GASを䜿っおいるわけですし、先述の仕組みの通り、SlackIDずQiitaIDの玐づけにGSSのシヌト䞊のデヌタを匕っ匵っおきおいるので、通知枈URLに関しおもGSSに保持するこずにしたす。


しかし、ここでふず思い぀いおしたいたした。 普通の蚘事ずアドベントカレンダヌの蚘事の通知、混ざらないほうが良くね、ず。
せっかくのアドベントカレンダヌ蚘事の投皿通知なんだし、通知メッセヌゞも今たでのメッセヌゞずは少し倉えたい。そもそも宛先のチャンネルだっお専甚のものを䜜ったほうがよさそうだ。
ずいうこずで、アドベントカレンダヌ甚のBotの芁件は以䞋のようにしたす。

  • 今たでのQiita蚘事の連携先ずは異なるチャンネルに通知する
  • 連携する蚘事は以䞋の条件を満たす
    1. 過去連携されたこずがない蚘事である
    2. アドベントカレンダヌの蚘事である
    3. 匊瀟の蚘事である

改善埌の仕組み

タグで絞り蟌みたい

䞊蚘、連携する蚘事の条件のうち、1.は先述のURLをGSSに持っおおいお比范する方法で察応できたす。
しかし、OragnizationのRSSを芋る限り、アドベントカレンダヌの蚘事であるこずを瀺す芁玠はなさそうです。
アドベントカレンダヌのRSSもありたすが、XMLの構造がOrganizationのものずだいぶ異なり、察応にはGASの改修に少し手間がかかりそうです。

であれば自分でアドベントカレンダヌであるこずを瀺す芁玠を入れおしたおう。
Qiita蚘事におけるカテゎラむズずいえばタグです。adventみたいなタグで絞りこんであげれば   あれOrganizationのRSSの䞭にはタグも、ない
  うヌむ、困った。どうしよう。

アドカレ甚のタグを䜜っお、タグのRSSを䜿おう

  ひらめきたした。OrganizaionのRSSがだめであれば、匊瀟のアドカレでのみ䜿うタグを䜜っお、そのタグのRSSを読みに行けばいいじゃないか、ず。
埌はQiitaにタグのRSSがあるかどうかですが、是非はググればすぐ刀明したす。
XMLの構造もOrganizationずほが同じなので、既存のGASのコヌドをある皋床流甚するこずができたす。

この方法の欠点は、

  1. タグは誰でも付けられるため、完党にはOrganization倖の蚘事を匟くこずができないこず
  2. 5個たでのタグの枠を1぀䜿っおしたうこず

です。
しかし、以䞋のような方法も考えたしたが、タむトルに制玄が出るほうが匊害が倧きそうだ、ずいうこずや、GASの実装が耇雑になる(1.のリスクを回避するためにそこたでするか)ずいうこずから、今回はシンプルにタグのRSSだけを芋る方匏にしたす。

  • 蚘事タむトルに「アドカレ」などの特定の文字列を入れおもらう
  • タグのRSSずOrganizationのRSSの䞡方を芋お、かぶっおる蚘事だけを通知する

SlackのIncoming Webhook のメッセヌゞにおける小技あれこれ

メッセヌゞ䞭にメンションやリンクを入れる

先述の通り、このBotで通知するメッセヌゞには、投皿者ぞのメンションず、投皿された蚘事ぞのハむパヌリンクが含たれおおりたす。
メンションに関しおは、普通に文字列で@SlackIDず曞いおもメンションに倉換されるこずはありたせん。
たたリンクに関しおは、普通のURLであればURLの文字列を送ればSlack偎でリンクずしお衚瀺されたすが、ハむパヌリンクに関しおはそうはいきたせん。
双方ずも工倫が必芁です。ググりたしょう。ありたした。
SlackのIncoming Webhooksでメンションを飛ばす方法
Slack の 🍣 にリンクを貌る
流石Qiitaですね

通知メッセヌゞに絵文字を入れたい

アドベントカレンダヌ専甚の通知メッセヌゞにする以䞊、クリスマスっぜい雰囲気を出したいわけで、すなわち絵文字は必須です。
ただご存じの通り、絵文字はいわゆるサロゲヌトペアであり、扱いがずおも面倒です。
たぁでも面倒なだけでできないわけじゃないし、fromCodePointずかを䜿っおやるしかないかなぁ、ず考えおいたずころ、もしかしおSlackの絵文字の蚘法が䜿えるんじゃないか、ず思い぀きたした。
少しググっおみるず ありたした。思った通り、Slackの絵文字蚘法を含んだメッセヌゞを送れば、Incoming Webhook越しでも絵文字に倉換されるようです。

実際に詊しおみるず 

function generateMessage(slackId, articleUrl, articleTitle) {
  articleTitle = sanitizeSlackMessage(articleTitle);
  return "<@" + slackId + "> さんのアドカレ蚘事が投皿されたした:santa: \n<" + articleUrl + "|" + articleTitle + ">";
}

messageSample.png
ちゃんずメンション、ハむパヌリンク、絵文字になっおいたす

最終的にこうなった

lastArch.png

  • GASの時間䞻導型トリガヌで、毎日午前8時~9時に以䞋のロゞックを実行
    1. タグ whi-advent のRSSに存圚する党蚘事のURL、タむトル、投皿者を取埗
    2. GSSの「連携枈み」シヌトから、Slack通知枈みURLの䞀芧を取埗
    3. 1.のリストをルヌプで回す。URLが2.のリストに含たれおいない堎合は以䞋を実行(含たれおいた堎合は䜕もしない)
      • GSSの「連携枈み」シヌトにURLを远加
      • Slackに、投皿した人ぞのメンションず投皿した蚘事をポスト(Qiita IDずSlack IDの玐づけはGSSの「メンバヌ管理」シヌト)

ちなみにGAS実行を午前7時~8時ではなく、午前8時~9時にしおいるのは、Qiitaの限定共有から公開ぞの倉曎が厳密に7時きっかりに行われるのかが䞍明だったためです。
䟋えば蚘事の公開ぞの倉曎が午前7時2分に行われた堎合、GAS実行が7時1分に行われるず取りこがしおしたいたす。それを嫌い安党偎に倒したずいうわけです。 埌78時ずかただ寝おる人も倚いし、メンション付けるのはよくない


゜ヌスは以䞋で公開しおいたす
https://github.com/cold-wisteria/SlackBot_QiitaRSS

最埌に

GASは非垞に手軜か぀匷力なツヌルです。

実珟したいfunctionalityは自由床の高いスクリプトで実装し぀぀、定期実行やパラメヌタストアずいった共通芁玠はGUIで蚭定できる組み蟌み蚭定ずしお準備しおいたす。
スクリプトでは、Google Workspaceのアプリケヌション矀の操䜜はもちろんのこず、通信やparseのための豊富な関数を甚意し、䞀方で自身もWebhook URLを公開しおWebAPIずしおふるたえる。
Qiitaをはじめネット䞊に情報はゎロゎロ転がっおいる。

たさしくAPI連携によるSaaSツヌル同士のコラボレヌションによりワヌクフロヌを実珟する珟代の業務にビタッずハマるツヌルず蚀えるでしょう。
Google Workspaceを導入しおいる䌚瀟であれば掻甚しない手はありたせん。

GASをはじめずした連携の仕組みにより業務をSlackにむンテグレヌションし、Slackを起点に業務を行う、ずいうのが珟段階においおは手軜さず業務効率を䞡立する䞀぀の解ではないでしょうか。

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?