6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LINEに投稿されたメッセージをSlackに流す(セキュリティ&確実性無視編

Last updated at Posted at 2021-06-22

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

  • https://developers.line.biz/console/ にアクセス。

  • プロバイダーを新規作成

  • 画面左 プロバイダー → 新規チャネル作成(チャネルの種類:Messageing API、さっき作ったプロバイダーを選ぶ)

  • 作成したチャネルの、チャネル基本設定を選択、Messaging API設定 タブを選択

  • 以下の設定を行う

    • Webhook設定 に、自作のpythonサーバーにアクセスして欲しいURLを入れる。
    • Webhookの利用 -> ON
    • LINE公式アカウント機能 グループ・複数人チャットへの参加を許可する -> 有効
    • LINE公式アカウント機能 -> 応答メッセージ
      • 基本設定 : ボット
      • あいさつメッセージ : OFF
      • 応答メッセージ : ON
      • Webhook : ON
  • チャネルアクセストークン(長期)
    +~~~~~~中略~~~~~~= が表示されているはずなのでメモしておく(これは他人に見せちゃダメなやつ)

LINE側 の準備はこれで終わりです

Python

下記ソースの
「LINEのチャネルアクセストークン」
「slackのWebhook URL」
を先ほどメモったものを置換する。(下記ソースコメント参照のこと)
下記ソースをwebサーバーにデプロイし、webアプリとして稼働させる。
購読したいLINEのグループに、先程のチャネル、を参加させる

うまくいっていればこれで実現できているはずです。
いろいろ脆弱性がありますがそれは攻撃された時に考えましょう・・・

app.py
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"
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?