[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『yahooショッピングAPIをエクセル(VBA)に適用するときのエラーについて』(orionboy75)
<Qiita>にて質問した問題ですが、なかなか返事が来なかったため
ぐぐってここまでたどり着きました。
解決したいこと
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でテストしてみても問題ないです。
詳細は下記にリンク先で確認お願いいたします。
https://qiita.com/orionboy75/questions/ebda07ee744f5cd915c7
< 使用 Excel:Excel2016、使用 OS:Windows10 >
(とおりすがりかな) 2021/08/27(金) 16:04
こういうのやったことない人間にはさっぱりわかりません で、適当なことを書きますが、的外れだったりしても悪しからずご了承ください。
objHTTP.setRequestHeader "Authorization", auth
ってやってますが、auth の文字列は正しいんですか? その前に
auth = Replace(auth, vbLf, "") auth = Replace(auth, vbCrLf, "")
ってやってますが、これは効いてるんでしょうか。
単純に考えて、この2行の順番を逆にするか、
auth = Replace(auth, vbLf, "") auth = Replace(auth, vbCr, "")
にしないと CRLF のうちCR は置換されません。 (´・ω・`) 2021/08/27(金) 21:49
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.