Rakuten API PHP〜楽天SDKを斬る(part2)〜

イントロダクション

前回は、楽天APIを使うために楽天SDKをレンタルサーバー上にアップロード(インストール)しました。

今回は、SDKを使用して1つページを作成しようと思います。

PHPの動きの確認

PHPは、基本的にサーバー上でプログラムが動きます。つまり、サーバーサイドです。
なので、下のようにHTMLと一緒にプログラムコードが書いてあるけど、
HTML部分はブラウザに表示されるものです。つまり、クライアントサイドになります。

早い話が、「サーバー側でPHPが出力したHTMLがクライアント側で表示される」ということです。

<? php
      // PHPのプログラムがサーバーサイドで動く
?>
<html>
 <!-- HTMLファイルの内容はクライアントサイドで表示(動く) -->
</html>

APIの使い方

APIの使い方はこちらのページ(楽天のヘルプ)です。

楽天APIの実装

ヘルプを見ると、上の様な画面が見つかります。「アプリ登録」が必要ということで、はやい話がAPIを使用するためのキーを取得します

上の様にアプリ名と起動するPHPファイルのURLを入力します。

上の様な感じで登録が完了します。

レッツPHP

まず初めに、パスの切り方とかどの様になっているかわからないので以下のコードをrakutenAPI.phpに実装します。
※「rakutenAPI.php」は、今作成したファイルの名前です。

<? php
      phpinfo();
?>
<!DOCTYPE html>
<html>
<head>
 <link rel="stylesheet" href="./rakuten.css">
</head>
<body>
</body>
</html>

そして対象のページを開きます。

上の様なヘッダーがあるページが表示されて色々と詳細が書いてあります。「SCRIPT_URL」という項目があるのでそれを見ると現在の起動しているファイルパスが記載されているのでそれを元にルートパスを確認します。

今回自分のところには「/project」から始まるURLが記載されていたのでルートディレクトリはprojectフォルダのあるディレクトリとなります。

そして使用する楽天APIのSDK→ライブラリのあるパスを指定して「autoload.php」を取り込む様にプログラムを書きます。

こちらのページを参考に作成しました。

// エラーを出力する
ini_set('display_errors', 1);
require_once('../rws-php-sdk-1.1.0/autoload.php');
$client = new RakutenRws_Client();
// アプリID (デベロッパーID) をセットします
$client->setApplicationId('1069312965684050347');

//アプリID (デベロッパーID) をセットします
client->setApplicationId('取得したアプリID');

// アフィリエイトID をセットします(任意)
$client->setAffiliateId('取得したアフィリエイトID');

// IchibaItem/Search API から、keyword=うどん を検索します
$response = $client->execute('IchibaItemSearch', array(
  'keyword' => 'AI'
));
// レスポンスが正しいかを isOk() で確認することができます※自作のメソッドです。
if ($response->isOk() == false) {
    // 配列アクセスによりレスポンスにアクセスすることができます。
    echo 'Error:'.$response->getMessage();
    return;
}
foreach($response as $items) {
    var_dump($items);
    foreach($items as $cols) {
        break;
    }
    break;
}

取得する項目に関してのドキュメントはこちらでテストフォームよりGETして見ると取得する内容がJSON形式で取得できます。PHPで取得する場合は変数->項目名で取得します。

取得したデータの初めの1レコード分です、ここから表示したい情報を取り出して紹介画面に表示します。
具体的には、変数の「$items」にセットされている内容を出力しています。

データの取得方法

var_dump($items);の出力内容のうち、初めのデータを下の「単純に出力したデータ」の項目に記述しています。
$items[0]の内容が出力した内容になります。JSONデータを取得しているので、この中身を取得するというところをイメージすればデータ構造が見えてくると思います。

単純に出力したデータ

["itemName"]=> string(256) "さらにクーポン割引 DAKINE ダカイン メンズ スノーボード グローブ ミトン GORE-TEX AI237-718 手ぶくろ ミトングローブ スノボ スノーグローブ 手袋 ゴアテックス スキーグローブ てぶくろ 男性用"

["catchcopy"]=> string(120) "全3色 DAKINE のスノーボード グローブ ミトン GORE-TEX が20%OFF IMPREZA MITT 2019 WINTER【あす楽】"

["itemCode"]=> string(18) "oc-sports:10024681"

["itemPrice"]=> int(7776)

["itemCaption"]=> string(1244) "メーカー希望小売価格はメーカー商品タグに基づいて掲載しています商品詳細素材・仕様DAKINE/ダカイン メンズ グローブ ミトン IMPREZA MITT 2019 WINTER AI237-7182019-DAKINE WINTER COLLECTION透湿性・防水性に優れたGORE-TEXを採用した、高品質なメンズスノーボードグローブ。裏起毛でゲレンデでも寒さからしっかり守ってくれます!手首はベルクロ使用で自分好みの大きさに調整可能!◆素材:ポリエステル65%、ポリウレタン22%、ナイロン13%サイズS:全長22cm×周囲20cm×幅11cm×親指7cmM:全長23.5cm×周囲22cm×幅13cm×親指8cmL:全長24.5cm×周囲25cm×幅14cm×親指9cm※商品によって多少の誤差がございますので、予めご了承ください。注意事項※初期不良以外の返品・交換は固くお断りしております。サイズ・カラー選び等は慎重に行ってください。※掲載商品の色は、できる限り現品と同じになるよう努めておりますが、ご使用のパソコン環境により多少色合いが異なる場合がございます。著しい色の相違は御座いませんのでご安心ください。"

["itemUrl"]=> string(191) "http://hb.afl.rakuten.co.jp/hgc/g00s1ld6.jciuf633.g00s1ld6.jciujad2/?pc=http%3A%2F%2Fitem.rakuten.co.jp%2Foc-sports%2F206040057%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Foc-sports%2Fi%2F10024681%2F" ["shopUrl"]=> string(163) "http://hb.afl.rakuten.co.jp/hgc/g00s1ld6.jciuf633.g00s1ld6.jciujad2/?pc=http%3A%2F%2Fwww.rakuten.co.jp%2Foc-sports%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Foc-sports%2F"

["smallImageUrls"]=> array(3) { [0]=> array(1) { ["imageUrl"]=> string(92) "http://thumbnail.image.rakuten.co.jp/@0_mall/oc-sports/cabinet/20618/206040057.jpg?_ex=64x64" } [1]=> array(1) {

["imageUrl"]=> string(94) "http://thumbnail.image.rakuten.co.jp/@0_mall/oc-sports/cabinet/20618/206040057_1.jpg?_ex=64x64" } [2]=> array(1) {

["imageUrl"]=> string(94) "http://thumbnail.image.rakuten.co.jp/@0_mall/oc-sports/cabinet/20618/206040057_2.jpg?_ex=64x64" } } ["mediumImageUrls"]=> array(3) { [0]=> array(1) { ["imageUrl"]=> string(94) "http://thumbnail.image.rakuten.co.jp/@0_mall/oc-sports/cabinet/20618/206040057.jpg?_ex=128x128" } [1]=> array(1) {

["imageUrl"]=> string(96) "http://thumbnail.image.rakuten.co.jp/@0_mall/oc-sports/cabinet/20618/206040057_1.jpg?_ex=128x128" } [2]=> array(1) {

["imageUrl"]=> string(96) "http://thumbnail.image.rakuten.co.jp/@0_mall/oc-sports/cabinet/20618/206040057_2.jpg?_ex=128x128" } } ["affiliateUrl"]=> string(191) "http://hb.afl.rakuten.co.jp/hgc/g00s1ld6.jciuf633.g00s1ld6.jciujad2/?pc=http%3A%2F%2Fitem.rakuten.co.jp%2Foc-sports%2F206040057%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Foc-sports%2Fi%2F10024681%2F"

["shopAffiliateUrl"]=> string(163) "http://hb.afl.rakuten.co.jp/hgc/g00s1ld6.jciuf633.g00s1ld6.jciujad2/?pc=http%3A%2F%2Fwww.rakuten.co.jp%2Foc-sports%2F&m=http%3A%2F%2Fm.rakuten.co.jp%2Foc-sports%2F"

["imageFlag"]=> int(1) ["availability"]=> int(1) ["taxFlag"]=> int(0)

["postageFlag"]=> int(0) ["creditCardFlag"]=> int(1) ["shopOfTheYearFlag"]=> int(0)

["shipOverseasFlag"]=> int(0)

["shipOverseasArea"]=> string(0) ""

["asurakuFlag"]=> int(1)

["asurakuClosingTime"]=> string(5) "13:00"

["asurakuArea"]=> string(305) "群馬県/埼玉県/千葉県/東京都/神奈川県/新潟県/富山県/石川県/福井県/山梨県/長野県/岐阜県/静岡県/愛知県/三重県/滋賀県/京都府/大阪府/兵庫県/奈良県/和歌山県/鳥取県/島根県/岡山県/広島県/山口県/徳島県/香川県/愛媛県/高知県"

["affiliateRate"]=> int(1)

["startTime"]=> string(0) ""

["endTime"]=> string(0) ""

["reviewCount"]=> int(0)

["reviewAverage"]=> int(0)

["pointRate"]=> int(1)

["pointRateStartTime"]=> string(0) ""

["pointRateEndTime"]=> string(0) ""

["giftFlag"]=> int(0)

["shopName"]=> string(15) "OC SPORTS ANNEX"

["shopCode"]=> string(9) "oc-sports"

["genreId"]=> string(6) "501854"

["tagIds"]=> array(0) { }


Rakuten API PHP〜楽天SDKを切る(part1)〜

イントロダクション

前回、Microbit〜WebServerまでのデータを送信する実装を行なったので。。。ものはついてで、PHPに触れてみようかと思います。

ホームページ、WordPressの運用などやっている人や「プログラム?」なんて思っている人もやってみてください。簡単にできるところがこういうプログラミング言語の魅力です。

高レベルAPI

先ほど「簡単にできる」という記述をしましたが、これは、「コードの量が少なくて済む」という意味です。筆者が推しているJava言語と違いウェブサーバー上で簡単に動かせる。プログラムの内容を理解しなくて済む。など「人間が扱いやすいAPI」のことを高レベルAPIと呼びます。

先人たちが作り上げた様々な仕組みを次の世代につなぐために、いろいろなAPI、アプリケーションインターフェースが存在しています。
Javaプログラミングに関していえば、自分で作ったクラスやメソッドなどをJavaDocという形で使い方などを書き残したりします。実際の書き方は以下のようになります。

/**
 * コマンドラインRPGのメインクラス</br>
 * <ul>
 * 機能リスト
 * <li>1.必要なリソースを読み込む #init</li>
 * <li>2.ゲーム起動(コマンド入力) #gameLoop</li>
 * <li>3.リソースの解放</li>
 * <li>ゲーム終了(このメインメソッドの終了)</li>
 * </ul>
 * @author takunoji
 */
 public class RpgMain { ... }

HTMLを組み合わせて作成することができます。JavaDocコマンドで作成したものを出力することができます。

楽天APIとは?

世間で「〜API」なんて言葉がたまに聞こえてきますが、早い話が「これを使うと簡単にいろんなことができるよ?」というものです。中には難しいものもありますが。。。

似た様なものでは以下の様なものがあります。

  1. Facebook APIグラフAPI
  2. Azure API
  3. Amazon API
  4. Yahoo API
  5. Hatena API
  6. Health planet API

などなど沢山あります。6番目のAPIはヘルスチェック(体組計関連)用のAPIでオムロン、タニタなど大手機器との連携が取れるという品物です。

楽天APIを切る

「切る」と言いましたが、指先や皮一枚を切る程度にします。妖怪でいうところの「カマイタチ」の様な感じでソフトに行こうと思います。

そして、自分は「WordPress」を使用しているのでプラグインを使用しようと思います。ワードプレスにログインしたら左の方に「プラグイン」という文字があると思うのでそれをクリックします。

赤い丸がついている部分がそれです。

そしてプラグイン「新規」でインストールします。

物によってはプラグインをインストールするときに「パスワード」を聞かれると思います。それはレンタルサーバーの「サーバー設定情報」をみて使用するFTPSのサーバー名を記入します。

※ミニムサーバーの場合は上の様な項目名が表示されます。サイトマネージャ→サーバー設定情報でみることができます。

楽天プラグインをインストールしたら?

下の様な楽天マークがブログ投稿ページと左のメニューに表示されます。

 

そして選択すると下の様な画面が表示されて、選択すると下の様なリンク?が挿入されます。

ここまでは、GUIの使い方

PHP実装の準備

ちょっと試したことがないのですが、記事の中にPHPコードが書けると思いますので、ちょっとやってみます。。。がダメでした。ワードプレスのエディタ(自分が使用しているもの)ではPHPのコードは書けませんでした。「<!--?php echo "Testing PGP" ?-->」の様にコメントアウトされてしまいました。

でわどうするか?

PHPファイルを作成します。今回は「rakutenAPI.php」という名前にします。

レンタルサーバーに上の様なファイルを作成します。

  1. ワードプレスの左側にある「外観」にマウスを当てます
  2. そのあと吹き出しの様なものが出るので「テーマの編集」をクリックします
  3. クリックすると下の様なページがあるので「メインインデックスのテンプレート」を選択します

そうするとindex.phpファイルの中身が表示されるのでそれをコピってペってやります。→「index.php」を自分のPC上に作成

一応確認

先ほど選択した「メインインデックスのテンプレート」から「テーマヘッダー」を開きその中から下の様な文を探します

<?php get_template_part( 'template-parts/header/header', 'image' ); ?>

これはパスを指定していて「XXXのファイルを読み込みますよ」という意味です。そして、このファイルの一番初めの部分「template-parts」はルートになるパス(ディレクトリ or フォルダ)の位置を示す重要な手がかりになります。

自分のレンタルサーバー(ミニムサーバー)ではルートになるのが「/web」になっています。なのでそこからワードプレスをインストールした場所を開きます。

インストールした場所には「wp-admin」というフォルダ(ディレクトリ)があるのですぐにわかります。そして今回探しているフォルダは「template-parts」なのでそれを探します。

結論から言うと「テンプレート」を使用するときはルートがテンプレートフォルダになるので「/web/wp/wp-content/themes/twentyseventeen」の様になります。

なので、楽天SDKを使用するにはテンプレートから切り離して使用する方がわかりやすいと思いますので以下の様なフォルダにダウンロードしたSDKをアップロードします。

そして、先ほど作成した「index.php」も同様にアップロードします。

これでSDKを使用する準備が整いました。

次は「Rakuten API PHP〜楽天SDKを斬る(part2)〜」です。

ターミナル(コマンド)を使う 〜FTPSを使ってファイルアップロード〜

イントロダクション

ようやく、Microbitでのデータ送信の作業の目処が立ち残すは画面の表示部分のみとなりました。

この部分に関しては、仲間内に協力してもらうことになったので、自分は次のことを考えます。

レンタルサーバーって?

早い話が、自分用のサーバーを借りるということです。自分でサーバーを立てて運用となるとすごく大変です。

  1. ネットワークの構築、自宅から外部ヘルータのポートを開けたり。。。
  2. DNSサーバーの構築、サーバーマシン or DNS用のマシンでDNSサーバーを作ります。主にやることはBINDというアプリケーションのインストールと設定です。
  3. DBのデータ、利用者に対する様々な補償など。。。

でも、自分で立てれる様になれば、ラズパイやアルディーニョなどの上でAPサーバーを作ったりとできることは格段に広がります。※機会があれば何かやりたいです。

FTPSで何やるの?

ファイルのアップロードです。作成したアプリや必要なライブラリなどをアップロードしてレンタルサーバー上で遊びます。今考えているのはJavaを起動したいと思っています。

ちなみにレンタルサーバー上ではコントロールパネルとかファイルマネージャの様な名前で以下の様なパネルがあるのでそれをクリックします。

ちなみに「ミニムサーバー」の場合

ファイルマネージャでファイルのアップロードや編集などができます。しかしアップロードするデータ量は小さいです。

そこでコマンドを使う!

Macであればターミナル、Windowsはコマンドプロンプト、Linuxではターミナル?とまぁコマンド入力ができるコンソールがあるのでそれを使用します。

Macの場合

手段1

  1. コマンドキーとスペースを押下
  2. 「Terminal.app」と入力してEnterキーを押下

手段2

右の様なアイコンをクリックする

そして以下の様にコマンドを入力します。確認するのは  

  

の部分です、ユーザー名とパスワードも確認してください。

「現在のディレクトリにあるファイルの確認」

> ls    (Mac, Linux)

> dir    (Windows)

アップロードしたいファイルのあるディレクトリに移動します。

cd /XXX/XXX

FTPを起動します。ここでアクセスすときに「FTPS」プロトコルでアクセスするところが「FTPS」(笑)

>ftp[Enter]

そして開きます。

>open

そして、FTPSサーバーの方の名前(XXX.XX.jpなど)を入力します。FTPSサーバーのところを確認してください。以下の様な順序で入力します。

  1. openでFTPを起動
  2. XXX.XXX.jpで接続しようとする
  3. ユーザー名を入力
  4. パスワードを入力

ログインできたら「put」コマンドでアップロードできます。

細かなコマンドなどは他のサイトを参考にしてみてください。

どうやるの?

Javaを起動するにはJREがあればどこでも動きますので以下の手順を踏みます

  1. JREをサーバー上にアップロード
  2. PHPやPythonなどからJavaを起動します。"./jre/bin/java -jar Hello.jar"など

[rakuten ids="leather-kawaya:10001022"]

まだ試していないので行けるかどうかは、次回!


WebSocket in PHP And JS 〜レンタルサーバー上でのWebSocket〜

イントロダクション

ここ数日、WebSocketを実装しようと色々とやりました。結局のところJSでの「WebSocket」を使用すれば簡単に行けることがわかりました。

WebSocket実装について

シンプルにサーバーはPHPでクライアントがJSになります。参考にしたソースはそれぞれ以下のようになっていました。

index.php:クライアント

デザイン的な部分はさておきにして。。。PHPの処理はメッセージの色をランダムに選択する処理を行なっているのみでした。

そして、本題のJS部分に関して

// ウェブソケットの作成処理
var wsUri = "ws://zenryokuservice.com:9000/demo/server.php"; 	
websocket = new WebSocket(wsUri);

ここではURLを設定する時に「ws://」で始める(プロトコル指定)を行いブラウザに実装されている「WebSocket」を作成(new)しています。

そして、作成したWebSocketにイベント処理を追加しています。

websocket.onopen = function(ev) {...};
websocket.onmessage = function(ev) {...};
websocket.onerror = function(ev) {...};
websocket.onclose = function(ev) {...};

送信部分の処理で以下の様になってました。

//prepare json data
var msg = {
	message: message_input.val(),
	name: name_input.val(),
	color : ''
};
websocket.send(JSON.stringify(msg));

そして。。。

サーバーサイドPHP(Socketサーバー)

通常通りにSocketサーバーを作成します。ちなみにJavaでやっても同じ手順を踏んでSocketサーバーを作成します。※java.net.ServerSocket

「通常通りというのは以下の手順です。」

  1. ソケットを作成      php -> socket_create();
  2. オプション設定      php -> socket_set_option();
  3. バインド         php -> socket_bind();
  4. リッスン開始            php -> socket_listen(); ※Javaは「listen」ではない
  5. 受信          php -> socket_accept();
  6. データの読み込み    php -> socket_read();


ここまでが大体ですがJavaでやる時と同じです。※メソッドなどは違います。。。

HTTPヘッダをWebSocket様に書き換えてソケット送信していました。

$secKey = $headers['Sec-WebSocket-Key'];
$secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
//hand shaking header
$upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"WebSocket-Origin: $host\r\n" .
"WebSocket-Location: ws://$host:$port/demo/shout.php\r\n".
"Sec-WebSocket-Accept:$secAccept\r\n\r\n";
// 送信処理
socket_write($client_conn,$upgrade,strlen($upgrade));

どうやらここがキーポイントだと思います。まだ調べていないのでなんとも言えませんが、今まで色々と試したことはPOSTリクエストとGETリクエストを送信する処理からイベントハンドラを使用して受信したメッセージを画面に表示するものでした。

なので、受信したデータは画面に表示されませんでした。サーバーで受けてもクライアント側に通知がいかないのでそれは何も起きません。。。

つまるところ、サーバー側からクライアント側にメッセージの受信を通知するためにはHTTPのヘッダメッセージを「Web Socket Protocol Handshake」にしないとダメなのではなかろうか?と疑っているところです。

これをうまく、Pythonからのソケット受信を受けた時にクライアントサイドの画面に表示できる様にしたい。。。

戦いはまだまだ続きます(笑)

 

PHP ServerSocket 〜レンタルサーバーでSocket受信〜

イントロダクション

Microbit〜PC〜ウェブサイトとデータの送信処理を実装することを目標に今までやってきています。「関連ページ一覧」に記載しています。

WebSocketの実装

色々と試したけれど、結局はGitからのソースを参照することにしました。

Chat-Using-WebSocket-and-PHP-Socket

<実際に実行してみた結果>

 

こちらは初めに起動してテスト入力を行いました。次に下の画面を開きさらにメッセージを入力しました。

 

後から起動した方には初めに起動したものとメッセージの数が違う。

 

結局のところは動かしてみないとわからないのですが。。。

画面を開いた状態であればChatすることができるようです。細かいところは下のサイトを見て内容を理解する必要があります。

https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

作成したものは、このリンクで見ることができます。でも長く起動しているものではありません。起動開始日:2018/12/15 15:00〜


関連ページ一覧