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

问题描述

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

我尝试向我的请求添加“ X-XSRF-Token”标头。但是我仍然收到相同的“#”响应,其主体等于{“ 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","X-XSRF-Token": xsrf_token,"Cookie": res.to_hash['set-cookie'][0]
    }

解决方法

通常这样的令牌绑定到您的会话,通常是通过与请求一起发送的一个或多个cookie建立的,如果不存在这些cookie,则可能无效。

它也可能被锁定到特定的IP或浏览器。这些可以通过许多不同的方式实现。这样做的目的是使它尽可能不可重用,因此您必须与之抗争。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...