79 lines
2.4 KiB
Python
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}")
|