You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Twitter Trends API遇403禁止错误求解决(X开发者免费权限)

解决X(原Twitter)Trends API调用403 Forbidden错误(免费权限场景)

核心原因

X的免费开发者账户(Free Tier)不支持访问v1.1版本的Trends API(/1.1/trends/place.json)。该端点仅对Basic及以上权限层级的账户开放,免费账户仅能访问有限的基础API端点。

解决方案步骤

1. 升级开发者权限层级

要调用趋势API,必须将你的开发者账户升级到Basic Tier(当前定价约每月100美元),更高层级的Pro、Enterprise也支持。升级路径:登录X开发者平台 → 进入项目 → 选择对应应用 → 在"Products"页面申请升级。

2. 确认应用权限配置

升级权限后,需确保你的应用已开启对应权限:

  • 进入X开发者平台的应用设置 → "Permissions and features"
  • 申请并启用Read权限(趋势API属于只读操作),等待审核通过后重新生成Bearer Token

3. 代码优化(规范实现+错误排查)

原代码存在可优化点,同时能帮助你更精准排查问题:

替换HttpWebRequest为HttpClient

.NET官方推荐使用HttpClient进行HTTP请求,代码更简洁且性能更优。同时添加详细的错误响应捕获,方便查看API返回的具体拒绝原因。

实体类定义(用于JSON反序列化)

创建对应API返回结构的实体类,方便将JSON数据绑定到Repeater控件:

Imports System.Collections.Generic

Public Class TrendItem
    Public Property name As String
    Public Property tweet_volume As Integer?
End Class

Public Class TrendLocation
    Public Property trends As List(Of TrendItem)
    Public Property name As String
    Public Property woeid As Integer
End Class

修改后的核心请求代码

Imports System.Net
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Web.Script.Serialization

Partial Class twitter_trends
    Inherits System.Web.UI.Page

    Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' 启用TLS 1.2/1.3,符合X API的安全要求
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 Or SecurityProtocolType.Tls13

        If Not IsPostBack Then
            Try
                Dim topTrends = Await GetTwitterTrendsAsync()
                rptTrends.DataSource = topTrends
                rptTrends.DataBind()
            Catch ex As Exception
                Response.Write($"请求失败: {ex.Message}")
            End Try
        End If
    End Sub

    Private Async Function GetTwitterTrendsAsync() As Task(Of List(Of TrendItem))
        Dim bearerToken = "你的有效Bearer Token"
        Dim woeid = "1" ' 1代表全球趋势,可替换为其他地区WOEID
        Dim apiUrl = $"https://api.twitter.com/1.1/trends/place.json?id={woeid}"

        Using client As New HttpClient()
            ' 设置授权头
            client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", bearerToken)
            ' 设置接受JSON格式
            client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))

            Dim response = Await client.GetAsync(apiUrl)
            If response.IsSuccessStatusCode Then
                Dim jsonContent = Await response.Content.ReadAsStringAsync()
                Dim serializer As New JavaScriptSerializer()
                ' 反序列化API返回的数组(第一个元素为目标地区的趋势数据)
                Dim trendData = serializer.Deserialize(Of List(Of TrendLocation))(jsonContent)
                ' 返回前10条趋势
                Return trendData(0).trends.Take(10).ToList()
            Else
                ' 捕获API返回的详细错误信息
                Dim errorDetails = Await response.Content.ReadAsStringAsync()
                Throw New Exception($"{response.StatusCode}: {errorDetails}")
            End If
        End Using
    End Function
End Class

调整ASPX的Repeater绑定

修改Repeater的ItemTemplate,匹配实体类的属性:

<asp:Repeater ID="rptTrends" runat="server">
    <ItemTemplate>
        <p><strong><%# Eval("name") %></strong> - Tweets: <%# If(Eval("tweet_volume") Is Nothing, "未知", Eval("tweet_volume")) %></p>
    </ItemTemplate>
</asp:Repeater>

关键提醒

  • 若未升级权限,无论代码如何调整都会返回403,这是X的权限限制导致的,而非代码问题
  • 升级权限后,务必重新生成Bearer Token,旧Token可能无法使用
  • 可以先通过Postman等工具测试API调用,确认权限生效后再集成到代码中

内容的提问来源于stack exchange,提问作者jouna harb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:00:16