LoginSignup
3
4

More than 3 years have passed since last update.

グローバルIPをSlackに通知したい

Posted at

やりたいこと

自宅サーバーのグローバルIPが変わったらSlackに通知する。

01.jpg

やったこと

  1. Slack APIを使うためのトークンを取得
  2. グローバルIPの取得方法を確立
  3. シェルスクリプトで実装・動作確認

Slack APIを使うためのトークンを取得

Slack アプリを作成

APIを使うためにはSlackアプリを作成する必要があります。
アプリ? APIを叩きたいだけなんだけど...と思う人もいるでしょうが、APIを叩くために必要なのでとりあえず作りましょう。慣れると数分でアプリ(=Tokenを取得)を作れます。

02.jpg

  1. https://api.slack.com/apps にアクセス。
  2. Create New App をクリック。

slackにサインインしていないとこのボタンは出ずに、サインインしてくださいボタンが出ます。サインインをしたらまたアクセスし直しましょう。

03.jpg

  1. App name に自分の好きなアプリ名を入力。今回はnotification_gipとしました。
  2. Development Slack workspace にグローバルIPを通知したいワークスペース名を選択。今回は私の個人slackであるmsrx9を選択します。
  3. Create App をクリック

作成したアプリ notification_gip のスコープ(どの機能を使うか)を設定

スコープを選択することで、使用できる機能を選択することができます。

04.jpg

Basic Informationページに遷移しますので、左メニューのOAuth & Permissionsをクリックします。

05.jpg

Scopesが出てくるまでスクロールしましょう。

06.jpg

Select Permission Scopes で、利用できる機能を指定します。今回はメッセージを書き込む機能を利用しますので、Send messages as notification_gip を選択してください。

07.jpg

Save Changes をクリック。ボタンの色が緑色から灰色に変わったらセーブ完了です。

ワークスペースに notification_gip をインストール

08.jpg

Install App to Workspace をクリックしてください。

09.jpg

許可する をクリックしてください。

tokenを入手!

10.jpg

グレーアウトしている 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}'

このワンライナーは以下のようなことをしています。

  1. curl -s https://www.cman.jp/network/support/go_access.cgi でHTMLを文字列として取得
  2. grep class..outIp で、取得したHTML文字列から class="outIp"が書いてある行を抽出
  3. 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 を使えばいいみたいです。

必須パラメータはtokenchanneltextの三つで、POSTメソッドでアクセスすれば良いと書いてありますね。

これ、ブラウザ経由だとGETメソッドでも通るので、最初に実装した時にブラウザだとOKなのに、curlを使うとNGになる。。と少し悩んでしまいました。

実装

Slackにアクセスするために事前に必要な情報はtokenchannelです。
tokenは上記で作成したOAuth Access Tokenです。channelは投稿したいチャンネルのURLの末尾部分(下図オレンジ枠)になります。

11.jpg

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に通知されます!やったね!

01.jpg

運用とこれから

毎日通知されるのも面倒臭いので、前回取得したグローバルIPと変化がなければ通知しない処理などを追加する予定です。
そして、このシェルスクリプトを1日1回起動するようにcrondに登録すればOK(のはずです。まだ自宅サーバも構築中なので運用試験まではできていません)

参考文献

3
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
3
4