LINEとSlackを連携させる (3.Slack→LINEの連携編)
なぜ連携させるのか
こんなことがありませんか?
- いつかはslackをメインで使いたいが,メンバがまだslackに慣れておらず,コミュニケーションの壁を取り払いたい
- 会社の人のグループLINEから休みの日も通知が来るのが嫌
全く違う例ですが,どちらも連携させれば...
できあがるとこんな感じ
連携への3つのステップ
記事は3つに分かれています.
- アカウント準備編
- LINE -> Slack の連携編
- Slack -> LINE の連携編 (本記事)
3. Slack -> LINE の連携
この記事ではSlackに投稿されたメッセージをLINEに転送できるようにします.
目次
ソースコード
ディレクトリ構成
次のようになっています.
slack2line ├── Procfile ├── plugins │ ├── __init__.py │ └── send_line.py ├── requirements.txt ├── run.py ├── runtime.txt └── slackbot_settings.py
環境構築
pip や pipenv などで次を使えるよう準備してください.
line-bot-sdk slackbot
以下は ubuntu/debian, pip3 の例を紹介します.
$ sudo apt install python3-pip $ pip3 install line-bot-sdk $ pip3 install slackbot
ソースコードの作成
- run.py : Slack Bots を起動します.
from slackbot.bot import Bot def main(): bot = Bot() bot.run() if __name__ == "__main__": main()
- slackbot_settings.py
Slack Bots の設定を決めます.
認証情報の取得では,環境変数に 1.アカウント準備編 でメモした値を設定する必要があります.
import os # トークンを指定 API_TOKEN = os.environ["SLACK_API_TOKEN"] # このbot宛の標準の応答メッセージ DEFAULT_REPLY = "このbotにはメッセージを送ることはできません" # プラグインスクリプトのリスト PLUGINS = ['plugins']
- plugins/send_line.py
具体的な動作を実装します.
import os from linebot import LineBotApi from linebot.models import TextSendMessage from slackbot.bot import listen_to from slackbot.bot import respond_to CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"] line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN) # メンションされた reply で始まるメッセージに対して @respond_to('reply (.*)') def mention_func(message, _): # slack投稿者のユーザ名を取得 name = message.channel._client.users[message._body['user']]['real_name'] + "さん\n" # slackに投稿されたメッセージのパース text = message.body['text'] parse_msg = text.split(' ') if len(parse_msg) >= 3: _, to, *send_msg = parse_msg # lineに送る line_bot_api.push_message( to=to, messages=TextSendMessage(text=name + ' '.join(map(str, send_msg))) ) # メッセージにスタンプをつける message.react('+1') # reply で始まるメッセージに対して @listen_to(r'^reply\s+\S.*') def reaction_func(message): # slack投稿者のユーザ名を取得 name = message.channel._client.users[message._body['user']]['real_name'] + "さん\n" # slackに投稿されたメッセージのパース text = message.body['text'] parse_msg = text.split(' ') if len(parse_msg) >= 3: _, to, *send_msg = parse_msg # lineに送る line_bot_api.push_message( to=to, messages=TextSendMessage(text=name + ' '.join(map(str, send_msg))) ) # メッセージにスタンプをつける message.react('+1')
herokuで動かすために更にコードを追加します.
- Procfile
pbot: python run.py
- requirements.txt
line-bot-sdk slackbot
- runtime.txt
python-3.6.8
Gitに追加する
heroku にデプロイするため,Gitレポジトリを作成しコミットしておきます. 以下はその例です.
$ git init $ git add . $ git commit -m "first commit"
heroku にデプロイ
heroku にアプリを作成し,環境変数を設定します.
heroku CLI を使うので,アカウントの準備ができていない場合は 1.アカウント準備編 を参考にしてください.
ここでは,アプリ名を slack2line としてデプロイしています.
$ heroku create slack2line Creating ⬢ slack2line... done https://slack2line.herokuapp.com/ | https://git.heroku.com/slack2line.git $ git push heroku master $ heroku config:set LINE_CHANNEL_ACCESS_TOKEN=[LINE Bot のアクセストークン (ロングターム)] --app slack2line $ heroku config:set SLACK_API_TOKEN=[slack bots の Bot User OAuth Access Token] --app slack2line $ heroku ps:scale pbot=1 --app slack2line
使い方
事前にLINEの投稿先のIDを知っている必要があります.
2. LINE -> Slack の連携編 を参考にグループIDまたはトークルームIDを取得します.
reply [グループID or トークルームID] [メッセージ]
とすると指定した先にメッセージを送信することができます. 上のソースコードの例では,Botsにメンションをつけても実行可能です.
トラブルシューティング
うまく動かないときは,
$ heroku logs --tail --app slack2line
で確認してみてください.
また,アプリのURL (上の例では https://slack2line.herokuapp.com/ ) にアクセスできるかも確認してみてください.
herokuの無料枠上限に注意
この例ではサーバをずっと動かし続けているため,無料枠の 450h/1ヶ月 (?) or 1000h/1ヶ月 (?) に達する可能性があります.
最後に
これらを応用するとSlackとLINEの連携だけでなく,それ以外からのメッセージ投稿ができるはず!