URL : https://github.com/presire/qEQAlert
qEQAlertは、気象庁 (JMA) あるいはP2P地震情報からデータを取得して、0ch系の掲示板に書き込むソフトウェアです。
緊急地震速報(警報)では、常に新規スレッドを自動作成します。
これは、緊急地震速報(警報)は緊急性が必要であり、既存のスレッドに書き込むと、
該当スレッドに多くのレスがある場合はスクロールする手間が掛かるからです。
発生した地震情報の場合は、震源地が同じ既存のスレッドが存在するときは該当スレッドに自動書き込み、
該当スレッドが無ければ新規スレッドを自動作成します。
取得する地震情報は、以下の通りです。
- 緊急地震速報(警報) :
30[秒]以内の最新情報 (1件のみ)
- 発生した地震情報 :
10[分]以内の最新情報 (1件のみ)
地震情報の詳細は、P2P地震情報 をご確認ください。
P2P地震情報では、以下のレート制限があります。
それを超えるとレスポンスが遅くなったり拒否 (HTTP ステータスコード 429) される場合があります。
60 リクエスト/分 (IPアドレスごと)
このソフトウェアを動作させるには、Qt 5.15 (Core、Network) および libxml 2.0が必要となります。
Qt 6を使用してビルドおよび動作させることができる可能性もありますが、確認はしておりませんのでご注意ください。
README.mdでは、Red Hat Enterprise LinuxおよびSUSE Linux Enterprise / openSUSEを前提に記載しております。
また、他のLinuxディストリビューションにもインストールして使用できると思います。
(例: Linux Mint, Manjaro, MX Linux, ... 等)
Raspberry Pi上での動作は確認済みです。
注意:
ただし、本ソフトウェアはリアルタイム性を保証できないため、緊急地震速報(警報)の機能の使用は非推奨としております。
version 0.2.0以降の設定ファイル (JSONファイル) は、version 0.1.2以前の設定ファイルと構造が異なります。
そのため、以前のバージョンの設定ファイルをversion 0.2.0以降で使い回すことが出来ないことに注意してください。
また、ご要望があれば、逐次開発を進めていく予定です。
- Qt5 Core
- Qt5 Network
- Qt5 Xml
- https://www.qt.io/
- qEQAlertは、Qtライブラリを使用しています。
- 本ソフトウェアで使用しているQtライブラリは、LGPL v3オープンソースライセンスの下で利用可能です。
- Qtのライセンスファイルは、以下に示すファイルで確認できます。
LibraryLicenses/Qt/LICENSE.LGPLv3
- libxml 2.0
- https://gitlab.gnome.org/GNOME/libxml2
- qEQAlertは、libxml 2.0を使用しています。
- libxml 2.0は、MITライセンスの下で利用可能です。
- libxml 2.0のライセンスファイルは、以下に示すファイルで確認できます。
LibraryLicenses/libxml2/LICENSE.MIT
システムをアップデートした後、続いて本ソフトウェアのビルドに必要なライブラリをインストールします。
# Red Hat Enterprise Linux
sudo dnf update
sudo dnf install make cmake gcc gcc-c++ \
libxml2 libxml2-devel qt5-qtbase-devel
# SUSE Linux Enterprise / openSUSE
sudo zypper update
sudo zypper install make cmake gcc gcc-c++ libxml2-devel \
libqt5-qtbase-common-devel libQt5Core-devel \
libQt5Network-devel libQt5Xml-devel
# Debian GNU/Linux, Raspberry Pi OS
sudo apt update && sudo apt upgrade
sudo apt install make cmake gcc libxml2 libxml2-dev \
qtbase5-dev libqt5xmlpatterns5-dev
GitHubからqEQAlertのソースコードをダウンロードします。
git clone https://github.com/presire/qEQAlert.git qEQAlert
cd qEQAlert
mkdir build && cd build
qEQAlertをソースコードからビルドするには、cmake
コマンドを使用します。
Ninjaビルドを使用する場合は、cmake
コマンドに-G Ninja
オプションを付加します。
ビルド時に使用できるオプションを以下に示します。
CMAKE_BUILD_TYPE
デフォルト値 :Release
リリースビルドまたはデバッグビルドを指定します。
CMAKE_INSTALL_PREFIX
デフォルト値 :/usr/local
qEQAlertのインストールディレクトリを変更することができます。
SYSCONF_DIR
デフォルト値 :/etc/qEQAlert/qEQAlert.json
設定ファイル qEQAlert.jsonのインストールディレクトリを変更することができます。
SYSTEMD
デフォルト値 :OFF
(無効 : Systemdサービスファイルはインストールされない)
指定できる値 1 :system
を指定する場合 -/etc/systemd/system
指定できる値 2 :user
を指定する場合 -~/.config/systemd/user
Systemdサービスファイル qEQAlert.serviceのインストールディレクトリを変更することができます。
PID
デフォルト値 :/var/run
Systemdサービスを使用する場合、プロセスファイル qEQAlert.pidのパスを変更することができます。
Systemdサービスを使用しない場合は不要です。
WITH_LIBXML2
デフォルト値 : 空欄
使用例 :-DWITH_LIBXML2=/opt/libxml2/lib64/pkgconfig
( libxml 2.0ライブラリが、/opt/libxml2ディレクトリにインストールされている場合 )
libxml 2.0ライブラリのpkgconfigディレクトリのパスを指定することにより、
任意のディレクトリにインストールされているlibxml 2.0ライブラリを使用して、このソフトウェアをコンパイルすることができます。
通常、あまり使用しないと思われます。
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=<qEQAlertのインストールディレクトリ> \
-DSYSCONF_DIR=<設定ファイルのインストールディレクトリ> \
-DSYSTEMD=user \ # Systemdサービスファイルをホームディレクトリにインストールする場合
-DPID=/tmp \ # Systemdサービスを使用する場合
..
make -j $(nproc)
make install または sudo make install
ワンショット機能を有効 (oneshot
をtrue
) にしている場合は、Systemdサービスと連携できないことにご注意ください。
qEQAlertのSystemdサービスファイルは、
/etc/systemd/systemディレクトリ、または、~/.config/systemd/userディレクトリのいずれかにインストールされております。
cmake
コマンドにおいて、SYSTEMD
オプションを変更することによりインストールディレクトリが変更されます。
Systemdサービスを再読み込みします。
sudo systemctl daemon-reload
または
systemctl --user daemon-reload
qeqalertデーモンは遅延実行を行う必要があるため、タイマサービスを有効化または実行する必要があります。
qEQAlertを実行する時は、タイマデーモンを開始します。
sudo systemctl start qeqalert.timer
または
systemctl --user start qeqalert.timer
PCの起動時またはユーザのログイン時において、qeqalertデーモンを自動起動する場合は、タイマデーモンを有効にします。
sudo systemctl enable qeqalert.timer
または
systemctl --user enable qeqalert.timer
PCの起動時またはユーザのログイン時において、qeqalertデーモンの自動起動を無効にする場合は、タイマデーモンを無効にします。
sudo systemctl disable qeqalert.timer
または
systemctl --user disable qeqalert.timer
qEQAlertを停止する場合は、qeqalertデーモンとタイマデーモンを停止します。
sudo systemctl stop qeqalert.service qeqalert.timer
または
systemctl --user stop qeqalert.service qeqalert.timer
デフォルトでは、PCの起動直後から15[秒]待機した後、本ソフトウェアを遅延起動しています。
もし十分なリソースをもつPCの場合は、この秒数を短くしても正常に動作すると予想されます。
Systemdサービスを使用せずに、qEQAlertを実行することもできます。
sudo qEQAlert --sysconf=<qEQAlert.jsonのパス>
または
qEQAlert --sysconf=<qEQAlert.jsonのパス>
直接実行した場合において、[q]キー または [Q]キー ==> [Enter]キー を押下することにより、本ソフトウェアを終了することができます。
Cronを使用して本ソフトウェアを連携する場合は、設定ファイルのoneshot
をtrue
に設定して、ワンショット機能を有効にします。
ワンショット機能を有効にしている場合は、Systemdサービスと連携できないことにご注意ください。
※注意
Cronの最小のスケジュール設定単位は分です。
したがって、Cronを使用して秒間隔でソフトウェアを実行することはできません。
本ソフトウェアでは、付属のラッパースクリプトを使用して、そのスクリプト内でループを使用して秒間隔で実行することにより、
Cronを使用して、例えば1分ごとにラッパースクリプトを実行することにより、秒間隔で本ソフトウェアを実行することができます。
以下は、Crontabファイルを編集して、毎日24時間 10秒ごとに本ソフトウェアを実行する設定例です。
この例では、本ソフトウェアは/usr/local/bin/qEQAlertにインストールされています。
sudo crontab -e
# 1[分]ごとにqEQAlertを実行する場合
* * * * * /usr/local/bin/qEQAlert.sh --sysconf=<qEQAlert.jsonのパス>
ラッパースクリプトの内容を以下に示します。
なお、このスクリプトファイルは、qEQAlertの実行ファイルと同階層のディレクトリにインストールされています。
#!/usr/bin/env sh
appname="qEQAlert"
# use -f to make the readlink path absolute
dirname="$(dirname -- "$(readlink -f -- "${0}")" )"
if [ "$dirname" = "." ]; then
dirname="$PWD/$dirname"
fi
cd $dirname
# 終了するまでの総秒数
END=60
# 現在の秒数
SECONDS=0
# 待機時間
WAIT=10
# 60秒間 (1分) にわたって秒間隔で実行
while [ $SECONDS -lt $END ]; do
# qEQAlertを実行
"$dirname/$appname" "$@"
# 指定時間待機
sleep $WAIT
SECONDS=$(($SECONDS + $WAIT))
done
qEQAlertの設定ファイルであるqEQAlert.jsonファイルでは、
取得する地震情報の可否、更新時間の間隔、取得した地震情報を書き込むためのログファイルのパス等が設定できます。
この設定ファイルがあるデフォルトのディレクトリは、/etc/qEQAlert/qEQAlert.json です。
cmake
コマンドの実行時にディレクトリを変更することもできます。
各設定の説明を記載します。
- earthquake
- alert
デフォルト値 :false
緊急地震速報(警報)のデータを取得するかどうかを指定します。
現在時刻から30[秒]以内に発令された緊急地震速報の場合のみ取得します。
デフォルト値はfalse
(無効) です。
- alerturl
- p2p
デフォルト値 :"https://api.p2pquake.net/v2/history?codes=556&limit=1&offset=0"
緊急地震速報(警報)を取得するURLを指定します。
現在の仕様では、P2P地震情報からのみ緊急地震速報(警報)を取得することができます。
- p2p
- alertlog
デフォルト値 :/tmp/eqalert.log
緊急地震速報(警報)の地震IDを保存するログファイルのパスを指定します。
これは、同じ地震情報を取得して新規スレッドを作成することがないように保存しています。
- info
デフォルト値 :true
発生した地震情報のデータを取得するかどうかを指定します。
現在時刻から10[分]以内に起きた地震情報の場合のみ取得します。
デフォルト値はtrue (有効) です。
- infourl
- jma
デフォルト値 :"https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml"
発生した地震情報を取得する気象庁 (JMA) のURLを指定します。
気象庁から発生した地震情報を取得する場合は、get
キーを0
に設定する必要があります。
- p2p
デフォルト値 :"https://api.p2pquake.net/v2/history?codes=551&limit=1&offset=0"
発生した地震情報から取得するP2P地震情報のURLを指定します。
P2P地震情報から発生した地震情報を取得する場合は、get
キーを1
に設定する必要があります。
- jma
- infolog
デフォルト値 :/tmp/eqinfo.log
発生した地震情報の地震IDや立てたスレッドの情報を保存するログファイルのパスを指定します。
これは、地震情報によりスレッドを制御するための情報を保存しています。
- alertscale / infoscale
デフォルト値 :50
地震情報を書き込むための基準となる震度を指定します。
指定可能な値以外を指定した場合は、強制的に50 (震度5強) に設定されます。
alertscale
は緊急地震速報、infoscale
は発生した地震情報の設定です。
デフォルト値は50 (震度5強) です。
指定できる値は、以下の通りです。
10 (震度1) 20 (震度2) 30 (震度3) 40 (震度4) 45 (震度5弱) 50 (震度5強) 55 (震度6弱) 60 (震度6強) 70 (震度7)
- get
デフォルト値 :0
JMA (気象庁)、または、P2P地震情報のどちらからデータを取得するかどうかを判別します。
0
の場合 : JMA (気象庁) からデータを取得します。
1
の場合 : P2P地震情報からデータを取得します。
- alerturl
デフォルト値 :https://api.p2pquake.net/v2/history?codes=556&limit=1&offset=0
緊急地震速報(警報)のデータを取得するURLを指定します。
現在、緊急地震速報(警報)では、P2P地震情報からのデータのみ取得できます。
- infourl
デフォルト値 :https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml
発生した地震情報のデータを取得するURLを指定します。
JMA(気象庁)からデータを取得する場合 :
https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml
P2P地震情報からデータを取得する場合 :
https://api.p2pquake.net/v2/history?codes=551&limit=1&offset=0
- alert
- thread
-
from
デフォルト値 :佐藤
地震情報を書き込む時の名前欄を指定します。
POSTデータとして送信します。
-
mail
デフォルト値 : 空欄
地震情報を書き込む時のメール欄を指定します。
POSTデータとして送信します。
-
bbs
デフォルト値 : 空欄
掲示板のBBS名を指定します。
POSTデータとして送信します。
書き込み時に必須です。
-
shiftjis
デフォルト値 :true
POSTデータの文字コードをShift-JISに変換するかどうかを指定します。
0ch系は、Shift-JISを指定 (true
) することを推奨します。
-
requesturl
デフォルト値 : 空欄
地震情報を書き込むため、POSTデータを送信するURLを指定します。
0ch系の掲示板では、以下のようなURLが多いです。http(s)://<ドメイン名>/test/bbs.cgi
http(s)://<ドメイン名>/test/bbs.cgi?guid=ON
書き込み時に必須です。
-
chtt
デフォルト値 :false
スレッドタイトルを最新の地震情報のタイトルに変更します。
地震情報を既存のスレッドに書き込む時、本文の先頭に!chttという文字列を付加して、POSTデータとして送信します。
防弾嫌儲系の掲示板において、!chtt
コマンドが使用できる場合に有効です。
-
subjecttime
デフォルト値 :true
緊急地震速報 で新規スレッドを作成する場合、スレッドタイトルに地震発現(到達)時刻を記載するかどうかを指定します。
この値がtrue
の場合、スレッドタイトルに 発現時刻 hh:mm:ss という文字列が付加されます。
スレッドタイトルの文字数に制限がある場合は、この値をfalse
にしてください。
true
の時のスレッドタイトル例 : 【緊急地震速報】<震源地名> Mx.x 発現時刻 hh:mm:ss 強い揺れに警戒
false
の時のスレッドタイトル例 : 【緊急地震速報】<震源地名> Mx.x 強い揺れに警戒
-
expiredxpath
デフォルト値 :"/html/head/title"
スレッドの生存を判断するときに使用するXPathです。
ログファイルに保存されているスレッドタイトルと現在のスレッドタイトルを比較する時に使用します。
-
- oneshot
デフォルト値 :false
タイマ (interval
キーの値を使用) を使用して、地震情報を自動取得するかどうかを指定します。
Cronを使用して本ソフトウェアをワンショットで実行する場合は、この値をtrue
に指定します。
つまり、true
に指定する場合、本ソフトウェアをワンショットで実行して、地震情報を1度だけ自動取得することができます。
例えば、Systemdサービスが使用できない環境 (Cronのみが使用できる環境) 等で使用します。
- interval
デフォルト値 :10
P2P地震情報から地震情報を取得する時間間隔 (秒) を指定します。
デフォルト値は10[秒]です。
5[秒]未満、または、60[秒]を超える値を指定した場合は、強制的に10[秒]に指定されます。
ただし、P2P地震情報では、1分間に60リクエストまでというレート制限があります。
それを超えるとレスポンスが遅くなったり拒否 (HTTP ステータスコード 429) される場合があります。
{
"earthquake": {
"alert": false,
"alertlog": "/tmp/eqalert.log",
"alertscale": 50,
"alerturl": {
"p2p": "https://api.p2pquake.net/v2/history?codes=556&limit=1&offset=0"
},
"get": 0,
"info": true,
"infolog": "/tmp/eqinfo.log",
"infoscale": 50,
"infourl": {
"jma": "https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml",
"p2p": "https://api.p2pquake.net/v2/history?codes=551&limit=1&offset=0"
}
},
"interval": 10,
"oneshot": false,
"thread": {
"bbs": "",
"chtt": false,
"expiredxpath": "/html/head/title",
"from": "佐藤",
"mail": "",
"requesturl": "",
"shiftjis": true,
"subjecttime": true
}
}
緊急地震速報の場合は、常にスレッドを新規作成します。
同じ緊急地震速報でスレッドを新規作成しないように地震IDを保存しています。
また、保存された地震IDは削除されることはありません。
このファイルは、以下に示すようなフォーマットになっています。
65f3146fd616be440743cfd5
65f3146fd616be4407lmle40
65f3146fekfmerkm3r34arge
...略
発生した地震情報の場合、同じ震源地で地震が起きたときは過去に立てたスレッドが生存している場合にのみ、該当スレッドに追加で書き込みます。
それ以外の場合は、スレッドを新規作成します。
また、同じ震源地で地震が起きたとき、かつ、過去に立てたスレッドが存在しない場合は該当するオブジェクトが削除されます。
このファイルは、以下に示すようなフォーマットになっています。
[
{
"date": "2024/03/19 10:15:00",
"hypocentre": "十勝沖",
"id": [
"65f8e803d616be440743cffc"
],
"prefs": "北海道",
"reportdatetime": "2024-06-09T03:24:00+09:00",
"thread": "1710837545",
"title": "【地震】十勝沖 震度2 M4.6",
"url": "https://www.example.com/test/read.cgi/sample/1710837545/"
},
{
"date": "2024/03/19 19:21:00",
"hypocentre": "石川県能登地方",
"id": [
"65f967c6d616be440743cffe",
"65f967c6d616be440743cffd"
],
"prefs": "石川県",
"reportdatetime": "2024-06-09T03:24:00+09:00",
"thread": "1710858633",
"title": "【地震】石川県能登地方 震度1 M3.2",
"url": "https://www.example.com/test/read.cgi/sample/1710858633/"
}
{
"date": "2024/06/16 19:35:00",
"hypocentre": "千葉県北西部",
"id": [
"20240616193512"
],
"prefs": "千葉県,東京都,神奈川県",
"reportdatetime": "2024-06-16T19:38:00+09:00",
"thread": "1710902547",
"title": "【地震】千葉県北西部 震度2 M4.1",
"url": "https://www.example.com/test/read.cgi/sample/1710902547/"
}
]