
【ログ保管&通知】LINEオープンチャット通知プログラム2
やがみさん(@Light_Yagami_a)のオープンチャットで、オプチャ主の発言を追跡する場合を例として解説しています(許諾済み)
記事内のスクリーンショットに映るアイコンや名前、書き込みは一部改変を行っており、オープンチャットの内容に直接触れるものは一切ありません。
最近のトレード界隈では、LINEのオープンチャットが流行しています。
私も入ってみましたが、みんなの活発な書き込みで通知は毎日何百件と溜まり、見たい人の発言もすぐに流れてしまうので、ログ追って、発言探して、、リアルタイムに追おうにも見逃したり、、結構大変ですよね。
というわけで、特定の人物1人を指定し、その発言をスクショして、LINEやDiscordに通知するプログラムを書きました。
たとえば、このような会話が行われた場合。

ここでは挨拶しか行われていませんが、これが仮に大切な書き込みであった場合。複数回届くLINE通知の中で、必要なのは最後のオプチャ主の書き込み通知のみでしょう。
ここでプログラムを起動しておけば、通知は1件で済み、このように表示されます。


このプログラムは私も実際に使用しており、PCで作業しているときは通知が鳴ったらトーク画面を見ればいいし、寝起きは何百件と溜まったオプチャのログは一旦無視して、DiscordやLINEのログを確認すればいいので便利です。
先日、プログラムを切った状態で旅行に行ったのですが、何百件とログが溜まっていくオプチャの確認は到底無理でした。
それだけ「一度慣れたら手放せない」と感じています。
なお、これはLINEのAPIなど、公式の機能を利用しているわけではありません。
Pythonのプログラムで、PCのトーク画面の指定範囲をスクショ
画像判定で設定したアイコンがあるか判定
判定できたアイコンを起点とし、最下部までを切り抜き
簡単に書くと上記の手順で動作しています。
常にオープンチャットを開いておく必要があるので、マルチモニタで作業してる人や、サブのノートパソコンがある人向け。
まとめると、本プログラムでは、以下の環境が用意できる方向けのものとなっています。
・マルチモニタなどで、常にオープンチャットを開いておける方
・記事の手順通りPython3.7の環境を用意して、プログラムコードを実行できる方
以前の記事では、非常に簡単なプログラムだったこともあり、無料で公開を行っていました。
しかし、直近でLINEのアップデートが入ったことでプログラムが複雑化し、また、前回導入などのサポートを無料で行うことがあったため、今回は有料記事として販売します。
無論、有料販売なので、購入された方には、Discordで導入のお手伝いなどのサポートをさせていただきます。
では、導入方法を書いていきます。
LINEの背景を変更

まずはLINEの設定→背景から、青い背景色を指定してください。

プログラムの設計段階で色々な背景色を試した際に、画像識別の精度が高かった色です。
Pythonの動作環境構築

プログラムは「Python」というプログラミング言語で書かれているので、その動作環境を用意してください。
Pythonの導入方法は色々ありますが、私は「Anaconda」を使用しています。バージョンは3.6~3.7じゃないと動かないっぽいので注意が必要です。
インストールが終わって「Anaconda Prompt」が開けるようになったら、以下のコードをコピー&ペーストして、プログラムの動作に必要なパッケージをダウンロードしてください。
pip install opencv-python
pip install pyautogui
pip install Pillow
pip install ImageHash
pip install requests
pip install scikit-image
プログラムのダウンロードと起動方法

プログラムをダウンロードして、好きな場所に解凍してください。
解凍したフォルダに「Anaconda Prompt」のショートカットを作成し、プロパティ→作業フォルダーで、解凍したフォルダの場所を入力。

この画面で、以下のコードをコピー&ペーストすれば、プログラムが起動します。
python Openchat_notify.py
止める時はCtrl+Cを押すか、ウインドウを閉じてください。
プログラムの設定

まずは「setting.json」の設定を行い、通知の前段階で必要なスクショを用意しましょう。ファイルはメモ帳などで開いて大丈夫です。
{
"dicord": "",
"line": "",
"ss_debug": 1,
"x": 0,
"y": 0,
"width": 360,
"height": 501,
"pixel_diff_threshold": 0
}
"discord"
DiscordのwebhookのURLを発行して、入力してください。
(例:https://discord.com/api/webhooks/8263239368095986909/vofr6BroSABlw9esPLfRuc-g5guPhirLpiM9St-pruCOSW6fl-wlyab9thidredRudrl)
"line"
LINE Notifyのトークンを取得して、入力してください。
(例:pRoTeWunoMOrer5pRapoh0BR1vamowu1okEy6kAP2aP)
DiscordかLINE、どちらか片方を設定するだけでも動作します。
"ss_debug"
初期設定のままだと通知は行われませんが、dataフォルダにPC画面のスクリーンショットが保存され、1秒間隔で更新されます。
通常の動作時には「0」に設定しますが、初期設定をする際に必要なので、最初は「1」にしています。
後述する座標を指定し、アイコンの設定も終えてから「0」に設定してください。
"x", "y", "width", "height"
PCで開いているLINEトーク画面をスクショする
x軸の座標
y軸の座標
横幅(width)
高さ(height)
の指定です。
この設定にプログラムの起動は必須なので、先ほどの"ss_debug"の数値を「1」にしたまま、プログラムを起動してください。
プログラム起動後、dataフォルダに保存されているスクショを開きながら設定を調整するのが良いです。スクショは1秒間隔で更新され続けるので、開いたまま設定を変えても反映されます。
最初は座標とか訳が分からないと思うので"width"や"height"を変更せず、"x"と"y"を調整して、まずトーク画面にたどり着くのがおすすめ。

背景に他のウインドウの線やら、背景色以外のものが映り込まないスクショを完成させたらOKです。
"width"や"height"は、単にスクショの大きさを指定するだけなので、最後に自分好みに変えてください。初期値はプログラムの起動負荷などを考えて設定しています。
"pixel_diff_threshold"
これが諸悪の根源、LINEのアップデートで設定しなくてはいけなくなった数値です。
後述する起動画面で、通知したい人のアイコンが入った際に、数字の羅列が表示されます。

この画面で、最も出現頻度の多い数字を設定してください。
例えばこの画面だと「15231」となります。今はまだ設定する必要はありません。
アイコンの設定

先程の設定で保存されたスクショから、追跡したい人のアイコン画像を切り抜いて、data→templateフォルダに「left_top.png」という名前で保存してください。

例の画像を参考に、下と右は余白無しで切り抜くのを推奨。理由は、後述するプログラムの仕組みを読んでいただければ分かると思います。
上と左の余白はどうでもいいです。揃えると通知が綺麗。それだけ。
プログラムを再起動

すべての設定が終わったら「setting.json」の"ss_debug"を「0」に設定して、プログラムを再起動してください。
そしてスクショしたい人物を画面内に入れると、先ほど紹介したこの画面が表示されます。

ここで、"pixel_diff_threshold"の項目でも書いたように、最も出現率の高い数字を「setting.json」の"pixel_diff_threshold"に入力し、プログラムを再起動してください。
プログラムの仕組み

仕組みが気になる方のために、このプログラムがどのような仕組みで動いているのかを簡単に説明します。
基本的には、指定された範囲("x", "y", "width", "height")のスクショを1秒間隔で撮影し続け、設定されたアイコン(left_top.png)が見つかれば、そこから最下部までを切り抜き、各通知を飛ばす仕組みです。
こちらは何度も例で紹介している基本的な画像。

最後に設定されたアイコンが登場しているので、切り抜いて次のような通知が届きます。

では次に、スクショ内に設定したアイコンが複数登場する場合。

このときは、見つけたアイコンの中で、最も最後に登場したものを起点とした切り抜きが通知されるので、先ほどと同じ通知が届きます。
「じゃ前の発言(画像だと「おつぺー」)が通知されないんじゃない?」と思われるかもしれませんが、常に流れ続けるチャットのスクショを1秒間隔で見ているので、前の発言は3時25分の時点で既に通知されています。
また、同じ切り抜きを何度も通知しないように、画像を文字列に変換し、かつ、画像の類似度を判定することで識別し、一度通知した画像の連投を防いでいます。
次に、他の人の発言があった場合。

「見つけたアイコンを起点として、スクショの最下部までを切り抜く」仕様上、スクショ内にアイコンが存在する限り永遠と通知が来ることになるのですが、これは以下の仕組みでブロックしています。
まず、アイコンを起点とした切り抜き。

次に、アイコンの幅で縦部分のみを切り抜き、アイコンを除いたすべてが背景色か判定。

この場合、他の方のアイコンが映っているので、全てが同じ色(背景色)にはなりません。つまり、通知が行われない。という仕組みです。
逆に、他の人のアイコンが無ければ通知が行われるので、設定したアイコンの人の連投、長文、画像、スタンプ、その全てに反応します。
記事公開当初のプログラムでは、他の人の発言があるか判定するために、細かく投稿の縦幅を指定する必要がありましたが、私自身がLINEの仕様を理解することで、かなり簡略化できました。
先述した"x", "y", "width", "height"の設定で、スクショの背景に背景色以外のものが映らないように推奨したのもこのためです。
スクショの下に、1pxでもウィンドウの線とか黒いバーとか、他の色が入っていると、全てが同じ色(背景色)という判定ができないので、通知が飛びません。
最後に

個人的に便利だと思って書いたプログラムなので、労力とリターンが見合わなすぎて記事書きたくなかったのですが、日々の仕事に忙殺され、オプチャのログが追えない人や、大事な発言を保存できなくて困ってる人が多いので、頑張って書きました。
この記事の公開当初は無かったのですが、最近ではPCの通知センターからLINEの通知を引っ張ってきて、名前判定で投稿を取得・通知するプログラムとかも販売されるようになってきています。
「私の画像判定ももう必要ないな~」と思っていたのですが、オプチャ主の名前が変わったり、名前やアイコンを似せた偽物が登場するギャグに、マジでキレてる人や、設定を変えるのに四苦八苦してる方がぼちぼち見られるので、プログラムは個人的にアップデートを重ねていたし、公開しておこうと思い記事を投稿しました。
このプログラムなら、アイコンしか見ていないので追いたい人の名前は関係ありませんし、アイコンが変わっても設定画像を変えるだけで対応できますし、オプチャ主のバッジ込みで判定しているので、画像似せギャグにマジギレすることもなくなると思います。
サポート

無料記事なので、サポートは致しかねます。