« | ★★★★ 東京マグニチュード8.0 #11 「悠貴へ…」 »

mixiからマイミク日記の画像入りRSSを作るmixirss

Posted on 2009/09/18 (金) 22:35
Filed Under 技術 | | TrackBack | このエントリをはてなブックマークに追加 Share on Tumblr

mixirss screen shotmixiはRSSも吐いてなくて、とても巡回効率が悪いんでmixiのマイミク新着日記からRSSを吐くスクリプトをこしらえた。

【便利な機能】
・新着日記をRSSにする
・写真をローカルにミラーして、ミラー先のURLに書き換えるのでRSSでも写真が見れる

githubとか使ったことないんでそのままアーカイブ置いただけ。

2010-02-12 更新
http://www.dcc-jpl.com/soft/mixirss/mixirss_20100112.tar.gz

展開して自分のサーバにインストールしてあげればかなりらくちんに使えるようになるはず。
みきし日記には公開範囲限定してる人もあるようなんで、、RSSをそのままGoogle Readerに登録しちゃったりすると何かとめんどくさいことになるかもしれないんでご注意を。
ウチではmixirssスクリプトとRSSリーダーのfreshreaderを同じサーバで動かしてる。

追加モジュールを入れるんでConfig::Pitを使って書けばおしゃれだったかもしれない。

【使い方】
・WWW::Mixi::Scraperモジュールが入ってなかったらインストールする。
・getrss.plの$mixi_emailと$mixi_passwordを自分のアカウントにする
・getrss.plの$img_dir、$replaceurl、$mydbを所定のパスやURLにする。
・getrss.plをサーバに設置してcronで回す。
・diaryrss.cgiの$mydbをgetrss.plのpathと同じものに書き換える。
・diaryrss.cgiをwebサーバから見えるところにおいてRSSリーダに登録する。

以下、アーカイブと同じソース。

PERL:
  1. #!/usr/bin/perl
  2.  
  3. use WWW::Mixi::Scraper;
  4. #use strict;
  5. use utf8;
  6. use Encode;
  7. #use Data::Dumper;
  8. use XML::RSS;
  9. use LWP::Simple;
  10. use File::Basename;
  11. use File::Path;
  12. use DBI;
  13.  
  14. # ログイン情報
  15. my $mixi_email = 'yourmiximail@example.com'; # メールアドレス
  16. my $mixi_password = 'yourmixipassword'; # パスワード
  17. # 各種設定
  18. our $img_dir = "/home/path/public_html/cgi/mixirss/mirror/";
  19. our $replaceurl = "http://www.example.com/url/to/cgi/mixirss/mirror/";
  20. our $mydb = "/home/path/to/mixirss/diary.db";
  21. my $debug = -1 ;
  22. #my $eucjp = find_encoding('eucjp');
  23. #my $rssfile = "/home/jplcom/public_html/tmp/protect/cgi/mixirss/diary.rdf";
  24.  
  25. #DB初期化
  26. unless (-e "$mydb"){
  27. if ($debug == 0){
  28.     print "File not exist:$mydb\nCreate DB.\n";
  29. }
  30.     &initdb;
  31. }
  32. my $mixi = WWW::Mixi::Scraper->new(
  33.       email => $mixi_email, password => $mixi_password ,
  34.       mode  => 'HTML'
  35. );
  36. my @list$mixi->new_friend_diary->parse;
  37. my $diary = "";
  38.  
  39. my $timestump = `date  +%Y-%m-%dT%H:%M:%S`; chomp($timestump);
  40. my $description = "";
  41. my $title = "";
  42. my $thumurl = "";
  43. my $mixidescription = "";
  44. my $imageserver = "";
  45. my $now = `date "+%Y-%m-%d %H:%M:%S"`; chomp($now);
  46. my $id = "";
  47. my $owner_id = "";
  48. my $link = "";
  49.  
  50. #ヘッダ設定
  51.  my $rss = new XML::RSS (version => '1.0');
  52.  
  53.  $rss->channel(
  54.    title        => "mixi diary rss",
  55.    link         => "http://mixi.jp/new_friend_diary.pl",
  56.    description  => "マイミクシィ最新日記",
  57.    dc => {
  58.      date       => "$timestump+09:00",
  59.      subject    => "マイミクシィ最新日記",
  60.      creator    => 'sorshi@dcc-jpl.com',
  61.      publisher  => 'sorshi@dcc-jpl.com',
  62.      rights     => 'Copyright 2009, DCC-JPL Japan',
  63.      language   => 'ja',
  64.    },
  65.    syn => {
  66.      updatePeriod     => "hourly",
  67.      updateFrequency  => "1",
  68.      updateBase       => "1901-01-01T00:00+00:00",
  69.    },
  70.  );
  71.  
  72.  $rss->add_module(prefix=>'my', uri=>'http://purl.org/my/rss/module/');
  73.  
  74. # ここをループ
  75. #-------------------------------------------------------
  76. foreach $item (@list){
  77. #for ($j= 0; $j<3; $j++){
  78. #$item = $list[$j];
  79. $link = $item->{'link'} ;
  80.  
  81. if ($link ne ""){
  82. if(&isthisnewdiary("$link")){
  83.     if ($debug == 0){
  84.         print  encode("utf8", "Diary exist;ski@:$link \n");
  85.     }
  86. }else{
  87. $diary = $mixi->parse($item->{'link'});
  88.  
  89. $description = "";
  90. $title = "$diary->{'subject'} / $item->{'name'}"; # タイトル / 作者
  91.  
  92. #写真ミラー&挿入
  93. for ($i=0;$i&lt;3;$i++){
  94. if ($diary->{'images'}[$i]{'thumb_link'} ne ""){
  95.     get_mirror($diary->{'images'}[$i]{'thumb_link'});
  96.         $thumurl = $diary->{'images'}[$i]{'thumb_link'};
  97.         $thumurl =~ s|http://|$replaceurl|;
  98.     $description .= "<a href=\"$diary->{'images'}[$i]{'link'}\"><img src=\"$thumurl\"/></a>";
  99. }#if
  100. }#for
  101.  
  102. #本文画像ミラー処理
  103. $mixidescription = $diary->{'description'};
  104. while($mixidescription =~ m|http://ic.*?.mixi.jp/.*?\.jpg|){
  105.     $mixidescription =~ m|http://ic.*?.mixi.jp/.*?\.jpg|;
  106.     get_mirror($&);
  107.     $imageserver = $& ;
  108.     $imageserver =~ m/ic.*?.mixi.jp/;
  109.     $imageserver = $& ;
  110.     $mixidescription =~ s|http://ic.*?.mixi.jp|${replaceurl}$imageserver|;
  111. }
  112. $description .= $mixidescription;
  113.  
  114. if ($debug == 0){
  115. print  encode("utf8", $item->{'link'});
  116. print "\n";
  117. print  encode("utf8", $item->{'name'});
  118. print "\n";
  119. print  encode("utf8", $item->{'time'});
  120. print "\n";
  121. print  encode("utf8", $item->{'subject'});
  122. print "\n";
  123. print  encode("utf8", $diary->{'level'}->{'description'});
  124. print "\n";
  125. print  encode("utf8", $diary->{'subject'});
  126. print "\n";
  127. print  encode("utf8", $description);
  128. print "\n";
  129. }
  130.  
  131. #SQLite追加
  132. $link = $item->{'link'} ;
  133. ($id,$owner_id) = &getids("$link");
  134. if ($debug == 0){
  135.     print  encode("utf8", "IDs : $id,$owner_id\n");
  136. }
  137. $now = `date "+%Y-%m-%d %H:%M:%S"`;chomp($now);
  138. &sqlitedbadd("$id","$owner_id",$diary->{'subject'},$item->{'link'},"$description",$item->{'time'},$item->{'name'},"$now");
  139.  
  140. #RSS追加
  141.     $rss->add_item(
  142.          title       => $title ,
  143.          link        => $item->{'link'},
  144.          description =>  $description,
  145.          dc => {
  146.             date  =>$item->{'time'},
  147.             creator  => $item->{'name'},
  148.       },
  149.     );
  150. }#endif isthisnewdiary("$link"
  151. }#end if  $item->{'link'} ne ""
  152. }# end foreach
  153. #-------------------------------------------------------
  154.  
  155. $rss->add_item (title=>$title, link=>$link, slash=>{ topic=>$topic });
  156.  
  157. #rdfファイル書き込み
  158. my $rssdate ;
  159. $rssdate = $rss->as_string;
  160. #Jcode::convert(\$rssdate, 'utf8');
  161. $rssdate =  encode("utf8", $rssdate);
  162. #open(RSS,"> $rssfile") || die "File Cannot create!";
  163. #print RSS "$rssdate";
  164. #close (RSS);
  165. #
  166.  
  167. sub get_mirror{
  168.     my $url = shift;
  169.     my $localfile = $url;
  170.     my $base_name;
  171.     my $dir;
  172.    
  173.     $localfile =~ s|http://|$img_dir|;
  174.     #ファイルが既にあるか見る
  175.     if(-e $localfile){
  176.     #print "exist\n";
  177.     }else{
  178.     #なければ
  179.     #print "DL\n";
  180.     ( $base_name, $dir ) = fileparse( $localfile );
  181.         if (-d $dir){
  182.         }else{
  183.         mkpath($dir);
  184.         }
  185.     #げっと
  186.     getstore($url,$localfile);
  187.     }
  188. #print "$base_name \n$dir \n$url \n$localfile\n";
  189. }#end sub get_mirror
  190.  
  191.  
  192.  
  193.  
  194. sub sqlitedbadd{
  195. my $id = $_[0];
  196. my $owner_id = $_[1];
  197. my $title = $_[2];
  198. my $link = $_[3];
  199. my $description = $_[4];
  200. my $time = $_[5];
  201. my $name = $_[6];
  202. my $dataadded = $_[7];
  203. my $hst;
  204. my $hDB;
  205. my $retval;
  206.  
  207. if ($debug == 0){
  208.     print  encode("utf8", "SQLite INSERT: $id ; $owner_id ; $title; $link; $description; $time; $name; $dataadded  \n");
  209. }
  210.  
  211. $hDB = DBI->connect(
  212.   "dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
  213.   );
  214. if(!$hDB){
  215.     print "$DBI::errstr \n";
  216.     exit;
  217. }
  218.  
  219. $hst = $hDB->prepare( "INSERT INTO diary VALUES(?,?,?,?,?,?,?,?)" ) or die "Cannot prepare:$!";
  220. if($hst){
  221.     $retval = $hst->execute($id,$owner_id , $title, $link , $description , $time , $name , $dataadded );
  222.     if(!$retval){
  223.         print $hDB->errstr . "\n";
  224.         #exit;
  225.     }
  226. }else{
  227.     # エラー処理
  228.     print $hDB->errstr . "\n";
  229. #   exit;
  230. }#end if
  231. }#endsub sqlitedbadd
  232.  
  233. sub getids($link){
  234. use URI;
  235. my $uri = URI->new($link);
  236. if ($debug == 0){
  237.     print  encode("utf8", $link ."\n");
  238.     print  encode("utf8", $uri->query ."\n");
  239. }
  240. #print $uri->query . "\n";
  241. my @param = "";
  242. @param = split(/&/,$uri->query);
  243. #print Dumper (\@param);
  244. my @ids = "";
  245. @ids = split(/=/,$param[0]);
  246. my $id = $ids[1];
  247. @ids = split(/=/,$param[1]);
  248. my $owner_id = $ids[1];
  249. #print "$link\n";
  250. if ($debug == 0){
  251.     print  encode("utf8", "$id,$owner_id \n");
  252. }
  253. return ($id,$owner_id)
  254. }#endsub getids
  255.  
  256.  
  257.  
  258. sub isthisnewdiary($link){
  259. my $hDB ;
  260. my $sql = "";
  261. my $id;
  262. my $owner_id;
  263. my $envph;
  264. my @ref;
  265. my $retval;
  266.  
  267. if ($link ne ""){
  268. ($id , $owner_id ) = &getids("$link");
  269.  
  270.  $hDB = DBI->connect(
  271.   "dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
  272.   );
  273.  
  274. if(!$hDB){
  275.     print "$DBI::errstr \n";
  276.     exit;
  277. }
  278.  
  279. $envph = $hDB->prepare("SELECT name,title ,link ,time ,dataadded FROM diary  WHERE id = ? AND ownerid = ?");
  280. $retval = $envph->execute($id,$owner_id);
  281.     if(!$retval){
  282.         print $hDB->errstr . "\n";
  283.         #exit;
  284.     }
  285. while (@ref = $envph->fetchrow_array ){
  286. #print Dumper (\@ref);
  287.     if ($debug == 0){
  288.         print ( "$ref[0],$ref[0],$ref[1],$ref[2],$ref[3],$ref[4]\n");
  289.     }
  290. }#end while
  291.   if ($envph->rows == 0) {
  292.     return (0);
  293.   }else{
  294.     return (-1);
  295.   }
  296. }#end if
  297. }#end sub isthisnewdiary
  298.  
  299.  
  300. sub initdb(){
  301. my $hst;
  302. my $hDB;
  303.  
  304. unless (-e "$mydb"){
  305.     open DB, ">>$mydb" || die $!;
  306.     close DB;
  307. $hDB = DBI->connect(
  308.   "dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
  309.   );
  310. if(!$hDB){
  311.     print "$DBI::errstr \n";
  312.     exit;
  313. }
  314. my $sql = "
  315. create table diary (
  316. id int8 PRIMARY KEY ,
  317. ownerid int8,
  318. title text,
  319. link text,
  320. description text,
  321. time DATETIME,
  322. name text,
  323. dataadded DATETIME
  324. );
  325. ";
  326. $hst = $hDB->do($sql);
  327. if(!$hst){
  328.     print $hDB->errstr . "\n";
  329.     exit;
  330. }
  331. }#unless
  332. }# end sub

PERL:
  1. #!/usr/bin/perl
  2.  
  3. use DBI;
  4. use strict;
  5. #use Data::Dumper;
  6. use utf8;
  7. use Encode;
  8. use CGI;
  9. use XML::RSS;
  10.  
  11. our $mydb = "/home/path/to/mixirss/diary.db";
  12.  
  13. #   test param
  14. my $debug = -1 ;
  15.  
  16.  
  17.  
  18. my $hDB;
  19. my $envph;
  20. my $retval;
  21. my @ref;
  22. my $timestump;
  23. my $rssdate ;
  24. my $rsstitle;
  25. #初期化
  26. my $rss = new XML::RSS (version => '1.0');
  27. print "Content-type: application/rdf+xml\n\n";
  28.  
  29. #DBread
  30.  $hDB = DBI->connect(
  31.   "dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
  32.   );
  33. if(!$hDB){
  34.     print "$DBI::errstr \n";
  35.     exit;
  36. }
  37. $envph = $hDB->prepare("SELECT id,ownerid,name,title ,link ,time ,description,dataadded FROM diary ORDER by time DESC LIMIT 30");
  38. $retval = $envph->execute();
  39.     if(!$retval){
  40.         print $hDB->errstr . "\n";
  41.         #exit;
  42.     }
  43. while (@ref$envph->fetchrow_array ){
  44. # @ref = decode("utf8", @ref);
  45.  
  46. #print Dumper (\@ref);
  47.     if ($debug == 0){
  48.         print ( "$ref[0],$ref[0],$ref[1],$ref[2],$ref[3],$ref[4]\n");
  49.     }
  50.     $rsstitle = "$ref[3] / $ref[2]";
  51.         #RSS追加
  52.         $rss->add_item(
  53.          title       => decode("utf8", $rsstitle ),
  54.          link        => decode("utf8", $ref[4]),
  55.          description => decode("utf8", $ref[6]),
  56.          dc => {
  57.             date  =>decode("utf8", $ref[5]),
  58.             creator  => decode("utf8", $ref[2]),
  59.       },
  60.     );
  61.  
  62. }#end while
  63.  
  64.  
  65. # 最終更新日取得
  66. $envph = $hDB->prepare("SELECT time FROM diary ORDER by time DESC LIMIT 1");
  67. $retval = $envph->execute();
  68.     if(!$retval){
  69.         print $hDB->errstr . "\n";
  70.         #exit;
  71.     }
  72. while (@ref = $envph->fetchrow_array ){
  73. #print Dumper (\@ref);
  74.     if ($debug == 0){
  75.         print ( "$ref[0]\n");
  76.     }
  77.         $timestump = $ref[0];
  78. }#end while
  79.  
  80.  
  81. #build RSS
  82.  $rss->channel(
  83.    title        => "mixi diary rss",
  84.    link         => "http://mixi.jp/new_friend_diary.pl",
  85.    description  => "マイミクシィ最新日記",
  86.    dc => {
  87.      date       => "$timestump+09:00",
  88.      subject    => "マイミクシィ最新日記",
  89.      creator    => 'sorshi@dcc-jpl.com',
  90.      publisher  => 'sorshi@dcc-jpl.com',
  91.      rights     => 'Copyright 2009, DCC-JPL Japan',
  92.      language   => 'ja',
  93.    },
  94.    syn => {
  95.      updatePeriod     => "hourly",
  96.      updateFrequency  => "1",
  97.      updateBase       => "1901-01-01T00:00+00:00",
  98.    },
  99.  );
  100.  $rss->add_module(prefix=>'my', uri=>'http://purl.org/my/rss/module/');
  101.  
  102.  
  103.  
  104. #rdfファイル書き込み
  105. $rssdate = $rss->as_string;
  106. $rssdate =  encode("utf8", $rssdate);
  107. print  "$rssdate\n";
  108.  
  109. exit ;

Comments

Leave a Comment

TrackBack URI :http://www.dcc-jpl.com/diary/2009/09/18/mixirss/trackback/

Name

Email

ウェブサイト

コメント

Recently


Categories


Archives


Wish list

宗子さんのほしい物リスト2015/5-