ai_member_xiaoyan/scripts/backfill_unit_challenge.py

79 lines
2.4 KiB
Python

"""
Backfill 10 unit challenge records to Feishu bitable
Reads from /tmp/unit_challenge_records.json
"""
import json, urllib.request
APP_TOKEN = "CMHSbUUjka3TrUsaxxEc297ongf"
CRED_FILE = "/root/.openclaw/credentials/xiaoyan/config.json"
TABLES = {
"writing_email": "tblszuk1TeToofBF",
"writing_picWrite": "tblSAwlMumKoyjws",
"speaking_qa": "tblRGv7k4WH58Jgq",
"speaking_topic": "tblGoWYBmVI0IrvQ",
}
with open(CRED_FILE) as f:
cfg = json.load(f)
req = urllib.request.Request(
"https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",
data=json.dumps({"app_id": cfg['apps'][0]['appId'], "app_secret": cfg['apps'][0]['appSecret']}).encode(),
headers={"Content-Type": "application/json"})
token = json.loads(urllib.request.urlopen(req).read())['tenant_access_token']
def api(url, method='GET', body=None):
h = {"Authorization": f"Bearer {token}"}
d = json.dumps(body).encode() if body else None
if d: h["Content-Type"] = "application/json"
r = urllib.request.Request(url, data=d, method=method, headers=h)
return json.loads(urllib.request.urlopen(r).read())
with open('/tmp/unit_challenge_records.json') as f:
records = json.load(f)
ok = 0
fail = 0
for rec in records:
tid = TABLES[rec['table']]
sid = rec['sid']
# Find existing record
url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{tid}/records?page_size=100"
resp = api(url)
rid = None
for item in resp['data']['items']:
if item['fields'].get('题目集合 ID', '') == sid:
rid = item['record_id']
break
new_jd = json.dumps(rec['json'], ensure_ascii=False)
fields = {
"题目集合 ID": sid,
"jsonData": new_jd,
"题目1": rec.get('t1', '')
}
if rid:
result = api(
f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{tid}/records/{rid}",
'PUT', {"fields": fields}
)
st = "UPD" if result.get('code') == 0 else f"ERR:{result.get('msg')}"
else:
result = api(
f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{tid}/records",
'POST', {"fields": fields}
)
st = "NEW" if result.get('code') == 0 else f"ERR:{result.get('msg')}"
if result.get('code') == 0:
ok += 1
else:
fail += 1
print(f" {st} {rec['type']} {sid}")
print(f"\n✅ OK={ok} FAIL={fail}")