ai_member_xiaoyan/scripts/fill_000001.py

171 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Fill QSID=000001 P1 record with complete content"""
import requests, json
APP_TOKEN='CMHSbUUjka3TrUsaxxEc297ongf'
APP_ID='cli_a931175d41799cc7'
APP_SECRET='Iw2vEfbjT6GtV0GhbxbZqfQ4nAPtbR14'
TABLE='tbliZAhcc9C43B23'
RID='recuUjgbwn3Lkm'
QSID='000001'
r = requests.post('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal',
json={'app_id':APP_ID,'app_secret':APP_SECRET}, timeout=10)
token = r.json()['tenant_access_token']
jd = {
"first": {
"category": "listening",
"type": "listening_choicePic",
"questionSetID": QSID,
"textDesc": "听录音,选择正确的图片。",
"questionSet": [
{
"question": "This is a blue box.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性事实理解|单句信息点抓取"],
"explanation": "听力中 Lily 说 'This is a blue box.'这是一个蓝色的盒子与图A蓝色方形卡通盒子相符故选A。"
},
{
"question": "He is a police officer.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性事实理解|单句信息点抓取"],
"explanation": "听力中 Tom 说 'He is a police officer.'他是一名警察与图A穿制服戴警帽的男警察相符故选A。"
},
{
"question": "I want to drink milk.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性事实理解|单句信息点抓取"],
"explanation": "听力中 Anna 说 'I want to drink milk.'我想喝牛奶与图A一杯热牛奶相符故选A。"
},
{
"question": "I eat a sandwich for breakfast.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性事实理解|单句信息点抓取"],
"explanation": "听力中 Bob 说 'I eat a sandwich for breakfast.'我早餐吃三明治与图A夹生菜火腿的三明治相符故选A。"
},
{
"question": "This is my red suitcase.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性事实理解|单句信息点抓取"],
"explanation": "听力中 Cindy 说 'This is my red suitcase.'这是我的红色手提箱与图A装满衣物的红色拉杆手提箱相符故选A。"
}
]
},
"second": {
"category": "listening",
"type": "listening_choicePic",
"questionSetID": QSID,
"textDesc": "听录音,选择正确的图片。",
"questionSet": [
{
"question": "Look at my new clothes.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性细节理解|物品特征辨识"],
"explanation": "听力中 Emma 说 'Look at my new clothes.'看看我的新衣服。卫衣属于衣物图B为运动鞋、图C为棒球帽均不属于衣物范畴故选A蓝色连帽卫衣。"
},
{
"question": "My dad works at the airport.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性细节理解|数字/时间/地点"],
"explanation": "听力中 Jack 说 'My dad works at the airport.'我爸爸在机场工作与图A停着飞机的机场航站楼场景相符故选A。"
},
{
"question": "The pirate has a black eye patch.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性事实理解|单句信息点抓取"],
"explanation": "听力中 Mike 说 'The pirate has a black eye patch.'海盗戴着一个黑色的眼罩图A戴眼罩的海盗与此描述完全匹配故选A。"
},
{
"question": "I need my passport to go abroad.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性细节理解|物品功能辨识"],
"explanation": "听力中 Lisa 说 'I need my passport to go abroad.'我需要护照出国图A为护照、图B为身份证、图C为银行卡对应出国所需的证件是护照故选A。"
},
{
"question": "I like eating cheese very much.",
"questionAudio": "",
"optionsImage": None,
"answer": [0],
"ability": ["显性细节理解|物品特征辨识"],
"explanation": "听力中 Peter 说 'I like eating cheese very much.'我非常喜欢吃芝士与图A切成块的黄色芝士相符。图B是全麦面包、图C是黄油均不是cheese故选A。"
}
]
}
}
TEXT1 = """【题目描述】
听录音,选择正确的图片。
【听力文本】
1. Lily: This is a blue box.
2. Tom: He is a police officer.
3. Anna: I want to drink milk.
4. Bob: I eat a sandwich for breakfast.
5. Cindy: This is my red suitcase."""
TEXT2 = """【题目描述】
听录音,选择正确的图片。
【听力文本】
1. Emma: Look at my new clothes.
2. Jack: My dad works at the airport.
3. Mike: The pirate has a black eye patch.
4. Lisa: I need my passport to go abroad.
5. Peter: I like eating cheese very much."""
fields = {
"题目集合 ID": QSID,
"jsonData": json.dumps(jd, ensure_ascii=False),
"题目1": TEXT1,
"题目2": TEXT2,
"dataStatus": "0",
"审校结果": "✅ 已补全10道题 content/explanation/ability 全部填充完成2026-05-14"
}
r = requests.put(
f'https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE}/records/{RID}',
headers={'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'},
json={'fields': fields}, timeout=15)
code = r.json().get('code')
if code == 0:
print('✅ 更新成功')
# Verify
r2 = requests.get(f'https://open.feishu.cn/open-apis/bitable/v1/apps/{APP_TOKEN}/tables/{TABLE}/records/{RID}',
headers={'Authorization': f'Bearer {token}'}, timeout=10)
jd2 = json.loads(r2.json()['data']['record']['fields']['jsonData'])
f_qs = jd2['first']['questionSet']
s_qs = jd2['second']['questionSet']
print(f'\n验证:')
for i, q in enumerate(f_qs):
ok = len(q.get('question',''))>0 and len(q.get('explanation',''))>20 and len(q.get('ability',[]))>0
print(f' first Q{i+1}: {"" if ok else ""} q="{q["question"]}" answer={q["answer"]} ability={q["ability"]}')
for i, q in enumerate(s_qs):
ok = len(q.get('question',''))>0 and len(q.get('explanation',''))>20 and len(q.get('ability',[]))>0
print(f' second Q{i+1}: {"" if ok else ""} q="{q["question"]}" answer={q["answer"]} ability={q["ability"]}')
f2 = r2.json()['data']['record']['fields']
print(f'\n题目1: {len(f2.get("题目1",""))}chars, 题目2: {len(f2.get("题目2",""))}chars')
print(f'审校结果: {f2.get("审校结果","")}')
else:
print(f'❌ 失败: {r.json().get("msg")}')