1. higashi000

    Posted

    higashi000
Changes in title
+VimでSlackする
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,164 @@
+こんにちは。
+Qiitaへの投稿がめちゃくちゃ久しぶりなひがしです。
+
+この記事は[Vim Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vim)の10日目の記事です。
+
+# VimでSlack
+本題です
+この記事ではVimでSlackをしていきたいと思います
+ちなみに私はVimでSlackをするためのプラグインとして
+https://github.com/higashi000/sarahck.vim
+を作っています
+良ければ使ってみてください
+
+# どうやってやるのか
+## 必要なもの編
+上記のsarahck.vimでは、
+- Slack Legacy token
+- Slack API
+- [vim-jp/vital.vim](https://github.com/vim-jp/vim-jp)
+- [mattn/webapi-vim](https://mattn/webapi-vim)
+を使っています。
+この記事でも同じものを使っていきます。
+tokenは他人に知られるとアカウントを乗っ取られてしまうので注意して使ってください
+
+## チャンネルリストを取得しよう
+チャンネルを取得する際は[channels.list](https://slack.com/api/channels.list
+)を使用します
+tokenをつけてHTTP Requestsを送ると全チャンネルのリストが取得できます。
+
+sample(vital.vim)
+
+```vimscript
+let token = 'トークン'
+let s:V = vital#higashi000#new()
+let s:H = s:V.import('Web.HTTP')
+let s:J = s:V.import('Web.JSON')
+
+let slackRes = s:H.get('https://slack.com/api/channels.list', {'token': token})
+
+let res = s:J.decode(slackRes.content)
+
+if res.ok != 1
+ return
+endif
+
+for i in res.channels
+ echo i.name
+ echo i.id
+endfor
+```
+
+sample(webapi-vim)
+
+```vimscript
+let token = 'トークン'
+
+let slackRes = webapi#http#get('https://slack.com/api/channels.list', {'token': token})
+
+let res = webapi#json#decode(slackRes.content)
+
+if res.ok != 1
+ return
+endif
+
+for i in res.channels
+ echo i.name
+ echo i.id
+endfor
+```
+
+今後のチャンネルを指定するパラメータはここで入手したidを使用します
+nameではないです
+
+## Slackにメッセージを送信してみよう
+メッセージを送信する際には[chat.postMessage](https://api.slack.com/methods/chat.postMessage)というAPIを使います。
+
+このAPIは要素としてtoken、channel ID、textが必須で、更にas_userをtrueにしないと自分ではなく、Slack API Testerが喋ってしまいます
+sample(vital.vim)
+
+```vimscript
+let channelID = '投稿したいchannelのID'
+let text = '投稿したい内容'
+let token = 'token'
+let s:V = vital#higashi000#new()
+let s:H = s:V.import('Web.HTTP')
+let s:J = s:V.import('Web.JSON')
+
+let slackRes = s:H.post('https://slack.com/api/chat.postMessage',
+ \ {'token': token,
+ \ 'channel': channelID,
+ \ 'text': text,
+ \ 'as_user': 'true'})
+
+let res = s:J.decode(slackRes.content)
+
+if res.ok == 1
+ echo 'complete'
+else
+ echo 'failure'
+endif
+```
+
+sample(webapi-vim)
+
+```vimscript
+let channelID = '投稿したいchannelのID'
+let text = '投稿したい内容'
+let token = 'token'
+
+let slackRes = webapi#http#post('https://slack.com/api/chat.postMessage',
+ \ {'token': token,
+ \ 'channel': channelID,
+ \ 'text': text,
+ \ 'as_user': 'true'})
+
+let res = webapi#json#decode(slackRes.content)
+
+if res.ok == 1
+ echo 'complete'
+else
+ echo 'failure'
+endif
+```
+
+ほとんど変わりませんがどちらでもメッセージの送信ができます、やったねばんざい
+
+## Slackのメッセージを確認しよう
+メッセージを確認するなら[channels.history](https://api.slack.com/methods/channels.history)を使います
+APIのオプションにtoken、channelをつけてrequestsを送るとメッセージが取れます。
+
+sample(vital.vim)
+
+```vimscript
+let token = 'トークン'
+let channelID = '対象チャンネルID'
+
+let s:V = vital#sarahck#new()
+let s:H = s:V.import('Web.HTTP')
+let s:J = s:V.import('Web.JSON')
+
+let historyAPI = 'https://slack.com/api/channels.history'
+let slackRes = s:H.get(historyAPI, {'token': token, 'channel': channelID})
+let res = s:J.decode(slackRes.content)
+```
+
+sample(webapi-vim)
+
+```vimscript
+let token = 'トークン'
+let channelID = '対象チャンネルID'
+let historyAPI = 'https://slack.com/api/channels.history'
+
+let slackRes = webapi#http#get(historyAPI, {'token': token, 'channel': channelID})
+let res = webapi#json#decode(slackRes.content)
+```
+
+## まとめ
+vital.vimやwebapi-vimを使えば簡単にHTTP Requestsを送ることができるようになり、Slack APIが使えるようになります。
+開発者の方にこの場を借りてお礼を申し上げます。
+ありがとうございます!
+
+いつかはvital.vimやwebapi-vimの開発に携われるようになりたいと思います。
+
+ここまで読んでくださりありがとうございました。