目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

API経由でWassrをいじってみた。

最近、Wassrをいじることが多くなってきたので、API経由でいろいろできたら便利かなと思いちょっと作ってみました。
ただ、JSONの仕様を勘違いしており、予想外に時間がかかったため、投稿スクリプトしかできませんでした。
一応、ユーザのヒトコトを取得できるメソッドは定義済みです。後はスクリプトの方で返ってくるJSONオブジェクトをパースしてあげれば、よしなにできると思います。
ヒトコト系を取得したいならuser_timelineメソッドのAPIのURLを変更してあげるだけでできると思います。

update.pl

Wassrに投稿するだけの単純なスクリプトです。
ホントはユーザIDとかパスワードは外部ファイルに置くのがいいのだとは思います。
ちなみに、スクリプトを動かす環境は文字コードをみれば分かるとおり、Windowsを想定しています。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use Encode;
use Readonly;
use Wassr;

# コレは外部ファイルに置きたい…。
Readonly my $USER     => 'ユーザID';
Readonly my $PASSWORD => 'パスワード';

if (not $ARGV[0]) {
    die 'Not defined tweet';
}
my $wassr = Wassr->new({
    user     => $USER,
    password => $PASSWORD,
});

$wassr->update(decode('sjis', $ARGV[0]));

Wassr.pm

実際の処理を行っているモジュールです。
なんかいろいろ気にくわない部分があるのですが、時間がないのでとりあえずのものを上げておきます。投稿とユーザタイムラインの取得しかできません。

package Wassr;
use strict;
use warnings;
use utf8;

use Carp;
use JSON;
use LWP::UserAgent;
use Readonly;
{
    Readonly my $NET_LOCATON       => 'api.wassr.jp:80';
    Readonly my $REALM             => 'API Authentication';
    Readonly my $UPDATE_API        => 'http://api.wassr.jp/statuses/update.json';
    Readonly my $USER_TIMELINE_API => 'http://api.wassr.jp/statuses/user_timeline.json';
    Readonly my $APPLICATION_NAME  => 'wasasuzu';

    # プライベートメソッドのつもり
    my $post = sub {
        my ($ua, $url, $options) = (@_);
        my $response = $options ? 
            $ua->post($url, $options) :
            $ua->post($url);

        if(not $response->is_success) {
            croak 'Bad Request: ', $response->as_string;
        }

        my $status = decode_json($response->decoded_content);
        if ($status->{error}) {
            croak 'Bad Response: ', $status->{error};
        }

        return $status;
    };

    my $get = sub {
        my ($ua, $url) = (@_);
        my $response = $ua->get($url);

        if(not $response->is_success) {
            croak 'Bad Request: ', $response->as_string;
        }

        my $status = decode_json($response->decoded_content);

        return $status;
    };

    sub new {
        my ($class, $options) = (@_);

        my $ua = LWP::UserAgent->new;
        $ua->credentials($NET_LOCATON, $REALM, $options->{user}, $options->{password});

        my $self = { ua  => $ua, };

        return bless $self, $class;
    }

    sub update {
        my ($self, $tweet) = (@_);
        return $post->(
            $self->{ua},
            $UPDATE_API,
            {
                source => $APPLICATION_NAME,
                status => $tweet,
            }
        );
    }

    sub user_timeline {
        my ($self, $user) = (@_);
        return $get->(
            $self->{ua},
            $USER_TIMELINE_API,
            {id => $user},
        );
    }
}

1;