【发布时间】:2019-06-20 05:44:49
【问题描述】:
我正在尝试修改 VBA 代码以根据跟踪号的长度使用不同的快递公司(例如,12 个字符 = Fedex,10 个字符 = DHL,6 个字符 = Startrack)。
如何在考虑 With、End With 语句的情况下集成 If、ElseIf 语句?
原始 JSON 转换器代码:VBA code - connect to webpage and retrieve value
原始 VBA
Option Explicit
Public Sub test()
Debug.Print GetDeliveryDate(727517426234#)
End Sub
Public Function GetDeliveryDate(ByVal id As Double) As Date
Dim s As String, body As String
body = "data={""TrackPackagesRequest"":{""appType"":""WTRK"",""appDeviceType"":""DESKTOP"",""supportHTML"":true,""supportCurrentLocation"":true,""uniqueKey"":"""",""processingParameters"":.{},""trackingInfoList"":[{""trackNumberInfo"":{""trackingNumber"":" & Chr$(34) & CStr(id) & Chr$(34) & ",""trackingQualifier"":"""",""trackingCarrier"":""""}}]}}"
body = body & "&action=trackpackages&locale=en_US&version=1&format=json"
With CreateObject("MSXML2.XMLHTTP")
.Open "POST", "https://www.fedex.com/trackingCal/track", False
.setRequestHeader "Referer", "https://www.fedex.com/apps/fedextrack/?tracknumbers=" & CStr(id)
.setRequestHeader "User-Agent", "Mozilla/5.0"
.setRequestHeader "X-Requested-With", "XMLHttpRequest"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
.send body
s = .responseText
End With
GetDeliveryDate = Split(Replace$(Split(Split(s, """actDeliveryDt"":""")(1), Chr$(34))(0), "\u002d", "-"), "T")(0)
End Function
在一个单独的模块上,我尝试通过将 VBA 更改为以下内容来使 DHL 正常工作
Public Function GetDHLDeliveryDate(ByVal id As Double) As Date
Dim json As Object, body As String '< VBE > Tools > References > Microsoft Scripting Runtime
body = "data={""TrackPackagesRequest"":{""appType"":""WTRK"",""appDeviceType"":""DESKTOP"",""supportHTML"":true,""supportCurrentLocation"":true,""uniqueKey"":"""",""processingParameters"":{},""trackingInfoList"":[{""trackNumberInfo"":{""trackingNumber"":" & Chr$(34) & CStr(id) & Chr$(34) & ",""trackingQualifier"":"""",""trackingCarrier"":""""}}]}}"
body = body & "&action=trackpackages&locale=en_AU&version=1&format=json"
With CreateObject("MSXML2.XMLHTTP")
.Open "POST", "https://api.dhlglobalmail.com", False
.setRequestHeader "Referer", "http://www.dhl.com.au/en/express/tracking.html?AWB=" & CStr(id)
.setRequestHeader "User-Agent", "Mozilla/5.0"
.setRequestHeader "X-Requested-With", "XMLHttpRequest"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
.send body
Set json = JSONConverter.ParseJson(.responseText)
End With
GetDHLDeliveryDate = json("TrackPackagesResponse")("packageList")(1)("displayActDeliveryDt")
End Function
但它在解析 JSON 时抛出了错误:
期待 '{' 或 '['
预期结果是:
如果追踪号码为 12 个字符,则前往 Fedex 网站获取追踪详情https://www.fedex.com/apps/fedextrack/?action=track&trackingnumber=786215144461
如果是 10 个字符,它会转到 DHL 站点以获取跟踪详细信息 http://www.dhl.com.au/en/express/tracking.html?AWB=3010931254&brand=DHL
如果是 6 个字符,它会去 starttrack 站点获取跟踪信息 https://my.startrackcourier.com.au/?type=Number&state=NSW&term=171100
这将允许我使用相同的=GetDeliveryDate(A1) 功能,而不是为每个托运人制作单独的功能。
【问题讨论】:
-
你好。第一件事。您必须了解 HTTP 请求/响应和 API 不是“一刀切”的东西。不同的网站提供不同的数据下载方式。响应的格式也不同。 JSON具有不同的结构等等。您不能只更改 URL 并期望它可以跨网站工作。我建议你更彻底地研究一下。
标签: json excel vba web-scraping