将Excel/VBA转换为Python

将Excel/VBA转换为Python,python,excel,vba,Python,Excel,Vba,我在这里找到了一个Excel/VBA脚本,正在尝试将其转换为Python。首先是VBA,然后是我的Python尝试。我应该如何修复Python代码 Public Function GetUPSDeliveryDate(ByVal id As String) As String Dim body As String, json As Object body = "{""Locale"":""en_US"",&

我在这里找到了一个Excel/VBA脚本,正在尝试将其转换为Python。首先是VBA,然后是我的Python尝试。我应该如何修复Python代码

Public Function GetUPSDeliveryDate(ByVal id As String) As String
Dim body As String, json As Object
body = "{""Locale"":""en_US"",""TrackingNumber"":[""" & id & """]}"
With CreateObject("MSXML2.XMLHTTP")
    .Open "POST", "https://www.ups.com/track/api/Track/GetStatus?loc=en_US", False
    .setRequestHeader "Referer", "https://www.ups.com/track?loc=en_US&requester=ST/"
    .setRequestHeader "User-Agent", "Mozilla/5.0"
    .setRequestHeader "DNT", "1"
    .setRequestHeader "Content-Type", "application/json"
    .setRequestHeader "Accept", "application/json, text/plain, */*"
    .send body
    Set json = JsonConverter.ParseJson(.responseText)
End With

我的尝试是:

def f(tn):
  data = {"Locale":"en_US",
    "TrackingNumber":f"[{tn}]",
    "Referer": "https://www.ups.com/track?loc=en_US&requester=ST/",
    "User-Agent": "Mozilla/5.0",
    "DNT": "1",
    "Content-Type": "application/json",
    "Accept": "application/json, text/plain, */*"}

  r = requests.post("https://www.ups.com/track/api/Track/GetStatus?loc=en_US", data=data)
  print(r.json())

我猜一个问题是将VBA中的
主体部分
放入
数据中

对。Locale和TrackingNumber是数据的一部分。其他所有内容都是请求头

def f(tn):
  data = {"Locale":"en_US",
    "TrackingNumber":f"[{tn}]"}
  headers = {
    "Referer": "https://www.ups.com/track?loc=en_US&requester=ST/",
    "User-Agent": "Mozilla/5.0",
    "DNT": "1",
    "Content-Type": "application/json",
    "Accept": "application/json, text/plain, */*"}

  r = requests.post("https://www.ups.com/track/api/Track/GetStatus?loc=en_US", data=data, headers=headers)
  print(r.json())

对。Locale和TrackingNumber是数据的一部分。其他所有内容都是请求头

def f(tn):
  data = {"Locale":"en_US",
    "TrackingNumber":f"[{tn}]"}
  headers = {
    "Referer": "https://www.ups.com/track?loc=en_US&requester=ST/",
    "User-Agent": "Mozilla/5.0",
    "DNT": "1",
    "Content-Type": "application/json",
    "Accept": "application/json, text/plain, */*"}

  r = requests.post("https://www.ups.com/track/api/Track/GetStatus?loc=en_US", data=data, headers=headers)
  print(r.json())

正如@Tim Roberts的回答所说的,现在您正在POST数据中包含所有标题。它们应该作为标题单独传递。正如@Tim Roberts的回答所说,现在您将所有标题都包含在POST数据中。它们应该作为标题单独传递。谢谢。唉,我得到了一个拒绝访问的错误,但这似乎是原始代码的问题(我还没有测试)。谢谢。唉,我得到了一个拒绝访问的错误,但这似乎是原始代码的问题(我还没有测试)。