INFOINFO
MAILMAIL

2015年12月 7日(月)

* はてブのRSSが取れなくなっていた件    [  日記 | PHP | インターネット  ]

 さて、相変わらずインターネットの情報収集は自前のRSSリーダーでやってるんだけども、ここ最近、世間様では『RSS離れ』が著しいようで、新しいサイトや、旧サイトでも修正のタイミングでRSSがサポートされなくなっているところもちらほらあるのよねぇ(たとえば「YOMIURI ONLINE」とか「J's GOAL」とか)。
 PULL型配信としてRSSはとても優れていると思うんだけども、サイト的には自サイトへ訪問せずにコンテンツを読まれることを懸念しているのだろうかねぇ。でも、見出しだけでも配信したほうが、客を集めるにはいいと思うんだけどなぁ。

 んで、そんなレガシー(?)な情報収集生活の中で、先週の末くらいから「はてなブックマーク」の更新情報が取れなくなってたのよ。まぁ、はてブは先月の上旬に新しいバージョンがリリースされ、その後もiOSアプリ関連も含めていろいろと改良されているようで、その絡みなのか今月頭くらいにサーバで何度かトラブルが起こしてたのよね。んなもんだから、今回の不調もそれが原因かなと思ってしばらく静観してたんだけど、サーバが復調してからも更新が取れてなくて、ちょっと困ったぞと。
 こっちのサーバのログ見てみると、どうやら12月4日以降でRSSファイルのクローリング中に取得に失敗しているらしい。仕方ないので、ちょっとしたテストプログラム書いて走らせてみたら、ファイルの取得時に“HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable”というエラーを起こしてくださっている。そのくせ、同じファイルをブラウザから見に行くと普通にデータが取れたりするもんだからどうなってんのよ、と。

 で、まぁ、こういう困ったときはGoogle先生にお尋ねすればいいいわけで、いろいろググってたら「12月の頭からはてブRSSがユーザーエージェントなしのアクセスだと500エラーを吐く - 情報の海の漂流者」という情報を発見。なるほど、なのでブラウザでは見えるのに、PHPスクリプトでは弾かれてたのか。しかし、微妙な修正を入れるもんだなぁ、まったく。

 ということで原因はわかったので、クローリング用のPHPスクリプトを修正。ウチではcopyでダイレクトにRSSファイルを読み込んでいたので、その部分を

$options = array(
  'http' => array(
    'method' => 'GET',
    'header' => 'User-Agent: Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko',
  ),
);
$context = stream_context_create($options);
@copy($feed['feed_url'], $fname, $context);

こんな感じに修正。ちなみに、UA情報はInternet Explorer 11でのユーザーエージェント文字列を使ってみた。これでとりあえず情報は取れるようになったので一安心。

 まぁ、今回はRSSのトレンドとは直接関係ない話ではあったけども、しかしRSSはこれからどんどん廃れていくのかねぇ。

Posted by “Lupin” on 2015/12/07 21:31:55

2010年 6月15日(火)

* PHPのXML-RPC対応で一苦労    [  Movable Type | PHP  ]

 Ubuntuに乗り換えたサーバはその後も順調に稼働していて、日々ログのチェックなんかはしているものの、とくに気なる部分はなし。10.04はリリースされて1カ月半だけど、細かな修正はときどき入っているようで、カーネルも2回ほどアップグレードされたかな、たしか。まぁ、そのあたりもパッケージの自動更新になってるので、とくに手間もかからないし(カーネルのアップデートの際だけ、再起動が必要になるけども)。

 で、ほとんどが最新のモジュールになっている中で、唯一、MTだけが古いバージョンで運用しているので、ちょいと最新版がどんなものか、チェックを兼ねてテスト環境にインストールしてみたわけですよ。
 とりあえずMT本体は、今ウチで稼働しているのがMT3.38で、現在の最新版はMT5.02なので、2つもメジャーバージョンが上がってるわけで、なんというか、ずいぶんと世界が変わってたって感じで…(^^;)。ま、MT本体に関しては別エントリで書く予定。

 んで、いろいろテストしてる過程で、自作して利用しているXML-RPC APIを使ったフォームでエントリを登録すると文字化けしちゃうことが判明。あちこちの設定とかいじってみてもダメだし、同じフォームでMT3/MT4では問題ないのに、MT5だけで問題が出たりして、さらにその部分をMT3/4相当にデグレードすると問題が解決するので、てっきりMT5側の問題じゃないかと思ってサポートの人とかにコンタクトとってみたりもしたんだけども、あっちでは再現しないと…。

続きを読む...
Posted by “Lupin” on 2010/06/15 22:21:20

2007年 9月10日(月)

* PHP: Javascriptのescapeに対応したunescape関数のバグ    [  PHP  ]

 先日オープンしたサブサイト用にMT用の投稿ページをつくるときに、JavascriptのBookmarkletからデータを取り込めるようにするために利用したのが「unescape(PHP)関数 Javascript版escape日本語POST対応」で紹介されているunescape関数。
 このページでも紹介されているけど、Javascriptから特定のページにデータを渡す際にはescape関数でエンコードして渡すのが一般的なんだけど、PHPではこれでエンコードされた文字列をデコードする手段がデフォルトでは用意されてないわけだ。でも、まぁ、そういうのは時間が解決してくれるわけで(笑)、どこかの偉いエンジニアがデコードできる関数を作ってくれて公開されているというわけ。すごいなぁ、偉いなぁ(^^)。

続きを読む...
Posted by “Lupin” on 2007/09/10 18:02:22

2007年 9月 9日(日)

* 検索キーワードの抽出    [  blog全般 | Linux | PHP  ]

 ってなわけで、ApacheのLogから検索キーワードを抽出するプログラムを書いてみたり。まぁ、キモの部分はこんな感じで。

<?php
    $pattern = '!^(.+) (.+) (.+) \[(.+)\] "([^ ]+) ([^ ]+) (.*)" (.+) (.+) "http://www\.google\.(?:com|co\.jp)/search\?(.+)" "(.+)"!';

    if ($fs = fopen($argv[1], "r")) {
        while (!feof($fs)) {
            $buffer = fgets($fs, 4096);
            if (preg_match($pattern, $buffer, $matches)) {
                $query = $matches[10];

                if (preg_match('/(?:&|\?)q=([^&]+)/', $query, $matches)) {
                    print mb_convert_encoding(urldecode($matches[1]), mb_internal_encoding(), "auto") . "\n";
                }
            }
        }
    }
?>

 ま、とくに難しいことはやってません。最後のキーワード抽出時にmb_internal_encoding()を使ってるんで、WindowsでもLinuxでもそのまま使えるはず。一応、Vine 4.1とWindows Vista上のPHP5では動作は確認してます。あ、上記のソースをhoge.phpとして格納してから、php hoge.php access_log のようにログを食わせてください。
(キーワードの抽出に失敗する場合があったので、2つ目のpreg_matchのパラメータを修正 - 9/10)

 んで、これをベースにgoogle以外のサイトに対応させるとかいろいろ手を加えて、access_logから1日に1度、データを抽出するようにして、そのデータを読み込んでWebページで表示させるようにしてみたり。まぁ、自分で眺めるだけなんで、とくにきれいに作る必要もないから、かなり手抜きだけど(笑)。ちなみに、画像でモザイクがかかってるのは、検索元のIPアドレスが表示されてるところ。
 しかし、c(カテゴリ一覧)とかm(月別)のページでヒットしてるのは使えないだろうなぁ(^^;)。早いとこ、除外されるといいんだけどねぇ。

Posted by “Lupin” on 2007/09/09 17:40:33