TwitterのDMでSSHもどき

f:id:panchiga:20151223054456p:plain

www.adventar.org

この記事は、Aizu Advent Calendarの10日目として書かれました。

昨日 @MiZuKi_Sonoko:

研究補助業務出役確認表の一部を自動生成した話 - ( mizuki | memo )

明日 @TobiasGSmollett:

Scala - 日常系のゆるふわな何か - Qiita

はじめに

マシンの遠隔操作はしたいけどセキュリティとか無知すぎるので、こういうことは専門でやっている人に任せたいと思った。
そこで、TwitterのDM機能から文字数制限がなくなったって話を思い出した。
どんなに長い実行結果もDM打って返してもらえばいいじゃないか。
ということでDMでコマンド打って結果を返してくれるものを作ってみた。

Secure SHellってなんですか??分かりません。

やりたいこと

自分のTwitterアカウントから、目的の端末上で動いているTwitterbotにコマンドを送って、実行結果をDMで返してほしい。
そこで、以下の事を実装するときに考える必要があると思った。

  1. 送ったコマンドがちゃんとコマンドになっているか。

    ls |

みたいなコマンドも実行されちゃわないか。

  1. 存在しないコマンド受け取った時どうするか

    aeua

    みたいなコマンド打っちゃった時はどうするか

  2. rubyの誰かが作ったメソッドでcd出来るか。
  3. DMの受信は出来るのか、DMの送信はできるのか。

やったこと

  1. 送ったコマンドがちゃんとコマンドになっているか。

    syntax error だったら怒ってくれる
    逆引きRuby - 例外

  2. 存在しないコマンド受け取った時どうするか

    Rubyで外部コマンドを実行して結果を受け取る方法あれこれ - Qiita

    capture3を使った。

    o, e, s = Open3.capture3(command)

  3. rubyの誰かが作ったメソッドでcd出来るか。

    できなかったのでpwdして取ってきたパスを使ってどうのこうのした。

  4. DMの受信は出来るのか、DMの送信はできるのか。

    rubyからtwitter APIを利用してbotを作る

コード

catとかできてなかったのでちょっと変えたんだけど長期規制中なせいか確認できてないんだ…

gist9be6ccaa5d75a4b70ff6

cd頑張った。

結果

f:id:panchiga:20151223054558p:plain

一応出来てる。

まとめと感想

やってみてはじめて知ったのだが、DMにも規制があるらしい。
ちょっとゆっくりめにってことで3秒毎にリクエストを投げてたにもかかわらずすぐに引っかかってびっくりした。
なのでbegin, rescue使って一応プログラムが止まらないようにしてる。

つまりこれ何も役に立たない! 無駄なものを作ってしまった…