« 2007年06月 | メイン | 2007年08月 »

2007年07月30日

WWW::Mixi::Scraperのpatch

WWW::Mixi::Scraperのパッチです。
これで1時間ぐらい悩んでしまったorz

--- Mech.pm.orig        2007-07-30 22:26:28.000000000 +0900
+++ Mech.pm     2007-07-30 22:26:49.000000000 +0900
@@ -76,7 +76,7 @@
   $self->{mech}->get($uri);
 
   # adapted from Plagger::Plugin::CustomFeed::Mixi
-  if ( $self->content =~ /action="login\.pl"/ ) {
+  if ( $self->content =~ /action="\/?login\.pl"/ ) {
     # shouldn't be path but path_query, obviously
     $self->{login}->{next_url} = $uri->path_query;
     $self->login;


拡張しやすいのがいいですねWM::Scraper。charsbarさん++
この変更はこの間、(以下略


■追記
日付の処理がうまくいってないところがあった

--- Utils.pm.orig       2007-07-03 04:41:10.000000000 +0900
+++ Utils.pm    2007-07-31 14:36:45.000000000 +0900
@@ -23,7 +23,16 @@
   }
 
   $string =~ s/^\s+//s;
-  my ($date, $time, $dummy) = split /\s+/s, $string, 3;
+  my @string = split /\s+/s, $string;
+  my ($date, $time);
+  if ( $string[2] && $string[2] =~ /\d+:\d+/ ) {
+     $date = join "", @string[0,1];
+     $time = $string[2];
+  }
+  else {
+     $date = $string[0];
+     $time = $string[1];
+  }
 
   $date =~ s/\D/\-/g;
   $date =~ s/\-+$//;


2007年07月27日

ImageMagickでAnimated GIFのサムネイルをきれいにつくる方法

ImageMagickでアニメーションGIFのサムネイルをきれいに作るには、
PerlMagickなどのAPIを使うのではなく、コマンドラインを使うのが楽です

# /usr/bin/convert animated.gif
   -coalesce
   -resize 30x30
   -deconstruct
   resized.gif


coalesceオプションとdeconstructがポイント。
それぞれ、

  • coalesce: 画像シーケンスをマージ
  • deconstruct: 画像シーケンスを構成要素


という意味になります

あと問題は、出来上がった画像サイズがどうしても大きくなってしまうことです

2007年07月16日

Perlで「もごもご」にアクセスする

もごもごAPIは、Twitter互換なので、Perlからアクセスする場合は、Net::Twitterが使えます。
APIの互換性重要

my $mogo2 = Net::Twitter->new(
    username => 'xxx@example.com',
    password => 'myapipass',
    apirealm => 'mogo2 api basic auth',
    apihost  => 'api.mogo2.jp:80',
    apiurl   => 'http://api.mogo2.jp/statuses'
);

my $result = $mogo2->update($status);


もごもごのAPIでは、さらに、timelineにオプションが渡せたり、スレッドの取得の拡張APIがあるので、Net::Twitterをbaseにして書いてみた。

ソースは追記。

package Net::Mogo2;

use warnings;
use strict;
use base qw/Net::Twitter/;
our $VERSION = '0.01';
use URI;

sub new {
    my $class = shift;
    my %conf = @_;

    $conf{apiurl} = 'http://api.mogo2.jp/statuses' unless defined $conf{apiurl};
    $conf{apihost} = 'api.mogo2.jp:80' unless defined $conf{apihost};
    $conf{apirealm} = 'mogo2 api basic auth' unless defined $conf{apirealm};

    $class->SUPER::new(%conf);
}

sub _request {
    my $self = shift;
    my $path = shift;
    my $uri = URI->new( $self->{apiurl} . $path );
    $uri->query_form(@_);
    my $req = $self->{ua}->post($uri);
    return ($req->is_success) ? JSON::Any->jsonToObj($req->content) : undef;
}

sub public_timeline {
    my $self = shift;
    $self->_request("/public_timeline.json", @_);
}


sub thread_timeline {
    my $self = shift;
    my $id   = shift;
    $self->_request("/thread_timeline/$id.json", @_);
}


sub friends_timeline {
    my $self = shift;
    my $id;
    if ( @_ % 2 ) {
        $id = shift;
    }
    my $uri = $id ? "/friends_timeline/$id.json" : "/friends_timeline.json";
    $self->_request($uri, @_);
}

sub user_timeline {
    my $self = shift;
    my $id;
    if ( @_ % 2 ) {
        $id = shift;
    }
    my $uri = $id ? "/user_timeline/$id.json" : "/user_timeline.json";
    $self->_request($uri, @_);
}

1;