pophope
@pophope

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

yahooショッピングAPIの画像アップロードがうまくいかない。

yahooショッピングで画像アップロードをAPIで行おうとしていますが
うまく動いてくれません。

yahooのサイトのサンプルコードです。
https://developer.yahoo.co.jp/webapi/shopping/uploadItemImage.html

うまく行かないのは、
sample.phpと同じフォルダ内にある
abc.jpgをアップロードしたいのですがうまくいきません。

sample.php
$header = [
    'Content-Type: multipart/form-data',
    'POST /ShoppingWebService/V1/uploadItemImage?seller_id=<ストアアカウント> HTTP/1.1',
    'Host: circus.shopping.yahooapis.jp',
    'Authorization: Bearer ' . $response["access_token"],
];


$url   = 'https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadItemImage?seller_id=arie-arie';
$filePath = 'C:\xampp\htdocs\php\abc.jpg';
$fileMIME = 'image/jpeg';
$fileName = 'abc.jpg';

$param = array('file' => new CURLFile($filePath, $fileMIME, $fileName));

// 必要に応じてオプションを追加してください。
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,  'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER,     $header);
curl_setopt($ch, CURLOPT_URL,            $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST,           true);
curl_setopt($ch, CURLOPT_POSTFIELDS,     $param);

$response = curl_exec($ch);
curl_close($ch);

filePathをフルパスにすると
responseには「Your request on the specified host was not found.
Check the location and try again.」と表示されたHTMLが返ってきます。

画像ファイルの設定が間違っていると思いますが、
誰か教えてください。

0

4Answer

$header = [
    'Content-Type: multipart/form-data',
    'POST /ShoppingWebService/V1/uploadItemImage?seller_id=<ストアアカウント> HTTP/1.1', //seller_id= がダミーのまま
    'Host: circus.shopping.yahooapis.jp',
    'Authorization: Bearer ' . $response["access_token"],
];

<ストアアカウント> が実際のものだとしたら、お持ちのストアアカウントに変更が必要です。

0Like

Comments

  1. @pophope

    Questioner

    回答ありがとうございます。
    ストアアカウントの所は実際のコードでは入れています。こちらでは伏せています。
$url   = 'https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadItemImage?seller_id=<ストアアカウント>';

の箇所を

$url   = 'https://circus.shopping.yahooapis.jp';

としてみてください。

0Like

Comments

  1. @pophope

    Questioner

    回答ありがとうございます。
    指定いただいたURLでは動かなかったので
    ストアアカウントをつけたURLで動かしてみました。

    レスポンスは
    Please provide valid credentials. Bearer realm="yahooapis.jp", error="insufficient_scope", error_description="insufficient scope"


    https://developer.yahoo.co.jp/webapi/shopping/faq.html
    「ご利用中の"アプリケーションID"にショッピングAPIの利用権限が付いていない可能性があります。」となります。

    利用権限をつけてやってみます。

まずPostmanを使って試してみるのはどうですか?
https://www.postman.com/downloads/

Postman.png

Postman-2.png

FILEにするには、フォーカスを外してマウスを乗せるとドロップダウンが出てくる
Screen_Shot_2020-08-05_at_13_25_15.png

あと、HTTPクライアントを使ったほうが、失敗が少ないかと思います。
例: https://qiita.com/yousan/items/2a4d9eac82c77be8ba8b

自分はRUBYでアップロードしていますが、基本的には

  1. 有効なAuthorization Bearerがヘッダーに設定してある
  2. https://developer.yahoo.co.jp/webapi/shopping/uploadItemImage.html の場合は、POSTするURLのパラメーターとしてshopIdが入っている必要がある
  3. fileというパラメータ名でファイルの内容をPOSTする

という点だけが重要だと思います。

0Like

Comments

  1. @pophope

    Questioner

    回答ありがとうございます。まさにダメなやつでやっていました。
    現在APIはシステム障害中のため実験ができませんでしたので後日やってみます。
  2. @pophope

    Questioner

    まだPHP初心者なのでSDK導入がよくわからず、
    https://developer.yahoo.co.jp/webapi/shopping/help.html#accesstoken にて
    v1でもアクセストークンは取得できました。

    ただ画像をアップロードする処理をすると
    invalid token format トークン無効 と返ってきました。

    教えていただいたショピング専用の申請には最大5営業日とあったので
    少し寝かしてみます。
  3. > 最大5営業日とあったので
    はテスト環境で申請した場合じゃないですか?本番環境であれば即時使えますよ。

    いずれにしても最初はPHPからではなく、Postmanからやってみてまず動作するのか(渡しているあらゆるパラメータが正常か?)を試したほうがいいです。

    -------
    【テスト環境用を選択された方へ】
    ※テスト環境ではYahoo!ショッピングのサービス中のシステムとは切り離された環境でテスト用APIやストア向けツールが利用できます。
    ※利用申請から最大5営業日で、利用のために必要なお知らせをメールにてご連絡いたします。
    -------

Your answer might help someone💌