2016/11/15

Recent entries from same category

  1. Zenn で Twitter bot 作成入門を書いた。
  2. プログラマーのための新しい情報共有コミュニティ Zenn で本を書いてみた。
  3. Windows ユーザは cmd.exe で生きるべき 2020年版
  4. Let's Encrypt を簡単操作できる CLI、Lego が MyDNS に対応した。
  5. golang でメモ専用コマンド「memo」作った。

数年前 Twitter の API はベーシック認証、かつ Public な API だったので Twitter Bot なんて楽ちんで作れたのですが、最近は認証は OAuth、Public な API も無くなってしまい Bot を作るのはとても難しくなりました。

やりたい事はそんなに大した事ではないのに、認証のおかげでコードも大きくなりがちで、気付けば本体コードよりも認証用のコードの方が多くなってしまう事もあります。Bot を作りたいのに敷居が高くて手を出せない、なんて思っている方も多いかもしれません。

でももし Twitter Bot がシェルで書けたら、簡単だと思いませんか?実は twty というツールを使うと簡単に Twitter 連携アプリケーションが作れてしまうのです。

GitHub - mattn/twty: command-line twitter client written in golang

README.md twty A command-line twitter client Install Install golang environment. see: http://golang....

https://github.com/mattn/twty

twty は端末で Twitter をする為のコンソールアプリなのですが、実はストリーミングを表示する -S オプション、出力を JSON にする -json オプションがあります。ですので出力を grep したり jq で加工したり出来るのです。

twty のインストールは以下の手順で行います。 go get github.com/mattn/twty

先に twty を1回起動しておいて下さい。もし既にログイン済みで、通常アカウントと異なるユーザで Bot を実行したいならログアウトし直して PIN コードを入力して下さい。

また通常 twty を使うユーザと Bot ユーザを分けたい場合は、twty に -account xxx フラグ(xxx は人気)を付けて起動して下さい。以降のソースコードでも変更が必要です。

まずは以下のソースコードを見て下さい。

#!/bin/sh

twty -json -S | while read -r LINE; do
  TEXT=`echo "$LINE" | jq -r .text`
  ID=`echo "$LINE" | jq -r .id_str`
  SCREENNAME=`echo "$LINE" | jq -r .user.screen_name`
  if echo "LINE" | grep -q '^RT @'; then
    continue
  fi
  if echo "$LINE" | grep -q 'ぬるぽ'; then
    twty -i $ID "@$SCREENNAME ガッ"
  fi
done

このコードは、twty から JSON ストリーミングを出力させ、1行毎に while ループが実行されます。ループ内では TEXT と ID、SCREENNAME を jq を使って取得し、grep で RT を除け、「ぬるぽ」という発言を検知したら twty を使って「ガッ」を返信します。その際 -i オプションでリプライID(in-reply-to)を指定しているのでちゃんと返信として発言します。

たったこれだけのソースですが、「ぬるぽ」の発言に「ガッ」を応答する Bot が出来ました。簡単ですね。

アイデアさえあれば色んな物が作れるはずです。

また発言に対するアクションが既に外部コマンドとして存在し、返信する必要もない場合には jsonargs が使えます。

GitHub - mattn/jsonargs: xargs for JSON stream

README.md jsonargs xargs for JSON stream Usage input data { "name": "foo1", "value": "bar1" } { "nam...

https://github.com/mattn/jsonargs

xargs の json ストリーミング版と思って下さい。例えば Twitter のタイムラインストリーミングを加工して外部コマンドを起動するのであれば以下の様に実行します。

twty -S -json | jsonargs my-command {{.user.screen_name}} {{.text}}

my-command というコマンドの第一引数に発言者の名前が、第二引数に発言内容が渡されます。

引数は golang の text/template のフォーマットで記述します。

template - The Go Programming Language

Package template implements data-driven templates for generating textual output.

https://golang.org/pkg/text/template/

応用例として、Twitter のタイムラインをデスクトップの画面に通知するコードを書いてみます。Mac であれば gntp-send の代わりに growl-notify を使うといいかもしれません。(Windows の場合は Growl for Windows が必要です)

twty -S -json | jsonargs gntp-send {{.user.screen_name}} {{.text}} {{.user.profile_image_url}}
twtyをgrowl通知

今あるツールを組み合わせて簡単に Twitter と連携できる様になりました。認証が難しいから Twitter 連携ツールが作れない、そんな風に思っておられたならぜひ twty を使ってみて下さい。

Posted at by | Edit