phoenix-powerLingrのAPIを使ってみた

LingrのAPIの情報、結構古いのがあって、使えなくなっているのと、分かりにくかったので紹介。

まず、LingrのAPIを使うには、Lingrのアカウントを持っている必要があります。それを前提に書きます。

Lingr APIを使うには、基本的にsession idが必要で、これは、以下のコマンドで取得できます。

1
2
$ curl -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/session/create\?user=foo\&password\=bar
{"status":"ok","session":"session_id","public_id":"public_id","nickname":"foo","user":{"username":"foo","name":"foo"}}

ただし、パスワードは平文で送られるので注意。これは仕様なのでどうしようもないです。例えば、Lingrアプリを使う場合、作成者にこちらのユーザーIDとパスワードが丸わかりになると思われます。

また、Webのログイン画面からAPI Keyを取得しておくと、制限が緩くなるようです。引数には、app_keyを指定。

1
$ curl -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/session/create\?user\=foo\&password\=bar\&app_key\=baz

次に、ここで得たsession_idを使ってユーザー情報とRoomのポストを取得してみます。

1
2
3
4
5
6
7
8
# session_idが有効か確認する
$ curl -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/session/verify\?session\=session_id

# ユーザーが登録しているRoom情報を取得する
$ curl -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/user/get_rooms\?session\=session_id

# Roomのポストを取得する
$ curl -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/room/show\?session\=session_id\&room\=room_id

こちらの情報がとても参考になりました。

https://gist.github.com/kumar8600/df2688b7bbc4f8fd28ba

スクリプトとして書く場合は、簡単に書くにはjqが必要になりますが、以下の様な感じ。

lingr_test.sh
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
user=
pass=
room_id=

if [ "`curl -sL -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/session/verify\?session\=${LINGR_SESSION_ID} | jq -r '.status'`" = "error" ];then
    LINGR_SESSION_ID=`curl -sL -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/session/create\?user=${user}\&password=${pass}|jq -r '.session'`
    curl -sL -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/room/show\?session=${LINGR_SESSION_ID}\&room=${room_id} | jq .
else
    curl -sL -X GET -H "application/javascript; charset=utf-8" http://lingr.com/api/room/show\?session=${LINGR_SESSION_ID}\&room=${room_id} | jq .
fi

ユーザーと発言内容を取得する場合は、以下の様にします。

1
2
3
$ ./lingr_test.sh > test.json

$ cat test.json| jq '.rooms|.[].messages|.[]|.nickname,.text'

xml形式は使えるのだろうか。試してない。-H "type=xml"で確認。

多くのWebサイトがxmlで配信されてるので、そういうのを通知する時、xmlが便利。

ここでは、xmllintを使う方法を紹介します。

たとえば、Webサイトを監視し、更新があれば通知する仕組みを作ってみます。

xml_test.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/zsh

if [ "$1" != "" ];then
    d=~/bin
    x=`echo $1|sed 's#/#.#g'`
    xtemp=${d}/${x}.tmp
    xtext=${d}/${x}.xml
    mkdir -p $d
    touch $xtemp
    touch $xtext
    mv $xtext $xtemp
    curl -sL ${1} > $xtext
    title=`echo "cat /rss/channel/item/title" | xmllint --shell $xtext | grep '<title>' | sed -e 's#<title>##g' -e 's#</title>##g'`
    echo "$title" >! $xtext
else
    echo arg!!
fi

まず、URLを引数1にして渡すと、タイトルを取得してくれるスクリプトを作成し、もうひとつのスクリプトで通知するやつを作成することにします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/zsh

d=~/bin
icon=~/dotfiles/Pictures/phoenix/phoenix_power.png
url=foo/rss.php
file=`echo $url | sed 's#/#.#g'`
back=${file}.tmp
file=${file}.xml

cd $d
./xml_test.sh $url
if [ "`diff $file $back`" != "" ];then
    growlnotify -m "`diff $file $back | sed 1d| cut -b 2-`" --image $icon -t $url
fi

Linuxでは、notifi-send, cronを使ったりします。簡単です。

Macの場合は面倒ですが、以下のスケジュール機能のlaunchctlを使います。

まず、設定ファイルを作成します。

~/Library/LaunchAgents/foo.plist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>foo</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/zsh</string>
            <string>/Users/syui/bin/foo.sh</string>
        </array>
        <key>StartInterval</key>
        <integer>60</integer>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

StartIntervalは秒を指定。RunAtLoadは自動起動の設定。

次に、スケジュールをロードします。オプションは、start, stop, unloadなど。

1
$ launchctl load ~/Library/LaunchAgents/foo.plist

アイコンとかを使用する場合は、Lingr APIの場合、icon_urlにて取得できます。ローカルにダウンロードしてもよいし、URLから変換してもよいです。ダウンロードする場合は、nicknameで保存すると良いと思われます。