ai_member_xiaoyan/scripts/batch_create_safe.py

95 lines
3.0 KiB
Python

#!/usr/bin/env python3
"""Batch create reading_pic_qa records with delay and immediate verification."""
import json, requests, sys, time
CRED_FILE = "/root/.openclaw/credentials/xiaoyan/config.json"
APP_TOKEN = "CMHSbUUjka3TrUsaxxEc297ongf"
TABLE_ID = "tblweY65jGBiwSdt"
sys.path.insert(0, '/root/.openclaw/workspace-xiaoyan')
from scripts.batch_reading_pic_qa import ALL_QUESTIONS, build_json
with open(CRED_FILE) as f:
cred = json.load(f)
app_id = cred["apps"][0]["appId"]
app_secret = cred["apps"][0]["appSecret"]
token_resp = requests.post(
"https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",
json={"app_id": app_id, "app_secret": app_secret},
)
token = token_resp.json()["tenant_access_token"]
results = []
for qid in sorted(ALL_QUESTIONS.keys()):
print(f"\n{'='*50}")
print(f"ID: {qid}")
json_data = build_json(qid, ALL_QUESTIONS[qid])
json_str = json.dumps(json_data, ensure_ascii=False)
print(f" jsonData: {len(json_str)} chars")
# Verify Y/N balance
for grp in ('first', 'second'):
qs = json_data[grp]['questionSet']
yc = sum(1 for q in qs if q['answerText']=='Yes')
nc = sum(1 for q in qs if q['answerText']=='No')
print(f" {grp}: {yc}Y/{nc}N")
# Create
fields = {
"题目集合 ID": qid,
"jsonData": json_str,
"dataStatus": "0",
}
resp = requests.post(
f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={"fields": fields},
)
result = resp.json()
if result.get("code") != 0:
print(f" ❌ Create failed: {result.get('msg', result)}")
results.append((qid, "FAIL"))
continue
record_id = result["data"]["record"]["record_id"]
print(f" record_id: {record_id}")
# Verify immediately
time.sleep(0.5)
resp2 = requests.get(
f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records/{record_id}",
headers={"Authorization": f"Bearer {token}"},
)
data2 = resp2.json()
stored_jd = data2["data"]["record"]["fields"].get("jsonData", "")
if len(stored_jd) < 100:
print(f" ❌ TRUNCATED ({len(stored_jd)} chars)! Deleting...")
requests.delete(
f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records/{record_id}",
headers={"Authorization": f"Bearer {token}"},
)
results.append((qid, "TRUNCATED"))
continue
try:
j = json.loads(stored_jd)
fq = len(j["first"]["questionSet"])
sq = len(j["second"]["questionSet"])
print(f" ✅ Verified: first={fq}q, second={sq}q")
results.append((qid, "OK", record_id))
except Exception as e:
print(f" ❌ Parse error: {e}")
results.append((qid, "PARSE_ERROR"))
time.sleep(1.0)
print(f"\n{'='*50}")
print("SUMMARY")
print(f"{'='*50}")
for r in results:
print(f" {r}")