From 48c9429cf915cb681ff0d3dd65623cc25c9e1d74 Mon Sep 17 00:00:00 2001 From: JesterHey <144512889+JesterHey@users.noreply.github.com> Date: Sat, 9 Dec 2023 22:48:21 +0800 Subject: [PATCH] Add files via upload --- get_answer.py | 32 +++++++++------ get_language.py | 37 +++++++++++++++++ get_params.py | 107 +++++++++++++++++++++++++++++------------------- login_ui.py | 2 +- main.py | 7 +++- trans_to_txt.py | 6 ++- 6 files changed, 132 insertions(+), 59 deletions(-) create mode 100644 get_language.py diff --git a/get_answer.py b/get_answer.py index 0ca5837..7a65b2b 100644 --- a/get_answer.py +++ b/get_answer.py @@ -10,7 +10,6 @@ import json import asyncio from cloud import download,delete import base64 -#读取当前目录下的json文件 #获得指定目录下的所有数字开头的json文件 def get_shixunjson(file:str) -> list: ''' @@ -33,6 +32,13 @@ def get_programmingjson(file:str) -> list: if i.endswith('.json') and i.startswith('pro'): jsonfiles.append(i) return jsonfiles +#读取当前目录下的json文件和对应的编程语言 +j_shixun = get_shixunjson(os.getcwd()) +j_programming = get_programmingjson(os.getcwd()) +if j_shixun == []: + language = get_programmingjson(os.getcwd())[0].split('.')[0].split('_')[-1] +else: + language = get_shixunjson(os.getcwd())[0].split('.')[0].split('_')[-1] ''' 与云服务器连接,先判断当前json是否已在云服务器上,如果在,则直接调用, @@ -61,7 +67,7 @@ def rewrite_programming_json(json_names:list,new_data:list): #读取json文件并转换为字典 -def load_json_data(json_name:str) -> dict: +def load_json_data(json_name:str) -> dict: with open(json_name,'r',encoding='utf-8') as f: # json_name为无答案的json文件名 data = json.load(f) return data @@ -75,8 +81,8 @@ def load_api_key() -> str: 向GPT提问的格式:promot + 参数模板化的问题 ''' -promot1 = '现在,我想让你扮演一个资深而经验丰富的程序员来解一个问题,我的问题将由三个部分组成,第一部分是问题的描述,第二部分是问题的需求,第三部分是问题的代码,我需要你按照我的模板编写代码。并且你返回的代码应当是带有注释的。再次注意,请返回完整的,格式正确的,可读的代码!' -promot2 = '现在,我想让你扮演一个资深而经验丰富的程序员来解一个问题,我的问题会有两个部分组成,第一部分是问题的描述,第二部分是你需要补全或者完善的代码。你需要阅读,理解我的问题描述,然后补全或者完善代码。再次注意,请返回完整的,格式正确的,输入由用户给出的,可读的代码!' +promot1 = f'现在,我想让你扮演一个资深而经验丰富的程序员来解一个问题,我的问题将由三个部分组成,第一部分是问题的描述,第二部分是问题的需求,第三部分是问题的代码,我需要你按照我的模板编写代码,使用的代码语言是{language}。并且你返回的代码应当是带有注释的。再次注意,请返回完整的,格式正确的,可读的代码!' +promot2 = f'现在,我想让你扮演一个资深而经验丰富的程序员来解一个问题,我的问题会有两个部分组成,第一部分是问题的描述,第二部分是你需要补全或者完善的代码。你需要阅读,理解我的问题描述,然后补全或者完善代码,使用的代码语言是{language}。再次注意,请返回完整的,格式正确的,输入由用户给出的,可读的代码!' #构造问题模板 #遍历字典,获得每一关的参数,构造请求,获得答案 #使用异步函数提升效率 @@ -157,8 +163,8 @@ def get_programming_answer_from_api(jsonfile:list,client:AsyncOpenAI,promot:str) question = f'问题描述:{des}\n根据上面的需求,以下是你需要补充并完善代码:\n{code}' try: response = await client.chat.completions.create( - #model='gpt-4-1106-preview', - model = 'gpt-3.5-turbo', + model='gpt-4-1106-preview', + #model = 'gpt-3.5-turbo', messages=[ {'role': 'system', 'content': promot2}, {'role': 'user', 'content': question} @@ -187,17 +193,19 @@ def get_programming_answer_from_api(jsonfile:list,client:AsyncOpenAI,promot:str) datalist[i]['answer'] = answers[i].split('/')[-1] # 返回datalist return datalist - + # 运行主函数,返回一个列表,列表中的每个元素为每个异步任务的返回值,即重写的字典 - return asyncio.run(main(datalist=data)) + return asyncio.run(main(datalist=data)) if __name__ == '__main__': - ans=get_programming_answer_from_api(jsonfile=get_programmingjson(os.getcwd()),client=client,promot=promot2) + ans = get_programming_answer_from_api(jsonfile=get_programmingjson( + os.getcwd()), + client=client, + promot=promot2) print(ans) - rewrite_programming_json(json_names=get_programmingjson(os.getcwd()),new_data=ans) + rewrite_programming_json(json_names=get_programmingjson(os.getcwd()), + new_data=ans) #new_data = get_programming_answer_from_api(get_programmingjson(os.getcwd()),client=client,promot=promot2) - - diff --git a/get_language.py b/get_language.py new file mode 100644 index 0000000..830c99d --- /dev/null +++ b/get_language.py @@ -0,0 +1,37 @@ +from trans_to_txt import get_shixunjson, get_programmingjson +import os +import json +shixuns = get_shixunjson(os.getcwd()) +programmings = get_programmingjson(os.getcwd()) +def get_shixun_language(shixuns:list) -> list: + ''' + 用于获得所有实训的语言 + ''' + languages = [] + for i in shixuns: + with open(i,'r',encoding='utf-8') as f: + data = json.load(f) + for j in data.keys(): + if j != 'answer': + languages.append(data[j]['language']) + return languages + +def get_programming_language(programmings:list) -> list: + ''' + 用于获得所有编程题的语言 + ''' + languages = [] + for i in programmings: + with open(i,'r',encoding='utf-8') as f: + data = json.load(f) + languages.append(data['language']) + return languages + + +if __name__ == '__main__': + if shixuns == []: + language_result = get_programming_language(programmings) + print(language_result) + elif programmings == []: + language_result = get_shixun_language(shixuns) + print(language_result) \ No newline at end of file diff --git a/get_params.py b/get_params.py index ad97ef2..0679f56 100644 --- a/get_params.py +++ b/get_params.py @@ -45,7 +45,7 @@ def is_programming(url:str) -> bool: # 另外,目前好像只有实训作业有这些参数,其他的作业例如编程作业就没有,所以先判断一下是否为实训作业,可以通过用户输入的url判断 # 主要是看educoder.net/后面是否有tasks,如果有,则是实训作业,否则,不是实训作业 #为方便main.py调用,将判断函数写入函数中,以下部分封装为函数 -def get_parameters(url:str,user_name:str,password:str): +def get_parameters(url: str, user_name: str, password: str): ''' 用于获得实训作业的参数 url:实训网址 @@ -67,7 +67,8 @@ def get_parameters(url:str,user_name:str,password:str): time.sleep(2) #判断是否登录成功 try: - safari.find_element(By.XPATH,'//*[@id="task-left-panel"]/div[1]/a[1]') + safari.find_element(By.XPATH, + '//*[@id="task-left-panel"]/div[1]/a[1]') except BaseException: print('登录失败 请检查输入信息是否正确') # 关闭浏览器 @@ -86,14 +87,15 @@ def get_parameters(url:str,user_name:str,password:str): identity = cur_url.split('/')[-1].split('?')[0] id_url = f'https://data.educoder.net/api/tasks/{identity}.json?' headers = { - 'Cookie':cookie, - 'User-Agent':User_Agent, - 'Referer':cur_url + 'Cookie': cookie, + 'User-Agent': User_Agent, + 'Referer': cur_url } response = requests.get(url=id_url, headers=headers) shixun_id = dict(response.json())['challenge']['shixun_id'] + language = requests.get(f'https://data.educoder.net/api/tasks/{identity}/rep_content.json',headers=headers).json()['content']['language'] #判断云端文件是否存在 - exist = is_exist(f'{shixun_id}.json') + exist = is_exist(f'{shixun_id}_{language}.json') if exist: try: print('云端文件已存在,正在下载') @@ -101,7 +103,7 @@ def get_parameters(url:str,user_name:str,password:str): # 检测本地文件是否下载完成 while True: try: - if os.path.exists(f'{shixun_id}.json'): + if os.path.exists(f'{shixun_id}_{language}.json'): print('下载完成') safari.quit() return @@ -110,46 +112,54 @@ def get_parameters(url:str,user_name:str,password:str): print(e) except Exception as e: print(e) - else:#不存在,则继续执行本程序 + else: #不存在,则继续执行本程序 print('云端文件不存在,正在爬取') #获取关卡数 #点击展开关卡页面 time.sleep(3) - safari.find_element(By.XPATH,'//*[@id="task-left-panel"]/div[1]/a[1]').click() + safari.find_element( + By.XPATH, '//*[@id="task-left-panel"]/div[1]/a[1]').click() #关卡数量由 class = "flex-container challenge-title space-between" 的元素数量决定 time.sleep(3) htmltxt = safari.page_source html = etree.HTML(htmltxt) - task_num = html.xpath('count(//*[@class="flex-container challenge-title space-between"])') + task_num = html.xpath( + 'count(//*[@class="flex-container challenge-title space-between"])' + ) task_num = int(task_num) print(f'关卡数量为{task_num}') #回到第一关 time.sleep(3) - safari.find_element(By.XPATH,'//*[@id="task-left-panel"]/div[3]/div[3]/div/div/div/div/div[1]/div[1]/a').click() + safari.find_element( + By.XPATH, + '//*[@id="task-left-panel"]/div[3]/div[3]/div/div/div/div/div[1]/div[1]/a' + ).click() #对于每一关,获取参数 #每一关的参数由以下元素组成: ''' /html/body/div[1]/div/div/div/div[2]/section[1]/div[3]/div[3]/div/div/div/div/div[3]/div[1]/a /html/body/div[1]/div/div/div/div[2]/section[1]/div[3]/div[3]/div/div/div/div/div[4]/div[1]/a ''' - obj1 = re.compile(r'
(?P
(?P
(?P
(?P