@orionboy75

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

yahooショッピングAPIをエクセル(VBA)に適用するときのエラーについて

解決したいこと

VBA(エクセル)でYahooの商品画像を削除するようなエクセルアプリをつくっています。
リフレッシュトークンを取得するときにはエラーにならないですが、
本番のURLへメッセージを送るとエラーになります。
解決方法を教えて下さい。
宜しくお願い致します。

発生している問題・エラー

OBJECT:MSXML2.ServerXMLHTTP.6.0
実行時エラー'-2147012711(80072f99)':
クライアント証明書で資格情報が使用できませんでした。

OBJECT:WinHttp.WinHttpRequest.5.1
実行時エラー'-2146697208(800c0008)':
指定されたリソースのダウンロードに失敗しました。

該当するソースコード

Function httpPost2(url As String, msg As String, auth As Variant, Optional token As String = False) As String
'    Const WinHttpRequestOption_SslErrorIgnoreFlags As Long = &H4&
'    Const SslErrorFlag_UnknownCA As Long = &H100&
'    Const SslErrorFlag_CertCNInvalid As Long = &H1000&

'    Dim flag As Long
'    Dim lngSslErrorIgnoreFlags As Long
'    Dim blnEnableRedirects As Boolean
'    Dim blnEnableHttpsToHttpRedirects As Boolean

'    lngSslErrorIgnoreFlags = &H3300 '13056(&H3300): ignore all err, 0: accept no err
'    blnEnableRedirects = True
'    blnEnableHttpsToHttpRedirects = True

    Dim objHTTP As Object

    auth = Replace(auth, vbLf, "")
    auth = Replace(auth, vbCrLf, "")

'On Error GoTo ERROR_

'    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")

    objHTTP.Open "POST", url, False
'    objHTTP.setRequestHeader "Host", "circus.shopping.yahooapis.jp"
    objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    objHTTP.setRequestHeader "Authorization", auth

'    'SSLエラーを無視するかどうかを決めるフラグ。
'    '初期値は0(エラーを無視しない)。
'    flag = objHTTP.Option(WinHttpRequestOption_SslErrorIgnoreFlags)
'    flag = flag Or SslErrorFlag_UnknownCA
'    flag = flag Or SslErrorFlag_CertCNInvalid
'
'    objHTTP.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = flag
'    objHTTP.setOption(0) = strUserAgentString
'    objHTTP.setOption(2) = lngSslErrorIgnoreFlags
'    objHTTP.setOption(6) = blnEnableRedirects
'    objHTTP.setOption(12) = blnEnableHttpsToHttpRedirects

    objHTTP.send msg 'ここがエラーになります。

    If objHTTP.Status = 200 Then
        httpPost2 = objHTTP.ResponseText
        Debug.Print "TRUE : " & objHTTP.Status & " / " & objHTTP.statusText
        Exit Function
    Else
        Debug.Print "FALSE : " & objHTTP.Status & " / " & objHTTP.statusText
    End If

- 省略 -

End Function

自分で試したこと

SSLの認証問題と思い、回避する方法をネットで調べてほぼ全部試してみました。
1. 参照するオブジェクトを「MSXML2.ServerXMLHTTP.6.0、WinHttp.WinHttpRequest.5.1」して両方試してみました。
2.証明書認証の問題だと思いSSLを無視するflagを使ってみました。
3. 送信メソッドの問題だと思い、POSTをGETに変更して試してみました。
4.PHPではどうかなと思いPHPで同じく試してみたところ、PHPは問題なく動きます。
   VBAで生成されたaccess_tokenを使ってPHPでテストしてみても問題ないです。
0 likes

1Answer

Comments

  1. @orionboy75

    Questioner

    ご返事ありがとうございます。

    サンプルリクエストURL
    https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/deleteItemImage

    サンプルリクエスト
    POST /ShoppingWebService/V1/deleteItemImage HTTP/1.1
    Host: circus.shopping.yahooapis.jp
    Authorization: Bearer <アクセストークン>

    seller_id=teststore&image_id=teststore_sample1%2Cteststore_sample2%2Cteststore_sample3

    以上
    Yahooのページにある内容です。
    宜しくお願い致します。
  2. それではなく

    objHTTP.setRequestHeader "Authorization", auth

    ここのauthです。この変数の中身を見せられますか?
  3. @orionboy75

    Questioner

    すみません。

    authは、
    Bearer xxxxxx

    こうなります。
    これでよろしいでしょうか?
  4. > トークンをxxxxxとかで伏せて書けますか?
    と一応忠告してたんですが...これが生のtokenなら消したほうが良いですよ。

    "Bearer"がないのかなとか思ったんですがありますね。
    あとはurlが本番環境用のURLじゃないかとかですかね?

    https://developer.yahoo.co.jp/webapi/shopping/deleteItemImage.html

    もっとコードを単純に考えて

    objHTTP

    を使って https://google.com にアクセスできますか?これでアクセスが問題ないならhttpsというプロトコルの問題ではなくurl、token辺りが問題になるのかなと思います。
  5. @orionboy75

    Questioner

    知識が足りなくてすみません。
    同じ方法、PHPを使うと問題なく動きます。
    URLは確かに本番環境用です。
    忠告通り、トークンはxxxにしました。
    ありがとうございます。

    PHPで動くのを見るとURLやトークンの問題ではないと思いますが・・・
    リフレッシュトークンとアクセストークンを取得するのは問題ないです。
    本番用URLを入れて、objHTTP.send msgをするとエラーになります。
  6. なので、objHTTPを使って https://google.com にアクセスしてhtmlを取ってみるのはどうですか?

    問題の切り分けとして

    - https(googleに行けるなら大丈夫なはず)
    - url(今一度Debug.WriteLineとかで実行中のものを見てみる)
    - token(同じtokenがPHPで動くなら問題ない)

    どこが原因かを段階的に見ていったほうが良いのかなと思いますが。
  7. エラーの時

    objHTTP.Status

    のコードは何がでますか?
  8. @orionboy75

    Questioner

    objHTTP.Statusには何もでません。
    その前にobjHTTP.sendでエラーになります。
    sendメソッドが働かないです。

Your answer might help someone💌