Help us understand the problem. What is going on with this article?

VimでSlackをしよう

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away