#! /usr/bin/perl
use lib('./lib');
use XMLRPC::Lite;
use Unicode::Japanese;
require "./jcode.pl";
#このファイルはEUCでできています。HNSがEUCなので。
$mtxml = "mt-xmlrpc.cgi"; #xml-rpc.cgi を指定する
$baseurl = "http://domain/MT/"; #MTの設置場所を指定する
$blogid = 1;
$username = "blog user";
$passwd = "blog passwd"; #--- MovableTypeのPassword Checkはパターンマッチさせている?
#--- ^先頭から一致していれば、 末尾の間に何が入っても通る可能性がある
$|=1;
%systemdata =(
'loginuser' => 'test', #xml rpcのユーザを指定
'loginpass' => '0000', #xml rpcのパスワードを指定
'blogid' => 1, #blog idを指定
'bloguser' => 'blog user', #blog のユーザを指定
'blogpass' => 'blog pass', #blog のパスワードを指定
);
%categories = &get_categories($systemdata{'blogid'},$systemdata{'bloguser'},$systemdata{'blogpass'});
$basedir = ""; #どこにhnsのデータを保存しているかを指定する
# 年で loop 範囲を指定する
for ($i=2003; $i <= 2005; $i++)
{
print $i . "\n";
$year = $i;
for ($m=1; $m <= 12; $m++)
{
$month = sprintf("%02d",$m);
for ($d = 1; $d<=31; $d++)
{
$day = sprintf("%02d",$d);
$date = $year . $month . $day;
$filename = $basedir . $year . "\\" . "d" . $date . ".hnf";
print $filename . "\n";
if (-e $filename)
{
$starting = 0;
$cate_back = "";
$message_back = "";
$title_back = "";
open(IN,"$filename");
while()
{
$lines = $_;
#return($value,$title,$categ);
($message,$title_new,$cate_new) = &check_commands($lines);
if ($cate_new ne "")
{
$cate_disp = $cate_new;
&jcode::convert(\$cate_disp,'sjis');
print "Cate: $cate_disp\n";
if ($cate_back ne "")
{
#2003-01-09 02:17:28
$message_date = $year ."-" . $month . "-" . $day . "T" . "00:0" . $starting . ":00.45+09:00";
&post_messages($systemdata{'blogid'},$systemdata{'bloguser'},$systemdata{'blogpass'},$cate_back,$title_back,$message_back,$message_date);
$starting++;
}
$cate_back = $cate_new;
$message_back = "";
}
elsif ($title_new ne "")
{
$title_back = $title_new;
$message_back = "";
}
else
{
$message_back .= $message;
}
}
close(IN);
$message_date = $year ."-" . $month . "-" . $day . "T" . "00:0" . $starting .":00.45+09:00";
&post_messages($systemdata{'blogid'},$systemdata{'bloguser'},$systemdata{'blogpass'},$cate_back,$title_back,$message_back,$message_date);
}
}
}
}
exit;
sub check_commands
{
my($lines) = @_;
my($value,$title,$categ);
chomp($lines);
if ($lines =~ /^OK$/i)
{
}
elsif ($lines =~ /^LNEW\s(.*?)\s(.*?)$/)
{
$title ="$2";
}
elsif ($lines =~ /^NEW\s(.*?)$/)
{
$title = $1;
}
elsif ($lines =~ /^CITE$/)
{
$value = "";
}
elsif ($lines =~ /^\/CITE$/)
{
$value = "
";
}
elsif ($lines =~ /^\/STRONG$/)
{
$value = "";
}
elsif ($lines =~ /^STRONG$/)
{
$value = "";
}
elsif ($lines =~ /^P$/)
{
$value = "";
}
elsif ($lines =~ /^\/P$/)
{
$value = "
";
}
elsif ($lines =~ /^\/P$/)
{
$value = "
";
}
elsif ($lines =~ /^CAT\s(.*?)$/)
{
$categ = $1;
}
elsif ($lines =~ /^LINK\s(.*?)\s(.*?)$/)
{
$value ="$2";
}
elsif ($lines =~ /^URL\s(.*?)\s(.*?)$/)
{
$value ="$2($1)";
}
elsif ($lines =~ /^FONT\s(.*?)\s(.*?)\s(.*?)$/)
{
$value ="$3";
}
elsif ($lines =~ /^STRIKE\s(.*?)$/)
{
$value ="$1";
}
elsif ($lines =~ /^PRE$/)
{
$value ="";
}
elsif ($lines =~ /^\/PRE$/)
{
$value ="
";
}
elsif ($lines =~ /^\/UL$/)
{
$value ="";
}
elsif ($lines =~ /^UL$/)
{
$value ="";
}
elsif ($lines =~ /^\/OL$/)
{
$value ="";
}
elsif ($lines =~ /^OL$/)
{
$value ="";
}
elsif ($lines =~ /^\/DL$/)
{
$value ="";
}
elsif ($lines =~ /^DL$/)
{
$value ="";
}
elsif ($lines =~ /^LI$/)
{
$value ="
- ";
}
elsif ($lines =~ /^DD$/)
{
$value ="
- ";
}
elsif ($lines =~ /^DT$/)
{
$value ="
- ";
}
else
{
$lines =~ s/\r\n//g;
$lines =~ s/\n//g;
$lines =~ s/\r//g;
$lines =~ s/(.*?)~$/$1\r\n/g;
if ($lines =~ m/^\s([a-zA-Z]+)(.*?)$/)
{
$lines = $1 . $2;
}
$value = $lines;
}
return($value,$title,$categ);
}
sub post_messages
{
my($ID,$setcategory,$ret);
my($blogid,$username,$passwd,$categ,$title,$message,$message_date) = @_;
my($key,$value);
#my $category = "1";
#my $postid = "1234";
#my %cat = ( "categoryId" => $category, "isPrimary" => 1 );
#my $array = [ \%cat ];
#my $res = XMLRPC::Lite->proxy($uri)->call( $method,
# $postid,
# $user,
# $passwd,
# $array
#)
#パラメータ: String blogid 、String username 、String password 、struct content 、boolean publish
#返り値: 成功すると新しい投稿のString postid 、失敗するとfault
#注: 構造体 content には次の標準のキーを含められます: エントリーのタイトルには title 、エントリーの
#本文には description 、エントリー作成日の指定には dateCreated。
#さらにMovable Typeの実装によって、次の7つのキーを含め、その値を指定して渡すことができます。
#allow_comments フィールドの値にはint mt_allow_comments 、 allow_pings フィールドの値にはint mt_allow_pings 、 convert_breaks フィールドの値にはString mt_convert_breaks 、追記のエントリー・テキストの値にはString mt_text_more 、概要のフィールドの値にはString mt_excerpt 、キーワード・フィールドの値にはString mt_keywords 、このエントリーのトラックバックpingを載せたURLのリストにはarray mt_tb_ping_urls 。 dateCreated を指定する場合は、ISO.8601のフォーマットに従ってください。
#2003-01-09 02:17:28
#convert_breaks="0":このエントリーの自動整形を無効にする。
#convert_breaks="1":このエントリーの自動整形を有効にする。
$title = Unicode::Japanese->new($title,'euc')->get;
$message = Unicode::Japanese->new($message,'euc')->get;
$message_date = Unicode::Japanese->new($message_date,'euc')->get;
#open(OUT,">./test.txt");
#print OUT $title2;
#print OUT "\n";
#print OUT $message2;
#print OUT "\n";
#close(OUT);
%struct =(
'title' => $title,
'description' => $message,
'dateCreated' => $message_date,
'allow_comments' => 1,
'allow_pings' => 1,
#'convert_breaks' => ,
#'mt_text_more' => ,
#'mt_excerpt' => ,
#'mt_keywords' =>
);
#my $ret = XMLRPC::Lite-> proxy("$baseurl$mtxml")->call("metaWeblog.newPost", $blogid , $username,$passwd,%struct,$publish)->result;
$ret = XMLRPC::Lite-> proxy("$baseurl$mtxml")->call("metaWeblog.newPost", $blogid , $username,$passwd,{ %struct },$publish)->result;
if (&CheckTypeOf(\$ret,"SCALAR") )
{
die "Not Get RPC...";
}
$postid = $ret;
#---- Postする際に、HNSのカテゴリ名称->MTのカテゴリへマッピングする
#---- 手動で指定してください....
if ($categ eq "にっき")
{
$categ = "単なる日記";
}
elsif ($categ eq "キャプチャ関連")
{
$categ = "キャプチャ・ビデオ編集";
}
elsif ($categ eq "ムービー関連")
{
$categ = "キャプチャ・ビデオ編集";
}
#elsif ($categ eq "ムービー関連")
#{
# $categ = "キャプチャ・ビデオ編集";
#}
$cate_disp2 = $categ;
&jcode::convert(\$cate_disp2,'sjis');
print "Cate2: $cate_disp2 \n";
while(($key,$value) = each %categories)
{
$val2 = $value;
&jcode::convert(\$val2,'sjis');
print "Cate3: $val2 \n";
if ($value eq $categ)
{
$setcategory = $key;
#each の時は途中で止めるとおかしくなる?
#--- これはActivePerlの問題なのか?
#last;
}
}
if ($setcategory ne "")
{
$ret = XMLRPC::Lite-> proxy("$baseurl$mtxml")->call("mt.setPostCategories", $postid, $username,$passwd,[ { 'categoryId' => $setcategory} ],$publish)->result;
if ($ret eq "")
{
print "Category set error?\n";
sleep 1;
}
if (&CheckTypeOf(\$ret,"SCALAR") )
{
die "Not Set Category...";
}
}
else
{
print "Mooo.... Category Not Set!?\n";
sleep 3;
}
$ret = XMLRPC::Lite-> proxy("$baseurl$mtxml")->call("mt.publishPost", $postid, $username,$passwd)->result;
if (&CheckTypeOf(\$ret,"SCALAR") )
{
die "Not Set Publish..";
}
}
#blogger.getRecentPosts
#機能; システムにおける最新の投稿リストを返します。
#パラメータ: String appkey 、String blogid 、String username 、String password 、int numberOfPosts
#返り値: 成功するとISO.8601 dateCreated 、String userid 、String postid 、String content を含む構造体の配列、失敗するとfault
#注: dateCreated は、ブログの blogid のタイムゾーンに基づきます。
my $ret = XMLRPC::Lite-> proxy("$baseurl$mtxml")->call("blogger.getRecentPosts", "",$blogid , $username,$passwd)->result;
#print $ret;
foreach (@$ret)
{
while(($key,$value) = each %$_)
{
print $key . "\n";
$value = Unicode::Japanese->new($value)->sjis;
print $value . "\n";
}
#print $_;
}
sub get_categories
{
my(%categories,$ID);
my($blogid,$username,$passwd) = @_;
my $ret = XMLRPC::Lite-> proxy("$baseurl$mtxml")->call("mt.getCategoryList", $blogid , $username,$passwd)->result;
if (&CheckTypeOf($ret) )
#---- 構造体の配列なので この時点で ARRAYにならなければ エラー ----
{
die "Not Get RPC...";
}
#mt.getCategoryList
#機能; ブログに定義された全カテゴリーのリストを返します。
#パラメータ: String blogid 、String username 、String password
#返り値: 成功するとString categoryId とString categoryName を含む構造体の配列、失敗するとfault
foreach (@$ret)
{
#$value = $$_{'categoryName'};
#$value = Unicode::Japanese->new($value)->euc;
$value = Unicode::Japanese->new($$_{'categoryName'})->euc;
$ID = Unicode::Japanese->new($$_{'categoryId'})->euc;
$categories{ $ID } = $value;
}
#while(($key,$value) = each %categories)
#{
#DebugCode("key" . $key);
#$value = Unicode::Japanese->new($value)->sjis;
#DebugCode("val" . $value);
#}
#DebugCode($_);
#print $_ . "\n";
return %categories;
}
sub DebugCode
{
my($value) = $_[0];
print $value . "\n";
}
sub CheckTypeOf
{
my($ref,$type) = @_;
my($param);
$param = ref($ref);
if ($type eq "")
{
$type = "ARRAY";
}
#REF
#SCALAR
#ARRAY
#HASH
#CODE
#GLOB
#&DebugCode;
#&DebugCode($type);
&DebugCode($param);
if ($param eq $type)
{
&DebugCode("TypeOK");
return;
}
return 1;
}