slackの投稿をLINEで通知させる

こんにちはレッドインパルスのたいちです。

エンジニアのコミュニケーションツールとして最近slackが流行っていますね。
元々はゲーム会社の社内チャットツールだったようですが、
pc版ブラウザでの使いやすさから多くの開発現場で使われているようです。
ただ、自分なんかは仕事用で割り切って使っているので、
例えばプライベートの時間に緊急の連絡が入ったとしても気付かないタイプです。

そこで!slackに特定の文が投稿された場合にlineのbotで通知させるという至極横着なシステムを作成しました。
今回はその方法をご紹介したいと思います。

システムの流れ


slackのwebhookをトリガーとしてウェブアプリケーションフレームワークでLINEのapiをたたきます。
今回はwebサーバをAWS、プログラムはpythonで構成していますが、ここはお好みでいいと思います。
作業は、LINE apiの構築、サーバにのせるプログラムの作成、webhookの設定、システム全体の連結、
と分けて行いましたのでそれぞれで章分けして解説していきます!

LINE apiの構築

lineのapiサービスは2016年の9月にサービスを開始しまして、個人の開発目的でも手軽にapiサービスを使用できる様になりました。messaging apiでは、普通のmessaging apiとdeveroppers trialというものがありますが、無料で色んなサービスを使ってみたいならdeveroppers trialを使いましょう。友達追加の上限が50人という制限はありますが、開発の試作程度でしたらこちらで十分かと思います。

名前や利用目的等の入力が終わったらアカウントが作成されますので、ヘッダーのツールからLINE@deveroppersを選択しアカウントの基礎情報を獲得しましょう。
今後使うのはchannel access tokenとuser idとなりますのでこの2つは控えておきます。

サンプルコードの方もご丁寧にline様が用意してくれているので(しかも複数言語で)活用しましょう。
今回は任意のタイミングでメッセージを送りたいので、push messageというコンポーネントのpythonでのサンプルコードを利用してます。
とりあえず自分のpc上でLINEのapiをたたかせるために以下のコードを用います。

[python gutter=”false”] from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError

line_bot_api = LineBotApi(‘##channel access token##’)
try:
    line_bot_api.push_message(‘##user id##’, TextSendMessage(text=’##hogehoge##’))
except LineBotApiError as e:
    print e
[/python]

ここでmessaging apiのpython用ライブラリをインストールしていますが、コマンドが少し分かりづらいのでこちらのサイトをご参考ください。
このプログラムを実行すればアカウントからメッセージが届きます。
ちなみにヘッダーのツールからLINE@MANEGERSを選択すればアカウントのidがわかるので、自分の携帯のLINEアプリでid検索をかけて友達登録をしておきましょう。

サーバ上のプログラム

まずAWSに登録しec2インスタンスにて仮想サーバをたてます。
説明欄にパブリックIPアドレスやユーザ名があるので控えておきましょう(秘密鍵はインスタンス設定の際にダウンロードできる)。
自分のpcから仮想サーバへとアクセスする際のsshコマンドは以下の様になります。

[shell gutter=”false”] $ ssh -i 秘密鍵名.pem [ユーザ名]@[IPアドレス or DNS名] [/shell]

ただし、sshコマンドには .ssh/のディレクトリ内にconfigファイルをおいてしまえばコマンドが簡素化できる機能も存在しますので、ユーザ名やIPアドレスをいちいち打ち込むのが面倒な人は設定しておくことをお勧めします。

[shell gutter=”false”] Host aws
HostName [IPアドレス or DNS名] User [ユーザ名] IdentityFile ~/.ssh/秘密鍵名.pem
[/shell]

このファイルと秘密鍵ファイルを~/.ssh/へ入れておけば

[shell gutter=”false”] $ ssh aws
[/shell]

で一発接続できます。簡単ですね。
接続したらプログラムを入れるディレクトリを作っておきましょう。

 

さて、続いてはサーバ上にプログラムをのせる作業ですが、slackのwebhookをサーバのプログラムで受けるので、先程のLINE apiをたたくプログラムをウェブアプリケーションフレームワークを用いて少し変えましょう。

[python gutter=”false”] from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError
from flask import Flask, request

line_bot_api = LineBotApi(‘##channel access token##’)
app = Flask(__name__)
@app.route(‘/’, methods=[‘POST’])
def slack_push():
if request.method == ‘POST’:
print request.form[“text”] if request.form[“text”] == ‘<hoge>’:
try:
line_bot_api.push_message(‘##user id##’, TextSendMessage(text=‘hogehoge’))
return “great”
except LineBotApiError as e:
return e
return “good”
if __name__ == ‘__main__’:
app.run(host=‘0.0.0.0’)
[/python]

これは、slackでhogeと投稿されたらhogehogeとLINEに投稿するプログラムとなっています。(host=‘0.0.0.0’)としてあるためどのユーザからのアクセスも受け付けているのでご注意ください。
こいつをscpコマンドを使ってサーバ上のworkspaceというディレクトリへ送りつけます。

[shell gutter=”false”] $ scp -i ~/.ssh/[秘密鍵名].pem [プログラム名] [ユーザ名]@[IPアドレス or DNS名]:~/
[/shell]

サーバ上でLINEbotのライブラリやFlaskのダウンロードを忘れない様にしておきましょう。

webhookの設定

slackの機能として特定のワードが投稿されたのを認識してpush通知を送る”outgoing webhook”というものがあります。slackにてsign inをしたら、こちらのurlからoutgoing webhookを追加しましょう。追加したら編集できる様になるので、指定のchannelとトリガーとなるワードの設定、push先のurlを入力します。

システムの連結

最後に個別に設定してきた各要素をそれぞれつなぎ、きちんと動くシステムにするために調整します。
サーバーのポートの設定や、サーバーにログインしていなくてもプログラムが動く様にしたりする作業が、少々面倒くさかったので説明しておきます。

まずポートの設定から。slackのwebhookからのpushを受け取るための専用ポートを開けます。適当な番号でいいです。開け方は、サイドメニュにあるセキュリティーグループを選択し、インスタンスを指定してからインバウンドという所を選択するとポートの編集ができるのでそちらから行います。私の場合はポート範囲を5000、送信元を0,0,0,0で設定しておきました。これに伴い、先程のoutgoing webhookでのpush先IPアドレスの設定を[IPアドレス]:5000と変更しました。

次にプログラムをサーバ上で動かし続ける方法について。Flaskをデーモン化するのにはgunicornというツールを用います。以下のコマンドを打てば実装できます。

[shell gutter=”false”] $ sudo pip install gunicorn
$ gunicorn [プログラム名]:app -b 0.0.0.0:5000 –daemon
[/shell]

この時、プログラム名には.pyをつけたままにしないよう注意しましょう。

これらの手順を間違えずに行えば、slackの投稿をトリガーにしてLINEのアカウントでメッセージを投稿するシステムの完成です!!

まとめ

かなり長ったらしくなってしまいましたが、「slackのアプリをちょくちょく開きさえすればいい話じゃん!」とツッコマレてしまえばそれまでですね〜笑
でも色々勉強できたので自分的には取り組んでみて良かったと思っています。
最後に今回勉強できたポイントをまとめて終わります。それでは〜

勉強ポイントまとめ

  • LINE apiの扱い
  • ec2インスタンスの扱い
  • pythonおよびflaskの扱い
  • webhookの扱い
  • gunicornの扱い