tekuppi1 / texserver

私たちのサービスのロジックを担う部分です。
1 stars 0 forks source link

get book data -- amazon api #31

Closed andychan94 closed 7 years ago

andychan94 commented 7 years ago

下のコードでurlが出てきます。

(amazon apiのsecret keyをgitにpushするのは禁止なので、寿司にLINEで送ります)

<?php
 *// ※は自分で設定してください
define("ACCESS_KEY_ID"     , '###insert-access-key-here###');
define("SECRET_ACCESS_KEY" , '###insert-secret-access-key-here###');
define("ASSOCIATE_TAG"     , 'tekuppi06-22');
define("ACCESS_URL"        , 'https://aws.amazonaws.jp/onca/xml');
$base_param = 'AWSAccessKeyId='.ACCESS_KEY_ID;
$params = array();
$params['Service']        = 'AWSECommerceService';
$params['Version']        = '2011-08-02'; //Versionは基本的には最新のものでOK
$params['Operation']      = 'ItemLookup';
$params['ItemId']         = '4886263070';
$params['IdType']         = 'ISBN'; //今回はISBNから情報を取得するのでISBN
$params['SearchIndex']    = "Books"; //今回は本の情報なのでBooks
$params['AssociateTag']   = ASSOCIATE_TAG;
$params['ResponseGroup']  = 'ItemAttributes,Offers, Images ,Reviews '; // 必要なレスポンスを設定(詳しくは下で説明)
$params['Timestamp']      = gmdate('Y-m-d\TH:i:s\Z');
//パラメータを自然順序付け・昇順で並び替え
ksort($params);
$canonical_string = $base_param;
foreach ($params as $k => $v) {
    $canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
}
function urlencode_RFC3986($str)
{
    return str_replace('%7E', '~', rawurlencode($str));
}
$parsed_url = parse_url(ACCESS_URL);
$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
$signature = base64_encode(
    hash_hmac('sha256', $string_to_sign, SECRET_ACCESS_KEY, true)
);
$url = ACCESS_URL.'?'.$canonical_string.'&Signature='.urlencode_RFC3986($signature);
echo $url;
TakenokoTech commented 7 years ago

@nodirashidov @hatimitusiropp 結構シンプル!!いい感じ!!

30 これみたいにACCESS_KEY_IDみたいな設定ファイルは、config中に入れたいっす。

hatimitusiropp commented 7 years ago

@TakenokoPro @nodirashidov URLは出てくるんですけど、file_get_contentsできないんですが、これで画像取得できますか?(;'∀') ↓エラー内容 file_get_contents(https://aws.amazonaws.jp/onca/xml? ・・・いろんな情報・・・) [function.file-get-contents]: failed to open stream: php_network_getaddresses: getaddrinfo failed:

ちなみにこのコードって、下のサイトみたいなプラグインなしでも動かせるってことですよね? http://www.abe-tech.jpn.com/program/amazonapi/cakephp%E3%81%AB%E3%82%88%E3%82%8Bamazonapi%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97/

TakenokoTech commented 7 years ago

@hatimitusiropp あれ? 自分がプッシュした奴 a6fe88c はXML取れた? たぶん、取れて"本一覧画面"で一覧が出てきたはずだけど・・・。

あと、画像取得はXML取った後にリダイレクトしてimgファイル取ってこないといけないんじゃないかな?

プラグイン使ってもいいけど、あんまバリデーション入ってないな。 作りは一緒だから、自前で良いと思うよ。

TakenokoTech commented 7 years ago

AmazonApiComponent.phpの構成はこれで

class AmazonApiComponent extends Component {

  // 本の情報
  private $bookInfo = array();

/**
  * 情報取得のURLを生成
  * serchWord:検索ワード
  * option:その他必要なパラメータ
  */
function generateUrl(serchWord, option); 

/** 
  * APIで通信
  * url: API接続したいurlパス
  */
function callApi(url);

/** 
  * 画像取得
  * url: 画像のurlパス
  */
function getImage(url);

  /**
   * DOMにマッピング
   */
  function mapToDom();
hatimitusiropp commented 7 years ago

`/**

の、画像のURLパスって、"http://images-jp.amazon.com/images/P/ISBN.09.MZZZZZZZ" みたいなURLであってますか?


`/** 
 * 画像取得
 * url: 画像のurlパス
 */
  public function getImage($url){

    // URLから取得するXML
    $xml = @simplexml_load_file($url);

    $base_param = 'AWSAccessKeyId='.Access_Key_ID;
    $params = array();
    $params['Service']        = 'AWSECommerceService';
    $params['Version']        = '2016-12-12'; //Versionは基本的には最新のものでOK
    $params['Operation']      = 'ItemLookup';
    $params['ItemId']         = '4886263070';
    $params['IdType']         = 'ISBN'; //今回はISBNから情報を取得するのでISBN
    $params['SearchIndex']    = "Books"; //今回は本の情報なのでBooks
    $params['AssociateTag']   = Associate_tag;
    $params['ResponseGroup']  = 'ItemAttributes,Offers, Images ,Reviews '; // 必要なレスポンスを設定(詳しくは下で説明)
    $params['Timestamp']      = gmdate('Y-m-d\TH:i:s\Z');
    //パラメータを自然順序付け・昇順で並び替え
    ksort($params);
    $canonical_string = $base_param;
    function urlencode_RFC3986($str)
    {
        return str_replace('%7E', '~', rawurlencode($str));
    }
    foreach ($params as $k => $v) {
        $canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
    }
    $parsed_url = parse_url(Access_URL);
    $string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
    $signature = base64_encode(
        hash_hmac('sha256', $string_to_sign, Secret_Access_Key, true)
    );
    $url = Access_URL.'?'.$canonical_string.'&Signature='.urlencode_RFC3986($signature);
    file_put_contents("/texserver/src/Image", $url);
  }
`

getImageの作り方のイメージがなんか具体的にできないんですが、この関数の中で、画像を保存するところまで書いて、それをコントローラーで呼び出すってことでしょうか?

TakenokoTech commented 7 years ago

あれ? 確認ダイアログ出すんじゃなかったっけ。 その場合は、getImageで登録したらダメでないか?

TakenokoTech commented 7 years ago

このgetImageで行う処理は、取得した画像の解像度を合わせるくらいかな。 本当はbase64の変換したのをreturnにして、Domにマッピングしたいけど(登録する時にそっちの方が楽) 今は空でいいかな。

TakenokoTech commented 7 years ago

一旦、#35 で改修させてください。