Parallax Image

Cutls Code Archives


SNZ 2016

特定のワードが連合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 <サービス名>
しました。