Skip to content

Commit

Permalink
feat: Add help and verbose options fix: Correct multi_cut function lo…
Browse files Browse the repository at this point in the history
…gic (#405) (#408)

* feat: Add help, verbose options, and random sleep; fix multi_cut function (#405)

- Added help and verbose options for better user control and logging.
- Introduced random sleep between chapters for more realistic simulation.
- Fixed multi_cut function to handle multiple-choice questions correctly.

Fixes: #405

* Reset task point index

* chore: Format code, improve log readability, and handle non-ASCII characters

* chore: handle non-ASCII characters
  • Loading branch information
n-WN authored Dec 24, 2024
1 parent 945cf53 commit 3369cae
Show file tree
Hide file tree
Showing 14 changed files with 526 additions and 322 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,11 @@ cookies.txt
.config.ini
config.ini
chaoxing.log
config*.ini
.chaoxing.log
./config.ini
./chaoxing.log
./cookies.txt
.idea/
cache.json
.vscode/
cache.json
42 changes: 22 additions & 20 deletions api/answer.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def token(self,value):
self._token = value

def init_tiku(self):
# 仅用于题库初始化应该在题库载入后作初始化调用随后才可以使用题库
# 仅用于题库初始化, 应该在题库载入后作初始化调用, 随后才可以使用题库
# 尝试根据配置文件设置提交模式
if not self._conf:
self.config_set(self._get_conf())
Expand All @@ -79,32 +79,34 @@ def init_tiku(self):
self._init_tiku()

def _init_tiku(self):
# 仅用于题库初始化例如配置token交由自定义题库完成
# 仅用于题库初始化, 例如配置token, 交由自定义题库完成
pass

def config_set(self,config):
self._conf = config

def _get_conf(self):
"""
从默认配置文件查询配置如果未能查到停用题库
从默认配置文件查询配置, 如果未能查到, 停用题库
"""
try:
config = configparser.ConfigParser()
config.read(self.CONFIG_PATH, encoding="utf8")
return config['tiku']
except KeyError or FileNotFoundError:
logger.info("未找到tiku配置已忽略题库功能")
logger.info("未找到tiku配置, 已忽略题库功能")
self.DISABLE = True
return None

def query(self,q_info:dict):
if self.DISABLE:
return None

# 预处理去除【单选题】这样与标题无关的字段
# 预处理, 去除【单选题】这样与标题无关的字段
# 此处需要改进!!!
logger.debug(f"原始标题:{q_info['title']}")
q_info['title'] = q_info['title'][6:] # 暂时直接用裁切解决
logger.debug(f"处理后标题:{q_info['title']}")

# 先过缓存
cache_dao = CacheDAO()
Expand All @@ -123,13 +125,13 @@ def query(self,q_info:dict):
return None
def _query(self,q_info:dict):
"""
查询接口交由自定义题库实现
查询接口, 交由自定义题库实现
"""
pass

def get_tiku_from_config(self):
"""
从配置文件加载题库这个配置可以是用户提供可以是默认配置文件
从配置文件加载题库, 这个配置可以是用户提供, 可以是默认配置文件
"""
if not self._conf:
# 尝试从默认配置文件加载
Expand All @@ -141,15 +143,15 @@ def get_tiku_from_config(self):
if not cls_name:
raise KeyError
except KeyError:
logger.error("未找到题库配置已忽略题库功能")
logger.error("未找到题库配置, 已忽略题库功能")
return self
new_cls = globals()[cls_name]()
new_cls.config_set(self._conf)
return new_cls

def jugement_select(self,answer:str) -> bool:
"""
这是一个专用的方法要求配置维护两个选项列表一份用于正确选项一份用于错误选项以应对题库对判断题答案响应的各种可能的情况
这是一个专用的方法, 要求配置维护两个选项列表, 一份用于正确选项, 一份用于错误选项, 以应对题库对判断题答案响应的各种可能的情况
它的作用是将获取到的答案answer与可能的选项列对比并返回对应的布尔值
"""
if self.DISABLE:
Expand All @@ -163,15 +165,15 @@ def jugement_select(self,answer:str) -> bool:
elif answer in false_list:
return False
else:
# 无法判断随机选择
logger.error(f'无法判断答案 -> {answer} 对应的是正确还是错误请自行判断并加入配置文件重启脚本本次将会随机选择选项')
# 无法判断, 随机选择
logger.error(f'无法判断答案 -> {answer} 对应的是正确还是错误, 请自行判断并加入配置文件重启脚本, 本次将会随机选择选项')
return random.choice([True,False])

def get_submit_params(self):
"""
这是一个专用方法用于根据当前设置的提交模式响应对应的答题提交API中的pyFlag值
这是一个专用方法, 用于根据当前设置的提交模式, 响应对应的答题提交API中的pyFlag值
"""
# 留空直接提交1保存但不提交
# 留空直接提交, 1保存但不提交
if self.SUBMIT:
return ""
else:
Expand All @@ -187,7 +189,7 @@ def __init__(self) -> None:
self.api = 'https://tk.enncy.cn/query'
self._token = None
self._token_index = 0 # token队列计数器
self._times = 100 # 查询次数剩余初始化为100查询后校对修正
self._times = 100 # 查询次数剩余, 初始化为100, 查询后校对修正

def _query(self,q_info:dict):
res = requests.get(
Expand All @@ -201,14 +203,14 @@ def _query(self,q_info:dict):
if res.status_code == 200:
res_json = res.json()
if not res_json['code']:
# 如果是因为TOKEN次数到期则更换token
# 如果是因为TOKEN次数到期, 则更换token
if self._times == 0 or '次数不足' in res_json['data']['answer']:
logger.info(f'TOKEN查询次数不足将会更换并重新搜题')
logger.info(f'TOKEN查询次数不足, 将会更换并重新搜题')
self._token_index += 1
self.load_token()
# 重新查询
return self._query(q_info)
logger.error(f'{self.name}查询失败:\n剩余查询数{res_json["data"].get("times",f"{self._times}(仅参考)")}:\n消息:{res_json["message"]}')
logger.error(f'{self.name}查询失败:\n\t剩余查询数{res_json["data"].get("times",f"{self._times}(仅参考)")}:\n\t消息:{res_json["message"]}')
return None
self._times = res_json["data"].get("times",self._times)
return res_json['data']['answer'].strip()
Expand All @@ -220,8 +222,8 @@ def load_token(self):
token_list = self._conf['tokens'].split(',')
if self._token_index == len(token_list):
# TOKEN 用完
logger.error('TOKEN用完请自行更换再重启脚本')
raise Exception(f'{self.name} TOKEN 已用完请更换')
logger.error('TOKEN用完, 请自行更换再重启脚本')
raise Exception(f'{self.name} TOKEN 已用完, 请更换')
self._token = token_list[self._token_index]

def _init_tiku(self):
Expand Down Expand Up @@ -260,7 +262,7 @@ def _query(self, q_info: dict):
if res.status_code == 200:
res_json = res.json()
if bool(res_json['plat']):
logger.error("查询失败返回:" + res.text)
logger.error("查询失败, 返回:" + res.text)
return None
sep = "\n"
return sep.join(res_json['answer']['allAnswer'][0]).strip()
Expand Down
Loading

0 comments on commit 3369cae

Please sign in to comment.