最近複数のDiscordコミュニティに入り浸ってます。
公式のBOT機能を使って面白かったり、便利にしてくれていることも多いです。
ただ、非公式イベントとか特定の人のアナウンスを通知してほしかったりするときには個人的なBOTがほしくなります。
チャネル公式のBOTはトークンを貰って通信する必要がありますが、個人的な用途でもらえるものではありません。
そこでブラウザアクセスできることを利用して2通りの方法で監視してみます。
ヘッドレスブラウザを使う
ブラウザ機能のあるクローラーを使って情報を取得します。
個人的に phantomjs + casperjs が導入も楽で使いやすいと思います。
サンプルとしてはこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
var casper = require('casper').create(); var $ = require('node_modules/jquery'); var TARGET ="https://discordapp.com/channels/xxxx/yyyy"; var EMAIL = 'main@addr.ress'; var PASSW = 'password'; var capop={ top: 0, left: 0, width: 1080, height: 1080 }; casper.userAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'); casper.start(TARGET, function(){ this.wait(10000); }); /* ログイン */ casper.viewport(1920, 1080).then(function(){ if(this.getCurrentUrl()!== TARGET){ this.sendKeys('input[type="email"]', EMAIL, {reset: true}); this.sendKeys('input[type="password"]', PASSW, {reset: true}); this.click('button[type="submit"]'); this.wait(10000); } }); var looptime = 1000; casper.then(function(){ this.capture('ss.png', capop); this.echo("start"); var ct = this; function loop(){ var t = ct.getHTML(".messages.scroller",true); var name = $(t).find(".username-wrapper .user-name:last"); ct.echo(name.text()); ct.wait(looptime,loop); } loop(); }); casper.run(); |
まずログインしてなければログインします。
あんまり早く遷移するとロボット確認になるので余裕をもってアクセスする。
この例では最終書き込み者の名前を出し続けます。
ブラウザのコンソールで javascript 実行する
さっきより手軽な分少し危ない面もあります。
ブラウザコンソールはF12で開けますが、こんな感じの注意が出ます。
基本的に理解できないものは貼り付けるべきではないです。
今回は observer を使って追加されたものだけ取るようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
function disco(node){ var user = node.querySelector(".username-wrapper .user-name"); var mark = node.querySelector(".markup"); if(user!=null&&mark!=null){ var text = mark.innerHTML; if(user.innerHTML=="へのへのもへじ"){ console.log(mark.innerHTML); } if(text.indexOf("ほげふが")!=-1){ node.querySelector(".btn-reaction").click(); document.querySelector(".row-3j9Kuo .emojiItem-109bjA:nth-child(4)").click(); } } } // main observe var observer = new MutationObserver(function (rs, obs) { rs.forEach(record => { Array.from(record.addedNodes).forEach(node => { disco(node); }); }); }); observer.observe($('.messages.scroller'), { childList: true }); |
「へのへのもへじ」さんの書き込みをログに残して、「ほげふが」という言葉の入った書き込みに4つ目のスタンプを押すという謎のサンプルです。
ブラウザのインスペクタでパスを探せば、オブザーバーを入れ子にしてスタンプが増えたら押すとかキーワードに反応してメンションを飛ばしたりもできます。
ヘッドレスブラウザと比べて簡単で、大抵のことはできますがスクリーンショットは撮れません(非常に面倒です)。
所感
チャンネル内で一瞬だけなにか書き込んで修正するみたいなのが流行っていたので個人的にログをとってみたのが最初でした。
使い慣れてくると色々できるようになったので、今までより楽しめてます。
しかし処理を間違って連続アクセスとかしてしまうとアク禁などになる可能性もあるので、やる際は本アカウントは避けて自己責任でやりましょう。
WEB版ではよくDOM変更が行われるためエレメントが見つかりませんといったエラーが起きることがあります。
例としては以下のようにクラス変更が起きていました。
https://blog.narumium.net/2018/08/02/discord%EF%BC%88web%E7%89%88%EF%BC%89%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E5%A4%89%E6%9B%B4/
必要に応じてF12ボタンから欲しい情報のクラスなどを取得してください。