如何实现Python脚本后台定期免登录上传文件至指定Google Drive账户
实现无交互后台上传文件到独立Google Drive账户的Python脚本
要实现无交互的后台定期上传,核心是用Google的**服务账号(Service Account)**来做认证——这种方式不需要用户手动登录,完全适合后台脚本运行。我帮你梳理下具体步骤和代码修改方案:
一、准备工作:创建并配置服务账号
- 登录Google Cloud控制台,创建一个新项目(或使用现有项目)。
- 在项目内搜索并启用「Google Drive API」。
- 左侧菜单进入「IAM与管理」→「服务账号」,点击「创建服务账号」,填写名称和ID后直接完成创建(暂时不需要分配角色)。
- 找到刚创建的服务账号,进入「密钥」标签页,点击「添加密钥」→「创建新密钥」,选择JSON格式,下载密钥文件(保存为
service_account_key.json,放在脚本同目录下)。 - 打开你的独立Google Drive账户,创建目标上传文件夹,右键选择「共享」,把服务账号的邮箱(可在下载的JSON密钥里的
client_email字段找到)添加进去,赋予「编辑」权限。
二、编写无交互上传脚本
替换原来的OAuth认证逻辑,改用服务账号认证。下面是完整的可运行示例:
首先安装依赖:
pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib schedule
脚本代码:
import os import schedule import time from google.oauth2 import service_account from googleapiclient.discovery import build from googleapiclient.http import MediaFileUpload # 配置参数,替换成你自己的内容 SERVICE_ACCOUNT_KEY_PATH = 'service_account_key.json' TARGET_FOLDER_ID = '你的目标文件夹ID' # 从Drive文件夹URL获取,比如https://drive.google.com/drive/folders/XXX里的XXX UPLOAD_FILE_PATH = '/path/to/your/target/file' # 本地要上传的文件路径 UPLOAD_INTERVAL_HOURS = 24 # 上传间隔,这里设置为每天一次 def upload_to_drive(): # 加载服务账号密钥并生成认证凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=['https://www.googleapis.com/auth/drive.file'] ) # 构建Drive服务客户端 drive_service = build('drive', 'v3', credentials=credentials) # 准备上传媒体对象 file_name = os.path.basename(UPLOAD_FILE_PATH) media = MediaFileUpload(UPLOAD_FILE_PATH) # 上传文件到指定文件夹 file_metadata = { 'name': file_name, 'parents': [TARGET_FOLDER_ID] } upload_result = drive_service.files().create( body=file_metadata, media_body=media, fields='id' ).execute() print(f"文件上传成功,Drive文件ID: {upload_result.get('id')}") if __name__ == '__main__': # 脚本启动时先执行一次上传 upload_to_drive() # 设置定期上传任务 schedule.every(UPLOAD_INTERVAL_HOURS).hours.do(upload_to_drive) # 保持脚本运行以触发定时任务 while True: schedule.run_pending() time.sleep(60)
三、关键细节说明
- 服务账号权限逻辑:服务账号本身有独立的Drive空间,但我们通过共享独立账户的文件夹,让它能将文件直接上传到你的目标账户中——这就是实现“上传至独立账户而非用户个人账户”的核心。
- 定时任务优化:如果需要长期稳定运行,更推荐用操作系统的定时任务(比如Linux的
cron,Windows的「任务计划程序」)来触发脚本,比脚本内的循环更可靠(避免脚本崩溃后停止运行)。 - 权限最小化:代码中使用的
drive.file权限仅允许服务账号访问自己上传的文件或被共享的文件,遵循最小权限原则,比全Drive权限更安全。
四、常见问题排查
- 若上传失败提示权限不足:检查服务账号邮箱是否被正确添加到目标文件夹的共享列表,且权限设置为「编辑」。
- 若找不到目标文件夹ID:打开Drive文件夹,URL中
folders/后面的字符串就是文件夹ID。
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

