通販サイトの作成ログ

通販サイトでいじったメモログみたいなものだとお考えください。
質問もどうぞ。わかる範囲内でしたらお答えします。

2015年03月

楽天におけるPHP、API

やろうとしたが自己流はやっぱりきつい
いやわかるがエネルギーが足りない

にぎわいツールいけるのか?

参照
https://webservice.rakuten.co.jp/sdk/php.html

にぎわいツールinカラーミー

axis-blog.comさんのAPIの解説とカラーミーAPIを利用した集客ツール事例のご紹介
http://axis-blog.com/?p=734
を参考ににぎわいシステム?ができるか試していました。

ソースの前半部分はなくなっても大丈夫そうだったので省いて実装
ちなみにcssはhttp://kjsmile.xsrv.jp/app/imaureteru/css/756-real_time.cssを参照
jquery-1.9.1.min.jsファイルはhttp://kjsmile.xsrv.jp/app/imaureteru/js/jquery-1.9.1.min.jsを参照
またアクセストークンはコードをとる時scope=read_salesにて取得してください(これに気付くのに3日かかった・・・orz)
下記ソースの箇所を適宜修正してください(<アクセストークン>など)

--------------------------------------------------------------------

<?php

$request_options = array(
        'http' => array(
            'method'  => 'GET',
            'header'=> "Authorization: Bearer <アクセストークン>\r\n"
        )
    );

$context = stream_context_create($request_options);
$url = 'https://api.shop-pro.jp/v1/sales.json?after=2015-03-01';

$response_body = file_get_contents($url, false, $context);
$response_json = json_decode($response_body, true);

echo $response_body;
print_r($response_json);
echo count($response_json['sales']);
ob_start();

//
cssのURL、jsファイルのURLを入力
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" style=\"overflow-x:hidden;\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n<title>イマウレテル!注文実況中継!</title>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"<cssのURL>\"/>\n<script type=\"text/javascript\" src=\"<
jsファイルのURL>\"></script>\n\n";

echo "<script type=\"text/javascript\">\ntimer = setInterval(function(){\n    $(\"tr:last\").children('td').wrapInner('<div />').children().hide();\n    $(\"tr:last\").children('td').children('div').animate({opacity: 0}, 0);\n    $(\"tr:last\").prependTo(\"tbody\");\n    $(\"tr\").eq(2).children('td').children('div').animate({height: \"toggle\"},\n    {duration: 1200, complete: function(){\n    $(this).replaceWith($(this).html());\n    }});    \n}, 5000);\n</script>\n\n</head>\n\n";

echo "<body>\n<div id=\"container\"><table width=\"100%\" id=\"real-time\"><thead><tr><th colspan=\"6\" align=\"center\">現在の注文状況(50件)</th>\n</tr>\n<!--<tr><th colspan=\"6\" align=\"right\" bgcolor=\"#FFFFCC\"><FORM name=\"form1\"><input type=\"hidden\" name=\"phpMyAdmin\" value=\"11cixo4d1caaqu1ongu3vlwfabjb5666\" />現在時刻<INPUT type=\"text\" name=\"text1\" size=\"25\"> 更新間隔5分 更新時間08 : 22</FORM></th>\n</tr>-->\n<tr><th width=\"15%\">写真</th>\n<th width=\"63%\">商品名</th><th width=\"10%\">住所</th>\n<th width=\"12%\">金額</th>\n</tr></thead><tbody>\n";

//<ショップのURL>を二箇所入力します。
for($i=0; $i<count($response_json['sales']); $i++) {
$price = number_format($response_json['sales'][$i]['details']['0']['price']);
if($i%2==0)
        echo "<tr class=\"odd\">\n";
else
        echo "<tr class=\"even\">\n";
        echo "<!--商品写真-->\n";

if($response_json['sales'][$i]['details']['0']['product_image_url'] == null) //画像URLがnullの場合
  echo "<td class=\"pict\"><a href=\"<ショップのURL>" . $response_json['sales'][$i]['details']['0']['product_id'] . "\" target=\"_blank\"><img src= \"<予備画像のURL>\" witdh=\"64\" height=\"64\" /></a></td>\n";
else
//画像URLがある場合
  echo "<td class=\"pict\"><a href=\"<ショップのURL>" . $response_json['sales'][$i]['details']['0']['product_id'] . "\" target=\"_blank\"><img src= \"" . $response_json['sales'][$i]['details']['0']['product_image_url'] . "\" witdh=\"64\" height=\"64\" /></a></td>\n";

        echo "<!--商品名-->\n";
echo "<td class=\"item-name\">\n<a href=\"<ショップのURL>" . $response_json['sales'][$i]['details']['0']['product_id'] . "\" target=\"_blank\">" . $response_json['sales'][$i]['details']['0']['product_name'] . "</a><br>の注文を頂きました!</td>\n";
        echo "<!--住所-->\n";
        echo "<td class=\"area\">" . $response_json['sales'][$i]['customer']['pref_name'] . "</td>\n";
echo "<!--金額-->\n";
echo "<td class=\"price\">" . $price . "円</td>\n";
echo "</tr>\n";
    }
echo "</tr></tbody></table>\n</div>\n</body>\n</html>\n";
 
$output = ob_get_contents();
ob_end_clean();
    $fp = fopen('tool.html', 'w');
    fwrite($fp, $output);
    fclose($fp);
    echo "OK";
?>


--------------------------------------------------------------------

で実行したのちokが出たら、phpファイルがある階層のとこにtool.htmlができます。
そのURLを参照するとカラーミー版にぎわいシステムが表示されると思います。

それと注文情報自動更新のためにhetemlのコントロールパネルの
cron設定で自動更新の設定も忘れずに

カラーミーAPI(PHP)の商品名一括変更 改

ちょっと改良。
scanfがスペースで区切ってしまうためfgetsに変更&IDと商品名を二つのテキストに分けた
なのでIDを登録したURLと商品名を登録したURLをご用意ください(文字コードはUTF-8を指定)

内容としてはIDを1行読み込んだ時に商品名テキストから1行読み出し
連動した商品ページの商品名を変更する仕様
ブラウザにはIDと商品名を返す
商品名が長いとエラーで返ってくるため、その場合
$name = fgets($handle2, 200);の数値をいじってください。

注意点としてIDと商品名が同じ行で連動しているかを確認するのと
2000件ぐらいの処理で停止してしまうため、オーバーする場合、
区切りを確認して、その都度、IDと商品名の一覧を変更しなければなりません。

----------------------------------------------------------------------------------

<?php
$handle = fopen("<商品名ID URL>", "r");
$handle2 = fopen("<商品名テキストURL>", "r");

  function namechange($ID,$namea){
    $attributes = array("product" => array("name" => $namea));

    $request_options = array(
      'http' => array(
        'method'  => 'PUT',
        'header'=> "Authorization: Bearer <アクセストークン>\r\n" . "Content-Type: application/json\r\n",
        'content' => json_encode($attributes)
    )
  );

  $context = stream_context_create($request_options);

  $url = 'https://api.shop-pro.jp/v1/products/'.$ID.'.json';
  $response_body = file_get_contents($url, false, $context);
    echo $ID,$namea,'<br>';
  }

  while ($code = fgets($handle, 100)) {
     $name = fgets($handle2, 300);
     $name = strtok($name, "\n\0");
     $code = strtok($code, "\n\0");
     namechange($code,$name);
  }
fclose($handle);
fclose($handle2);
?>
----------------------------------------------------------------------------------

3万件を更新なう

よくよく見たらブラウザに最後に表示されたIDの次のIDまで処理されていることが多いです。
めんどくさいっていう場合はブラウザに表示された最後のIDを区切りでも何の問題もありません。

商品名変更の処理だけで2000件ぐらいなのでプラス何かだと一度の処理件数は落ちると考えられます。
あとサーバーの状態にもよりけり。
夕方だと混み合うみたいなのでさらに処理件数は落ちると考えられます。

まあ行っている方法としては
1、エクセルでIDと商品名の連動確認

2、IDを登録したURLと商品名を登録したURLにIDと商品名をそれぞれ登録
(エクセルでCtrl+Shift+↓にて選択項目以下すべてを指定してコピペ)

3、登録したそれぞれのURLの1行目がエクセルの同じ列にあるか確認

4、phpを登録したURLにアクセス(2週目以降は更新でおk)

5、表示されるまでしばしお待ちを

6、ブラウザに表示されたらエラーがないか確認

7、ブラウザに表示された最後のIDをエクセルで確認してその下のIDを選択して空白行を挿入

8、空白行以上を処理(1に戻る)

と細かく言うとこうなる。

一括処理なので行がずれたら全部ずれます。お気をつけて。

追記.このページを掲載後2時間現在、google検索にて「カラーミー PHP」で検索かけると
2ページ目に表示されていた・・・
レスポンスおかしくね?

カラーミーAPIにおいての商品名変更

こんなんなった。これをhetemlでPHPファイルにて保存したのち、URLにアクセスすればおk

-------------------------------------------------------------------------------
<?php
$attributes = array("product" => array("name" => "<商品名>"));

$request_options = array(
    'http' => array(
        'method'  => 'PUT',
        'header'=> "Authorization: Bearer <アクセストークン>\r\n" . "Content-Type: application/json\r\n",
        'content' => json_encode($attributes)
    )
);

$context = stream_context_create($request_options);

$url = 'https://api.shop-pro.jp/v1/products/<商品ID>.json';
$response_body = file_get_contents($url, false, $context);
echo $response_body;// 確認用出力、省いてもよし
?>
-------------------------------------------------------------------------------

<商品名>と<アクセストークン>と<商品ID>を任意で入力してください。


カラーミーのサンプルはオプション変更だったから配列入力が二つあったのね。
理解するのに2日かかった…orz
あ、arrayが配列指定みたいです、はい。

例文探しまくったけど全然なかた((= ・ω・=))


なので商品名のところをhttp://shop-pro.jp/?mode=api_interface#put-v1productsidjsonを参考に

$attributes = array("product" => array("name" => "<商品名>", "price" => 1000, "cost"=> 500));

とかにすると商品名、販売価格、原価を変更可能みたいです。
オプション変更の場合はhttp://shop-pro.jp/?mode=api_startedのサンプルの形でいいはず。

まあこれでファイル読み込みさせてカラーミーで商品名のみ一括変更できるはず。
俺これが終わったら会社やめてやるんだ・・・。

それにしても$response_body見る限り、ほかの部分も変えれるんじゃねこれ。

カラーミーAPIについて2

カラーミーいじりたおし カラーミーAPIを試してみた 2
http://shop-pro.blogspot.jp/2014/03/api-2.html

php POST送信時の「Content-type not specified assuming application/x-www-form-urlencoded」エラー
http://crss-m.jp/blog/?p=36

APIの解説とカラーミーAPIを利用した集客ツール事例のご紹介
http://axis-blog.com/?p=734


といろいろ参考にしたけど普通にカラーミーの「カラーミーAPIを使ってできること」
http://shop-pro.jp/?mode=api_started
の順番にした方が正しく動いた。
あ、サーバーはhetemlです。

手順としては
1、カラーミーデベロッパーアカウントに登録→こちら

2、アプリを登録(アプリ名とリダイレクトURL(ここではheteml上で登録したphpを使った))

3、認証ページを表示
下記URLにおいて
<CLIENT_ID>にアプリのところに表示されるクライアントID、
<REDIRECT_URL>にリダイレクトURL
を入力してブラウザで開く
https://api.shop-pro.jp/oauth/authorize?client_id=<CLIENT_ID>&redirect_uri=<REDIRECT_URL>&response_type=code&scope=read_products%20write_products
※商品データを参照の場合はscope=read_products、在庫データを更新の場合はscope=write_products
受注・顧客データを参照の場合はscope=read_sales、受注データを更新の場合はscope=write_sales

4、承認ボタンをおしてエラーコードがなければURLにcode=と表示されるのでそのURLをメモ(有効なのは10分ぐらい)

5、リダイレクトURLのphpに下記プログラムを張り付けて適宜変更して保存
----------------------------------------------------------------------------------
<?php
$params = array(
    'client_id'     => '<OAUTH2_CLIENT_ID>',          //クライアントIDを入力
    'client_secret' => '<OAUTH2_CLIENT_SECRET>',  //クライアントシークレットを入力
    'code'          => '<code>',                          //4で取ったURLのコード部分を入力
    'grant_type'    => 'authorization_code',           //このまま
    'redirect_uri'  => '<OAUTH2_REDIRECT_URI>'     //リダイレクトURLを入力
);
$request_options = array(
    'http' => array(
        'method'  => 'POST',
        'content' => http_build_query($params)
    )
);
$context = stream_context_create($request_options);

$token_url = 'https://api.shop-pro.jp/oauth/token';
$response_body = file_get_contents($token_url, false, $context);

echo $response_body;
--------------------------------------------------------------------------------------

6、4のURLにアクセスして表示されたトークンの文字列を吸出し


でこのトークンを使えば商品の更新や情報の取得が可能になります。
4に書いた通りコードが有効なのは10分ぐらいなので気を付けてください。
わけあってやり直したらコードの部分はこのブログ上だと異なる表記になるみたいなので
http://shop-pro.jp/?mode=api_startedの4. 認可コードとアクセストークンを交換の
ソースを直接参照したほうが確実です。
さいごにecho $response_body;だけ付け加えてください。

PHPなのでテキストでも読み込めさせば選択一括更新可能とかできたりします。
まだ実装できてないけど…
最新コメント
記事検索