magpieRSSを使用した、RSSフィードを取得するPHPを書きました。


以下は私が作成したコードです。
http://d.hatena.ne.jp/holoholobird/20120319
20分ごとにcronで、20分以内に出てきた記事のitemのみを取得します。

このコードは正常に動作しません。
本来、取得できるはずのitemを取得できないのです。

エラーの原因を探りましたが、自分で思いつくすべての方法を試しましたが無理でした。
恐らくtemp_time周りが怪しいと思うのですが、私の力量では解決は望めませんでした。

20分ごとにRSSの差分を取得するPHPのコードを教えてください。
もしくは上記コードの修正箇所を教えてください。

取得するブログは大半がlivedoorブログとfc2ブログです。

数件、これ以外のウェブサービスによるブログもありますが、
コードがややこしくなるようでしたら無視してもらってもかまいません。

livedoorブログとfc2ブログのフィードの例は
http://hamusoku.com/index.rdf(livedoorブログ)
http://workingnews.blog117.fc2.com/?xml(fc2ブログ)
となります。

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/03/24 16:10:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:oil999 No.1

回答回数1728ベストアンサー獲得回数320

ポイント100pt

52行目を以下のように修正してみてください。

$temp_time = isset($item["date_timestamp"]) ? $item["date_timestamp"] : strtotime($item["dc"]["date"]);
  • id:windofjuly
    うぃんど 2012/03/19 09:02:35
    echo $iquery; でSQLの内容確認はしたみたいですが、
    mysql_query($iquery, $link) の戻り値(trueで成功、falseで失敗)は確認しましたか?

    ざっくりみただけなので、たぶんですが以下のいずれかではないかと思いました
    (a)MySQLのunixtimeフィールドがINT型
      $values = の式で$unixtimeを'で囲まないようにする
    (b)MySQLのunixtimeフィールドがdatetime型
      $unixtime = の式でdatetime型の値を入れるようにする

    ちゃんと確認してないのでコメントにしておきます
  • id:holoholobird
    ご回答ありがとうございます。

    シェルをたたいて実行すると、ほぼすべてのitemで

    PHP Notice: Undefined index: date_timestamp in /var/www/html/getnews.php on line 52

    が出てきます。sql自体への登録は成功しています。
  • id:tobeoscontinue
    >20分以内に出てきた記事のitemのみを取得します。
    正しく動作しているように思います。

    >本来、取得できるはずのitemを取得できないのです。
    rss側も一定間隔で更新していると思われるのでそのタイムラグが問題のように思います。
    例えば20分ごとにcronで、200分以内に出てきた(あるいは全ての)記事を取得し重複する
    部分を捨てることで希望の形に近づくように思います。
    しかしrssではあらかじめ件数を設定していることもあるのですべてを網羅できるとはかぎりません。

    get_headers()でLast-Modifiedが入手できればいいのですがフィードの例のサイトでは出力していませんでした。
    時間はあてに出来ないので$siteurlなどで既に登録されているか否かで判断することになると思います。
    あるいはフィードのサイトごとに最新の記事の時間を記録し、次回はその時間以降のものを登録する。

    >PHP Notice: Undefined index: date_timestamp in /var/www/html/getnews.php on line 52
    $temp_time = ($item["date_timestamp"]) ? $item["date_timestamp"] : strtotime($item["dc"]["date"]);
    の$item["date_timestamp"]でNoticeとなっているのでisset()やin_array("date_timestamp", $item)とすることで出なくなります。
  • id:holoholobird
    ご回答、コメントでアドバイスしてくださった皆様、ありがとうございました。

    無事に解決いたしました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません