在GitHub Actions部署Python X机器人时无法读取Secrets的问题
解决GitHub Actions中Python X(原Twitter)机器人无法读取Secrets的问题
问题情况
- 已将TWITTER_API_KEY等密钥存储在GitHub仓库Secrets中
- GitHub Actions Workflow里能成功打印出密钥,但
Main.py读取这些密钥时返回None - 代码在Replit上运行正常,仅在GitHub部署时触发报错
错误日志
TWITTER_API_KEY: aycZ**** TWITTER_API_KEY_SECRET: **** TWITTER_API_SECRET_KEY: 5Y7Q**** TWITTER_ACCESS_TOKEN: 1804**** TWITTER_ACCESS_TOKEN_SECRET: radk**** 1s Run python Main.py Traceback (most recent call last): API Key: None File "/home/runner/work/X-bot/X-bot/Main.py", line 43, in <module> auth = tweepy.OAuthHandler(api_key, api_key_secret) File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/tweepy/auth.py", line 124, in __init__ super().__init__(consumer_key, consumer_secret, access_token, File "/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/tweepy/auth.py", line 31, in __init__ raise TypeError("Consumer key must be string or bytes, not " TypeError: Consumer key must be string or bytes, not NoneType Error: Process completed with exit code 1.
相关代码片段
import requests import tweepy import random import json import logging from io import BytesIO import os import http.client from apscheduler.schedulers.blocking import BlockingScheduler from flask import Flask from threading import Thread # 修正原代码中不必要的换行问题 bearer_token = os.getenv('TWITTER_BEARER_TOKEN') api_key = os.getenv('TWITTER_API_KEY') api_key_secret = os.getenv('TWITTER_API_KEY_SECRET') access_token = os.getenv('TWITTER_ACCESS_TOKEN') access_token_secret = os.getenv('TWITTER_ACCESS_TOKEN_SECRET') client = tweepy.Client( bearer_token=bearer_token, consumer_key=api_key, consumer_secret=api_key_secret, access_token=access_token, access_token_secret=access_token_secret ) auth = tweepy.OAuthHandler(api_key, api_key_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth)
解决方案
1. 确保Workflow中正确传递Secrets到环境变量
在GitHub Actions的Workflow配置文件(通常位于.github/workflows/目录下)中,执行Python脚本的步骤必须显式将Secrets映射为环境变量。示例配置:
- name: 运行Python脚本 env: TWITTER_API_KEY: ${{ secrets.TWITTER_API_KEY }} TWITTER_API_KEY_SECRET: ${{ secrets.TWITTER_API_KEY_SECRET }} TWITTER_BEARER_TOKEN: ${{ secrets.TWITTER_BEARER_TOKEN }} TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }} TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} run: python Main.py
注意:如果仅在单独的密钥打印步骤传递了变量,而执行脚本的步骤未配置,会导致脚本无法读取。
2. 修正代码中的语法错误与变量拼写
- 原代码中存在
os.getenv被拆分为多行的情况,这会触发Python语法错误,必须合并为单行(如上述代码片段所示)。 - 确认代码中使用的环境变量名称与GitHub Secrets的名称完全一致,包括大小写,比如
TWITTER_API_KEY_SECRET必须和Secrets中的名称完全匹配。
3. 验证环境变量传递状态
在Main.py开头添加打印语句,直接确认变量是否被正确读取:
import os print("API Key:", os.getenv('TWITTER_API_KEY')) print("API Key Secret:", os.getenv('TWITTER_API_KEY_SECRET'))
通过日志输出可以直接判断环境变量是否成功传递到脚本运行环境中。
内容的提问来源于stack exchange,提问作者Manasess Kamau
相关产品推荐
相关产品推荐

