#!/usr/bin/env python3 """Supplement abilityTag and complete ability/explanation for all 8 records.""" import subprocess, json APP_TOKEN = "CMHSbUUjka3TrUsaxxEc297ongf" TABLE_ID = "tblszuk1TeToofBF" APP_ID = "cli_a931175d41799cc7" APP_SECRET = "Iw2vEfbjT6GtV0GhbxbZqfQ4nAPtbR14" r = subprocess.run([ "curl", "-s", "-X", "POST", "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal", "-H", "Content-Type: application/json", "-d", json.dumps({"app_id": APP_ID, "app_secret": APP_SECRET}) ], capture_output=True, text=True) TOKEN = json.loads(r.stdout)["tenant_access_token"] print(f"Token: {TOKEN[:20]}...") def get_jsonData(rid): url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records/{rid}" r = subprocess.run(["curl", "-s", "-X", "GET", url, "-H", f"Authorization: Bearer {TOKEN}"], capture_output=True, text=True) return json.loads(r.stdout)['data']['record']['fields'] def update_jsonData(rid, jd): url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE_ID}/records/{rid}" body = json.dumps({"fields": {"jsonData": json.dumps(jd, ensure_ascii=False)}}, ensure_ascii=False) r = subprocess.run(["curl", "-s", "-X", "PUT", url, "-H", f"Authorization: Bearer {TOKEN}", "-H", "Content-Type: application/json", "-d", body], capture_output=True, text=True) return json.loads(r.stdout) # Per-record ability / abilityTag / explanation definitions SPECS = { "recvjzbkvoOgvy": { # 022201 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Max,)→ 正文第一句(告诉Max你听说了旧盒子:"I heard you found...")→ 正文第二句(询问盒子里有什么:"What did you find...")→ 正文第三句(建议一起打开:"Let\'s open it...")→ 结尾敬语(Take care,)→ 署名(Alex)。学生需通过指代词(it指代the old box)和时间提示(after school)判断句子间的逻辑顺序。', }, "recvjzblhhNt7Q": { # 022301 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "句型组织"], "explanation": "正确的邮件结构:称呼(Dear Emma,)→ 正文第一句(描述今天做了什么:\"We worked hard...\")→ 正文第二句(描述花园现状:\"All the new flowers...\")→ 正文第三句(建议下次行动:\"Next time we should...\")→ 结尾(Your friend,)→ 署名(Lily)。学生需通过时间词(this afternoon / next time)判断事件先后顺序,通过\"And\"连词识别并列描述关系。", }, "recvjzblXOJ7Fs": { # 022401 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Sophie,)→ 正文第一句(告知探病事实:"Tom and I went...")→ 正文第二句(描述Jack当前状态:"He is feeling much better...")→ 正文第三句(建议对方可做的事:"You could send him...")→ 结尾敬语(Warmly,)→ 署名(Lily)。学生需通过人称指代(him指代Jack)和连词(and he smiled when...)判断句子衔接关系。', }, "recvjzXjMKAQ4i": { # 032501 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "情感表达|鼓励与共情", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "情感表达", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Ben,)→ 正文第一句(表达听说了对方的担忧:"I heard you are worried...")→ 正文第二句(共情自己的紧张感:"I feel nervous...but practising helps...")→ 正文第三句(鼓励不要放弃:"Please don\'t give up...")→ 结尾敬语(Yours truly,)→ 署名(Sam)。学生需通过转折连词(but)和破折号(—解释说明"you have already worked so hard")判断句子逻辑关系。', }, "recvjzXklYIE05": { # 032601 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "社交写作|感谢信", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "社交写作", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Mr. Brown,)→ 正文第一句(表达感谢:"Thank you so much...")→ 正文第二句(描述最喜欢的内容:"I enjoyed the planet show...")→ 正文第三句(请求分享照片:"Could you please share...")→ 结尾敬语(Warm regards,)→ 署名(Lucy)。学生需通过破折号(—补充说明"really amazing")和指代词(the trip回指上文博物馆之旅)判断句子衔接顺序。', }, "recvjzXkYnsQ8r": { # 032701 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "描述性写作|地点与人物", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "描述性写作", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Anna,)→ 正文第一句(描述去过咖啡馆:"I visited a lovely little cafe...")→ 正文第二句(描述店员特点:"The people working there...")→ 正文第三句(建议一起去:"We should go there together...")→ 结尾敬语(Kind regards,)→ 署名(Emma)。学生需通过指代词(there指代the cafe)和破折号(—补充解释"you would love it")判断句子间的逻辑顺序。', }, "recvjzXlxz4r3i": { # 032801 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "问题解决|求助与建议", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "问题解决", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Miss Green,)→ 正文第一句(说明项目停止工作:"Our science project has suddenly stopped...")→ 正文第二句(描述已尝试的方案:"We have tried changing the batteries, but...")→ 正文第三句(请求建议:"Could you give us some advice...")→ 结尾敬语(Gratefully,)→ 署名(Tom)。学生需通过转折连词(but)和因果指代("that did not fix..."中that指代changing batteries)判断句子逻辑。', }, "recvjzXm5yEXBY": { # 032901 "ability": ["短消息写作|邮件/便条", "衔接与连贯|指代与连词使用", "描述性写作|场景与情绪", "句型组织|邮件段落排序"], "abilityTag": ["短消息写作", "衔接与连贯", "描述性写作", "句型组织"], "explanation": '正确的邮件结构:称呼(Dear Sophie,)→ 正文第一句(描述正在派对:"I\'m at my mum\'s birthday party...")→ 正文第二句(描述家人表现:"My little sister is dancing...Dad seems...")→ 正文第三句(表达感受:"I feel so lucky...")→ 结尾敬语(With love,)→ 署名(Jessica)。学生需通过并列连词(and)和时间提示词(right now / tonight)判断描述的层次推进。', }, } for rid, spec in SPECS.items(): fields = get_jsonData(rid) jd = json.loads(fields["jsonData"]) qid = jd["first"]["questionSetID"] jd["first"]["ability"] = spec["ability"] jd["first"]["abilityTag"] = spec["abilityTag"] jd["first"]["explanation"] = spec["explanation"] print(f"[{qid}] updating...", end=" ") resp = update_jsonData(rid, jd) if resp.get("code") == 0: print("✅") else: print(f"❌ {resp.get('msg')}") print("\nDone.")