代码之家  ›  专栏  ›  技术社区  ›  Yios

使用/1.1/statuses/update在自己的Twitter帐户上发布推文。json失败,无法对您进行身份验证

  •  1
  • Yios  · 技术社区  · 8 年前

    我已经花了相当多的时间试图从我的网站上把推文发布到我自己的推特用户帐户,而不使用任何现成的解决方案。 该网站在应用程序上具有读/写权限。啁啾com和我已重新生成所有密钥。

    我遵循Twitter API的指示,参考端点“POST/1.1/statuses/update.json”

    我已经仔细检查了我所有的物品,现在仍在

    response       =--- !ruby/object:Net::HTTPUnauthorized
    http_version: '1.1'
    code: '401'
    message: Authorization Required
    header:
      connection:
      - close
      content-length:
      - '89'
      content-type:
      - application/json; charset=utf-8
      date:
      - Wed, 18 Oct 2017 15:28:19 GMT
      server:
      - tsa_o
      set-cookie:
      - personalization_id="v1_pxDMvL5ZrViFDcn8AfFemw=="; Expires=Fri, 18 Oct 2019 15:28:19
        UTC; Path=/; Domain=.twitter.com
      - guest_id=v1%3A150834049962807489; Expires=Fri, 18 Oct 2019 15:28:19 UTC; Path=/;
        Domain=.twitter.com
      strict-transport-security:
      - max-age=631138519
      x-connection-hash:
      - '05228a7a2026efc93a8a2d4b1a8c6460'
      x-response-time:
      - '142'
      x-tsa-request-body-time:
      - '1'
    body: '{"errors":[{"code":32,"message":"Could not authenticate you."}]}'
    read: true
    uri:
    decode_content: true
    socket:
    body_exist: true
    

    我想发送一个简单的“你好”从我的网站到我的推特帐户,并已仔细检查了所有部分,将出现在下面。

    此外,同样的逻辑用于使用我的twitter帐户在我的网站上验证我的身份。所以我知道授权(三条腿)工作正常。

    为了使用我的rails应用程序发布推文,我尝试了两种方法:1)使用我应用程序的消费者和访问令牌对发布推文,而不执行所有授权步骤;2)引导自己进入推文,明确重新授权我的网站发布推文。这两种情况都会导致错误401。除了实际的推特步骤外,一切都正常。

    非常感谢您的帮助。请注意,我对使用gem不感兴趣,并且已经彻底阅读了相关的API文档。

    以下是我的post请求的所有组成部分:

    Parameter String:    
    include_entities=true&
    oauth_consumer_key=Xffffffffffffffffffffffff&
    oauth_nonce=1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8&
    oauth_signature_method=HMAC-SHA1&
    oauth_timestamp=1508340584&
    oauth_token=4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG&
    oauth_version=1.0&
    status=Hello
    
    signature base string:
    POST&
    https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&
    include_entities%3Dtrue%26
    oauth_consumer_key%3DXffffffffffffffffffffffff%26
    oauth_nonce%3D1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8%26
    oauth_signature_method%3DHMAC-SHA1%26
    oauth_timestamp%3D1508340584%26
    oauth_token%3D4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG%26
    oauth_version%3D1.0%26
    status%3DHello
    
    signing key:
    W6SzwsKSXwFpl8tb0UNJFoCTW6crf6p3JaS8GipJMErofZVLAA&ENxK6XHG8h2EI7dOeSL0fABJzqnzs7FhP6QirBbXvd0br
    
    signature:
    0zx68mHx/SxhHkoRpaqZmO8iC2s=
    
    header string:
    OAuth oauth_consumer_key="Xffffffffffffffffffffffff", 
    oauth_nonce="1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8", 
    oauth_signature="0zx68mHx%2FSxhHkoRpaqZmO8iC2s%3D", 
    oauth_signature_method="HMAC-SHA1", 
    oauth_timestamp="1508340584", 
    oauth_token="4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", 
    oauth_version="1.0"
    
    
    POST REQUEST
    request        =--- !ruby/object:Net::HTTP::Post
    method: POST
    request_has_body: true
    response_has_body: true
    uri:
    path: "/1.1/statuses/update.json?include_entities=true"
    decode_content: true
    header:
      content-type:
      - application/x-www-form-urlencoded
      authorization:
      - OAuth oauth_consumer_key="Xffffffffffffffffffffffff", oauth_nonce="1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8",
        oauth_signature="0zx68mHx%2FSxhHkoRpaqZmO8iC2s%3D", oauth_signature_method="HMAC-SHA1",
        oauth_timestamp="1508340584", oauth_token="4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG",
        oauth_version="1.0"
      host:
      - api.twitter.com
      accept-encoding:
      - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
      accept:
      - "*/*"
      user-agent:
      - Ruby
    body: '{"status":"Hello"}'
    body_stream:
    body_data:
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Yios    8 年前

    我终于成功了。存在几个问题。没有签名和授权标头。相反,使用的时间戳中存在问题,没有正确同步,也没有像推特所期望的那样在GMT中。我将系统时钟与时间同步。谷歌。com,这部分已经完成。现在,还有一个关于标题的问题,它也需要排序,这与twitter自己的文档只在签名基字符串的上下文中谈论排序相反。我发现扩展头也需要排序。扩展是因为它包含推文本身,而推文本身不是签名计算的一部分。一旦这一部分在发布中建立起来,推特就成功了