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

如何通过服务器脚本实现YouTube频道横幅自动更新

全自动无人值守更新YouTube频道横幅实现方案

完全可以实现,你当前的代码无法满足自动化需求的核心问题有两个:

  • 你使用了InstalledAppFlow.run_console()控制台授权模式,该模式本身是为本地手动操作场景设计,首次授权或凭据过期时都需要人工复制粘贴授权码,无法自动完成身份校验。
  • 代码逻辑存在两处错误:一是初始化YouTube服务时错误混用了API Key,API Key仅支持公开数据查询,没有修改频道内容的权限;二是仅调用了channelBanners.insert接口上传横幅素材,没有调用频道更新接口将素材绑定为当前频道横幅,即使上传成功也不会实际修改频道展示的横幅。

实现步骤

1. 一次性授权准备(仅需操作1次)

你只需要在本地有浏览器的环境下完成一次授权,拿到长期有效的刷新凭据,后续服务器运行时会自动刷新短期访问令牌,全程不需要人工介入:

  • 在Google Cloud控制台创建好OAuth 2.0客户端凭据,下载得到client_secret.json文件
  • 在本地运行下文给出的完整脚本,按照弹出的浏览器提示登录你的YouTube账号完成授权,脚本会自动在同目录生成token.json凭据文件
  • 将client_secret.json、token.json、存放轮播横幅的文件夹一起上传到服务器即可

2. 服务器端全自动脚本

脚本会自动检测凭据有效性,过期时自动刷新,不需要手动操作;同时自带随机选图的轮播逻辑,你只需要把所有要轮播的横幅图片放到指定文件夹即可。

import os
import random
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow

# 配置参数
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
CLIENT_SECRET_PATH = 'client_secret.json'
TOKEN_SAVE_PATH = 'token.json'
BANNER_FOLDER = './banners'  # 所有待轮播横幅存放在该目录
TARGET_CHANNEL_ID = '替换为你自己的YouTube频道ID'

def get_auth_credentials():
    creds = None
    # 读取本地已保存的凭据
    if os.path.exists(TOKEN_SAVE_PATH):
        creds = Credentials.from_authorized_user_file(TOKEN_SAVE_PATH, SCOPES)
    # 凭据过期时自动刷新,无需人工操作
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
            with open(TOKEN_SAVE_PATH, 'w') as f:
                f.write(creds.to_json())
        else:
            # 该分支仅在本地首次无有效凭据时触发,服务器部署后不会走到该逻辑
            flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_PATH, SCOPES)
            creds = flow.run_local_server(port=0)
            with open(TOKEN_SAVE_PATH, 'w') as f:
                f.write(creds.to_json())
    return creds

def rotate_banner():
    creds = get_auth_credentials()
    # 使用OAuth凭据初始化服务,不要传入API Key
    youtube = build('youtube', 'v3', credentials=creds)

    # 从目录中选取一张可用横幅
    banner_files = [f for f in os.listdir(BANNER_FOLDER) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
    if not banner_files:
        raise RuntimeError("指定目录下没有找到可用的横幅图片")
    selected_img = os.path.join(BANNER_FOLDER, random.choice(banner_files))

    # 第一步:上传横幅素材到YouTube服务器
    upload_resp = youtube.channelBanners().insert(
        body={},
        media_body=MediaFileUpload(selected_img, chunksize=-1, resumable=True)
    ).execute()
    new_banner_url = upload_resp['url']

    # 第二步:将上传完成的素材设置为频道当前横幅
    youtube.channels().update(
        part='brandingSettings',
        body={
            'id': TARGET_CHANNEL_ID,
            'brandingSettings': {
                'image': {
                    'bannerExternalUrl': new_banner_url
                }
            }
        }
    ).execute()
    print(f"横幅更新成功,当前使用图片:{selected_img}")

if __name__ == "__main__":
    rotate_banner()

3. 配置自动运行

在服务器上配置定时任务即可实现自动轮播,比如使用crontab设置每天凌晨2点执行一次脚本,就会自动随机切换一张横幅,全程无人值守。

注意事项

  • 横幅图片推荐使用2560*1440分辨率,符合YouTube官方尺寸要求,避免出现裁切异常、上传失败的问题
  • 不要泄露client_secret.json和token.json文件,持有这两个文件的主体可以直接修改你对应频道的相关设置
  • 如果后续修改了授权的SCOPE权限,需要重新在本地跑一次授权流程生成新的token.json再传到服务器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:33:20