如何调度Python脚本实现OneDrive文件上传并部署至服务器?
解决方案:将Excel同步脚本部署到Heroku并集成OneDrive
1. 注册Azure AD应用获取API凭证
要在服务器端访问OneDrive,必须通过Microsoft Graph API完成授权,步骤如下:
- 登录Azure门户,进入Azure Active Directory → 应用注册 → 新注册
- 自定义应用名称,支持账户类型选任何组织目录中的账户和个人Microsoft账户(适配个人OneDrive),重定向URI留空(服务器端用无用户交互的客户端凭证流)
- 注册完成后,记录页面上的客户端ID和租户ID
- 进入证书和密码 → 新客户端密码,设置过期时间后生成密钥,务必保存生成的客户端密钥(仅显示一次)
- 进入API权限 → 添加权限 → Microsoft Graph → 应用权限,添加
Files.ReadWrite.All权限(可根据需求选择更细的权限范围),最后点击授予管理员同意
2. 修改Python脚本适配Heroku与Graph API
整理依赖文件
在项目根目录创建requirements.txt,添加所需依赖:
requests msgraph-core python-dotenv pandas # 若脚本需处理Excel逻辑则添加
核心代码调整示例
替换原本地操作OneDrive的代码,改用Graph API实现文件上传:
import os import requests from dotenv import load_dotenv from msgraph.core import GraphClient # 加载环境变量 load_dotenv() # 初始化Graph客户端 client = GraphClient( credential={ 'client_id': os.getenv('CLIENT_ID'), 'client_secret': os.getenv('CLIENT_SECRET'), 'tenant_id': os.getenv('TENANT_ID'), 'scopes': ['https://graph.microsoft.com/.default'] } ) def download_excel(url, save_path): # 实现你的Excel下载逻辑 response = requests.get(url) with open(save_path, 'wb') as f: f.write(response.content) def upload_to_onedrive(local_file_path, onedrive_folder_name, file_name): # 查询目标文件夹ID(可预先手动获取后硬编码,减少重复请求) folder_response = client.get(f'/me/drive/root:/{onedrive_folder_name}') folder_id = folder_response.json()['id'] # 上传文件到指定文件夹 with open(local_file_path, 'rb') as f: client.put( f'/me/drive/items/{folder_id}:/{file_name}:/content', data=f, headers={'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'} ) if __name__ == '__main__': # 下载Excel到Heroku临时目录(Heroku仅/tmp目录可写) temp_file = '/tmp/daily_excel.xlsx' download_excel('你的Excel文件下载URL', temp_file) # 上传至OneDrive指定文件夹 upload_to_onedrive(temp_file, '每日数据备份', f'当日数据_{pd.Timestamp.now().strftime("%Y%m%d")}.xlsx') # 清理临时文件 os.remove(temp_file)
3. 配置Heroku环境变量
进入Heroku控制台对应应用 → 设置 → 配置变量,添加以下字段:
CLIENT_ID:Azure应用的客户端IDCLIENT_SECRET:Azure应用的客户端密钥TENANT_ID:Azure应用的租户ID
4. 设置定时任务
- 在Heroku控制台的资源页面搜索并安装Scheduler插件
- 进入Scheduler页面点击添加任务,设置执行频率(如每天固定时间),命令填写
python your_script.py(替换为你的脚本文件名)
5. 部署与测试
- 通过Git推送代码到Heroku:
git init heroku create your-app-name git add . git commit -m "Initial deploy" git push heroku main
- 手动触发脚本测试:
heroku run python your_script.py,通过heroku logs --tail查看运行日志排查问题
内容的提问来源于stack exchange,提问作者Gustavo Lacerda
相关产品推荐
相关产品推荐

