【问题标题】:Access (and authenticate at) Zendesk web API with Excel VBA使用 Excel VBA 访问 Zendesk Web API(并在其中进行身份验证)
【发布时间】:2021-03-15 07:24:52
【问题描述】:

我正在尝试将 Web API 与 Excel VBA 一起使用。

在 API 说明中是这样写的:

使用 cURL

curl https://{subdomain}.zendesk.com/api/v2/users/create_or_update.json \
  -d '{"user": {"name": "Roger Wilco", "email": "roge@example.org"}}' \
  -H "Content-Type: application/json" -X POST \
  -v -u {email_address}:{password}

链接到 API 本身(创建或更新用户)https://developer.zendesk.com/rest_api/docs/support/users#create-or-update-user

这是我的代码:

Public Function PostJsonRequest() As String
    Dim strURL As String
    Dim strParse() As String
    Dim jsonStr As String
    Dim hreq As Object
    Dim tixScript As Object
    
    On Error GoTo Er   
 
    Set hreq = CreateObject("MSXML2.XMLHTTP")        
    strURL = "https://subdomain.zendesk.com/api/v2/users/create_or_update"
    hreq.Open "POST", strURL, 0, "username/token", "token"
    
    hreq.setRequestHeader "User-Agent", "Chrome"
    hreq.setRequestHeader "Content-Type", "application/json"
    hreq.setRequestHeader "Accept", "application/json"
    hreq.setRequestHeader "-v -u {MyEmail}:{MyPassword}"

    jsonStr = "-d '{""user"": {""name"": ""Roger Wilco"", ""email"": ""roge@example.org""}}'"
    hreq.Send jsonStr

    MsgBox hreq.responseText
    Exit Function
    
    Er:
    MsgBox "Error - " & Err.Number & " - " & Err.Description    
End Function

在电子邮件和密码行我收到此错误:

错误 - 450 - 参数数量错误或属性分配无效

【问题讨论】:

    标签: json excel vba api zendesk-api


    【解决方案1】:

    这无效hreq.setRequestHeader "-v -u {MyEmail}:{MyPassword}"

    改为尝试基本身份验证

    hreq.setRequestHeader "Authorization", "Basic dXNlcjpwYXNzd29yZA=="
    

    其中dXNlcjpwYXNzd29yZA== 是base64 编码的{MyEmail}:{MyPassword} 字符串。

    例如:

    Dim username As String
    username = "user123"
    
    Dim password As String
    password = "abc123"
    
    hreq.setRequestHeader "Authorization", "Basic " & EncodeBase64(username & ":" & password)
    

    base64 编码函数的工作原理如下:

    Private Function EncodeBase64(ByVal plainText As String) As String
        Dim bytes() As Byte
        Dim objXML As Object 'MSXML2.DOMDocument60
        Dim objNode As Object 'MSXML2.IXMLDOMNode
        
        bytes = StrConv(plainText, vbFromUnicode)
       
        Set objXML = CreateObject("MSXML2.DOMDocument.6.0")
        Set objNode = objXML.createElement("b64")
        objNode.DataType = "bin.base64"
        objNode.nodeTypedValue = bytes
        EncodeBase64 = objNode.Text
        
        Set objNode = Nothing
        Set objXML = Nothing
    End Function
    

    还要确保只发送不带 -d '…' 的 JSON 部分:

    jsonStr = "{""user"": {""name"": ""Roger Wilco"", ""email"": ""roge@example.org""}}"
    

    最后一个比问题更美观的东西:

    hreq.setRequestHeader "User-Agent", "Chrome"
    

    将您的用户代理字符串设置为伪造一个真正的用户代理,对于当前的 chrome,它看起来像:

    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
    

    例如,伪造用户代理是为了让网站认为您正在使用 Chrome 浏览器。对于 API,我猜这不是必需的,因此您可以将其设置为通用的,例如:

    hreq.setRequestHeader "User-Agent", "MyVBAProject Version x.y.z Windows 10 using MSXML2.XMLHTTP"
    

    向网站清楚地显示您属于哪种类型的应用程序。

    至少不要将其设置为 "Chrome",因为这只会让人感到困惑,因为 Chrome 永远不会使用该用户代理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2013-11-29
      • 2022-07-28
      • 2012-09-29
      • 2019-07-21
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多