こんにちは。
Qiitaへの投稿がめちゃくちゃ久しぶりなひがしです。
この記事はVim Advent Calendar 2019の10日目の記事です。
VimでSlack
本題です
この記事ではVimでSlackをしていきたいと思います
ちなみに私はVimでSlackをするためのプラグインとして
https://github.com/higashi000/sarahck.vim
を作っています
良ければ使ってみてください
どうやってやるのか
必要なもの編
上記のsarahck.vimでは、
- Slack Legacy token
- Slack API
-
vim-jp/vital.vim
を使っています。
この記事では上記の3つに加え、mattnさんが作成されている、webapi-vimを使っていきます。
tokenは他人に知られるとアカウントを乗っ取られてしまうので注意して使ってください
vital.vimの下準備
これから紹介するvital.vimを使ったサンプルではvitalizeがすでにされている前提で話が進んでいます。
というわけでvitalizeの手順を説明しておきます。
まずVimを起動して以下のコマンドを実行します。
:Vitalize --name=作成しているプラグイン名 . +Web.HTTP +Web.JSON
終わりです。
サンプルコードのhigashi000
の部分を作成しているプラグイン名
に置き換えてください。
こちらの記事ではvital.vimのWeb.HTTPとWeb.JSONを主に使用します。
チャンネルリストを取得しよう
チャンネルを取得する際はchannels.listを使用します
tokenをつけてHTTP Requestsを送ると全チャンネルのリストが取得できます。
sample(vital.vim)
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
execute ":redir!>" . "channel.txt"
for i in res.channels
:silent! echon i.name . "\n"
:silent! echon i.id . "\n"
:silent! echon "\n"
endfor
:redir END
sample(webapi-vim)
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
execute ":redir!>" . "channel.txt"
for i in res.channels
:silent! echon i.name . "\n"
:silent! echon i.id . "\n"
:silent! echon "\n"
endfor
:redir END
今後のチャンネルを指定するパラメータはここで入手したidを使用します
nameではないです
Slackにメッセージを送信してみよう
メッセージを送信する際にはchat.postMessageというAPIを使います。
このAPIは要素としてtoken、channel ID、textが必須で、更にas_userをtrueにしないと自分ではなく、Slack API Testerが喋ってしまいます
sample(vital.vim)
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)
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を使います
APIのオプションにtoken、channelをつけてrequestsを送るとメッセージが取れます。
sample(vital.vim)
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)
execute ":redir!>" . "channelHistory.txt"
for i in res.messages
:silent! echon i.text . "\n"
endfor
:redir END
sample(webapi-vim)
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)
execute ":redir!>" . "channelHistory.txt"
for i in res.messages
:silent! echon i.text . "\n"
endfor
:redir END
まとめ
vital.vimやwebapi-vimを使えば簡単にHTTP Requestsを送ることができるようになり、Slack APIが使えるようになります。
開発者の方にこの場を借りてお礼を申し上げます。
ありがとうございます
いつかはvital.vimやwebapi-vimの開発に携われるようになりたいと思います。
ここまで読んでくださりありがとうございました。