Преобразование Curl в VBA - PullRequest
0 голосов
/ 22 марта 2019

Что такое VBA-код этого API-интерфейса (для API проверки домена Name.com):

curl -u 'username: token' 'https://api.dev.name.com/v4/domains:checkAvailability' -X POST --data'{"domainNames": ["example.org"]}'

Пытался:

Set request = CreateObject("WinHttp.WinHttpRequest.5.1") '
url = "https://api.dev.name.com/v4/domains:checkAvailability"
request.Open "POST", url, False
request.setRequestHeader "username:token", "???:???"
or 
request.SetCredentials "username", "token", 0
request.setRequestHeader "domainNames", Range("C1").Value & ".com"
request.Send
MsgBox request.ResponseText

В нем говорится: "message:", "unauthenticated"

Примечание: для API доступности домена GoDaddy это преобразование работает:

curl -X GET -H "Авторизация: sso-ключ [API_KEY]: [API_SECRET]" "https://api.godaddy.com/v1/domains/available?domain="

VBA:

url = "https://api.godaddy.com/v1/domains/available?domain=" & Range(CellC).Value & ".com"
request.setRequestHeader "Authorization", "sso-key ???:???"

(имя пользователя и токен / ключ (???) скрыты)

Также для запроса "whois.internic.net", a(работает) Пример кода VBA приветствуется.

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

Почему бы не использовать curl напрямую (через оболочку Windows):

Для приведенного ниже кода вы устанавливаете ссылку на Windows Script Host Object Model для раннего связывания.

Конечно, я не могу проверить это как дано, так как он возвращает «Отказано в доступе», что, как я полагаю, связано с неверным именем пользователя: токен.

Обратите внимание на "" экранированные кавычки для кавычек, включенных в строку в кавычках.

Option Explicit
Sub curl()
    Const strCurl As String = """username:token"" ""https://api.dev.name.com/v4/domains:checkAvailability"" -X POST --data ""{""domainNames"":[""example.org""]}"""
    Dim WSH As WshShell, lErrCode As Long
    Dim FSO As FileSystemObject, TS As TextStream
    Dim sTemp As String
    Dim sBasePath As String
    Dim I As Long
    Dim strJson As String

    sTemp = Environ("Temp") & "\FileList.txt"



Set WSH = New WshShell
lErrCode = WSH.Run("CMD /c curl -u" & strCurl & " > " & sTemp, xlHidden, True)

'lErrCode = WSH.Run("CMD /c tree """ & sBasePath & """ /F /A > " & sTemp, xlHidden, True)

If Not lErrCode = 0 Then
    MsgBox "Problem " & "Error Code " & lErrCode
    Exit Sub
End If


Set FSO = New FileSystemObject
Set TS = FSO.OpenTextFile(sTemp, ForReading, False, TristateFalse)
strJson = TS.ReadAll
TS.Close

FSO.DeleteFile sTemp
Set FSO = Nothing
Set WSH = Nothing

Stop 'see what's in the string.
     'if it worked, then you can parse the results

End Sub
0 голосов
/ 22 марта 2019

Вам нужно в base64 кодировать данные аутентификации и передать заголовки и передать список доменов в теле. Я использовал jsonconverter.bas для анализа ответа json. После добавления базы вам необходимо добавить ссылку, показанную ниже. Также добавьте ссылку на Microsoft xml

Public Sub GetResults()
    Dim data As String, json As Object '<  VBE > Tools > References > Microsoft Scripting Runtime
    data = "{""domainNames"":[""google.com""]}"
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "POST", "https://api.dev.name.com/v4/domains:checkAvailability", False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
        .setRequestHeader "Authorization", "Basic " + _
            EncodeBase64("username" + ":" + "Token")
        .send data
        Set json = JsonConverter.ParseJson(.responseText)
        Dim result As Object
        For Each result In json("results")
            Debug.Print result("domainName")
        Next
    End With
End Sub

Function EncodeBase64(text As String) As String


  Dim arrData() As Byte
  arrData = StrConv(text, vbFromUnicode)

  Dim objXML As MSXML2.DOMDocument60
  Dim objNode As MSXML2.IXMLDOMElement

  Set objXML = New MSXML2.DOMDocument60
  Set objNode = objXML.createElement("b64")

  objNode.DataType = "bin.base64"
  objNode.nodeTypedValue = arrData
  EncodeBase64 = Application.Clean(objNode.text)

  Set objNode = Nothing
  Set objXML = Nothing
End Function

функция base64 взята из здесь / здесь .

Если вы знаете Python, вы можете сделать это проще:

import requests

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}

data = '{"domainNames":["google.com"]}'

result = requests.post('https://api.dev.name.com/v4/domains:checkAvailability', data=data, headers = headers, auth=('username','token')).json()
print(result['results'])
0 голосов
/ 22 марта 2019

Можете ли вы попробовать XMLHTTP и посмотреть, имеет ли это какое-то значение, включая имя пользователя и токен в методе open?

url = "https://api.dev.name.com/v4/domains:checkAvailability"

Set request = CreateObject("MSXML2.ServerXMLHTTP.6.0")
request.open("POST", url, False, "username", "token")
request.setRequestHeader "domainNames", Range("C1").Value & ".com"
request.Send

MsgBox request.ResponseText
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...