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

使用Python调用Bitly API缩短URL时遭遇403 Forbidden错误求助

你的Bitly API 403 Forbidden错误分析与修复方案

看起来你遇到的403问题主要来自几个关键的配置和代码细节,咱们一步步拆解解决:

1. group_guid 用错了——它不是用户名!

Bitly v4 API要求的group_guid是你账户下对应群组的唯一标识符,绝对不是你的用户名。你可以通过这条curl命令获取自己的群组GUID:

curl -H "Authorization: Bearer YOUR_API_TOKEN" https://api-ssl.bitly.com/v4/groups

返回的JSON数据里会有一个guid字段,把这个值替换掉你当前用的os.environ["BITLY_USER"]就行。

2. 请求没告诉服务器你发的是JSON

你的代码用json.dumps生成了JSON格式的payload,但直接传给requests.post的data参数时,没有设置Content-Type: application/json请求头。Bitly API会因为无法识别请求格式而拒绝访问。

有两种简单的修复方式:

  • 更省心的方式:用requests.post的json参数替代data,requests会自动帮你设置正确的请求头,还不用手动dumps:
    response = requests.post(
        "https://api-ssl.bitly.com/v4/shorten",
        json={'long_url': u[1], "domain": "bit.ly", "group_guid": group_guid },
        headers={'Authorization': f"Bearer {api_key}" }
    )
    
  • 手动加头的方式:如果坚持用data参数,记得补上Content-Type:
    response = requests.post(
        "https://api-ssl.bitly.com/v4/shorten",
        data=payload,
        headers={
            'Authorization': f"Bearer {api_key}",
            'Content-Type': 'application/json'
        }
    )
    

3. 确认你的API令牌有权限

你提到用curl获取的API令牌,要确保这个令牌属于有权限操作对应群组的账户,且令牌拥有缩短链接的权限。可以用这条命令验证令牌有效性:

curl -H "Authorization: Bearer YOUR_API_TOKEN" https://api-ssl.bitly.com/v4/user

如果返回正常的用户信息,说明令牌是没问题的。

修复后的完整代码参考

import re
import sys
import glob
import json
import requests
import os
from pprint import pprint

if len(sys.argv) > 1:
    urls_json = sys.argv[1]
else:
    urls_json = "enlaces.json"

with open( urls_json ) as data_file:
    urls = json.load(data_file)

api_key = os.environ["BITLY_TOKEN"]
# 替换成你通过/groups接口拿到的真实group_guid
group_guid = os.environ["BITLY_GROUP_GUID"]
shortened_links = []

for u in urls:
    # 直接用json参数自动处理序列化和请求头
    payload = {'long_url': u[1], "domain": "bit.ly", "group_guid": group_guid }
    response = requests.post(
        "https://api-ssl.bitly.com/v4/shorten",
        json=payload,
        headers={'Authorization': f"Bearer {api_key}" }
    )
    # 打印响应JSON比raw对象更方便调试
    response_data = response.json()
    pprint(response_data)
    if 'link' in response_data:
        shortened_links.append(response_data['link'])

# 可选:把缩短后的链接保存到文件
with open("shortened_links.json", "w") as f:
    json.dump(shortened_links, f, indent=2)

额外调试小技巧

如果还是遇到403,试试这些:

  • 检查你的账户是否还有创建短链接的额度(免费账户有数量限制)
  • 确认你要缩短的long_url是有效的、可正常访问的链接,Bitly会拒绝无效或违规的URL
  • 一定要看response.json()返回的具体错误信息,API会告诉你到底是权限、参数还是格式问题,比看response.raw有用多了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:30:20