PHPでPhotosynthのSOAP APIを呼んでみた


Photosynthには、下記のURLにおいてSOAP APIが用意されています。
PhotosynthService Web Service

今回は、この中から『GetCollectionData』というAPIを使ってみることにします。これは、対象のPhotosynthのGUID(PhotosynthのコンテンツのURLの最後についているID。先日紹介したNASAのPhotosynthなら、”a8d71756-1671-493e-a07d-4ebf0eda0faf”)を渡すことにより、そのPhotosynthのデータついて記述したXMLを返すAPIです。

実を言うと、PHPでSOAP APIを利用する方法以前にSOAPというものがどういうものかよく分かっていなかったのですが、簡単に説明するとPOST渡しで指定のフォーマット通りにXMLを渡すとXML形式で結果が返ってくるのがSOAPだそうです。でも、どうやらWSDLモードというものがあると、それを使うことによりSOAP APIを簡単に利用できるのだとか。普通にXMLで渡す方法でいいような気もするのですが、PHPでSOAPを使う方法を探してみるとこのWSDLモードを使う方法ばかりで、これが正直よくわかりませんでした(PhotosynthのWSDLはこちら)。正直今でもよく分かってない部分はあるのですが、とりあえず下記のサイトなどを参考に作ってみました。
参考:PHP: SoapClient – Manual
参考:PHP5のSOAP関数のサンプル

そうして作った関数が下記。

これは、PhotosynthのGUIDの文字列を引数にいれて呼ぶと、SOAP APIのGetCollectionDataを呼んだ結果を返す関数となっています。

試しに下記のような感じで、var_dumpで出力するだけのページを作ってみました。

サンプルページ:NASAのPhotosynthのGUIDでSOAP APIを呼んだ結果

ここで、JSON形式で書かれたページのURLを取得できますが、ここからPhotosynthで利用している画像を取得するのに必要なデータが得られるようです(本当はその画像を表示するページを作ろうと思ったのだけれども、単純にJSONに画像のURLが書かれてるわけではないようなので断念。そのうちそのようなページを作るかもしれません)。

他にも、最初に記したページを軽く読み流してみると、APIを使うことにより、Photosynthを独自のサーバーで追加したり削除したりできるようです。使い方はわかりませんが・・・。

余談ですが、先日、Photosynthを開発したMicrosoft Researchのシリコンバレーの開発拠点が閉鎖されたようです。
参考:米マイクロソフトが2100人削減、シリコンバレーのR&D拠点閉鎖 | ビジネス | 最新ニュース | ニューズウィーク日本版 オフィシャルサイト
参考:Microsoft Research Silicon Valley 最後の日を見て – (iwi)の日記

このニュースについて、Photosynthがどれぐらい関係しているのかどうかというのはよく分かっていないのですが、今後どうなるのか気になります。

PHPでWebスクレイピングをやってみた


前から興味があったけどやったことがなかったPHPでのWebスクレイピング。調べてみると、『PHP Simple HTML DOM Parser』というのがいいらしい(参考:PHP Simple HTML DOM Parserの使用方法 – Webスクレイピング ライブラリ)。
PHP Simple HTML DOM Parser – Browse Files at SourceForge.net

というわけで使ってみることに。まずは上記ページからsimple_html_dom.phpをダウンロードして作成するPHPと同じフォルダに置く。今回のウェブスクレイピングの対象ページははてなブックマークのタグ検索ページ。はてブのタグ検索結果ページのそれぞれのエントリーはsearch-resultというクラスのliタグ内に記述しているようなので、search-resultクラスの要素を取得してforeachでループしたらよさそう。

やってみたら思った以上に簡単にできたので、ちょっといろいろ機能つけくわえてみた。以下、body部分のみ抜粋。

サンプルページ:スクレイピングテスト

内容としては、タグと除外URLを入力してブックマーク数を指定して送信ボタンを押すとはてなブックマークのタグ検索の結果(最高200件まで)を出力するというもの。除外URLを入力すると、表示させないエントリーを指定できる。

例えば、タグに『ニコニコ動画』、除外URLに『http://www.nicovideo.jp/』と入れると、結果はURLに『http://www.nicovideo.jp/』がURLに入ってないエントリーだけが表示される(前方一致ではなく、URLのどこかに含まれていたら除外する)。
http://amyu.minibird.jp/scraping/scraping_test.php?tag=ニコニコ動画&cut=http%3A%2F%2Fwww.nicovideo.jp%2F&users=3

とりあえず、5ページぐらいなら怒られないだろうと思って最初5ページのみを見るようにした。他に影響がでるもんでもないと思うので、XSSとか考えずにコーディングしてます(それ以前にもっとキレイなコードを書くようにしろと怒られそうですが・・・)。

本当、思った以上に簡単にできたので時間があれば何かウェブサービスっぽいものを作ってみたい。

サイドバーに最近読んだ本(ブクログに追加した本)のアソシエイトリンクを追加


昨年の11月より、ブクログの無料ユーザーは、アマゾンのアソシエイトIDを設定できなくなりました(参考:ブクログ、無料ユーザーは「AmazonアソシエイトID設定」が利用不能に(2013年11月6日15:00より) | Synthetic LOG)。
とはいっても、自分にはほとんど関係ない話で、アマゾンの紹介料レポートをみても、ブクログ経由でクリックされたものはなさそうです。

ところで、今までサイドバーにて使っていたブクログのブログパーツ(ミニ本棚)。最近読んだ本(というより、最近登録した本)を一覧で表示してくれるのはいいのだけれども、リンク先がブクログのURL。当たり前だろと言われそうですが、個人的にはアマゾンに直接とんでくれるほうがうれしい。
というわけで、自分でやってみることにしました。

利用したデータはブクログで配信されているRSS(http://booklog.jp/users/amano225/feed)。ブクログでは非公式APIとしてjsonも配信しているようですし(参考:ブクログのAPI(非公式)を使って本の情報をjQueryで取得してみた :: backyard.weblog)、そちらのほうが多分簡単に実装できるとは思うのですが、今回はRSSのほうを利用することに。
また、今回のやり方では『PHP Code Widget』というプラグインを使っています。PHP Codeのウィジェットをサイドバーにいれて、下記のように入力。

今回困ったことに、simplexml_load_fileを使って直接RSSのXMLをパースできなませんでした。ブクログのRSSでの表示は、HTTPリクエストヘッダにユーザーエージェントが必要なようです(7~12行目で設定)。ユーザーエージェントは空文字でもいいようなのですが、とりあえず”am-yu.net”と設定しておきました。HTTPリクエストヘッダをつけてsimplexml_load_fileで取得する方法はあるのだろうか。調べてみても分かりませんでした。

23行目ではアマゾンへリンクできる本かどうか、25行目ではレビューがあるかどうかを見て、26行目で両方そうであればリンクを作成するようにしています。これは、自分がhontoの電子書籍を購入してブクログに登録することがあるため。やろうと思えばhontoのアフィリエイトリンクも作れるとは思うのですが、hontoのアフィリエイトIDを持ってないのでやってません。レビューがあるかないかは別に見る必要はないかもしれませんが、あまり触れてほしくない本はレビューをしてないのでレビューしてるかどうかで表示するか判断することに。
また、掲載する本は最大5冊にしています。

amazonへのURLについては下記のページを参考にしました。
AmazonのURL短縮|最新版
“ref=nosim/”はつけたほうがいいのかな? とずっと思ってたけど、今は別に関係ないようです。

関数にしてるのは、PHP Codeの動きがよく分かっていないため、変数名の衝突する可能性もあるのではないかと思ってそうしました。PHPはあまり詳しくないのでこうしましたが、もっと良い方法があるかもしれません。

ところで、最後に一つだけ言っておくと、自分のブクログのレビューは、たまに日記や雑記みたいなことを書いてしまっています。

PHPでウェブページを読み込み、サーバーに保存する方法


わけあって、外部RSS(XML)を自身のサーバーに保存したくなったので、ちょっと調べてみた。

多分、以下の方法が一番簡単。http://am-yu.net/feed/

file_get_contents()でウェブページ(ファイル)を読み込んですべて取得し、file_put_contents()で保存するというもの。

Cronなどの自動実行ツールと組み合わせて、RSSリーダーみたいなものを作ることができるはず。

PHPで自動キーワードリンク


別に運営しているサイトで、用語集なんてコンテンツがあります。最近、自動キーワードリンク機能がほしくなって探したら正規表現で簡単にできそうなので、作ってみました。今回はそのメモ。

このエントリーでは『JavaとJavaScriptは名前は似てるけど、違うプログラミング言語だよ』という文章と『Java』『JavaScript』『プログラミング言語』の3つが入った配列を用意して、Wikipediaのページにリンクするということをやってみます。

ソースコード

簡単に解説をしておくと、5~10行目で、正規表現用の変数を作ってます。|がORの意味で、8行目で$listの中を一つずついれていってます。
 12行目で置換してます。$1はかっこ()内の正規表現結果をあらわしてます。実行結果は以下です。

実行結果

JavaJavaScriptは名前は似てるけど、違うプログラミング言語だよ

うーん。『JavaSceipt』の部分が『JavaScript』ではなく『Java』で認識しちゃってます。どうやら、同じ位置から始まった単語では、正規表現の|の区分けにおいてはじめのほうにある単語が優先されちゃうそうです。
 というわけで、$listを文字列の長い順に並べ替えてから$regを作ることにしましょう。ここではPHPのユーザー定義でソートできるusort関数を使うことにします。

ソースコード

5行目から8行目でソート用の関数を作って、usortの第二引数でその関数の名前を渡しています。

実行結果

JavaJavaScriptは名前は似てるけど、違うプログラミング言語だよ

うん。うまくいった。

ところで、これでうまくいってはいるんですが、URLエンコードをしたほうがもっといいような気がします(というより、自分が作ったサイトは、URLエンコードしないとIEでは、ちゃんと動いてくれなかった)。
 URLエンコードは、19行目の下に以下のコードを追加したら動くはずです。

これが一番自分でもよく分からなかったとこ。下記のページを参考にしました。
参照を使ったリンクをurlエンコードする方法 – PHPプロ!Q&A掲示板

というわけで実行結果

実行結果

JavaJavaScriptは名前は似てるけど、違うプログラミング言語だよ