Ruby: 从UPS获取跟踪信息API (无需登录)

Ruby: Get the tracking information from the UPS API (without login)

我在 rails 上构建了一个 ruby Web 应用程序,用于解析来自“https://www.ups.com/track/api/Track/GetStatus”的 UPS 货运跟踪信息。从昨天开始,我开始收到 401 错误,我再也无法检索到货件的跟踪信息。

我试图在我的请求中添加“X-XSRF-Token”header。但我仍然收到相同的“#”响应,其 body 等于 {"unauthorized":401}。我做错了什么吗?

这是我尝试实现的代码:

    uri = URI("https://www.ups.com/track/api/Track/GetStatus")
    res = Net::HTTP.get_response(uri)
    xsrf_token = res.to_hash['set-cookie'][1].split("\;")[0].split("X-XSRF-TOKEN-ST=")[1]
    
    header = {
      "Content-Type": "application/json",
      "Accept": "application/json",
      "X-Requested-With": "XMLHttpRequest",
      "X-XSRF-Token": xsrf_token
    }

    body = {
        "TrackingNumber": ["my ups tracking number"],
    }

    request = Net::HTTP::Post.new(uri, header)
    request.body = body.to_json

    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    response = http.request(request)

编辑(解决方案):

谢谢塔德曼的回答。一种解决方案确实是随请求发送 cookie。

    header = {
      "Content-Type": "application/json",
      "Accept": "application/json",
      "X-Requested-With": "XMLHttpRequest",
      "X-XSRF-Token": xsrf_token,
      "Cookie": res.to_hash['set-cookie'][0]
    }

通常情况下,此类令牌会绑定到您的会话,通常是通过一个或多个与请求一起发送的 cookie 建立的,如果没有这些 cookie,它可能无效。

它也可能被锁定到特定的IP或浏览器。这些可以通过许多不同的方式实现。我们的想法是让它尽可能 non-reusable,所以你将不得不与之抗争。

最后,使用 cookie 持久性建立您自己的会话并为此任务获取新令牌可能会更容易。