<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>Slack &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/slack/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>Node.jsでSlack Command Botをつくってみよう</title>
		<link>https://html5experts.jp/girlie_mac/22535/</link>
		<pubDate>Fri, 03 Mar 2017 00:00:22 +0000</pubDate>
		<dc:creator><![CDATA[Tomomi Imura]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[ES6]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[Slack]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[海外]]></category>

		<guid isPermaLink="false">/?p=22535</guid>
		<description><![CDATA[こんにちは。ごぶさたしています。以前の執筆から１年ちょっとになるのですが、その当時はInternet of Things(IoT)について書いたのですが、最近では市場がある程度まで到達したからでしょうか、それとも脆弱性の...]]></description>
				<content:encoded><![CDATA[<p>こんにちは。ごぶさたしています。以前の執筆から１年ちょっとになるのですが、その当時はInternet of Things(IoT)について書いたのですが、最近では市場がある程度まで到達したからでしょうか、それとも脆弱性の問題を問われることが多くなったせいでしょうか、話題は少し落ち着いてきたかに思われます。さて今ホットな話題は何でしょうか、ということで今回はChat Botsについて書いてみようと思います。</p>

<h3>E-Commerceから Conversational Commerceへ</h3>

<p>ここ最近話題になることが多いAIやBotsですが、私の周りではConversational interface、Conversational UXなどという言葉が去年からたびたび使われるようになっているようです。</p>

<p>これはAmazon Alexaなどのデバイスや、Facebook Messengerなどチャットアプリケーションなどの対話型テクノロジーをいかに活用しその使い勝手をよくするか、ということなのですが、必ずしもアプリケーションのUIデザインそのものを述べているわけではなく、既存のサービスを延長することを指していることも多いでしょう。例えば、今まではモバイル上のアプリケーションのみで車を呼べていたUberが、<a href="https://newsroom.uber.com/messengerlaunch/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Facebook Messenger のチャットからも車をを呼べるような機能</a>を加えたり、Slack上でTaco Bellからタコスをオーダーできる<a href="https://www.tacobell.com/feed/tacobot" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TacoBot</a>、というのもが挙げられます。</p>

<h3>Slack Botを書いてみよう</h3>

<p>さて、というわけで何かBotを書いてみたいと思いませんか？ここはNode.jsでSlack botを作成する方法を紹介したいと思います。</p>

<p>このチュートリアルでは、ディベロッパー向けのHTTPステータスコードのルックアップができるスラッシュ・コマンドを作ってみます。ここでは私が５年ほど前に何気なく作って、Mashableなどで紹介され思わぬ反響を得てしまった<a href="http://http.cat/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTTP Status Cats</a>を使ってみます。具体的には、Slack上でユーザが、<code>/httpstatus [code]</code> （例えば <code>/httpstatus 404</code>）と入力すると、そのステータスコードの意味と猫が一緒に表示される、という簡単なbotです。</p>

<p>まず試してみたい方は、<a href="http://www.girliemac.com/slack-httpstatuscats/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTTP Status Cats command for Slack</a>を自分がアドミン権限のあるのチャットチームにインストールしてみてください。</p>

<p><img src="/wp-content/uploads/2017/02/slack-httpstatuscats.gif" alt="slack-httpstatuscats gif animation" width="640" height="437" class="aligncenter size-full wp-image-22558" /></p>

<p>さて、このチュートリアルは２つのパートに分けられます。</p>

<ol>
<li>スラッシュ・コマンドを書いて、自分のSlackチームにインストールする
<li>OAuthを使ってボットを<a href="https://slack.com/apps" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Slack&#8217;s App Directory</a>などで誰もがインストールできるようにする</ol>

<p></ol></p>

<p>とりあえず動くbotを書いてみたい、と思う方は１だけ試してみてで十分ですが、botをみんなにシェアしたい方は２も読んでみてください。</p>

<p><a href="https://github.com/girliemac/slack-httpstatuscats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソースコード</a>と実際のボットのインストールボタンは両方GitHubにあります。では始めましょう！</p>

<h2>1 プライベートなスラッシュコマンドボットの作成</h2>

<p>ここで作るのは、Slackの公式な用語でいうところの<a href="https://api.slack.com/custom-integrations" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Custom Integrations</a>というもので、自分のチャットグループ専用のプライベートなbot、もしくはいわゆるAppとして発表する前にドライ・ランを行うことを指します。アカウントを持っていない方はまずサインアップしてから始めましょう。</p>

<h3>1.1 スラッシュコマンドの設定</h3>

<p>ログインして、<a href="https://my.slack.com/services/new/slash-commands" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">my.slack.com/services/new/slash-commands</a>でコマンドを選びます。ここでは<code>/httpstatus</code>と入力し<strong>Add Slash Command Integration</strong>ボタンをクリックして次のステップへ進みます。</p>

<p>Tokenなどの欄がありますが現時点では、(1) Command、 (2) URL、 (3) Method、の３つが必要になります。</p>

<p><img src="/wp-content/uploads/2017/02/slack-config-custom-integration.png" alt="slack-config-custom-integration" width="431" height="640" class="aligncenter size-full wp-image-22561" srcset="/wp-content/uploads/2017/02/slack-config-custom-integration.png 431w, /wp-content/uploads/2017/02/slack-config-custom-integration-202x300.png 202w, /wp-content/uploads/2017/02/slack-config-custom-integration-139x207.png 139w" sizes="(max-width: 431px) 100vw, 431px" /></p>

<p>(1)には、<code>/httpstatus</code>、(3)には、<code>POST</code>、そして(2)のURLは次のように設定してください。</p>

<p>開発中に使用するURLを取得するには<a href="https://ngrok.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ngrok</a>を使ってみましょう。いろいろなツールがあるのですが、これは自分のローカルホストをパブリックURLとしてトンネルできるというとても便利なツールなので私のイチオシです。開発途中にデプロイすることなく、Webhookが手軽に使えます。自分のローカルホスト、たとえば  <code>http://localhost:3000/</code> をつかったままOAuthのテストもできるのです。（注：よく聞かれるのですが、ngrokはあくまでも開発ツールですのでプロダクションには適していません。デプロイメントに関しては最後の章を読んでください）</p>

<p><a href="https://ngrok.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://ngrok.com/</a>から自分のマシンにngrokをインストールしたら、ターミナルで自分の使いたいポート番号（このチュートリアルでは 3000）を設定します。</p>

<p></p><pre class="crayon-plain-tag">$ ngrok http 3000</pre><p></p>

<p>すると下のスクリーンショットのように、Forwardingアドレスが取得できるので、そのURL（例えば<a href="https://71f03962.ngrok.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://71f03962.ngrok.io/</a>)をSlackセッティングの、上のスクリーンショットで示された(2)の欄で使います。</p>

<p><img src="/wp-content/uploads/2017/02/ngrok.png" alt="ngrok" width="640" height="349" class="aligncenter size-full wp-image-22538" srcset="/wp-content/uploads/2017/02/ngrok.png 640w, /wp-content/uploads/2017/02/ngrok-300x164.png 300w, /wp-content/uploads/2017/02/ngrok-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>すべての設定が終えたらSaveボタンを押します。&#8221;Your settings have been saved!&#8221;のメッセージが画面上部に現れるのを確認してください。</p>

<h3>1.2 Node.js を使ってレスポンスを書く</h3>

<p>基本的にbotは、ユーザがSlackインターフェイス上でコマンドを実行した際HTTP POST（または設定次第では GET)によって指定先のURLにメッセージが届け、プログラムでその応答をユーザに返す、という作業になります。</p>

<p>たとえばそのユーザが<code>/httpstatus 302</code>というコマンドを送信した場合、指定URLに送られるデータは次のようになります。</p>

<p></p><pre class="crayon-plain-tag">command=/httpstatus
text=302
response_url=https://hooks.slack.com/commands/1234/5678
…</pre><p></p>

<p>Botは、これに対する応答をユーザに返します。この場合はユーザが尋ねているステータス302の定義と<a href="https://http.cat/302" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">この猫</a>を返しましょう。</p>

<p>ではそのコードを書いてみましょう。</p>

<p>まず、<strong>Express.js</strong>と<strong>body-parser</strong>をインストールします。</p>

<p></p><pre class="crayon-plain-tag">$ npm install express body-parser --save</pre><p></p>

<p><strong>index.js</strong>で、<code>express</code>のインスタンスを作り、先ほどngrokで設定したポート番号、3000でサーバを始動します。</p>

<p></p><pre class="crayon-plain-tag">'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

const server = app.listen(3000, () =&gt; { 
console.log('Express server listening on port %d in %s mode', server.address().port, app.settings.env);});</pre><p></p>

<p>次はHTTP POSTルートメソッドで、コマンドを扱います。</p>

<p></p><pre class="crayon-plain-tag">app.post('/', (req, res) =&gt; {
 let text = req.body.text;
 // ここでbotを書きます
});</pre><p></p>

<p>ここで<code>text</code>の値を取得します。HTTP Status botの場合、<code>/httpstatus</code> コマンドの値、例えば&#8221;404&#8243;が <code>text</code>の値になります。同時に、ユーザが数字以外を入力した際にエラーメッセージを送るなどのエラーチェックもしておきましょう。</p>

<p></p><pre class="crayon-plain-tag">if(! /^\d+$/.test(q.text)) { // not a digit
 res.send('Error: enter a valid status code, such as 200');   
 return;
}</pre><p></p>

<p>このエラーは、ユーザだけにプライベートに送信されるメッセージでチャットそのものには表示されません。</p>

<p>エラーがない場合は、コマンドに対する応答をJSONとしてレスポンスします。</p>

<p></p><pre class="crayon-plain-tag">let data = {
 response_type: 'in_channel', 
 text: '302: Found',
 attachments:[{
   image_url: 'https://http.cat/302.jpg'
 }]
};
res.json(data);</pre><p></p>

<p><code>response_type</code>を<code>in_channel</code>とすることで応答はチャットメンバー全員に見えるように送信されます。デフォルトはその逆の<code>ephemeral</code>で、コマンドを送ったユーザのみに表示されます。</p>

<p>このコマンドと応答は次のようになります。</p>

<p><img src="/wp-content/uploads/2017/02/slack-command.png" alt="slack-command" width="640" height="491" class="aligncenter size-full wp-image-22540" srcset="/wp-content/uploads/2017/02/slack-command.png 640w, /wp-content/uploads/2017/02/slack-command-300x230.png 300w, /wp-content/uploads/2017/02/slack-command-207x159.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このサンプルコードでは、応答をわかりやすくハードコードで示してありますが、実際はストリングなどは別のファイルに定義しています。下のスクリーンショットのように存在しないHTTPステータスに対してのエラーメッセージも定義しましょう。実際のコードは<a href="https://github.com/girliemac/slack-httpstatuscats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソースコード</a>を参照してください。</p>

<p><img src="/wp-content/uploads/2017/02/slack-command-private.png" alt="slack-command-private" width="640" height="60" class="aligncenter size-full wp-image-22539" srcset="/wp-content/uploads/2017/02/slack-command-private.png 640w, /wp-content/uploads/2017/02/slack-command-private-300x28.png 300w, /wp-content/uploads/2017/02/slack-command-private-207x19.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ディスプレイはボーダー色などのカスタマイズが可能です。詳しくはSlackドキュメンテーションの<a href="https://api.slack.com/docs/message-formatting" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Basic message formatting</a>を参照してください。</p>

<p>次のステップでは、このボットを自分のチャットグループ以外に配布するために必要な認証とコードのデプロイについてです。</p>

<h2>2. Slack Botのディストリビューション</h2>

<p>この「Custom Integration」をインストール可能な「App」にするには、コードのデプロイをして他のチャットにもインストールできるようにせねばならないのですが、そのためにはあといつくかのステップが必要になります。</p>

<h3>2.1 Appセットアップ</h3>

<p>まず、自分のAppを申請し、クライアントIDやシークレットなどのクレデンシャルを取得します。<a href="https://api.slack.com/apps" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://api.slack.com/apps</a>で<strong>Create an App</strong>ボタンをクリックしてください。</p>

<p><img src="/wp-content/uploads/2017/02/slack-create-app.png" alt="slack-create-app" width="614" height="640" class="aligncenter size-full wp-image-22542" srcset="/wp-content/uploads/2017/02/slack-create-app.png 614w, /wp-content/uploads/2017/02/slack-create-app-288x300.png 288w, /wp-content/uploads/2017/02/slack-create-app-199x207.png 199w" sizes="(max-width: 614px) 100vw, 614px" /></p>

<p>このフォームにはいくつもの欄があり少しわかりづらいのですが、スラッシュコマンドのbotには次の3つが最低必要になります。</p>

<ul>
<li><strong>Basic Information</strong> (at <a href="https://api.slack.com/apps/YOUR_APP_ID/general%29" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://api.slack.com/apps/YOUR_APP_ID/general)</a></li>
<li><strong>OAuth &amp; Permissions</strong> (at …/YOUR_APP_ID/oauth)</li>
<li><strong>Slash Commands</strong> (at …/YOUR_APP_ID/slash-commands)</li>
</ul>

<h3>2.1.1 API Keyを.envファイルに保管</h3>

<p>ここで取得した<code>Client ID</code>、<code>Client secret</code>、<code>Verification token</code>は <strong>.env</strong> ファイルに別に保管してbotのメインのコードから切り離すことを推奨します。gitを使う場合は、このファイルを <strong>.gitignore</strong> ファイルに付け加えるのを忘れずに。</p>

<p></p><pre class="crayon-plain-tag">SLACK_CLIENT_ID=12345XXXXX.09876XXXXX 
SLACK_CLIENT_SECRET=535d2f9....
SLACK_VERIFICATION_TOKEN=42P829U...</pre><p></p>

<h3>2.1.2 Foremanを使う</h3>

<p>他にも手段はありますが、<a href="https://heroku.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Heroku</a>にデプロイするために私は<a href="http://strongloop.github.io/node-foreman/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Node Foreman</a>を使っています。Foremanを使うには、npmを使ってglobalフラッグでインストールしてください。</p>

<p></p><pre class="crayon-plain-tag">$ npm install -g foreman</pre><p></p>

<p>アプリケーションの Root に <code>.procfile</code> を作成し、この一行を加えます。</p>

<p></p><pre class="crayon-plain-tag">web: node index.js</pre><p></p>

<p>index.jsを実行するには <code>node index.js</code>の代わりに次のコマンドを使います。</p>

<p></p><pre class="crayon-plain-tag">$ nf start</pre><p></p>

<h2>2.2 ユーザの認証</h2>

<p>Slackは認証には<a href="https://oauth.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OAuth</a>を使っています。実際には自分でOAuthを実装しなくても、<a href="https://api.slack.com/docs/slack-button" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Slack ボタン</a>を使えば簡単に認証できるようになっています。</p>

<p>公式のドキュメンテーションのダイアグラムに手を加えて、流れをわかりやすくするためにGIFアニメーションにしてみました。</p>

<p><img src="/wp-content/uploads/2017/02/slack-oauth-1.gif" alt="slack-oauth gif animation" width="640" height="387" class="aligncenter size-full wp-image-22559" /></p>

<p>ここでの実際のフローは次のようになります。</p>

<ol>
<li>ウェブページを作成し、認証ボタンを置く。ユーザがボタンをクリックするとパラメータがSlackに送信される(ユーザは認証ページにリダイレクトされる)。
<li>Node appには、SlackからGETで10分だけ有効な仮のコードが送られる。
<li>アクセストークンを得るために <a href="https://api.slack.com/methods/oauth.access" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">oauth.access</a> API使い認証コードをPOSTする。Node app側から`200 OK`を受け取り次第、このプロセスが完了。
<li>オプションとして、このトークンを使ってSlackの他のAPIにもアクセス。例えば、認証後、ユーザをhttps://team-name.slack.comにリダイレクトするなど。/
</ol>

<h3>2.2.1 Slack ボタンの設定</h3>

<p>Slackボタンを使うには、まずウェブページを作成してください。私の場合はこのNode Appとは切り離した別のHTMLページを作成し、<a href="http://www.girliemac.com/slack-httpstatuscats/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GitHub Pages</a>にホストしました。</p>

<p>次にボタンを設定しましょう。 <a href="https://api.slack.com/docs/slack-button" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://api.slack.com/docs/slack-button</a> に行き、<strong>Add the Slack button</strong> までスクロールして下さい。</p>

<p><img src="/wp-content/uploads/2017/02/slack-generate-button.png" alt="slack-generate-button" width="640" height="268" class="aligncenter size-full wp-image-22543" srcset="/wp-content/uploads/2017/02/slack-generate-button.png 640w, /wp-content/uploads/2017/02/slack-generate-button-300x126.png 300w, /wp-content/uploads/2017/02/slack-generate-button-207x87.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このボタン作成ツールの<strong>Commends</strong>のチェックボックスをチェックします。</p>

<p>上で示したフローの４を実行したい場合は、このGETパラメータを下のように変更します。</p>

<p></p><pre class="crayon-plain-tag">&lt;a href="https://slack.com/oauth/authorize?scope=commands+team%3Aread&amp;client_id=your_client_id"&gt;</pre><p></p>

<p>ここで<code>scope</code>に着目してみてください。<code>commands</code>の他に<code>team:read</code>(コロンは<strong>%3A</strong>とエスケープ)が必要になります。詳しくは<a href="https://api.slack.com/docs/oauth-scopes" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OAuth scopes on the Slack API docs</a>で。</p>

<p><img src="/wp-content/uploads/2017/02/slack-button.png" alt="slack-button" width="139" height="40" class="aligncenter size-full wp-image-22548" /></p>

<h3>2.2.2 トークンの発行</h3>

<p>さて、Nodeコードに戻りましょう。仮のコード(<code>req.query.code</code>)をGETで取得するためにまたExpress.jsを使います。</p>

<p>何でもよいのですがここでは<code>/slack</code> routeを使いましょう。この場合ngrokのURL は <code>http://71f03962.ngrok.io/slack</code> のようになります。Slack App設定ページ（https://api.slack.com/apps/YOUR_APP_ID/oauth）の、<strong>OAuth &amp; Permissions</strong> セクションにある、<em>Redirect URL</em>の欄にはこのURLを設定してください。</p>

<p>仮の<code>code</code>を取得されたら、それを自分のAPIクレデンシャルとともにPOSTで送って、トークンと交換します。POSTするためにここではNode.jsのHTTPリクエストクライアントである、<code>Request</code>を使いましょう。</p>

<p></p><pre class="crayon-plain-tag">$ npm install request --save</pre><p></p>

<p>仮の<code>code</code>を取得し、それを<code>token</code>と交換するコードが下になります。</p>

<p></p><pre class="crayon-plain-tag">const request = require('request');

app.get('/slack', function(req, res){
 let data = {form: {
   client_id: process.env.SLACK_CLIENT_ID,
   client_secret: process.env.SLACK_CLIENT_SECRET,
   code: req.query.code
 }};

 request.post('https://slack.com/api/oauth.access', data, function (error, response, body) {
   if (!error &amp;&amp; response.statusCode == 200) {
     // おしまい！
     // ここからはオプションでチーム情報を取得
     let token = JSON.parse(body).access_token; // Auth token
   } ...</pre><p></p>

<h3>2.2.3 オプショナル： ユーザをチームURLにダイレクトする</h3>

<p>認証が済んだらそこで終えてもよいのですが、この画面でユーザを置き去りにするのはあまりよいUXとはいえないので、チームページにリダイレクトしてみましょう。</p>

<p>リダイレクトURLのサブドメインとなるチーム名は<a href="https://api.slack.com/methods/team.info" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">team.info</a>APIで取得できます。</p>

<p>このAPIを使うにはトークンが必要なので前述のコードでの、トークンにアクセスする箇所に下のコードを追加します。</p>

<p></p><pre class="crayon-plain-tag">...
request.post('https://slack.com/api/team.info', {form: {token: token}}, function (error, response, body) {
 if (!error &amp;&amp; response.statusCode == 200) {
   let team = JSON.parse(body).team.domain;
   res.redirect('http://' +team+ '.slack.com');
 }
});</pre><p></p>

<p>これで API からチーム名(<code>team.domain</code>)が返されました。最終的にこれを使ってチームURLにリダイレクトしてできあがり！</p>

<p>このチュートリアルでは簡素化したコードを使いましたが、<a href="https://github.com/girliemac/slack-httpstatuscats" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">全ソースコードはGitHubで</a>見てみてください。</p>

<h2>2.3 サーバにデプロイする</h2>

<p>最後にデプロイしておしまいです。APIクレデンシャルの<strong>env vars</strong>設定を忘れないように！私はHerokuを使っているのですが、Herokuの場合、<code>heroku config</code>コマンドを使います。例えば、<code>heroku config:set API_KEY=123456</code>というふうに設定してください。</p>

<p>Slackの設定で画面で指定したngrok URLを、デプロイ先のURLに変更するのもお忘れなく。</p>

<p>さて、プロセスが少し面倒ですが、コード自体は簡単だったと思います。もし何か面白いボットを作った際にはぜひ教えてくださいね！</p>

<p><img src="/wp-content/uploads/2017/02/slack-worked.png" alt="slack-worked" width="200" height="200" class="aligncenter size-full wp-image-22546" srcset="/wp-content/uploads/2017/02/slack-worked.png 200w, /wp-content/uploads/2017/02/slack-worked-150x150.png 150w" sizes="(max-width: 200px) 100vw, 200px" /></p>
]]></content:encoded>
			</item>
	</channel>
</rss>
