#!/usr/local/bin/perl
use strict;
use HTML::LinkExtor;
use Jcode;
use Net::TrackBack;
# 各種設定 ----------------------------------------------------------- #
# blogのタイトル
my $blog_name = "blogの名前";
# エントリのディレクトリ
my $entry_dir = '/path/to/entries';
# デバッグ
my $debug = 1;
# ----------------------------------------------------------- 各種設定 #
# メインルーチン ----------------------------------------------------- #
# 簡単に引数をチェック
die "Usage: autotb.pl \n" if int(@ARGV) != 1;
# 引数を取得
my $entry_path = shift;
$entry_path =~ s!\\!/!g; # Windowsのパス区切り文字を変換する処理
die "This file is not a blosxom entry: $entry_path\n" if $entry_path !~ /$entry_dir/;
# Jcodeオブジェクト作成
my $j = Jcode->new();
# HTML::LinkExtorオブジェクト作成
my @urls;
my $parser = HTML::LinkExtor->new(\&callback);
sub callback {
my($tag, %attr) = @_;
if ($tag eq 'a' and ($attr{'href'} =~ m!^http://!)) {
push(@urls, $attr{'href'});
}
}
# Net::TrackBackオブジェクト作成
my $trackback = Net::TrackBack->new();
# Trackbackで送信する内容を生成
my %data = &make_qs($entry_path);
if ($debug) {
foreach my $key (keys %data) {
print $key . ": " . $data{$key} . "\n";
}
}
# Ping送信先URLリストを生成
my @ping_urls = &find_ping_urls($entry_path);
foreach (@ping_urls) {
my $ping_url = $_;
if ($debug) {
print "$ping_url\n";
}
else {
$data{'ping_url'} = $ping_url;
print "Sending TrackBack ping to $ping_url\n";
$trackback->send_ping(\%data);
if ($trackback->is_error) {
print $trackback->message . "\n";
}
}
}
# 終了
exit;
# ----------------------------------------------------- メインルーチン #
# サブルーチン ------------------------------------------------------- #
# Trackbackで送信する内容を生成するサブルーチン
sub make_qs {
my $entry_path = $_[0];
my %data;
# blogのタイトルを生成
$data{'blog_name'} = $blog_name;
# エントリのParmanent linkを生成
my $url = $entry_path;
# 要変更
$url =~ s!$entry_dir/!http://www.example.jp/path/to/blosxom.cgi/!g;
$url =~ s!txt!html!g;
$data{'url'} = $url;
# エントリのファイルを読み込む
open(FILE, "< $entry_path") || die "Cannot open entry file: $ARGV[1]\n";
my @lines = ;
close(FILE);
# エントリのタイトルを抽出
my $title = shift @lines;
$title =~ s!\x0D\x0A|\x0D|\x0A!!g;
$data{'title'} = $title;
# エントリの要約を生成
my $excerpt = join("", @lines);
$excerpt =~ s!\x0D\x0A|\x0D|\x0A!!g;
$excerpt =~ s!<.*?>!!g;
$excerpt = $j->set(\$excerpt, 'utf8')->euc;
$excerpt = substr($excerpt, 0, 253);
if ($excerpt =~ /\x8F$/ or $excerpt =~ tr/\x8E\xA1-\xFE// % 2) {
$excerpt = substr($excerpt, 0, 252);
if ($excerpt =~ /\x8F$/ or $excerpt =~ tr/\x8E\xA1-\xFE// % 2) {
$excerpt = substr($excerpt, 0, 251);
}
}
$excerpt .= '...';
$data{'excerpt'} = $j->set(\$excerpt, 'euc')->utf8;
return %data;
}
# Ping送信先URLリストを生成するサブルーチン
sub find_ping_urls {
my $entry_path = $_[0];
$parser->parse_file($entry_path);
foreach my $url (@urls) {
foreach my $discover ($trackback->discover($url)) {
push(@ping_urls, $discover);
}
}
return @ping_urls;
}
# ------------------------------------------------------- サブルーチン #