APIサービスを利用
APIサービスを利用して岡山WEBというサイト名にそったコンテンツを作ってみました。前回はアマゾンWEBサービスを利用して岡山作家ガイドを特集しましたが、今回「ぐるなび」という全国のグルメ情報をを扱っているサイトの「ぐるなびwebサービス」を利用して、グルメサーチ岡山というコンテンツにしてみました。次にリクルートのフロム・エーナビというアルバイト・バイト・仕事探しの総合サイトの「お仕事検索webサービス」を利用して岡山エリアのアルバイト情報に特化したコンテンツを試作してみました。
アマゾンwebサービスを使う
前々から、岡山WEBネットに岡山出身の作家の著作一覧を表示させることが出来たらと思っていたのですが、APIサービスのアマゾンwebサービスを使うことで可能ということが分かりました。参考にしたのは「PHP×WEBサービス APIコネクションズ」という本です。残念なことにPHP5を前提に書かれているので、サンプルコードをそのまま使うことは出来ませんでしたが、一部を変更することでPHP4.3でもTESTすることが出来ました。
一応の結果をチャンネル::岡山出身作家ガイドに載せています。
今のところ、その作家以外に、その作家の名前のついた文学賞の受賞作もいっしょについてきていますがそのうち修正します。
なお、アマゾンからのデータは一度(1ページ)に10件分しか出てきませんので、10件以上のデータを表示するにはページ送りのページャーが必要です。今回、ページャーは、レッツPHP!さんの「簡易ページャ」を使わせてもらいました。このような便利なツールを公開してくださったことに感謝いたします。
今度はぐるなびの岡山版の情報をを岡山WEBネット上に載せてみようと思います。APIサービスのおかげで単なるホームページリンク集に加えて、岡山に関するサイトとして充実できそうです。
APIを使いたい-3
APIの対象は、livedoor「お天気Webサービス。」です。ここから例えば岡山南部の明日の天気予報をリクエストパラメーターを使用して、XMLで呼び出し、その中から必要なデータを取り出してWEBに表示させようと思います。PEARのXML_Serializerを使うことでXMLの解析ができ、必要な情報が読み出せます。
require_once "XML/Unserializer.php";
$xml_data = file_get_contents("http://weather.livedoor.com/forecast/webservice/rest/v1?city=88&day=tomorrow");
$parser = new XML_Unserializer(array('parseAttributes' => true));
$parser->unserialize($xml_data);
$XML = $parser->getUnserializedData();
print_r ($XML);
このprint_rは、変数の情報をかえすコマンドで、この場合、$XMLに収められた変数(パラメーターから得られたXMLの情報)の構造が分かります。実は最初見た時はよく分かりませんでした。このようになります。(UTF-8で出てくるのでブラウザのエンコードをUTF-8にします。)
Array
(
[version] => livedoor Weather Web Service 1.0
[author] => livedoor Weather Team.
[location] => Array
(
[area] => 中国
[pref] => 岡山県
[city] => 岡山
)
[title] => 岡山県 岡山 - 明日の天気
[link] => http://weather.livedoor.com/area/33/88.html?v=1
[forecastday] => tomorrow
[day] => Tuesday
[forecastdate] => Tue,28 Aug 2007 00:00:00 +0900
[publictime] => Mon,27 Aug 2007 05:00:00 +0900
[telop] => 曇り
[description] => 中国地方は、薄雲が広がっていますが、高気圧に覆われているため、概ね晴れています。
今日(27日)は、高気圧に覆われますが、湿った空気の影響で大気の状態が...
[image] => Array
(
[title] => 曇り
[link] => http://weather.livedoor.com/area/33/88.html?v=1
[url] => http://image.weather.livedoor.com/img/icon/8.gif
[width] => 50
[height] => 31
)
)
PHPの参考書など読んだ時、少し分かりにくいのでいつもとばしていた連想配列と気づくのに少し時間がかかりました。そのうえ、初歩の説明には、単純な連想配列の説明だけなので、このような配列の中に配列があるような多次元連想配列の分かりやすい説明には、なかなかお目にかかりません。いろいろと検索していると、
JOHO.BOO.JP というサイトにプログラミングメモのコーナーがあり、PHP、多次元配列という項目がありました。ここに多次元配列の情報を読み出す方法が書いてありました。これにより、先ほどの$XMLから必要な項目だけ読み出すことが出来ます。
print $XML["location"]["city"];
print $XML["link"];
print $XML["title"];
print $XML["telop"];
print $XML['image']['url'];
これで出力結果は、
岡山 http://weather.livedoor.com/area/33/88.html?v=1岡山県 岡山 – 明日の天気曇りhttp://image.weather.livedoor.com/img/icon/8.gif
となるはずです。後は、ひとつずつ文字コードをエンコードして、わかりやすくレイアアウトすればいいと思います。
APIを使いたい-2
PHP5がサーバーにインストールされていたらこんなに苦労しなくてもすんだのですが・・・、
PHP4.3とPEARの力を借りてlivedoor「お天気Webサービス。」が使えそうです
いろいろと参考になりそうなサイトを検索してようやくたどり着いたのがEC studioというブログ。そこにPEARのXML_Serializerを使うことによりXMLデータを配列に格納する処理ができるということがわかりました。
XML_Util とXML_Parser が必要なのでそれらもいっしょに追加。次は、どんな配列になるか確認して見ようと思います。
APIを使いたい
最近は公開API(アプリケーション・プログラミング・インターフェース)という便利なツールがある。それらは、お天気情報や楽天のショップ情報、アマゾンのショップ情報などをXMLなどで提供してくれるサービスなので、PHPを勉強するのならやはりAPIにもとりかかりたいということで、いろいろと情報を集めて見ました。
参考にしたサイトは10分で理解する初めてのAPIとかPHPでWebAPIを骨までしゃぶるです。
しかし、どうも調べるにつれPHPのバージョンが5.0以降でないとついていけないようです。このブログを置いているレンタルサーバーのPHPは4.3なのです。それでも説明をよく読むと、PEARというライブラリをインストールするとできないこともないようだということでした。
レンタルサーバーにPEARを導入するには、サーバーの管理会社へ依頼するか自分でインストールするしかないのですが、今回はとりあえず自分でインストールしました。
まず、ローカルのWINDOWSパソコンにインストールしているPHPには既にPEARのインストーラーgo-pear.batがあるのでそれをdosプロンプトで実行し、その後必要なライブラリーを追加でインストール。
この辺りは、WindowsへPEARをインストールする が参考になりました。
そして、ローカルのPEARをサーバーにアップロードしHTACCSEEにPEARのパスを通して完了。いよいよお天気APIに挑戦してみることにします。
PHPで配列の勉強2-Feedcreatorを試用
CGIでRSSフィードを生成するのにはYUKI::RSSが簡単に使えることは以前このブログで紹介しましたが、PHPには、Feedcreatorという便利なライブラリーがありました。このライブラリーはLGPLなのでだれでも自由に使用できるものということなので試用して見ることにしました。
ダウンロードはSourceForge.netからです。
RSS 0.91/1.0/2.0、Atom 0.3/1.0などのフォーマットに対応しているので、好みのスタイルでフィードを作成することができます。デフォルトはRSS0.91でした。
まず、ダウンロードしてきたファイルのうち、ライブラリーは「feedcreator.class.php」ですが、日本語に対応させるため、672行あたりのvar $encoding = “ISO-8859-1″; のISO-8859-1をUTF-8に変更しました。サンプルのdemo.phpをみると、YUKI::RSSと同じようにライブラリーを読み込ませ、最初のブロック(//define channel)の部分でサイトのタイトル、説明、サイトURLなどの固定部分を書き込み、次のブロック(//channel items/entries)に記事を書きこんだらいいようです。//channel items/entriesのブロックにデータベースからデータを読み込む例がダウンロードしたファイルのofficial_demo.phpに書いてありましたが、そこまではまだ手が出ないので、CSVのようなデータファイルから配列を使って一行ずつ書き出すように考えて見ました。(配列の勉強です)
1、データファイルの準備
ファイル名 data.txt(UTF-8で保存)
内容:
111111,aaaaaaa
22222,bbbbbb
33333,cccccccc
こんなデータを作って保存。今回は文字の変換を考えないように、エンコードをUTF-8で保存。
2、RSSフィードを作成するためのPHPプログラムを以下のように作ってみました。
< ?php
define(’TIME_ZONE’,‘+09:00′);//日本時間に変更
require_once ‘include/feedcreator.class.php’;//設置場所のパスを指定
$rss = new UniversalFeedCreator();
$rss->useCached();
$rss->title = ‘新着情報’;
$rss->description = ‘岡山WEBサーチの新着情報です’;
$rss->link = ‘http://www.okayamaweb.net/’;
$rss->syndicationURL = ‘http://www.okayamaweb.net/***.xml’;
//データファイルから記事を読み出す
$file_data=file(”data.txt”);
//複数行に渡るファイルの内容を読み出す
foreach($file_data as $value){
list($title,$body) = split(”,”,$value);
$item = new FeedItem();
$item->title=$title;
$item->link = ‘http://www.okayamaweb.net/’;
$item->description =$body;
$item->author = ‘okayamaweb’;
$rss->addItem($item);
}
//$rss->saveFeed(’RSS2.0′,’sample.xml’);
$rss->outputFeed(’RSS2.0′);//RSS2.0を空欄にすると0.91で表示1.0と記入するとRSS1.0で表示
?>
とりあえず簡単な例ですが、いろいろと応用できそうです。一応エスケープ文字にも対応していました。ただし、日本語への変換がどこまで出来ているのかは使って見なければ分かりません。
PHPで配列の勉強
久しぶりにPHPで配列の勉強をした。
目次などの表示を列表示で大項目-小項目-小項目というようなデータの表示を考えていました。いわばツリー状なデータの項目表示で、ホームページのメニュー表示をPHPの配列で表示できないかということです。
例えば、
コンピューター(大項目)
- アップル
- 九十九電機
- エプソンダイレクト
- DELL
というようなメニューを配列を使ってPHPで表示したかったのです。
データの登録方法などいろいろ試行錯誤した結果、データ1行に大項目と小項目を書き込んだら配列で表現できるということが分かりました。
例えば、
<?php
$data=(“コンピューター,アップル,九十九電機,DELL,エプソンダイレクト,ヒューレットパッカード”);//先頭に大項目を、次から小項目を書き込む
$data=explode(“,”,$data);
$daikoumoku=$data[0];
$count=count($data);
print($daikoumoku);//ここで大項目$data[0]を書き出す
print(“<ol>”);
for ($i=1; $i<$count; $i++)//dataの2項目$data[1]から項目数より一つ少ない$data[5]までひとつずつ書き出します
{
$syoukoumoku=$data[$i];
print(“<li>”);
print($syoukoumoku);
print(“</li>”);
}
print(“</ol>”);
?>
というようにです。
なお、まだまだ勉強中なのでおかしなところがあるかも分かりませんがご容赦を。
wordpressのバージョンアップ
岡山webブログを作成しているWordpressが2.2にバージョンアップしたので、やってみました。しかし、サーバーの仕様がよくわからないのと、以前インストールした時に、EUCでインストールしていたことですんなりとはいきませんでした。
WordPressにはMySQL というデータベースがサーバーに設置されていないといけないのですが、そのMySQL からバックアップをとったものが文字化けをしてバックアップにならないのです。サーバーの仕様のせいだとは思うのですが。私にとっては、この解決にはまだ時間と知識が必要なようです。
それと、Wordpress2.2はEUCが使えず、UTF-8でないといけないのでバックアップをさらに文字変換する必要がありました。
今回、よく分からん!ということで新しいフォルダーにインストールして、全部手作業で、コピー&ペーストで入れ替えました。
初心者でもMySQL とphpMyAdminのことがよくわかるテキストがあればいいと思うのだけれどなかなかいい本がありませんね。
Yuki::RSSを使ってRSS生成
PHPのおかげでMagpieRSSを使って、RSSを取り込んでWEBに表示することができることが分かったのですが、次は、掲示板などのログデータやYomisearchなどのログデータをRSSに生成できたらいいかと思い、いろいろと探していたら、Yuki::RSSというCGIのモジュールにたどり着きました。XML::RSSという本格的なモジュールもあるようですが、他に付属のモジュールをほとんど必要としない小さなモジュールということで使って見ることにしました。最初はどうやっていいのか分からなかったのですが、
というKamoLandさんのサイトを参考にしてyomisearchのログデータからRSSを生成するCGIを作成することができました。上記サイトでは、表示件数や日付のソートなどいろいろと条件を加えていましたが、CGI初心者としては、単純にログファイルを読み込んで、Yuki::RSSを使ってRSS1.0を生成するCGIができればいいということでシンプルなプログラムとしました。もう少しCGIを勉強すればいろいろな条件を加えたRSSを生成することが出来るかも分かりません。現在トップページに表示している新着更新サイト、相互リンクピックアップはKamoLandさんとYuki::RSSとMagpieRSSのおかげです。
MagpieRSSをいろいろ試して
PHPで使えるRSSパーサーのMagpieRSSをいろいろと試しています。
書かれているのがPHPなので、表示には、もちろん、PHPの関数が使えます。
たとえば、RSSの何項目もある<item>から7項目のみ表示させたいときは、
$rss->items = array_slice($rss->items,0,7)
array_sliceという関数が使えます。
問題は、日付の変換です。日付に関しては、いろいろな表現方法があるようで、変換もそのつど悩んでいます。(基礎がないので仕方がありませんが)。
あるサイトの日付の出力は、
<pubDate>Thu,15 Mar 2007 15:00:00 +0900</pubDate>
となっていて、この場合は
$date=$item[pubdate];
$daytime=date(“■Y年m月d日”,strtotime($date));
$daytime = JcodeConvert($daytime,0,1);
などとするとうまく変換されました。
また、あるサイトのRSSは、
<dc:date>2006-12-27T09:58+09:00</dc:date>
となっていました。この書式の年号の変換の仕方とdc:dateという書き方をどういうふうに変換したらいいのかわからず、いろいろ試してもエラーばかりでしたが、MagpieRSSを紹介していたサイトのコメントの中に答えがありました。
dc:dateは[dc][date]いうことと、MagpieRSSのユーティリティが使えそうなことが分かりました。こんな感じでうまく変換できました。
include_once ‘rss_utils.inc’;
$date=$item['dc']['date'];
$date=parse_w3cdtf($date);
$daytime=date(‘■Y年m月d日’,$date);
$daytime = JcodeConvert($daytime,0,2);
何かに書き留めておかないと忘れることもあるので、web作成メモとして残しておくことにします。
