chore: account-manager — runtime_env sibling root, wait-login and browser fixes
All checks were successful
技能自动化发布 / release (push) Successful in 43s
All checks were successful
技能自动化发布 / release (push) Successful in 43s
This commit is contained in:
@@ -46,7 +46,7 @@ def get_account_by_id(account_id):
|
||||
cur = conn.cursor()
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id, name, platform, phone, profile_dir, url, login_status, last_login_at, extra_json,
|
||||
SELECT id, name, platform, phone, profile_dir, url, extra_json,
|
||||
created_at, updated_at
|
||||
FROM accounts WHERE id = ?
|
||||
""",
|
||||
@@ -62,14 +62,12 @@ def get_account_by_id(account_id):
|
||||
"phone": row[3] or "",
|
||||
"profile_dir": (row[4] or "").strip(),
|
||||
"url": row[5] or PLATFORM_URLS.get(row[2], ""),
|
||||
"login_status": int(row[6] or 0),
|
||||
"last_login_at": _unix_to_iso_local(row[7]),
|
||||
"created_at": _unix_to_iso_local(row[9]),
|
||||
"updated_at": _unix_to_iso_local(row[10]),
|
||||
"created_at": _unix_to_iso_local(row[7]),
|
||||
"updated_at": _unix_to_iso_local(row[8]),
|
||||
}
|
||||
if row[8]:
|
||||
if row[6]:
|
||||
try:
|
||||
extra = json.loads(row[8])
|
||||
extra = json.loads(row[6])
|
||||
if isinstance(extra, dict):
|
||||
acc.update(extra)
|
||||
except Exception:
|
||||
@@ -79,21 +77,13 @@ def get_account_by_id(account_id):
|
||||
conn.close()
|
||||
|
||||
|
||||
def mark_login_status(account_id, success: bool):
|
||||
def touch_account_updated_at(account_id) -> None:
|
||||
"""登录 DOM 检测成功等场景下刷新 updated_at,供 pick-web 等按最近活跃选号。"""
|
||||
now = _now_unix()
|
||||
conn = get_conn()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
if success:
|
||||
cur.execute(
|
||||
"UPDATE accounts SET login_status = 1, last_login_at = ?, updated_at = ? WHERE id = ?",
|
||||
(now, now, account_id),
|
||||
)
|
||||
else:
|
||||
cur.execute(
|
||||
"UPDATE accounts SET login_status = 0, updated_at = ? WHERE id = ?",
|
||||
(now, account_id),
|
||||
)
|
||||
cur.execute("UPDATE accounts SET updated_at = ? WHERE id = ?", (now, account_id))
|
||||
conn.commit()
|
||||
finally:
|
||||
conn.close()
|
||||
@@ -105,8 +95,8 @@ def fetch_list_rows(platform_key: str, limit: int):
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
sql = (
|
||||
"SELECT id, name, platform, phone, profile_dir, url, login_status, "
|
||||
"last_login_at, extra_json, created_at, updated_at FROM accounts "
|
||||
"SELECT id, name, platform, phone, profile_dir, url, "
|
||||
"extra_json, created_at, updated_at FROM accounts "
|
||||
)
|
||||
if platform_key == "all":
|
||||
cur.execute(sql + "ORDER BY created_at DESC, id DESC LIMIT ?", (int(limit),))
|
||||
@@ -140,50 +130,21 @@ def fetch_ids_for_list_json(platform_key: str, lim: int):
|
||||
conn.close()
|
||||
|
||||
|
||||
def fetch_pick_logged_in_id(platform_key: str) -> Optional[int]:
|
||||
conn = get_conn()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id FROM accounts
|
||||
WHERE platform = ? AND login_status = 1
|
||||
ORDER BY (last_login_at IS NULL), last_login_at DESC
|
||||
LIMIT 1
|
||||
""",
|
||||
(platform_key,),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
return int(row[0]) if row else None
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def fetch_pick_web_candidate_id(platform_key: str) -> Optional[int]:
|
||||
"""该平台一条账号:按 updated_at、created_at 倒序,与是否登录无关。"""
|
||||
conn = get_conn()
|
||||
try:
|
||||
cur = conn.cursor()
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id FROM accounts
|
||||
WHERE platform = ? AND login_status = 1
|
||||
ORDER BY (last_login_at IS NULL), last_login_at DESC
|
||||
WHERE platform = ?
|
||||
ORDER BY updated_at DESC, created_at DESC, id DESC
|
||||
LIMIT 1
|
||||
""",
|
||||
(platform_key,),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
if not row:
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id FROM accounts
|
||||
WHERE platform = ?
|
||||
ORDER BY updated_at DESC, id DESC
|
||||
LIMIT 1
|
||||
""",
|
||||
(platform_key,),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
return int(row[0]) if row else None
|
||||
finally:
|
||||
conn.close()
|
||||
@@ -216,8 +177,8 @@ def insert_account_row(
|
||||
cur = conn.cursor()
|
||||
cur.execute(
|
||||
"""
|
||||
INSERT INTO accounts (name, platform, phone, profile_dir, url, login_status, last_login_at, extra_json, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, 0, NULL, NULL, ?, ?)
|
||||
INSERT INTO accounts (name, platform, phone, profile_dir, url, extra_json, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, NULL, ?, ?)
|
||||
""",
|
||||
(name, platform_key, phone_store, profile_dir, url, now, now),
|
||||
)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# SQLite 无独立 DATETIME 类型: 时间统一存 INTEGER Unix 秒 (UTC), 查询/JSON 再转 ISO8601.
|
||||
# 下列 DDL 含注释, 会原样写入 sqlite_master, 便于 Navicat / DBeaver 等查看建表语句.
|
||||
ACCOUNTS_TABLE_SQL = """
|
||||
/* 多平台账号表: 与本地 Chromium/Edge 用户数据目录 (profile) 绑定, 供发布类技能读取登录态 */
|
||||
/* 多平台账号表: 与本地 Chromium/Edge 用户数据目录 (profile) 绑定 */
|
||||
CREATE TABLE accounts (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 账号主键 (自增)
|
||||
name TEXT NOT NULL, -- 展示名称, 如「搜狐1号」
|
||||
@@ -9,8 +9,6 @@ CREATE TABLE accounts (
|
||||
phone TEXT, -- 可选绑定手机号
|
||||
profile_dir TEXT, -- Playwright 用户数据目录 (绝对路径); 默认可读结构 profiles/<平台展示名>/<手机号>/
|
||||
url TEXT, -- 平台入口或登录页 URL
|
||||
login_status INTEGER NOT NULL DEFAULT 0, -- 展示/排序用尽力同步;编排上请以 Playwright DOM 检测为准,勿单独依赖本字段
|
||||
last_login_at INTEGER, -- 最近一次登录成功时间, Unix 秒 UTC; 未登录过为 NULL
|
||||
extra_json TEXT, -- 扩展字段 JSON
|
||||
created_at INTEGER NOT NULL, -- 记录创建时间, Unix 秒 UTC
|
||||
updated_at INTEGER NOT NULL -- 记录最后更新时间, Unix 秒 UTC
|
||||
|
||||
Reference in New Issue
Block a user