やりたいこと
自宅サーバーのグローバルIPが変わったらSlackに通知する。
やったこと
- Slack APIを使うためのトークンを取得
- グローバルIPの取得方法を確立
- シェルスクリプトで実装・動作確認
Slack APIを使うためのトークンを取得
Slack アプリを作成
APIを使うためにはSlackアプリを作成する必要があります。
アプリ? APIを叩きたいだけなんだけど...と思う人もいるでしょうが、APIを叩くために必要なのでとりあえず作りましょう。慣れると数分でアプリ(=Tokenを取得)を作れます。
- https://api.slack.com/apps にアクセス。
-
Create New App
をクリック。
slackにサインインしていないとこのボタンは出ずに、サインインしてくださいボタンが出ます。サインインをしたらまたアクセスし直しましょう。
-
App name
に自分の好きなアプリ名を入力。今回はnotification_gipとしました。 -
Development Slack workspace
にグローバルIPを通知したいワークスペース名を選択。今回は私の個人slackであるmsrx9を選択します。 -
Create App
をクリック
作成したアプリ notification_gip のスコープ(どの機能を使うか)を設定
スコープを選択することで、使用できる機能を選択することができます。
Basic Informationページに遷移しますので、左メニューのOAuth & Permissions
をクリックします。
Scopes
が出てくるまでスクロールしましょう。
Select Permission Scopes で、利用できる機能を指定します。今回はメッセージを書き込む機能を利用しますので、Send messages as notification_gip
を選択してください。
Save Changes
をクリック。ボタンの色が緑色から灰色に変わったらセーブ完了です。
ワークスペースに notification_gip をインストール
Install App to Workspace
をクリックしてください。
許可する
をクリックしてください。
tokenを入手!
グレーアウトしている OAuth Access Token
を使う事でSlack APIを叩く事ができるようになります。
グローバルIPの取得方法を調べる
次は実際にSlackに通知するためのグローバルIPを取得する方法を考えます。
自分のPCのグローバルIPアドレスを知るためのサービスとして https://www.cman.jp/network/support/go_access.cgi があります。
アクセスするとあなたの利用しているIPアドレス
と大きく表示されていると思います。これがアクセスしているPCのグローバルIPアドレスです。
このページからグローバルIPだけを抽出すれば良さそうですね。
curlコマンドを使って取得したHTMLを眺めているとグローバルIPを特定しやすそうなタグを見つけました。
<div class="outIp">192.xxx.xxx.xxx</div>
class="outIp"
と記載されている行のIPアドレスを取得する処理を考えましょう。
curl -s https://www.cman.jp/network/support/go_access.cgi | grep class..outIp| grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
このワンライナーは以下のようなことをしています。
-
curl -s https://www.cman.jp/network/support/go_access.cgi
でHTMLを文字列として取得 -
grep class..outIp
で、取得したHTML文字列からclass="outIp"
が書いてある行を抽出 -
grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
で、IPアドレス(xxx.xxx.xxx.xxx)の箇所だけを抽出
これでグローバルIPが取得できるようになりました。
slackに書き込むためのAPIは?
slackに書き込むためのAPIは chat.postMessage を使えばいいみたいです。
必須パラメータはtoken
、channel
、text
の三つで、POSTメソッドでアクセスすれば良いと書いてありますね。
これ、ブラウザ経由だとGETメソッドでも通るので、最初に実装した時にブラウザだとOKなのに、curlを使うとNGになる。。と少し悩んでしまいました。
実装
Slackにアクセスするために事前に必要な情報はtoken
とchannel
です。
tokenは上記で作成したOAuth Access Tokenです。channelは投稿したいチャンネルのURLの末尾部分(下図オレンジ枠)になります。
gip2slack.sh - グローバルIPをslackに通知
以下のようなシェルスクリプトを組んでみました。
実行するとgipチャンネルに現在のグローバルIPが通知されます。
これで出先でも自宅サーバへアクセスするためのアドレスがわかりますね!
#!/bin/sh
# 設定
TOKEN="xxxx-xxxx-xxxxx" # 上記で作成したOAuth Access Tokenを指定
CHANNEL="Cxxxxxxx5" # slackのチャンネルIDを指定
# グローバルIPアドレス取得
GIPADDR=$(curl -s https://www.cman.jp/network/support/go_access.cgi | grep class..outIp| grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
# IP通知
curl -XPOST https://slack.com/api/chat.postMessage -d "token=${TOKEN}" -d "channel=${CHANNEL}" -d "text=${GIPADDR}"
実行するとこんな感じでSlackに通知されます!やったね!
運用とこれから
毎日通知されるのも面倒臭いので、前回取得したグローバルIPと変化がなければ通知しない処理などを追加する予定です。
そして、このシェルスクリプトを1日1回起動するようにcrondに登録すればOK(のはずです。まだ自宅サーバも構築中なので運用試験まではできていません)