弊社はどのチャットサービスを使うか慢性的に悩んでいるところがあるのですが、とりあえず今はSlackを使っています。ところがこのSlack、全ての発言で常時通知が出る設定にしていても(何度も見直した)、何故か出たり出なかったりするという問題(不具合?)がメンバー内で起きており、声かけに何時間も気付かない…ということが多発しています。
ネットで調べても関連情報が見当たらないので、Slackに書き込みがあったら、LINE Botから通知が来る仕組みを作ってみました。メモも兼ねて以下駆け足で説明します。
slackの投稿をLINEで通知させる | UEQareer
https://ueqareer.net/2141
こちらの記事をおおいに参考にさせていただきました。
Messaging APIのご紹介 | LINE Business Center
https://business.line.me/ja/services/bot
まずはこちらから「Developer Trialを始める」でアカウントを作ります。弊社では以前Botの実験をしようとアカウントを作っていました。アカウントができたらAPIを有効化し、Channel Access Tokenを手に入れておきます。
LINEのBot用SDKは各言語版が用意されていますがここではPythonでやります。サーバーが必要なのでVPSや自宅サーバーなどを1つ用意し、Python3を使えるようにします。以下はCentOS7にPython3.6を入れる例。
yum install https://centos7.iuscommunity.org/ius-release.rpm yum install python36u python36u-libs python36u-devel python36u-pip ln -s /bin/python3.6 /bin/python3 unlink /bin/python ln -s /bin/python3 /bin/python unlink /bin/pip ln -s /bin/pip3.6 /bin/pipそして
pip install line-bot-sdkでSDKが入りました。他に
flask (Pythonの軽量Webフレームワーク)
gunicorn (flaskをdaemonとして動作させる)
も必要なのでpipで入れておきましょう。
サーバー側でPythonのスクリプトを作ります。解説は後でします。
from linebot import LineBotApi from linebot.models import TextSendMessage from linebot.exceptions import LineBotApiError from flask import Flask, request, jsonify line_bot_api = LineBotApi('CHANNEL ACCCES TOKEN') app = Flask(__name__) @app.route('/', methods=['POST']) def slack_push(): if request.method == 'POST': try: linkUrl = 'https://example.com/slackredirect.php?team_id=' + request.form["team_id"] if request.form["channel_name"] == 'directmessage': linkUrl = linkUrl + '&user_id=' + request.form["user_id"] else: linkUrl = linkUrl + '&channel_id=' + request.form["channel_id"] line_bot_api.push_message('GROUP ID', TextSendMessage( text = request.form["user_name"] + ":\n" + request.form["text"] + "\n" + linkUrl) ) return jsonify(text = "", response_type = "in_channel") except LineBotApiError as e: return e return "good" if __name__ == '__main__': app.run(host='0.0.0.0', ssl_context=('/etc/letsencrypt/live/example.com/fullchain.pem', '/etc/letsencrypt/live/example.com/privkey.pem'))
続く。