特定のワードが連合TLにあったらLINEに通知するbot
カテゴリ:Mastodon, TheDesk 投稿日:2018年9月24日TheDeskエゴサ魔神として名高いCutls P(?)のエゴサを楽にするツール
Node.jsで書きます。
依存はwebsocket
,axios
,querystring
です。
npm install websocket
などをして入れておきましょう。
まず、LINEのbotを製作します。Qiitaの記事を参考にしたのですが、メンテ中なのでリンクを辿れません…
LINE Notifyの下の方、「サービスを登録する」からログインします。入力せずに、右上の自分の名前のところをクリックして「My page」の、
「Generate token」を押して、サービス名と1:1 on chat…を選択して、トークンを作ってコピーします。
以下をline.jsとして作成します。qiitaの記事コピペです。
const axios = require('axios'); const querystring = require('querystring'); const Line = function () {}; /** * * LINE Notifyのトークンセット * * @param {String} token LINE Notifyトークン * */ Line.prototype.setToken = function(token) { this.token = token; }; /** * * LINE Notify実行 * * @param {String} text メッセージ * */ Line.prototype.notify = function(text) { if(this.token == undefined || this.token == null){ console.error('undefined token.'); return; } console.log(`notify message : ${text}`); axios( { method: 'post', url: 'https://notify-api.line.me/api/notify', headers: { Authorization: `Bearer ${this.token}`, 'Content-Type': 'application/x-www-form-urlencoded', }, data: querystring.stringify({ message: text, }), } ) .then( function(res) { console.log(res.data); }) .catch( function(err) { console.error(err); }); }; module.exports = Line;
そして、Websocketにつないで連合TLを取得します。今回はJPのタイムラインを使います。
<正規表現>
,<LINEトークン>
,<アクセストークン>
は適宜埋めてください。アクセストークンくらいは説明省いていいよね…
var WebSocketClient = require('websocket').client; const Line = require('./line'); var client = new WebSocketClient(); client.on('connectFailed', function(error) { console.log('Connect Error: ' + error.toString()); }); client.on('connect', function(connection) { console.log('WebSocket Client Connected'); connection.on('error', function(error) { console.log("Connection Error: " + error.toString()); }); connection.on('close', function() { console.log('echo-protocol Connection Closed'); }); connection.on('message', function(mess) { var mess=JSON.parse(mess.utf8Data); var typeA = mess["event"]; if (typeA == "update") { var obj = JSON.parse(mess.payload); var text=obj.content.replace('','').replace('
',''); var regex = new RegExp(<正規表現>); if (regex.test(text)) { const myLine = new Line(); myLine.setToken("<LINEトークン>"); myLine.notify(obj.account.acct+" "+text+" "+obj.url); } } }); function reconnect() { if (!connection.connected) { connect(); setTimeout(reconnect, 10000); } } reconnect(); }); function connect(){ client.connect('wss://mstdn.jp/api/v1/streaming/?stream=public&access_token=<アクセストークン>', 'echo-protocol'); } connect();
一応Websocketが死んだら、10秒後につなぎ直すはずですが、試していません。
実際の正規表現は、
/the\s?desk/i
と書きました。theとdeskのスペースの有無や大文字小文字の関係なくマッチします。
こんな感じで来ます。(ここに書いているコードでは、<p>/</p>はなくなります。
運用するときは、serviceにしてから動かします。Cent OSなので、
vi /etc/systemd/system/<サービス名>.service
して.serviceファイルを作って、
[Unit] Description=Ego-search system for Cutls P After=syslog.target network.target [Service] Type=simple ExecStart=/usr/bin/node <.jsファイルの場所>.js WorkingDirectory=/ KillMode=process Restart=always User=root Group=root [Install] WantedBy=multi-user.target
と書いて、おなじみアレで起動します。
systemctl start <サービス名>
しました。