25
13

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 3 years have passed since last update.

VimAdvent Calendar 2019

Day 10

VimでSlackをしよう

Last updated at Posted at 2019-12-09

こんにちは。
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の開発に携われるようになりたいと思います。

ここまで読んでくださりありがとうございました。

25
13
1

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
25
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?