vim→Python→Slackに投稿

  • 2
    いいね
  • 0
    コメント

VIMからPython経由して、Slackに投稿

  • VIMからSlack使いたい人は以下を使ったほうがいいと思う。
     - SlackとVimとメモ管理と私

  • 以下の記事に影響されました。

  • やりたかったこと

    • Pure Pythonで、Slackに投稿
    • VIMからできれば、もっといい
  • 準備

    • SlackのTokenか、WebhookのURLは自分でGETする
    • Getしたら、Webhookと、API両方使えるから好きな方を設定
    • Pythonがコマンドプロンプトから実行できれば動くはず
    • vim scirptにpython.pyのPathを書く
  • 動作

    • Python実行で「test」を投稿
    • vimで「:PSlack」するとエディタの内容を投稿
    • 改行を連続投稿に変更しました
python.py
import sys
import requests
import json
import re


class SlackApiWrapper:
    def __init__(self, proxy_flg=None):
        '''
        proxy_flg:True:Proxy使う
                  False:Non-Proxy
        '''
        # Your infomation
        self.token = '<your token>'
        self.postWebhookUrl = '<your webhookurl>'

        # Post infomation
        self.postSlackUrl = 'https://slack.com/api/chat.postMessage'
        self.channel = '#general'
        self.username = 'vim_python'

        # if proxy
        if proxy_flg is None:
            self.proxy_flg = False
        else:
            self.proxy_flg = proxy_flg
            self.proxy_info = {
                "http": "http://hogehoge:8080",
                "https": "http://hogehoge:8080"
            }

    def post_api(self, text):
        json_data = {
            'token': self.token,
            'channel': self.channel,
            'text': text,
            'username': self.username,
            'unfurl_links': 'false',
            'pretty': 1

        }
        if self.proxy_flg:
            r = requests.post(self.postSlackUrl, params=json_data, proxies=self.proxy_info)
        else:
            r = requests.post(self.postSlackUrl, params=json_data)
        print(r.text)

    def post_webhook(self, text):
        json_data = {
            'text': text,
            'username': self.username,
            'link_names': 1
        }
        if self.proxy_flg:
            r = requests.post(self.postWebhookUrl, data=json.dumps(json_data), proxies=self.proxy_info)
        else:
            r = requests.post(self.postWebhookUrl, data=json.dumps(json_data))
        print(r.text)


def main(args):
    filename = None
    if args:
        filename = str(args[0])

    data = None
    if filename is None:
        data = ["test"]
    else:
        try:
            with open(filename, mode="r", encoding='utf-8') as fh:
                data = fh.readlines()
        except Exception as ex:
            raise ex

    # vimの改行を連結
    # data = "".join(data)
    # data = re.sub(r"\n", "", data)

    # None Proxy
    # sl = SlackApiWrapper(False)

    # Proxy
    sl = SlackApiWrapper(True)

    # 改行を連続投稿
    for text in data:
        # どちらでも
        sl.post_webhook(text)
        sl.post_api(text)


if __name__ == "__main__":
    main(sys.argv[1:])
_vimrc.local
"slack"{{{
function! s:post_slack_vim()"
    let s:file = tempname()
    let s:py_script = "<DLしたPython.pyのPATH>"
    silent execute ":write " . s:file
    silent execute '!python' . ' ' . s:py_script . ' ' . s:file
    call delete(s:file)
    unlet! s:file
    unlet! s:py_script
endfunction augroup END"
command! -nargs=0 PSlack call s:post_slack_vim()
"}}}