如何用Python调用Basecamp 3 API向Campfire上传图片?
解决Basecamp 3 API上传图片到Campfire的问题
你遇到的400错误主要来自两个核心问题:附件上传时硬编码了错误的Content-Length,以及发送Campfire消息时请求体格式不符合API要求。以下是具体修正方案:
错误分析
- 硬编码Content-Length:你把
Content-Length写死为123,这和实际图片文件大小不匹配,会导致附件上传请求异常。 - Campfire消息格式错误:Basecamp要求发送带附件的Campfire消息时,必须指定
type为Forward,且content是包含attachable_sgid的对象,而非直接传入sgid字符串。 - 手动拼接JSON风险:手动拼接JSON字符串容易出现转义错误,建议直接使用requests的
json参数自动处理序列化。
修正后的代码
import requests import os access_token = '你的token' account_id = "5437964" project_id = "29141823" campfire_id = "5288317671" base_url = f"https://3.basecampapi.com/{account_id}" # 1. 上传附件获取attachable_sgid file_path = "img.png" attachments_url = f"{base_url}/attachments.json?name={os.path.basename(file_path)}" # 动态计算实际文件大小,替换硬编码值 file_size = os.path.getsize(file_path) img_headers = { 'Authorization': f'Bearer {access_token}', "Content-Type": "image/png", "Content-Length": str(file_size) } with open(file_path, "rb") as img_content: response = requests.post(attachments_url, headers=img_headers, data=img_content) response.raise_for_status() # 检查附件上传是否成功,失败则抛出异常 attachable_sgid = response.json()['attachable_sgid'] # 2. 发送带附件的Campfire消息 campfire_url = f"{base_url}/buckets/{project_id}/chats/{campfire_id}/lines.json" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", } # 符合API要求的请求体结构 payload = { "type": "Forward", "content": { "attachable_sgid": attachable_sgid } } response = requests.post(campfire_url, headers=headers, json=payload) response.raise_for_status() # 检查消息发送是否成功 print("图片上传到Campfire成功")
关键修改说明
- 动态计算文件大小:使用
os.path.getsize()获取实际文件大小,确保请求头和上传内容的大小匹配。 - 规范消息结构:指定
type为Forward,并将attachable_sgid嵌套在content对象中,完全符合Basecamp 3 API的要求。 - 自动处理JSON序列化:通过
requests.post(..., json=payload)自动完成JSON转换,避免手动拼接字符串的转义错误。 - 添加异常检查:使用
response.raise_for_status()在请求失败时直接抛出异常,便于快速定位问题。
内容的提问来源于stack exchange,提问作者mare011
相关产品推荐
相关产品推荐

