如何让Python脚本自动获取Dropbox API的访问令牌?
解决Dropbox令牌过期实现无人值守Python应用方案
一、获取长期有效的Refresh Token
这一步仅需手动操作一次,之后就能实现自动刷新令牌:
- 登录Dropbox开发者控制台,打开你的应用
- 在应用「Settings」页面的「OAuth 2」区域,确认Access type选择「Full Dropbox」或「App folder」(按需选择)
- 构造授权URL,必须带上
access_type=offline参数,示例格式:
https://www.dropbox.com/oauth2/authorize?client_id=你的应用CLIENT_ID&response_type=code&access_type=offline- 构造授权URL,必须带上
- 在浏览器打开该URL,登录Dropbox账号并授权,获取授权码(authorization code)
- 用授权码兑换refresh token和初始access token,执行以下Python代码:
得到的refresh token长期有效,除非你手动撤销应用权限。import requests import json token_url = "https://api.dropboxapi.com/oauth2/token" data = { "grant_type": "authorization_code", "code": "你拿到的授权码", "client_id": "你的应用CLIENT_ID", "client_secret": "你的应用CLIENT_SECRET" } response = requests.post(token_url, data=data) tokens = response.json() # 将refresh token保存到本地文件,后续自动刷新用 with open("dropbox_tokens.json", "w") as f: json.dump({"refresh_token": tokens["refresh_token"]}, f)
二、编写自动刷新令牌的Python业务代码
Dropbox官方SDK内置了自动刷新逻辑,无需手动处理令牌过期:
- 安装SDK:
pip install dropbox
- 安装SDK:
- 核心代码示例:
import dropbox import json import time # 加载保存的refresh token with open("dropbox_tokens.json", "r") as f: tokens = json.load(f) refresh_token = tokens["refresh_token"] client_id = "你的应用CLIENT_ID" client_secret = "你的应用CLIENT_SECRET" # 初始化客户端,SDK会自动处理令牌刷新 dbx = dropbox.Dropbox( oauth2_refresh_token=refresh_token, app_key=client_id, app_secret=client_secret ) def update_dropbox_file(local_file_path, dropbox_file_path): with open(local_file_path, "rb") as f: dbx.files_upload(f.read(), dropbox_file_path, mode=dropbox.files.WriteMode.overwrite) # 24小时循环执行,每分钟覆盖一次文件 while True: update_dropbox_file("你的本地文件路径", "/Dropbox目标文件路径") time.sleep(60)
三、服务器部署保障后台运行
- 确保
dropbox_tokens.json和代码文件权限安全(仅当前用户可读) - 使用进程管理工具让脚本后台持续运行:
- 用
nohup快速启动:nohup python3 your_script.py & - 用
systemd实现开机自启+崩溃重启:
创建服务文件/etc/systemd/system/dropbox-updater.service:
执行命令生效:[Unit] Description=Dropbox File Updater After=network.target [Service] User=你的服务器用户名 ExecStart=/usr/bin/python3 /脚本所在路径/your_script.py Restart=always [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload sudo systemctl start dropbox-updater sudo systemctl enable dropbox-updater
- 用
内容的提问来源于stack exchange,提问作者Sufiyan Ashraf
相关产品推荐
相关产品推荐

