ブログからはてなブックマークへの自動投稿

  • 投稿 : 2011-02-15
  • 更新 : 2013-05-16
はてなが提供しているTwitterとの連携機能を使うとお手軽に実現可能です。ブログ更新->TwitterにPOSTすると自動ではてなブックマークに追加されます。ブログ更新でTwitterに自動投稿するには、FeedBurnerなどを使うとよいでしょう。

今回は、上記のものを使わず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が使えない場合は、はてなアンテナなどで代用可能なようです。

スポンサーリンク