refactor: 配置迁移至 .env,推送直连设备 MAC
- config.py 顶部新增零依赖 _load_dotenv(),凭证/参数统一从同目录 .env 读取, 真实环境变量(cron/命令行注入)优先;移除所有明文 fallback - 新增 .env.example 模板,.env 加入 .gitignore - pusher.py 删除 get_devices(),resolve_device_id() 直接取 ZECTRIX_DEVICE_ID, 不再调 GET /devices 列表 - jm_api.py 改为设备密钥授权(client_secret,免验证码),token 进程内缓存 + 401 重试 - 同步 CLAUDE.md / main.py 文档 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
43
config.py
43
config.py
@@ -1,15 +1,38 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""全局配置。敏感项支持用环境变量覆盖。"""
|
||||
"""全局配置。敏感项从同目录 .env 读取,真实环境变量(如 cron 注入)优先。"""
|
||||
import os
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
def _load_dotenv(path):
|
||||
"""极简零依赖 .env 加载器:把 KEY=VALUE 写入 os.environ。
|
||||
已存在的真实环境变量优先(不覆盖),故 cron/命令行注入仍可压过 .env。
|
||||
支持 # 注释、空行、行内 KEY=VALUE,值两侧成对的单/双引号会被去掉。"""
|
||||
try:
|
||||
with open(path, "r", encoding="utf-8") as fp:
|
||||
for raw in fp:
|
||||
line = raw.strip()
|
||||
if not line or line.startswith("#") or "=" not in line:
|
||||
continue
|
||||
key, _, val = line.partition("=")
|
||||
key, val = key.strip(), val.strip()
|
||||
if len(val) >= 2 and val[0] == val[-1] and val[0] in "\"'":
|
||||
val = val[1:-1]
|
||||
if key:
|
||||
os.environ.setdefault(key, val)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
_load_dotenv(os.path.join(BASE_DIR, ".env"))
|
||||
|
||||
# ---- Zectrix 极趣云平台 API ----
|
||||
API_BASE = "https://cloud.zectrix.com/open/v1"
|
||||
API_KEY = os.environ.get("ZECTRIX_API_KEY", "zt_3266e9b843768257893ff95e4bf4d740")
|
||||
API_KEY = os.environ.get("ZECTRIX_API_KEY", "")
|
||||
|
||||
# 目标设备 ID(MAC)。留空则自动取设备列表的第一个。
|
||||
# 目标设备 ID(硬件 MAC)。必填——直接据此调推送接口,不再获取设备列表。
|
||||
DEVICE_ID = os.environ.get("ZECTRIX_DEVICE_ID", "")
|
||||
|
||||
# 推送参数
|
||||
@@ -24,15 +47,21 @@ FONT_PATH = os.path.join(BASE_DIR, "fonts", "fusion-pixel-12px-proportional-zh_h
|
||||
OUTPUT_DIR = os.path.join(BASE_DIR, "output")
|
||||
OUTPUT_PATH = os.path.join(OUTPUT_DIR, "dashboard.png")
|
||||
|
||||
# ---- 橘喵 jm-devops 后端(今日经营 / 近30天趋势 数据源,免鉴权 GET 调用)----
|
||||
# ---- 橘喵 jm-devops 后端(今日经营 / 近30天趋势 数据源)----
|
||||
# 鉴权方式:设备密钥授权(grant_type=client_secret,免验证码)。
|
||||
# 用 CLIENT_ID + CLIENT_SECRET 调 /auth/login 换 token,再带 Bearer 调统计接口(详见 jm_api.py)。
|
||||
# CLIENT_SECRET 等价于长期凭证,务必走 HTTPS、优先用环境变量覆盖、可在后端 sys_client 轮换。
|
||||
BASE_API = os.environ.get("JM_BASE_API", "https://admin.jumiaotandian.com/prod-api")
|
||||
CLIENT_ID = os.environ.get("JM_CLIENT_ID", "e5cd7e4891bf95d1d19206ce24a7b32e")
|
||||
CLIENT_ID = os.environ.get("JM_CLIENT_ID", "")
|
||||
CLIENT_SECRET = os.environ.get("JM_CLIENT_SECRET", "")
|
||||
GRANT_TYPE = os.environ.get("JM_GRANT_TYPE", "client_secret")
|
||||
TENANT_ID = os.environ.get("JM_TENANT_ID", "000000")
|
||||
|
||||
# ---- 和风天气(QWeather)数据源 ----
|
||||
# 专属 API Host 与 Key 在 https://console.qweather.com/setting 查看,须用环境变量配置;
|
||||
# 未配置时天气区显示占位 "--",不影响其余渲染与推送。
|
||||
QWEATHER_HOST = os.environ.get("QWEATHER_HOST", "n57fc3yv6r.re.qweatherapi.com") # 用户专属 API Host
|
||||
QWEATHER_KEY = os.environ.get("QWEATHER_KEY", "b27f545219a34d42adb54bbf2c5b81dd")
|
||||
QWEATHER_HOST = os.environ.get("QWEATHER_HOST", "") # 用户专属 API Host
|
||||
QWEATHER_KEY = os.environ.get("QWEATHER_KEY", "")
|
||||
# 定位固定为南京·秦淮区。和风经纬度格式为「经度,纬度」
|
||||
WEATHER_LOCATION = os.environ.get("WEATHER_LOCATION", "118.788,32.014")
|
||||
WEATHER_LOC_NAME = "南京·秦淮"
|
||||
|
||||
Reference in New Issue
Block a user