LINEに投稿されたメッセージをSlackに集約したい。という要件あり。
IFTTTでできるんじゃないかな? とおもったものの、パッとみたところここの一覧 にLINEが存在しない。
WebHookを駆使すればIFTTTで実現可能な気がするが、pythonでサーバーを立てて実現してみる。
サーバを立ち上げるところはHeroku,Azure,AWS,etc...お好きなところで。
大雑把な機構は以下のとおり
LINEに投稿あり
↓
LINEが messaging-api webhooks 機能により、自作のpythonサーバーにPOSTメッセージを送る
↓
pythonサーバーでLINEから送られるメッセージ受信。
LINEから送られるメッセージにはユーザー名が含まれていないのでLINEのAPIを叩き、
そのメッセージを送ったユーザー情報(欲しいのは表示名)を取得
↓
pythonサーバーでSlack の Webhookを叩く
↓
Slackに表示された〜
Slack側 Incoming Webhook の用意
- https://api.slack.com/apps を開く
- Create New App ボタンを押す。From scratchを選択。
- App Name をなんか適当に決める。投稿したいワークスペースを選んで Create App!
- そしたらアプリが作成される(おそらく作成したアプリのBasic Information画面に遷移している)
左メニューからIncoming Webhooksを選択。 - Incoming Webhooks を On にする。「どこのチャンネルに投稿する?」を聞かれるので適宜選ぶ。
この画面下に「Webhook URL」
https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ
というのが表示されていると思うのでそれをメモしておく。(これは他人に見せちゃダメなやつ)
Slack側 の準備はこれで終わりです
LINE側 Messaging API の設定
ドキュメントはこの辺だがあんまり見なくていい https://developers.line.biz/ja/reference/messaging-api/#webhooks
-
プロバイダーを新規作成
-
画面左 プロバイダー → 新規チャネル作成(チャネルの種類:Messageing API、さっき作ったプロバイダーを選ぶ)
-
作成したチャネルの、チャネル基本設定を選択、Messaging API設定 タブを選択
-
以下の設定を行う
- Webhook設定 に、自作のpythonサーバーにアクセスして欲しいURLを入れる。
- 下記pythonサンプルで言えば https://example.com/endpoint になる
- Webhookの利用 -> ON
- LINE公式アカウント機能 グループ・複数人チャットへの参加を許可する -> 有効
- LINE公式アカウント機能 -> 応答メッセージ
- 基本設定 : ボット
- あいさつメッセージ : OFF
- 応答メッセージ : ON
- Webhook : ON
- Webhook設定 に、自作のpythonサーバーにアクセスして欲しいURLを入れる。
-
チャネルアクセストークン(長期)
+~~~~~~中略~~~~~~= が表示されているはずなのでメモしておく(これは他人に見せちゃダメなやつ)
LINE側 の準備はこれで終わりです
Python
下記ソースの
「LINEのチャネルアクセストークン」
「slackのWebhook URL」
を先ほどメモったものを置換する。(下記ソースコメント参照のこと)
下記ソースをwebサーバーにデプロイし、webアプリとして稼働させる。
購読したいLINEのグループに、先程のチャネル、を参加させる
うまくいっていればこれで実現できているはずです。
いろいろ脆弱性がありますがそれは攻撃された時に考えましょう・・・
from flask import Flask, request
import requests
import json
app = Flask(__name__)
lineURL = 'https://api.line.me/v2/bot/profile/'
lineAuthHeaders = {'Authorization': 'Bearer ここにLINEのチャネルアクセストークンを記載'}
slackURL = 'https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ' #slackのWebhook URLを記載
@app.route("/")
def hello_world():
#サーバー死活確認用
return "<p>Hello</p>"
@app.route("/endpoint",methods=["POST"])
def endpoint():
try:
webHook = json.loads( request.get_data(as_text=True) )
events = webHook['events']
for event in events:
if (event['type'] == 'message') and event['message']['type'] == 'text' :
message_text = event['message']['text']
user_id = event['source']['userId']
lineRes = requests.get(lineURL+user_id, headers=lineAuthHeaders)
user_name = lineRes.json()['displayName']
postSlackData = {
'text': user_name + ' : ' + message_text
}
_ = requests.post(slackURL, json=postSlackData)
except Exception as e:
return ("Error {0}".format(str(e)))
return "OK"