mixiからマイミク日記の画像入りRSSを作るmixirss
Posted on 2009/09/18 (金) 22:35
Filed Under 技術 | | TrackBack |
mixiは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リーダに登録する。
以下、アーカイブと同じソース。
-
#!/usr/bin/perl
-
-
use WWW::Mixi::Scraper;
-
#use strict;
-
use utf8;
-
use Encode;
-
#use Data::Dumper;
-
use XML::RSS;
-
use LWP::Simple;
-
use File::Basename;
-
use File::Path;
-
use DBI;
-
-
# ログイン情報
-
my $mixi_email = 'yourmiximail@example.com'; # メールアドレス
-
my $mixi_password = 'yourmixipassword'; # パスワード
-
# 各種設定
-
our $img_dir = "/home/path/public_html/cgi/mixirss/mirror/";
-
our $replaceurl = "http://www.example.com/url/to/cgi/mixirss/mirror/";
-
our $mydb = "/home/path/to/mixirss/diary.db";
-
my $debug = -1 ;
-
#my $eucjp = find_encoding('eucjp');
-
#my $rssfile = "/home/jplcom/public_html/tmp/protect/cgi/mixirss/diary.rdf";
-
-
#DB初期化
-
unless (-e "$mydb"){
-
if ($debug == 0){
-
print "File not exist:$mydb\nCreate DB.\n";
-
}
-
&initdb;
-
}
-
my $mixi = WWW::Mixi::Scraper->new(
-
email => $mixi_email, password => $mixi_password ,
-
mode => 'HTML'
-
);
-
my @list = $mixi->new_friend_diary->parse;
-
my $diary = "";
-
-
my $description = "";
-
my $title = "";
-
my $thumurl = "";
-
my $mixidescription = "";
-
my $imageserver = "";
-
my $id = "";
-
my $owner_id = "";
-
my $link = "";
-
-
#ヘッダ設定
-
my $rss = new XML::RSS (version => '1.0');
-
-
$rss->channel(
-
title => "mixi diary rss",
-
link => "http://mixi.jp/new_friend_diary.pl",
-
description => "マイミクシィ最新日記",
-
dc => {
-
date => "$timestump+09:00",
-
subject => "マイミクシィ最新日記",
-
creator => 'sorshi@dcc-jpl.com',
-
publisher => 'sorshi@dcc-jpl.com',
-
rights => 'Copyright 2009, DCC-JPL Japan',
-
language => 'ja',
-
},
-
syn => {
-
updatePeriod => "hourly",
-
updateFrequency => "1",
-
updateBase => "1901-01-01T00:00+00:00",
-
},
-
);
-
-
$rss->add_module(prefix=>'my', uri=>'http://purl.org/my/rss/module/');
-
-
# ここをループ
-
#-------------------------------------------------------
-
foreach $item (@list){
-
#for ($j= 0; $j<3; $j++){
-
#$item = $list[$j];
-
$link = $item->{'link'} ;
-
-
if ($link ne ""){
-
if(&isthisnewdiary("$link")){
-
if ($debug == 0){
-
}
-
}else{
-
$diary = $mixi->parse($item->{'link'});
-
-
$description = "";
-
$title = "$diary->{'subject'} / $item->{'name'}"; # タイトル / 作者
-
-
#写真ミラー&挿入
-
for ($i=0;$i<3;$i++){
-
if ($diary->{'images'}[$i]{'thumb_link'} ne ""){
-
get_mirror($diary->{'images'}[$i]{'thumb_link'});
-
$thumurl = $diary->{'images'}[$i]{'thumb_link'};
-
$thumurl =~ s|http://|$replaceurl|;
-
$description .= "<a href=\"$diary->{'images'}[$i]{'link'}\"><img src=\"$thumurl\"/></a>";
-
}#if
-
}#for
-
-
#本文画像ミラー処理
-
$mixidescription = $diary->{'description'};
-
while($mixidescription =~ m|http://ic.*?.mixi.jp/.*?\.jpg|){
-
$mixidescription =~ m|http://ic.*?.mixi.jp/.*?\.jpg|;
-
get_mirror($&);
-
$imageserver = $& ;
-
$imageserver =~ m/ic.*?.mixi.jp/;
-
$imageserver = $& ;
-
$mixidescription =~ s|http://ic.*?.mixi.jp|${replaceurl}$imageserver|;
-
}
-
$description .= $mixidescription;
-
-
if ($debug == 0){
-
print "\n";
-
print "\n";
-
print "\n";
-
print "\n";
-
print "\n";
-
print "\n";
-
print "\n";
-
}
-
-
#SQLite追加
-
$link = $item->{'link'} ;
-
($id,$owner_id) = &getids("$link");
-
if ($debug == 0){
-
}
-
$now = `date "+%Y-%m-%d %H:%M:%S"`;chomp($now);
-
&sqlitedbadd("$id","$owner_id",$diary->{'subject'},$item->{'link'},"$description",$item->{'time'},$item->{'name'},"$now");
-
-
#RSS追加
-
$rss->add_item(
-
title => $title ,
-
description => $description,
-
dc => {
-
date =>$item->{'time'},
-
creator => $item->{'name'},
-
},
-
);
-
}#endif isthisnewdiary("$link"
-
}#end if $item->{'link'} ne ""
-
}# end foreach
-
#-------------------------------------------------------
-
-
-
#rdfファイル書き込み
-
my $rssdate ;
-
$rssdate = $rss->as_string;
-
#Jcode::convert(\$rssdate, 'utf8');
-
$rssdate = encode("utf8", $rssdate);
-
#open(RSS,"> $rssfile") || die "File Cannot create!";
-
#print RSS "$rssdate";
-
#close (RSS);
-
#
-
-
sub get_mirror{
-
my $localfile = $url;
-
my $base_name;
-
my $dir;
-
-
$localfile =~ s|http://|$img_dir|;
-
#ファイルが既にあるか見る
-
if(-e $localfile){
-
#print "exist\n";
-
}else{
-
#なければ
-
#print "DL\n";
-
( $base_name, $dir ) = fileparse( $localfile );
-
if (-d $dir){
-
}else{
-
mkpath($dir);
-
}
-
#げっと
-
getstore($url,$localfile);
-
}
-
#print "$base_name \n$dir \n$url \n$localfile\n";
-
}#end sub get_mirror
-
-
-
-
-
sub sqlitedbadd{
-
my $id = $_[0];
-
my $owner_id = $_[1];
-
my $title = $_[2];
-
my $link = $_[3];
-
my $description = $_[4];
-
my $time = $_[5];
-
my $name = $_[6];
-
my $dataadded = $_[7];
-
my $hst;
-
my $hDB;
-
my $retval;
-
-
if ($debug == 0){
-
print encode("utf8", "SQLite INSERT: $id ; $owner_id ; $title; $link; $description; $time; $name; $dataadded \n");
-
}
-
-
$hDB = DBI->connect(
-
"dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
-
);
-
if(!$hDB){
-
print "$DBI::errstr \n";
-
exit;
-
}
-
-
if($hst){
-
$retval = $hst->execute($id,$owner_id , $title, $link , $description , $time , $name , $dataadded );
-
if(!$retval){
-
#exit;
-
}
-
}else{
-
# エラー処理
-
# exit;
-
}#end if
-
}#endsub sqlitedbadd
-
-
sub getids($link){
-
use URI;
-
my $uri = URI->new($link);
-
if ($debug == 0){
-
}
-
#print $uri->query . "\n";
-
my @param = "";
-
#print Dumper (\@param);
-
my @ids = "";
-
my $id = $ids[1];
-
my $owner_id = $ids[1];
-
#print "$link\n";
-
if ($debug == 0){
-
}
-
}#endsub getids
-
-
-
-
sub isthisnewdiary($link){
-
my $hDB ;
-
my $sql = "";
-
my $id;
-
my $owner_id;
-
my $envph;
-
my @ref;
-
my $retval;
-
-
if ($link ne ""){
-
($id , $owner_id ) = &getids("$link");
-
-
$hDB = DBI->connect(
-
"dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
-
);
-
-
if(!$hDB){
-
print "$DBI::errstr \n";
-
exit;
-
}
-
-
$envph = $hDB->prepare("SELECT name,title ,link ,time ,dataadded FROM diary WHERE id = ? AND ownerid = ?");
-
$retval = $envph->execute($id,$owner_id);
-
if(!$retval){
-
#exit;
-
}
-
while (@ref = $envph->fetchrow_array ){
-
#print Dumper (\@ref);
-
if ($debug == 0){
-
}
-
}#end while
-
if ($envph->rows == 0) {
-
}else{
-
}
-
}#end if
-
}#end sub isthisnewdiary
-
-
-
sub initdb(){
-
my $hst;
-
my $hDB;
-
-
unless (-e "$mydb"){
-
close DB;
-
$hDB = DBI->connect(
-
"dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
-
);
-
if(!$hDB){
-
print "$DBI::errstr \n";
-
exit;
-
}
-
my $sql = "
-
create table diary (
-
id int8 PRIMARY KEY ,
-
ownerid int8,
-
title text,
-
link text,
-
description text,
-
time DATETIME,
-
name text,
-
dataadded DATETIME
-
);
-
";
-
$hst = $hDB->do($sql);
-
if(!$hst){
-
exit;
-
}
-
}#unless
-
}# end sub
-
#!/usr/bin/perl
-
-
use DBI;
-
use strict;
-
#use Data::Dumper;
-
use utf8;
-
use Encode;
-
use CGI;
-
use XML::RSS;
-
-
our $mydb = "/home/path/to/mixirss/diary.db";
-
-
# test param
-
my $debug = -1 ;
-
-
-
-
my $hDB;
-
my $envph;
-
my $retval;
-
my @ref;
-
my $timestump;
-
my $rssdate ;
-
my $rsstitle;
-
#初期化
-
my $rss = new XML::RSS (version => '1.0');
-
print "Content-type: application/rdf+xml\n\n";
-
-
#DBread
-
$hDB = DBI->connect(
-
"dbi:SQLite:dbname=$mydb","","",{PrintError=>0}
-
);
-
if(!$hDB){
-
print "$DBI::errstr \n";
-
exit;
-
}
-
$envph = $hDB->prepare("SELECT id,ownerid,name,title ,link ,time ,description,dataadded FROM diary ORDER by time DESC LIMIT 30");
-
$retval = $envph->execute();
-
if(!$retval){
-
#exit;
-
}
-
while (@ref = $envph->fetchrow_array ){
-
# @ref = decode("utf8", @ref);
-
-
#print Dumper (\@ref);
-
if ($debug == 0){
-
}
-
$rsstitle = "$ref[3] / $ref[2]";
-
#RSS追加
-
$rss->add_item(
-
title => decode("utf8", $rsstitle ),
-
description => decode("utf8", $ref[6]),
-
dc => {
-
date =>decode("utf8", $ref[5]),
-
creator => decode("utf8", $ref[2]),
-
},
-
);
-
-
}#end while
-
-
-
# 最終更新日取得
-
$envph = $hDB->prepare("SELECT time FROM diary ORDER by time DESC LIMIT 1");
-
$retval = $envph->execute();
-
if(!$retval){
-
#exit;
-
}
-
while (@ref = $envph->fetchrow_array ){
-
#print Dumper (\@ref);
-
if ($debug == 0){
-
}
-
$timestump = $ref[0];
-
}#end while
-
-
-
#build RSS
-
$rss->channel(
-
title => "mixi diary rss",
-
link => "http://mixi.jp/new_friend_diary.pl",
-
description => "マイミクシィ最新日記",
-
dc => {
-
date => "$timestump+09:00",
-
subject => "マイミクシィ最新日記",
-
creator => 'sorshi@dcc-jpl.com',
-
publisher => 'sorshi@dcc-jpl.com',
-
rights => 'Copyright 2009, DCC-JPL Japan',
-
language => 'ja',
-
},
-
syn => {
-
updatePeriod => "hourly",
-
updateFrequency => "1",
-
updateBase => "1901-01-01T00:00+00:00",
-
},
-
);
-
$rss->add_module(prefix=>'my', uri=>'http://purl.org/my/rss/module/');
-
-
-
-
#rdfファイル書き込み
-
$rssdate = $rss->as_string;
-
$rssdate = encode("utf8", $rssdate);
-
print "$rssdate\n";
-
-
exit ;
Comments
Leave a Comment
TrackBack URI :http://www.dcc-jpl.com/diary/2009/09/18/mixirss/trackback/
Recently
- Comistream Reader公開!
- 2024年10月時点の令和最新版ウチのバックアップ環境
- C104 夏コミのご案内
- C103 冬コミのご案内
- C102 夏コミのご案内 13日 日曜日 西お28b
- 「アニメソムリエ」という新サービスを作りました!
- C101冬コミのご案内 2日目 12/31 土曜日 西さ07a
- モバイルディスプレイをMac miniにつないだら1600×1000がRetina表示にならなかったんで設定変更した話
- C100夏コミのご案内 1日目 8/13 土曜日 西し15b
- DCC-JPL.COMのメールシステムをG SuiteからCloudflare Email Routingに切り換えた
- ゲーム実況とVTuber的な日記【毎週土曜15時配信】
- C99冬コミのご案内 2日目 12/31金曜日 東5 テ07b
- アニメオブジイヤ2020
- MacでjpegのzipをQuickLookしよう
- USB2.5GbEアダプタを買ったりErgoDoxのキースイッチをまた交換したりといった最近の日記
- CentOS 8 StreamがESXi5.5上でIllegal instruction (core dumped)で死にまくるのを解決するメモ
- 2020年のヒット曲TOP41が1時間でわかるMIX(原曲Spotifyリンク&各曲コメントつき)
- アニメオブジイヤ2019
- 今日のErgoDoxなどの日記
- 2019年のヒット曲TOP41が1時間でわかるMIX
- 中古のThinkPad X1 Carbon 4th Genを買ってWWAN(LTEモデム)を内蔵した話
- Raspberry PiでGNSSをクロックソースにするStratum1 NTPサーバーを作った話
- 40ギガビットイーサネットへの道 1(MikroTik CRS326-24S+2Q+RM導入編)
- メインプロバイダを「ZOOT NATIVE IPv4固定IP1個」に乗り換えた
- C97冬コミのご案内 4日目 12/31火曜日 南3 ヨ-18a
- 2018年のヒット曲TOP41が1時間でわかるMIX
- 最近のErgoDox日記
- レーザー刻印で薙刀式キーキャップを作った
- Mac miniの重さ
- Mac用薙刀式のセンターシフト+T,Yの実装
Categories
Archives
- 2024年 11月
- 2024年 8月
- 2023年 12月
- 2023年 8月
- 2023年 3月
- 2022年 12月
- 2022年 8月
- 2022年 3月
- 2021年 12月
- 2021年 11月
- 2021年 5月
- 2021年 3月
- 2021年 2月
- 2020年 12月
- 2020年 11月
- 2020年 10月
- 2020年 6月
- 2019年 12月
- 2019年 11月
- 2019年 10月
- 2019年 9月
- 2019年 8月
- 2019年 7月
- 2019年 5月
- 2019年 4月
- 2019年 3月
- 2019年 1月
- 2018年 12月
- 2018年 8月
- 2018年 6月
- 2018年 4月
- 2018年 2月
- 2017年 12月
- 2017年 8月
- 2017年 5月
- 2017年 1月
- 2016年 12月
- 2016年 9月
- 2016年 8月
- 2016年 7月
- 2016年 4月
- 2016年 1月
- 2015年 11月
- 2015年 9月
- 2015年 8月
- 2015年 5月
- 2015年 3月
- 2015年 2月
- 2015年 1月
- 2014年 12月
- 2014年 11月
- 2014年 10月
- 2014年 9月
- 2014年 8月
- 2014年 7月
- 2014年 5月
- 2014年 3月
- 2014年 2月
- 2014年 1月
- 2013年 12月
- 2013年 11月
- 2013年 10月
- 2013年 9月
- 2013年 8月
- 2013年 7月
- 2013年 6月
- 2013年 5月
- 2013年 4月
- 2012年 11月
- 2012年 10月
- 2012年 9月
- 2012年 8月
- 2012年 7月
- 2012年 6月
- 2012年 5月
- 2012年 4月
- 2012年 3月
- 2012年 2月
- 2012年 1月
- 2011年 12月
- 2011年 11月
- 2011年 10月
- 2011年 9月
- 2011年 8月
- 2011年 7月
- 2011年 6月
- 2011年 5月
- 2011年 4月
- 2011年 3月
- 2011年 2月
- 2011年 1月
- 2010年 12月
- 2010年 11月
- 2010年 10月
- 2010年 9月
- 2010年 8月
- 2010年 7月
- 2010年 6月
- 2010年 5月
- 2010年 4月
- 2010年 3月
- 2010年 2月
- 2010年 1月
- 2009年 12月
- 2009年 11月
- 2009年 10月
- 2009年 9月
- 2009年 8月
- 2009年 7月
- 2009年 6月
- 2009年 5月
- 2009年 4月
- 2009年 3月
- 2009年 2月
- 2009年 1月
- 2008年 12月
- 2008年 11月
- 2008年 10月
- 2008年 9月
- 2008年 8月
- 2008年 7月
- 2008年 6月
- 2008年 5月
- 2008年 4月
- 2008年 3月
- 2008年 2月
- 2008年 1月
- 2007年 12月
- 2007年 11月
- 2007年 10月
- 2007年 9月
- 2007年 8月
- 2007年 7月
- 2007年 6月
- 2007年 5月
- 2007年 4月
- 2007年 3月
- 2007年 2月
- 2007年 1月