[僕] はてブと del.icio.us と LivedoorClip に同時ブクマ

僕ト云フ事

たろマークはてなブックマーク

2006年08月20日

[del.icio.us][livedoor][sbm][はてな] はてブと del.icio.us と LivedoorClip に同時ブクマ

以前から miyagawa さんsbm-xpost を使ってはてブdel.icio.us にクロスポストしていたんですが、Livedoor Clip にも対応してみよう、ということでやってみました。

Livedoor Clip への投稿には、はてブのブクマを livedoor クリップにクリップしてみる件 - にぽたん研究所 の WWW::SyncSBS::H2L を使わせていただきました。(三つ同時ポスト前に同期取るのにも使わせてもらいました。)

そんなわけで、今後は Livedoor Clip にもお世話になります。

sbm-xpost.cgi (改造版)


#!/usr/local/bin/perl
use strict;
use CGI;
use DateTime;
use Encode;
use HTTP::Request::Common;
use LWP::UserAgent;
use Template;
use XML::Atom::Entry;
use XML::Atom::Client;
use YAML;
 
use lib qw( ./lib );
use WWW::SyncSBS::H2L;
 
(my $config = $ENV{SCRIPT_FILENAME}) =~ s/\.cgi$/.yaml/;
our $conf = YAML::LoadFile($config);
 
my $q = CGI->new;
if ($q->request_method eq 'POST') {
    do_post($q);
} else {
    do_form($q);
}
 
sub do_form {
    my $q = shift;
    print $q->header('text/html; charset=utf-8');
    binmode STDOUT, ":utf8";
    my $tt = Template->new;
    $tt->process(\<<TEMPLATE, { q => $q });
<html>
<head>
<title>del.icio.us and Hatena cross-poster</title>
<style>body { font-family: trebuchet MS, Arial; font-size: 13px }</style>
<body onload="document.forms[0].tags.focus()">
<h1>del.icio.us and Hatena cross-poster</h1>
<form action="[% q.url('-query'=>0) %]" method="post">
<table>
<tr><td style="text-align:right">URL:</td><td><input size="64" type="text" name="url" value="[% q.param('url')|html %]" /></td></tr>
<tr><td style="text-align:right">Title:</td><td><input size="64" type="text" name="title" value="[% q.param('title') | html %]" /></td></tr>
<tr><td style="text-align:right">Comment:</td><td><input size="64" type="text" name="comment" /></td></tr>
<tr><td style="text-align:right">Tags:</td><td><input size="64" type="text" name="tags" /></td></tr>
</table>
<input type="submit" value=" Save " />
</form>
<div><a href="javascript:location.href='[% q.url %]?url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)">bookmarklet</a></div>
</body>
TEMPLATE
    ;
}
 
sub do_post {
    my $q = shift;
    post_delicious($q);
    post_hatena($q);
    post_livedoorclip($q);
    my $url = URI->new("http://www.google.com/url");
    $url->query_form(sa => 'D', q => $q->param('url'));
    print $q->redirect($url);
}
 
sub post_delicious {
    my $q = shift;
    my $url = URI->new("https://api.del.icio.us/v1/posts/add");
    $url->query_form(
        url => $q->param('url'),
        description => $q->param('title'),
        extended => $q->param('comment'),
        tags => $q->param('tags'),
        dt   => DateTime->now,
    );
    my $ua = LWP::UserAgent->new;
    $ua->credentials("api.del.icio.us:443", "del.icio.us API", $conf->{delicious}->{username}, $conf->{delicious}->{password});
    my $res = $ua->get($url);
    warn $res->status_line unless $res->is_success;
}
 
sub post_hatena {
    my $q = shift;
    my $summary = join '', map "[$_]", split /\s+/, $q->param('tags');
    $summary .= " " . $q->param('comment') if $q->param('comment');
    Encode::_utf8_off($summary);
 
    my $entry = XML::Atom::Entry->new;
    my $link  = XML::Atom::Link->new;
    $link->rel('related');
    $link->type('text/html');
    $link->href($q->param('url'));
    $entry->add_link($link);
    $entry->summary($summary);
 
    my $client = XML::Atom::Client->new;
    $client->username($conf->{hatena}->{username});
    $client->password($conf->{hatena}->{password});
    $client->createEntry("http://b.hatena.ne.jp/atom/post", $entry)
        or warn $client->errstr;
}
 
sub post_livedoorclip {
    my $q = shift;
    my $h2l = WWW::SyncSBS::H2L->new;
    $h2l->livedoor_id( $conf->{livedoor}->{username} );
    $h2l->password( $conf->{livedoor}->{password} );
    $h2l->login_livedoor_clip
        or warn 'failes to login to livedoor clip';
    my @tags = split(' ', $q->param('tags') );
 
    my $postdata = [{
        url  => $q->param('url'),
        title => $q->param('title'),
        tags  => \@tags,
        summary => $q->param('comment')
    }];
    $h2l->clip_to_livedoor( $postdata );
 
}

sbm-xpost.yaml


delicious:
  username: yourname
  password: password
hatena:
  username: yourname
  password: password
livedoor:
  username: yourname
  password: password

Original(Revision 1918) との差分


12a13,15
> use lib qw( ./lib );
> use WWW::SyncSBS::H2L;
>
53a57
>     post_livedoorclip($q);
94a99,117
>
> sub post_livedoorclip {
>     my $q = shift;
>     my $h2l = WWW::SyncSBS::H2L->new;
>     $h2l->livedoor_id( $conf->{livedoor}->{username} );
>     $h2l->password( $conf->{livedoor}->{password} );
>     $h2l->login_livedoor_clip
>         or warn 'failes to login to livedoor clip';
>     my @tags = split(' ', $q->param('tags') );
>
>     my $postdata = [{
>         url  => $q->param('url'),
>         title => $q->param('title'),
>         tags  => \@tags,
>         summary => $q->param('comment')
>     }];
>     $h2l->clip_to_livedoor( $postdata );
>
> }

トラックバック

このエントリーのトラックバックURL:
http://vkgtaro.jp/cgi-bin/mt/mt-tb.cgi/572

コメントを投稿