跳转到主要内容

使用 X API 处理会话线程

观察 X 上对话的演变时,一个 Post 往往会引发多个会话线程,随着更多人参与,每个线程的长度和复杂度都会增加。X API v2 的响应负载和搜索功能支持识别 Post 之间的关系并理解会话线程。当某个 Post 收到回复(reply),或对该回复再进行回复时,每条回复上都会带有一个明确的 conversation_id,其值与发起该对话的原始 Post 的 Post ID 相同。 针对某个 Post 的回复,以及对这些回复的进一步回复,都会归入由该原始 Post 引发的同一会话。无论分化出多少条回复线程,它们都会共享指向引发该对话的原始 Post 的同一个 conversation_id。使用 X API v2,您可以检索并重建整个会话线程,从而理解讨论内容以及对话与观点如何演变。

示例对话串

下面展示一个包含五位不同参与者的对话串示例,其中包括对某条回复的再回复。
{
  "data": [
    {
      "conversation_id": "1279944223114900000",
      "in_reply_to_user_id": "1102323333",
      "author_id": "63044444",
      "created_at": "2020-07-06T15:58:10.000Z",
      "id": "1280169177479744444",
      "referenced_tweets": [
        {
          "type": "replied_to",
          "id": "1280155225706433333"
        }
      ],
      "text": "@ThirdPerson333 @OriginalPerson000 回复第三条回复!"
    },
    {
      "conversation_id": "1279944223114900000",
      "in_reply_to_user_id": "3001960000",
      "author_id": "1102323333",
      "created_at": "2020-07-06T15:02:44.000Z",
      "id": "1280155225706433333",
      "referenced_tweets": [
        {
          "type": "replied_to",
          "id": "1279944223114900000"
        }
      ],
      "text": "@OriginalPerson000 第三条回复"
    },
    {
      "conversation_id": "1279944223114900000",
      "in_reply_to_user_id": "3001960000",
      "author_id": "199562222",
      "created_at": "2020-07-06T15:02:36.000Z",
      "id": "1280155190306340864",
      "referenced_tweets": [
        {
          "type": "replied_to",
          "id": "1279944223114900000"
        }
      ],
      "text": "@OriginalPerson000 第二条回复"
    }
  ],
  "includes": {
    "users": [
      {
        "name": "原始用户",
        "id": "3001960000",
        "username": "OriginalPerson000"
      },
      {
        "name": "第一个用户",
        "id": "179201111",
        "username": "FirstPerson111"
      }
    ]
  },
  "meta": {
    "newest_id": "1280169177479744444",
    "oldest_id": "1279945722494811111",
    "result_count": 4
  }
}
conversation_id 作为 tweet.fields 参数进行检索 要在 v2 endpoint 上为返回的所有 Post 请求 conversation_id,请在请求参数中添加 tweet.fields=conversation_id 字段。conversation_id 字段始终等于该会话回复线程中原始 Post 的 Post ID。属于同一回复线程的所有 Post(包括由较早回复线程分支而来的回复线程)都会显示相同的 conversation_id。

携带 conversation_id 参数的请求

curl --request GET \
  --url 'https://api.x.com/2/tweets?ids=1225917697675886593&tweet.fields=author_id,conversation_id,created_at,in_reply_to_user_id,referenced_tweets&expansions=author_id,in_reply_to_user_id,referenced_tweets.id&user.fields=name,username' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'

响应

{
  "data": [
    {
      "id": "1225917697675886593",
      "text": "@TwitterEng *ahem* https://t.co/aroJHt2zQ1",
      "created_at": "2020-02-07T23:02:10.000Z",
      "author_id": "2244994945",
      "in_reply_to_user_id": "6844292",
      "conversation_id": "1225912275971657728",
      "referenced_tweets": [
        {
          "type": "quoted",
          "id": "1200517737669378053"
        },
        {
          "type": "replied_to",
          "id": "1225912275971657728"
        }
      ]
    }
  ],
  "includes": {
    "users": [
      {
        "username": "TwitterDev",
        "name": "Twitter Dev",
        "id": "2244994945"
      },
      {
        "username": "TwitterEng",
        "name": "Twitter Engineering",
        "id": "6844292"
      }
    ],
    "tweets": [
      {
        "id": "1200517737669378053",
        "text": "| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|\n             不要在            \n             周五发布到            \n               生产环境                  \n|___________| \n(\\__/)",
        "created_at": "2019-11-29T20:51:47.000Z",
        "author_id": "2244994945",
        "conversation_id": "1200517737669378053"
      }
    ]
  }
}

conversation_id 用作过滤运算符

conversation_id 可在“近期搜索”中作为搜索 query(查询)参数使用,或作为规则中的运算符用于过滤的流。这将返回整个 Post 会话线程:可通过过滤的流实时返回,或通过搜索 Tweets按时间逆序返回。你还可以将此运算符与Posts 计数结合使用,以获取会话中 Post 的数量。

使用 conversation_id 发起查询请求

curl --request GET \
  --url 'https://api.x.com/2/tweets/search/recent?query=conversation_id:1279940000004973111&tweet.fields=in_reply_to_user_id,author_id,created_at,conversation_id' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'

响应

注意:搜索 Post 的结果按时间逆序排列。
{
  "data": [
    {
      "id": "1280169000000704333",
      "text": "@attributeisland @iterationjoe 多么美丽的生物!#海龟周 快乐",
      "conversation_id": "1279940000004973111",
      "public_metrics": {
        "retweet_count": 0,
        "reply_count": 0,
        "like_count": 7,
        "quote_count": 0
      }
    }
  ],
  "meta": {
    "newest_id": "1280169000000704333",
    "oldest_id": "1279940000004973111",
    "result_count": 5
  }
}
I