気になる言葉ショップ

気になる言葉ショップでは、管理人のわがままで選ばれた気になる言葉ごとのオンラインショッピングコーナーを設けています。
Home >
Webサービス

twitterに商品情報をつぶやく(2)

商品情報のAPIを利用して、twitterに商品情報をつぶやくphpプログラムを作って見ようかと思います。のつづき。
まずは、twitterのAPIを使えるように、アプリケーションの作成(twitterの管理画面の表現がcreat New Appsとなっているのでこう書きます)をします。
続きを読む

twitterに商品情報をつぶやく(1)

商品情報のAPIを利用して、twitterに商品情報をつぶやくphpプログラムを作って見ようかと思います。
続きを読む

PaypalのIPNでGoogle Analyticsに通知する(PHP)

Paypalには、購入時などにバックグランドで処理が行えるようにIPN(即時支払通知)という機能があるので、これを使って、購入してくれたらWordpressを使った会員制サイトに登録するということをしよとしていました。これは、WordPressのプラグインWP-Membersでできたのですが、ついでに、Google Analyticsにつうちできないかと調べてみました。 続きを読む

Webサービス

一般に、Webサービスとは、インターネットを介して外部からデータベースにアクセスしてXMLベースのデータを得られるように公開されている機能のことをいいます。
ここでは、本サイトで使用した時にわかったことを参考に残しておきます。

XML::Simpleとパーサー

いくつかのマシンに、Webサービスを利用したシステムを構築していると、サーバにより動きが異なり、サーバの負荷状態も違うようであり、ググってみました。
どうも原因は、XML::Simpleが使うパーサーにあるようです。(パーサーは、XMLのテキストを解読してプログラムで扱える構造にしてくれるものです。)XML::Simpleは、そのマシンで最後にインストールされたパサーを使うようになっているらしいです。
好みのパサーを使う場合は、
$XML::Simple::PREFERRED_PARSER = ‘XML::Parser’;
のように明示しておく必要があります。
私が、使った範囲での各パーサーの特徴は以下のとおり。
XML::SAX::PurePerl
もとの文書のエンコードが何であろうとUTF8にしてしまうようです。速度遅い。
XML::Parser
高速。エンコードがUTF以外だとうまくいかないみたい。
XML::LibXML::SAX
もとの文書のエンコードのまま処理をしてくれるようです。

アクセストレード WEBサービス

アクセストレードWEBサービスβ版( 以下ATWS )

提携したショップがWEBサービスを提供していると使えます。逆にいうと提携していないお店の商品は取り出せません。
まだ、β版のためか、カテゴリ指定が、使いにくいです。カテゴリといってもお店の登録してあるカテゴリのようで、お店がいろいろなカテゴリの商品を扱っているとカテゴリに関係ない商品も抽出されるようです。機能的には、サブカテゴリがありますが、まだ使われていないようです。

my $query ='[検索したい語]';
Encode::from_to($query,'sjis','utf8');
&encode($query);
utf8::decode($query);
my $url = "http://xml.accesstrade.net/at/ws.html?ws_type=searchgoods&ws_ver=1
&ws_id=[パートナーID]&row=20&sort1=5&search=" . $query;
my $content = get $url;
if($content eq ""){ return; };
my $xmlsimple = new XML::Simple(ForceArray => ['Goods']);
my $responce = $xmlsimple->XMLin($content);
foreach my $result(@{$responce->{Goods}}){
my $title = $result->{GoodsName};
$title = Encode::encode("utf8",$title);
Encode::from_to($title,'utf8','sjis');
my $corpname =$result->{ShopName};
$corpname = Encode::encode("utf8",$corpname);
Encode::from_to($corpname,'utf8','sjis');
my $opt = 'target="_blank" rel="nofollow"';
$opt .= ' onmouseover="window.status=\'' .$corpname .'へ\';return true;"
onmouseout="window.status=\' \';return true;"';
my $linkurl = "<a href=\"$result->{LinkCode}\" $opt>";
ここでいろいろ処理
}

Affiliate2.0Webサービス

ビッダーズの発展形。
AmazonのRESTに近い感じ。
シフトJISでのやりとりもできるので、シフトJISで行っていたら、XMLのパーサー問題にぶつかったようです。
<以下準備中>

電脳WEBサービス

電脳卸の提供するWebサービスですが、長期療養中。2006年6月20日再開予定。
使えなくなる前は、こんな感じで使ってました。

my $email = '[登録メールアドレス]';
my $hid = "[販売店ID]";
my $type = "heavy";
my $sort = "1";
my $url0 = "http://webservice.d-064.com/get_tag.php?"
."&email=". $email
."&hid=". $hid
."&type=". $type
."&sort=". $sort;
my $onsale='販売中';
# 検索文字列をUTF-8に。
my $query = '[検索したい語]';
Encode::from_to($query,'sjis','utf8');
&encode($query);
utf8::decode($query);
foreach $j(1 .. 3){ #最大10x3個のデータを取得
my $url = $url0 ."&sword=". $query ."&page=". $j;
my $content = get $url;
if($content eq ""){ return; };
$XML::Simple::PREFERRED_PARSER = 'XML::LibXML::SAX';
my $xmlsimple = new XML::Simple(ForceArray => ['Details']);
my $responce = $xmlsimple->XMLin($content);
my $link1 = $responce->{ProductPHP} . "?hid=" . $hid;
foreach my $result(@{$responce->{Details}}){
my $salestatus = $result->{SaleStatus};
$salestatus = Encode::encode("utf8",$salestatus);
Encode::from_to($salestatus,'utf8','sjis');
if($salestatus ne $onsale) {next;} #販売中でないものは除く
# 検索結果をシフトJIS変換。
my $title = $result->{ProductName};
$title = Encode::encode("utf8",$title);
Encode::from_to($title,'utf8','sjis');
my $detail = "";
if( !ref($result->{ItemDetail})){
$detail = $result->{ItemDetail};
if( $detail ne "" ){
$detail = Encode::encode("utf8",$detail);
Encode::from_to($detail,'utf8','sjis');
}
}
my $linkurl = "$link1&pid=$result->{ItemID}&oid= $result->{ORID}";
my $imgurl = $result->{ImageUrlMedium}; # バナーURL
ここでいろいろ処理
}
if($j >= $responce->{TotalPages}){last;} #最後のページまで終了
}

パーサーは、高速版だとフォーマット違反にある場合あり。

Amazon ECS 4.0

Amazonのアフィリエイトは、本だけで1万円稼がないとお金をてにできないので遠慮していたのですが、この前見たら、本以外にもいろいろあるし、最低支払金額も5千円になっているので、挑戦してみることにしました。

Amazon E-Commerce Service(ECS) 4.0は、Amazon Web サービス(AWS)3.0から、2004年にメジャーバージョンアップしたものです。
ECSには、RESTとSOAPの2種類が用意されています。RESTとはREpresentational State Transferの略で、WWWの実装にあたってリソースを特定するURIと、リソースにアクセス、操作するためのプロトコルとして、シンプルなHTTP(POST,GET,PUT,DELETE)を使用するアーキテクチャ。
簡単に言えば、ホームページを見るのと同じ要領で、URLにパラメータを含めてリクエストを出すと、ホームぺージのHTMLでなく、XMLでデータがかえってくる方法。
SOAPより取っつきやすいので、RESTを使っている人が多いようです。従って、情報もRESTの方が多いので、RESTで作って見ました。

use Encode;
use XML::Simple;
use LWP::Simple;
use XML::Parser;
my $query = '[検索したい語]';
Encode::from_to($query,'sjis','utf8'); #UTF8に変換
&encode($query); #URLエンコード(別に用意)
utf8::decode($query);
my $affID = "[アソシエイトID]";
my $accessKey = "[アクセスキー]";
my $searchIdx = "Blended"; #全ての商品
my $verDate = "2006-05-17";
my $url = "http://webservices.amazon.co.jp/onca/xml";
$url .= "?Service=AWSECommerceService&Version=$verDate";
$url .= "&AWSAccessKeyId=$accessKey&AssociateTag=$affID";
$url .= "&Operation=ItemSearch&SearchIndex=$searchIdx";
$url .= "&ItemPage=1&ResponseGroup=Medium&Keywords=$query";
my $content = get $url;
if($content eq ""){ return; };
my @ltime=localtime(time); #情報取得時間表示用
my $stamp = sprintf("[\'%02d年%d月%d日 %02d時%02d分(日本時間)時点]",
$ltime[5]-100,$ltime[4]+1,$ltime[3],$ltime[2],$ltime[1]);
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
my $xmlsimple = new XML::Simple(ForceArray => ['Item','Artist','Creator'
,'EditorialReview']);
my $responce = $xmlsimple->XMLin($content);
foreach my $result(@{$responce->{Items}->{Item}}){
if($result->{ItemAttributes}->{IsAdultProduct}) {next;} #アダルト除外
if($result->{OfferSummary}->{TotalNew} == 0){next;} #品切れ
# 検索結果をシフトJIS変換。
my $title = $result->{ItemAttributes}->{Title};
$title = Encode::encode("utf8",$title);
Encode::from_to($title,'utf8','sjis');
my $comment = ""; #制作者等の情報
if($result->{ItemAttributes}->{Binding} eq 'CD'){
$comment = "アーティスト:";
foreach my $author(@{$result->{ItemAttributes}->{Artist}}){
$author = Encode::encode("utf8",$author);
Encode::from_to($author,'utf8','sjis');
$comment .= "$author ";
}
} else {
my $pre = "";
foreach my $creator(@{$result->{ItemAttributes}->{Creator}}){
my $role = "<br>$creator->{Role}:";
if($pre eq $role){
$role =",";
} else {
$pre = $role;
}
my $author = $role . $creator->{content};
$author = Encode::encode("utf8",$author);
Encode::from_to($author,'utf8','sjis');
$comment .= "$author ";
}
}
foreach my $review(@{$result->{EditorialReviews}->{EditorialReview}}){
my $content = $review->{Content};
$content = Encode::encode("utf8",$content);
Encode::from_to($content,'utf8','sjis');
$comment .= "<br>$content";
}
my $opt = 'target="_blank" rel="nofollow"';
my $linkurl = "<a href=\"$result->{DetailPageURL}\" $opt>";
my $imgurl = $result->{MediumImage}->{URL};
if(index($imgurl,'http:')<0){ #画像が無い場合の代替画像
$imgurl=$EST{img_path_url} . "noimage.gif";
}
ここでいろいろ処理
}

アダルトチェックの{IsAdultProduct}は、バージョン"2006-05-17"からですので、バージョンの指定を忘れずに。

Google Web API

GoogleのWebサービスは、SOAP(ソープ。元はSimple Object Access Protocolの略だが、現在ではW3Cが、何かの略でなく固有名詞と宣言しています)を使用しています。

Yomi-Searchをベースにしていたので、
Yomi-Search FAN!「Googleの検索結果をYomi-Searchのテンプレートで表示するには?」を参考にしました。

以下のような感じのコードを使いました。

use Jcode;
use SOAP::Lite;
# Google Web API を利用して、Google から検索結果を得る。
my $google_key='[取得したGoogle Key.]';
my $google_wsdl = "./GoogleSearch.wsdl"; # WSDL指定.
# Start Google Web API.
my $google_search = SOAP::Lite->service("file:$google_wsdl");
# 検索文字列をUTF-8に。
my $query = '[検索したい語]';
$query = jcode($query)->utf8;
utf8::decode($query);
# Query Google(10件をリクエスト)
my $results = $google_search ->doGoogleSearch($google_key, $query, 0, 
10, "false", "", "false", "", "UTF-8", "UTF-8"); foreach my $result (@{$results->{'resultElements'}}) { # 検索結果をシフトJIS変換。 my $title = $result->{'title'}; my $snippet = $result->{'snippet'}; my $url = $result->{'URL'}; $title = jcode($title, 'utf8')->sjis; $snippet = jcode($snippet, 'utf8')->sjis; # 不要なタグを消してみる。 $title=~s/\n//g; $title=~s/<b>//g; $title=~s/<\/b>//g; $snippet=~s/\n//g; $snippet=~s/<b>//g; $snippet=~s/<\/b>//g; $snippet=~s/<br>//g; $title = 'タイトル無し' if (!$title); $snippet = '紹介文無し' if (!$snippet); ここでいろいろ処理 }

利用したのは、
・title=サイトのタイトル。
・url=サイトのURL。
・snippet=サイトの概要。
の3つの項目で、実際の利用例は、グアムの下の方の関連リンクのところ。