今回は、上記のものを使わずcronを使って定期的にRSSの中身をチェックして更新があればはてなブックマークに登録するPHPスクリプトを使うことにします。
PearのServices_Hatenaを使用します
<?php
//--------------
//はてなブックマークのIDとパスワード
//-------------
$user = 'ユーザー名';
$pass = 'パスワード';
log_write("crom#はてなブックマーク");
//--------------------------
// メイン
//--------------------------
$host = "http://RSSのURL";
//cURLセッション
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$result = curl_exec($ch);curl_close($ch);
//XML文字列をオブジェクトに代入する
$XML = simplexml_load_string($result);
foreach ($XML->channel->item as $rssrow) {
$url = $rssrow->link;
$title = $rssrow->title;
if(chk_url($url) ==0){
//echo "なし";
$ret=bookmark($url,$user,$pass);
log_write($ret.":".$title."(".$url.")");
}else{
//echo "あり";
}}
//--------------------------
// 関数
//--------------------------
function bookmark($url,$user,$pass){
require_once 'Services/Hatena.php';
//引数に'Bookmark'を与えてインスタンスを作成
$hatena = & Services_Hatena::factory('Bookmark');
//ログイン準備
$hatena->hatena_login($user, $pass);
//ブックマークをポスト
$r = $hatena->add_bookmark(
$url, //string url
'[blog]ブログ' //string
comment);
//var_dump($hatena->http->getResponseCode());
//201return $hatena->http->getResponseCode();
}
function chk_url($url){
$fileName="url.txt";
$max = 30;
$fdata[0]=$url;
//------------------------------
//ファイルがないときは作成
if( !file_exists($fileName) ){touch( $fileName );}
//----------------------------------
//ファイルを読み込み専用で開く
$fp = fopen($fileName,"r");
$ct = 1;
while(!feof($fp)){
$wk = trim(fgets($fp));
if($wk !=""){
if(strcmp($wk,$fdata[0])==0){
fclose($fp);return 1;
}
$fdata[$ct] = $wk;
$ct ++;
}
}
fclose($fp);
$fp = fopen($fileName,"w");
//------------------
//ファイルの保存
if ($fp){
if (flock($fp, LOCK_EX)){
rewind($fp);
$ct =0;
foreach($fdata as $d){
$ct++;fputs($fp,$d."n");
if($ct >=$max){
//30件の件数制限break;
}
}
flock($fp, LOCK_UN);
}
}
fclose($fp);
//-----------------------------------
return 0;
}
function log_write($data){
$time = time() + 9*3600; //GMTとの時差9時間を足す
$time2= gmdate("Y/m/d H:i:s ", $time);
$fp = fopen("log.txt", "a");
fwrite($fp,$time2.":".$data."n");
fclose($fp);
}
?>
でこのスクリプトをcronに登録します。
/usr/bin/curl -s http://host/bookmark.php
このような感じで、httpのリクエストとして呼び出すようにします。
【はまったところ】
allow_url_fopenがOFFだとsimplexml_load_fileで外部サイトに読みにいけない。allow_url_fopenをONに変更できるサーバーは変更すればよいが、できない場合は別の方法を使わないと駄目のようです。fsockopen を使うかcURL(curl)を使うことで回避可能です。
cronの登録で、/usr/bin/php -f /xxxx/bookmark.phpのように呼び出すと、なぜかはてなブックマークを1件登録した時点で処理が終了してしまう。原因わからず。そのため、上記のように呼び出すことで回避してます。
【参考になるサイト】
・allow_url_fopen=offの設定でRSSやXMLファイルを読み込みたい。
・【PHP】PEAR::Services_Hatena_Bookmarkを使う
・cron使ってシェルからGETメソッドを実行する方法
追記:2011/05/21
cronが使えない場合は、はてなアンテナなどで代用可能なようです。
cronが使えない場合は、はてなアンテナなどで代用可能なようです。
スポンサーリンク
コメントを残す