たろマーク (はてなブックマーク)
-
[ moinmoin ]
-
[ upstart ] プロセス監視して死んでも蘇らせてくれるのか。
■ はてブと 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 );
>
> }






