« 2007年5月 | メイン | 2007年8月 »

2007年6月 アーカイブ

2007年6月 6日

EFTのextract_after_hook後の日本語

PlaggerのFilterのEntryFullTextのYAMLのextract_after_hookの後の処理で、 日本語使った正規表現が通らねーなーと思って検索してみたらutf8でdecodeすればいいんだね。 miyagawaさんがだいぶ前に書いてた

extract_after_hook: |
  my $regex = decode("utf-8","「.*?」");
  $data->{title} =~ s/$regex//;

2007年6月16日

Perlでfc2ブログに投稿する

ちょっと実験がしたくてなんかたくさんの人が使っているらしいfc2ブログを使ってみてます。 MovableTypeで使われているXML-RPCが実装されてらしくて、Perlからは以下のコードでポストできました。 最初Net::MovableTypeを使ってみたけど、文字化けた。

#!/usr/bin/perl
use strict;
use warnings;
use RPC::XML::Client;

my $client = RPC::XML::Client->new('http://blog.fc2.com/xmlrpc.php');
my $blogid = 'blogid';
my $userid = 'mail@address';
my $password = 'password';

my $req = RPC::XML::request->new(
  'metaWeblog.newPost',
  RPC::XML::string->new($blogid),
  RPC::XML::string->new($userid),
  RPC::XML::string->new($password),
  RPC::XML::struct->new(
    'title' => RPC::XML::string->new("タイトル"),
    'description' => 
    RPC::XML::string->new("本文です。"),
    'mt_convert_breaks' => RPC::XML::string->new("0"),
    ),
  RPC::XML::boolean->new('true'),
  );
my $res = $client->send_request($req);
my $new_id;
if( $res->is_fault ){
  print $res->value->{faultString} . "¥n";
}else{
  $new_id = $res->value;
}

$req = RPC::XML::request->new(
  'mt.setPostCategories',
  RPC::XML::string->new($new_id),
  RPC::XML::string->new($userid),
  RPC::XML::string->new($password),
  RPC::XML::array->new(
    RPC::XML::struct->new(
      'categoryId' => RPC::XML::string->new('1'),
      )
    ),
  );
$res = $client->send_request($req);
if( $res->is_fault ){
  print $res->value->{faultString} . "¥n";
}

Plagger::Plugin::Publish::FC2 / ver0.01

調子に乗ってPlaggerのPlugin作った。 Plagger側のエントリーひとつごとにFC2エントリーをひとつ投稿するタイプ。 テストしてたらFC2の1日最大投稿数が30までらしく激しく怒られますた。 よく考えたらdescriptionにbodyしか入れてないのでlinkにとばねえじゃん。 というわけで、使うときはtemplatizeさせるように。

 
package Plagger::Plugin::Publish::FC2;
use strict;
use base qw( Plagger::Plugin );

our $VERSION = 0.01;

use RPC::XML::Client;
use Encode;

sub register {
  my($self, $context) = @_;
  $context->register_hook(
    $self,
    'plugin.init'   => \&initialize,
    'publish.entry' => \&post_entry,
    );
}

sub rule_hook { 'publish.entry' }

sub initialize {
  my ($self, $context, $args) = @_;
  $self->{client} = RPC::XML::Client->new('http://blog.fc2.com/xmlrpc.php');
}

sub post_entry {
  my($self, $context, $args) = @_;
  
  my $req = RPC::XML::request->new(
    'metaWeblog.newPost',
    RPC::XML::string->new($self->conf->{blog_id}),
    RPC::XML::string->new($self->conf->{user_id}),
    RPC::XML::string->new($self->conf->{password}),
    RPC::XML::struct->new(
      'title' => RPC::XML::string->new( encode('utf-8', $args->{entry}->title) ),
      'description' => 
      RPC::XML::string->new( encode('utf-8', $args->{entry}->body) ),
      'mt_convert_breaks' => RPC::XML::string->new("0"),
      ),
    RPC::XML::boolean->new('true'),
    );
  
  my $res = $self->{client}->send_request($req);
  
  if( $res->is_fault ){
    $context->log(info => "Error: " . $res->value->{faultString} );
  }else{
    $context->log(info => "Post entry success. FC2 blog entry id is " . $res->value );
  }
  
}

1;

__END__

=head1 NAME

Plagger::Plugin::Publish::FC2 - Post to FC2 blog automatically

=head1 SYNOPSIS

  - module: Publish::FC2
    config:
      blog_id: your-blog_id
      user_id: your-user_id
      password: your-password

=head1 AUTHOR

Yusuke Wada

=head1 SEE ALSO

L<Plagger>, L<RPC::XML::Client>, L<http://blog.fc2.com/>

=cut

2007年6月29日

Plagger::Plugin::Publish::FC2 / ver0.02

先日のVer0.01に手を加えた。主にテンプレート処理を加えたのが改善点。 よって、assets/plugins/Publish-FC2/fc2.ttが必要。 あとXML-RPCのendpointをオプションで変更できるので他のブログサービスにも投稿できると思う。 仕組みが一緒らしいdtiブログってのではうまくいった。 EroPlaでアグリゲートしているようなサイトをルー語Filterかまして、 これで外部ブログにポストとか悪ふざけしてます。乱発厳禁。

package Plagger::Plugin::Publish::FC2;
use strict;
use base qw( Plagger::Plugin );

our $VERSION = 0.02;

use RPC::XML::Client;
use Encode;

$RPC::XML::ENCODING='utf-8';

sub register {
  my($self, $context) = @_;
  $context->register_hook(
    $self,
    'plugin.init'   => \&initialize,
    'publish.entry' => \&post_entry,
    );
}

sub rule_hook { 'publish.entry' }

sub initialize {
  my ($self, $context, $args) = @_;
  my $endpoint_url = $self->conf->{endpoint_url} || 'http://blog.fc2.com/xmlrpc.php';
  $self->{client} = RPC::XML::Client->new($endpoint_url);
  $self->{template} = $self->conf->{template} || 'fc2.tt';
}

sub post_entry {
  my($self, $context, $args) = @_;
  
  my $body  = $self->templatize($self->{template}, $args);
  
  my $req = RPC::XML::request->new(
    'metaWeblog.newPost',
    RPC::XML::string->new($self->conf->{blog_id}),
    RPC::XML::string->new($self->conf->{user_id}),
    RPC::XML::string->new($self->conf->{password}),
    RPC::XML::struct->new(
      'title' => RPC::XML::string->new( encode('utf-8', $args->{entry}->title) ),
      'description' => 
      RPC::XML::string->new( encode('utf-8', $body) ),
      'mt_convert_breaks' => RPC::XML::string->new("0"),
      ),
    RPC::XML::boolean->new('true'),
    );
  
  my $res = $self->{client}->send_request($req);
  
  if( $res->is_fault ){
    $context->log(info => "Error: " . $res->value->{faultString} );
  }else{
    $context->log(info => "Post entry success. FC2 blog entry id is " . $res->value );
  }
  
}

1;

__END__

=head1 NAME

Plagger::Plugin::Publish::FC2 - Post to FC2 blog automatically

=head1 SYNOPSIS

  - module: Publish::FC2
    config:
      blog_id: your-blog_id
      user_id: your-user_id
      password: your-password
      endpoint_url: endpoint_url #optional

=head1 AUTHOR

Yusuke Wada

=head1 SEE ALSO

L<Plagger>, L<RPC::XML::Client>, L<http://blog.fc2.com/>

=cut

assets/plugins/Publish-FC2/fc2.tt

<p>
  [% entry.body %]
</p>
<p>
  via <a href="[% entry.permalink %]">[% entry.title %]</a>
  form <a herf="[% feed.link %]">[% feed.title %]</a>
</p>

LastFMの最近聞いた曲にAmazonの情報を付加して書き出す

Blogに貼るLastFMの「最近聞いた曲」ウィジェットみたいなのあるけど、 あれじゃなんか気に食わないので、 CDジャケット写真とAmazonへのアサマシリンク付きのオリジナル「最近聞いた曲」ウィジェットを作る。 WebService-LastFMはあえて使わず、素直にAudioScrobblerのXMLを持ってきてパース、Amazon検索、TTに渡して、JavaScriptのdocument.write('ほげほげ')形式のファイルに書き出すPerlスクリプト。あとはcronでまわして、出てきたファイルをHTML内でincludeしてやればよし。

#!/usr/bin/perl

use strict;
use URI::Fetch;
use XML::Simple;
use Net::Amazon;
use Net::Amazon::Request::Keyword;
use Cache::File;
use DateTime;
use Template;
use Encode;

our $UserName = "yusukebe";
our $CacheDir = '/tmp/yusuke/lastfm_widget';
our $FileName = "/home/yusuke/public_html/yusukebe/m/now_playing.js";
our $DeveloperToken = "YOURTOKEN";
our $AssociateID    = "kamawada-22";

my $track = fetch_track();
my $keyword = $track->{album}->{content} || $track->{name};
$keyword = $keyword . " " . $track->{artist}->{content};
my $item = search_aws( $keyword ) or die "cannot find Amazon item.";
my $dt =  get_time($track->{date}->{uts});

my $template = Template->new or die $Template::ERROR;
my $html;
$template->process(
  \*DATA, { track => $track, item => $item, dt => $dt }, \$html )
     or die $template->error;

$html =~ s/\n//g;
warn encode("utf-8", $html) . "\n";

open  HTML,"+>$FileName";
print HTML encode("utf-8", $html);
close HTML;

sub fetch_track {
  my $url = "http://ws.audioscrobbler.com/1.0/user/$UserName/recenttracks.xml";
  my $cache = Cache::File->new( cache_root => $CacheDir );
  my $res = URI::Fetch->fetch( $url,
                               Cache => $cache
                               )
    or die URI::Fetch->errstr;
  
  my $xml = XMLin($res->content, ForceArray => ['track'], KeyAttr=> []);
  return ${$xml->{track}}[0];
}

sub search_aws {
  my ($keyword) = @_;
  warn "Searching $keyword on Amazon...\n";
  
  my $attr;
  $attr->{token}  = $DeveloperToken;
  $attr->{locale} = "jp";
  $attr->{affiliate_id} = $AssociateID;
  $attr->{cache} = Cache::File->new( 
    cache_root        => $CacheDir,
    default_expires   => '7 days',
    );
  
  my $ua = Net::Amazon->new(%$attr);
  my $req = Net::Amazon::Request::Keyword->new(
    keyword => $keyword,
    mode    => "music-jp",
    );
  
  my $response = $ua->request($req);
  my $item = ($response->properties())[0];
  return $item;
}

sub get_time {
  my $epoch = shift;
  my $dt = DateTime->from_epoch( epoch => $epoch );
  $dt->set_time_zone( 'Asia/Tokyo' );
  return $dt;
}

__DATA__
document.write('
[% USE JavaScript -%]
[% dt.month %]/[% dt.day %] [% dt.hms %]<br />
<a href="[% item.url %]">
<img src="[% item.ImageUrlSmall %]" alt="[% item.ProductName | js %]" />
</a><br />
<a href="[% item.url %]">[% track.artist.content | js %] - [% track.name | js %] [% IF track.album.content %]([% track.album.content %])[% END %]
</a><br />
')

About 2007年6月

2007年6月にブログ「Yusukebe::Tech」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2007年5月です。

次のアーカイブは2007年8月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。


ブログSEO対策:track word seo