mixiのコミュニティ参加人数をはてなグラフにポストするPerlスクリプトを書いた

狼に「コミュ参加人数でメンバーの人気を調査」みたいなスレがあったのを見て、これ手作業で集計してるのかなぁと思いつつそれPlaなネタではあるんだけど書いてみた。

グラフ名を9文字以上にしてポストするとグラフが作られてグラフ名も8文字に切られてポストされるんだけど、値がポストされないっていう点にはまった。グラフ名が全角8文字までってのはヘルプに書いてあるのでわかってたんだけど、グラフは作られるしグラフ名だけはポストされるからAPI経由で投稿するときはよしなにしてくれると思いこんでて、文字コードが変なんじゃないのかとか色々悩んでた。キーワード巡ってたらd:id:ma2:20061103:p4で見つけた。あと、UTF-8フラグがたった文字列をグラフ名にしてポストしようとすると500が返ってくる。最初は落ちてるのかなと思ったんだけどそれっぽい障害情報もでてないし、次にspam判定でもされたかと思って焦った。

結局、グラフ名はグラフ表示する時とかのURLにもなるので半角の方がいいかと思い直し、コミュニティのIDをグラフ名にして投稿するようにした。8文字で切る処理も一応残してある。

この間も課題のプログラムで文字コードにはまったことがあったんだけどその時も今回もまるごとPerl! Vol.1のDanさんの記事に助けられた。基本部分だけだけどPerlでの日本語の扱いに自信がついてきた気がする。

あと、WWW::Mixiの使い方にちょっと手こずった。PODが日本語でびっくりした。

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

use utf8;
use WWW::Mixi;
use WebService::Hatena::Graph;
use Encode;

binmode STDOUT, ':encoding(utf8)';

my $debug = 0;
my $commu = 'http://mixi.jp/view_community.pl?id=';
my $regex = '<title>\[mixi\] (.*?)</title>.*全てを見る\(([0-9]+)人\)';
my @ids   = @ARGV or die "Community ID(s) required";

my $ua = WWW::Mixi->new(
    'foo@example.com',
    'password for mixi',
);

my $graph = WebService::Hatena::Graph->new(
    username => 'hatena id',
    password => 'password for hatena',
);

$ua->login->is_success or die "Login failed\n";

for my $id (@ids) {
    my $content = decode('eucjp', $ua->get($commu.$id)->content);
    my ($title, $count) = $content =~ /$regex/s;

    next unless $count;

    my $graphname = encode('utf8', substr($title, 0, 8));

    $graph->post(
        graphname => $id,    # or graphname => $graphname
        value     => $count,
    ) unless $debug;

    printf "id: %s %s, %s人\n", $id, $title, $count if $debug;
}

print "Done\n";

まるごとPerl! Vol.1

まるごとPerl! Vol.1