æ¬èšäºã¯æ ªåŒäŒç€Ÿ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ãå©çšããŠããŸãããã以äžã®ãããªçç±

ãããRSS Appã®å©çšããããGASãå©çšããŠRSSã宿çã«èµ°æ»ãSlackã«æããBotãéçšããŠããŸããã
(Botã®äœè
ã¯åŒç€Ÿã§SREãåãã @kabik æ°ã§ãã圌ã®ã¢ããã³ãã«ã¬ã³ããŒã¯1æç®ã®12/16ã«æçš¿ãããŸãã®ã§ããã²æ¥œãã¿ã«ããŠããŠãã ããïŒ )
ããããçŸç¶ã®Botã®ä»çµã¿ã ãšãã¢ããã³ãã«ã¬ã³ããŒãšããŠæçš¿ããèšäºã§ã¯ããŸãSlackã«é£æºãããªãããšãçºèŠãããããä»åçè
ãæ¹ä¿®ãè¡ããŸããã
æ¬èšäºã§ã¯ãå
ã
ã®Botã®ä»çµã¿ããªããã®ä»çµã¿ã§ã¯ã¢ããã³ãã«ã¬ã³ããŒãããŸã飿ºãããªãããã©ã®ããã«æ¹ä¿®ããããã玹ä»ããŠãããŸãã
å ã ã®Botã®ä»çµã¿
ããŠãå
ã
ã®Botã®ä»çµã¿ã¯ä»¥äžã®ãããªãã®ã§ãã

- 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">
<h2>
<span id="ãã®èšäºã¯" class="fragment"></span><a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AF"><i class="fa fa-link"></i></a>ãã®èšäºã¯</h2>
<p><a href="https://qiita.com/advent-calendar/2020/whi">Develop fun!ãäœçŸãã Works Human Intelligence Advent Calendar 2020</a><br>
<a href="https://qiita.com/advent-calendar/2020/whi-2">Develop fun!ãäœçŸãã Works Human Intelligence #2 Advent Calendar 2020</a></p>
<p>Works Human Intelligence ã¢ããã³ãã«ã¬ã³ããŒã®æçš¿ç·Žç¿ç¬¬äºåŒŸã§ããã¿ã€ãã«ãšã¯è£è
¹ã«ã倱æã蚱容ãããšèšãããŠããªã倱æããããªããããã£ãŠãæããªãããæ£çŽã«èšããªãããã£ãŠããå
çããããšæã£ãŠããŸã人ïŒç§ïŒåãã«æžããŸããã</p>
äžç¥
</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"><p>å
æ¥Electronã䜿çšããWindowsã¢ããªã±ãŒã·ã§ã³ãäœæããŠããéãElectronã®<a href="https://www.electronjs.org/docs/api/shell#shellopenexternalurl-options" rel="nofollow noopener" target="_blank"><code>shell.openExternal</code></a>ãäžæãåããªããã©ãã«ã«ããããŸããã<br>
åå ãšããŠã¯éåžžã«åæ©çãªãã£ãããã¹ã ã£ãã®ã§ããã誰ãåãç¹ã§èºããŠããæ¹ã®ã圹ã«ç«ãŠã°ãšæãèšäºã«ãããŠããã ããŸããã</p>
<h2>
<span id="ããããã£ãããš" class="fragment"></span><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"><i class="fa fa-link"></i></a>ããããã£ãããš</h2>
<p>ãå€éšãã©ãŠã¶ã§äœãç»é¢ãéããèªåã®ãŠã£ã³ããŠã¯éãããã¿ãããªåŠçãããã</p>
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.ã¯å
è¿°ã®URLãGSSã«æã£ãŠãããŠæ¯èŒããæ¹æ³ã§å¯Ÿå¿ã§ããŸãã
ããããOragnizationã®RSSãèŠãéããã¢ããã³ãã«ã¬ã³ããŒã®èšäºã§ããããšã瀺ãèŠçŽ ã¯ãªãããã§ãã
ã¢ããã³ãã«ã¬ã³ããŒã®RSSããããŸãããXMLã®æ§é ãOrganizationã®ãã®ãšã ãã¶ç°ãªãã察å¿ã«ã¯GASã®æ¹ä¿®ã«å°ãæéããããããã§ãã
ã§ããã°èªåã§ã¢ããã³ãã«ã¬ã³ããŒã§ããããšã瀺ãèŠçŽ ãå
¥ããŠããŸããã
Qiitaèšäºã«ãããã«ããŽã©ã€ãºãšããã°ã¿ã°ã§ããadventã¿ãããªã¿ã°ã§çµãããã§ãããã°âŠâŠ ããïŒOrganizationã®RSSã®äžã«ã¯ã¿ã°ãããªãïŒ
âŠâŠããŒããå°ã£ããã©ããããã
ã¢ãã«ã¬çšã®ã¿ã°ãäœã£ãŠãã¿ã°ã®RSSã䜿ããïŒ
âŠâŠã²ããããŸãããOrganizaionã®RSSãã ãã§ããã°ãåŒç€Ÿã®ã¢ãã«ã¬ã§ã®ã¿äœ¿ãã¿ã°ãäœã£ãŠããã®ã¿ã°ã®RSSãèªã¿ã«è¡ãã°ãããããªããããšã
åŸã¯Qiitaã«ã¿ã°ã®RSSããããã©ããã§ãããæ¯éã¯ã°ã°ãã°ãã倿ããŸãã
XMLã®æ§é ãOrganizationãšã»ãŒåããªã®ã§ãæ¢åã®GASã®ã³ãŒããããçšåºŠæµçšããããšãã§ããŸãã
ãã®æ¹æ³ã®æ¬ ç¹ã¯ã
- ã¿ã°ã¯èª°ã§ãä»ãããããããå®å šã«ã¯Organizationå€ã®èšäºã匟ãããšãã§ããªãããš
- 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 + ">";
}

ã¡ãããšã¡ã³ã·ã§ã³ããã€ããŒãªã³ã¯ãçµµæåã«ãªã£ãŠããŸãïŒ
æçµçã«ãããªã£ã
-
GASã®æéäž»å°åããªã¬ãŒã§ãæ¯æ¥åå8æ~9æã«ä»¥äžã®ããžãã¯ãå®è¡
- ã¿ã°
whi-adventã®RSSã«ååšããå šèšäºã®URLãã¿ã€ãã«ãæçš¿è ãååŸ - GSSã®ã飿ºæžã¿ãã·ãŒããããSlackéç¥æžã¿URLã®äžèЧãååŸ
- 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ãèµ·ç¹ã«æ¥åãè¡ãããšããã®ãçŸæ®µéã«ãããŠã¯æè»œããšæ¥åå¹çãäž¡ç«ããäžã€ã®è§£ã§ã¯ãªãã§ããããã
