吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1779|回复: 48
上一主题 下一主题
收起左侧

[Python 原创] python实现win后台录屏

[复制链接]
跳转到指定楼层
楼主
pinkLove 发表于 2025-3-19 10:44 回帖奖励
本帖最后由 pinkLove 于 2025-3-21 09:43 编辑

[md]事情是因为我朋友开了一个电竞酒店,有客人在电脑上开挂,硬件被cf打标了,其他玩家上号就被封号。想了很多办法都不合适,写了个轻量的录屏软件,如果出现问题,也可以找到开东西的人。下面是代码

import os
import subprocess
import sys

import pyautogui
import cv2
import numpy as np
import threading
from datetime import datetime
import time
import signal

# 解析命令行参数
parser = argparse.ArgumentParser(description="Screen Recording Service")
parser.add_argument("--duration", type=int, default=10, help="Video duration in seconds (default: 3600 seconds)")
parser.add_argument("--save_path", type=str, default="D:/doc/local/vid",
                    help="Directory to save videos (default: D:/doc/local/vid)")
args = parser.parse_args()

VIDEO_DURATION = args.duration
SAVE_PATH = args.save_path
TARGET_RESOLUTION = (1280, 720)  # 目标视频分辨率
FPS = 15  # 帧率

# 录屏变量
recording = False
current_video = None
out = None  # 用于保存视频的cv2对象

# 确保 ffmpeg.exe 在正确的路径
if getattr(sys, 'frozen', False):
    # PyInstaller 生成的可执行文件运行时
    BASE_PATH = sys._MEIPASS
else:
    # 运行 .py 文件时
    BASE_PATH = os.path.dirname(os.path.abspath(__file__))

FFMPEG_PATH = os.path.join(BASE_PATH, 'ffmpeg.exe')
print(FFMPEG_PATH)

# 确保保存目录存在
os.makedirs(SAVE_PATH, exist_ok=True)

def record_screen():
    global recording, current_video, out
    screen_width, screen_height = pyautogui.size()
    fourcc = cv2.VideoWriter_fourcc(*'XVID')

    # 当前时间戳作为视频文件名
    current_video = f"recording_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.mp4"
    output_path = os.path.join(SAVE_PATH, current_video)

    # 创建视频写入对象
    out = cv2.VideoWriter(output_path, fourcc, FPS, TARGET_RESOLUTION)

    # 开始录制
    start_time = time.time()
    recording = True
    while recording and (time.time() - start_time < VIDEO_DURATION):
        # 捕获屏幕截图
        screenshot = pyautogui.screenshot()
        frame = np.array(screenshot)
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

        # 调整帧的大小
        frame_resized = cv2.resize(frame, TARGET_RESOLUTION)
        out.write(frame_resized)
    # 释放资源
    out.release()
    print(f"视频保存为: {output_path}")

def save_video():
    """保存并压缩视频"""
    global current_video
    if current_video:
        video_path = os.path.join(SAVE_PATH, current_video)

        # 如果发生异常退出,不进行压缩,直接保存原视频文件
        if out is None:
            print(f"发生异常,视频未压缩,原视频文件保存在:{video_path}")
        else:
            # 使用 FFmpeg 压缩视频
            compressed_video_path = os.path.join(SAVE_PATH, current_video.replace('.mp4', '_compressed.mp4'))
            compress_video_with_ffmpeg(video_path, compressed_video_path)

            # 删除原视频
            os.remove(video_path)
            print(f"已删除原视频文件:{video_path}")

def compress_video_with_ffmpeg(video_path, output_path):
    """使用 FFmpeg 压缩视频"""
    ffmpeg_cmd = [
        FFMPEG_PATH, '-i', video_path,
        '-vcodec', 'libx264',  # 使用 h.264 编码
        '-crf', '23',  # 控制视频质量,数值越小质量越高,文件越大
        '-an',  # 去除音频,文件更小
        '-preset', 'fast',  # 快速压缩
        '-movflags', 'faststart',  # 优化视频播放
        '-y', output_path
    ]
    startupinfo = None
    if sys.platform == "win32":
        startupinfo = subprocess.STARTUPINFO()
        startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW  # 隐藏窗口
    try:
        # subprocess.run(ffmpeg_cmd, check=True)
        # 上面命令要弹出窗口。下面这个不会弹出
        subprocess.run(ffmpeg_cmd, check=True, startupinfo=startupinfo)
        print(f"视频已压缩并保存为:{output_path}")
    except subprocess.CalledProcessError as e:
        print(f"FFmpeg 压缩失败: {e}")

def stop_recording():
    """停止录制"""
    global recording
    recording = False
    save_video()

def schedule_recording():
    """每小时录制一次"""
    while True:
        record_screen()  # 开始录制
        time.sleep(VIDEO_DURATION)  # 等待一小时
        stop_recording()  # 停止录制

def start_service():
    """启动录屏服务"""
    recording_thread = threading.Thread(target=schedule_recording)
    recording_thread.daemon = True  # 使线程在程序退出时自动结束
    recording_thread.start()
    print("录屏服务已启动...")

def exit_gracefully(signum, frame):
    """程序异常退出时保存视频"""
    global out
    print("程序异常退出,正在保存视频...")
    if out is not None:
        out.release()  # 确保视频流关闭

if __name__ == "__main__":
    # 捕获异常退出信号
    signal.signal(signal.SIGINT, exit_gracefully)
    signal.signal(signal.SIGTERM, exit_gracefully)

    start_service()
    while True:
        time.sleep(1)  # 保持程序运行

然后我们通过打包命令打包成可执行文件

pyinstaller -w --onefile --windowed  --add-data "ffmpeg.exe:." -i .\ico.ico -n ikunScreenW.exe screen.py

这里需要使用到ffmpeg 可自行上网查阅

给一个成品
https://wwts.lanzoub.com/ivlJG2r0hj0b
密码:5r73




___=============分割线===========___
又仔细想了一下需求,感觉截屏比录屏更有性价比,而且截屏能更少的占用资源,在大佬的指点下,我对代码进行了优化,特别是顾客隐私方面,设置了白名单过滤,话不多说,下面是代码
```python
import argparse
import os
import time
from datetime import datetime

import win32gui
import win32con
from PIL import ImageGrab

# 解析命令行参数
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="D:/doc/local/testPng", help="图片文件存储地址 默认D:/doc/local")
parser.add_argument("--white_list", type=str, default="", help="应用白名单 按,分割传入 默认为空")
# 忽略非预期参数
args, _ = parser.parse_known_args()

SLEEP_TIME = args.sleep
SAVE_PATH = args.save_path
os.makedirs(SAVE_PATH, exist_ok=True)
WHITE_LIST = args.white_list
# 这个是默认的白名单 主要是微信
white_list = ['微信', 'WeChat', '聊天文件', '朋友圈']
if WHITE_LIST != "":
    str_list = WHITE_LIST.split(",")  # 按逗号分割字符串
    white_list = list(set(str_list + white_list))  # 合并列表并去重


def is_white_window_open():
    """检测白名单窗口是否打开"""

    def enum_windows_callback(hwnd, open_list):
        # 获取窗口标题
        title = win32gui.GetWindowText(hwnd)
        # 检查开启的窗口是否包含白名单应用
        if title in white_list:
            # 检查窗口是否可见
            if win32gui.IsWindowVisible(hwnd):
                # 检查窗口是否最小化
                placement = win32gui.GetWindowPlacement(hwnd)
                if placement[1] != win32con.SW_SHOWMINIMIZED:  # 窗口未最小化
                    open_list.append(hwnd)

    results = []
    # 枚举所有窗口
    win32gui.EnumWindows(enum_windows_callback, results)
    return bool(results)


def screenshot():
    """截屏保存"""
    screenshot_png = ImageGrab.grab()
    # file_name = f"{SAVE_PATH}/screenshot_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.webp"
    # screenshot_png.save(file_name, 'webp', quality=80)

    file_name = f"{SAVE_PATH}/screenshot_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.png"
    screenshot_png.save(file_name)


if __name__ == "__main__":
    while True:
        if not is_white_window_open():
            screenshot()
        time.sleep(SLEEP_TIME)

```

可通过启动参数的方式来设置白名单,可对客户的隐私做保护

<h1>最后还是感谢大佬们的指点</h1>[/md]

免费评分

参与人数 4吾爱币 +10 热心值 +4 收起 理由
acail + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
52bulesky + 1 + 1 我很赞同!
youkans + 1 + 1 我很赞同!

查看全部评分

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

推荐
walykyy 发表于 2025-3-19 12:39
这个不错,后台录屏,玩的人也不知道
推荐
rhci 发表于 2025-3-19 15:17
pinkLove 发表于 2025-3-19 15:09
试过了,在我本地直接用ffmpeg的话,鼠标会闪烁,打开文件的时候会卡顿,请问在这个方面,你有解决的办法 ...

仅讨论技术哈
[Visual Basic] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
' 创建一个WScript.Shell对象
Set objShell = WScript.CreateObject("WScript.Shell")
 
' 隐藏运行CMD命令
' 注意:第三个参数0表示隐藏窗口
objShell.Run "cmd /c E:\ffmpeg\lx.cmd", 0, True
 
' 清理对象
Set objShell = Nothing

[Shell] 纯文本查看 复制代码
1
@ffmpeg -framerate 10 -f gdigrab -i desktop -vf scale=w=-1:h='min(720,ih*1)' -pix_fmt yuv420p -c:v libx264 -crf 18 -f rtsp -rtsp_transport tcp rtsp://192.168.0.100:10054/%COMPUTERNAME%
推荐
haoxue 发表于 2025-3-19 15:13
设定一个常用软件白名单, 在之外的才开启, 否则会影响那些规矩上网人的隐私
沙发
hellotony04 发表于 2025-3-19 12:38
学习一下,思路很不错
4#
GGbond141242 发表于 2025-3-19 13:21
每次是手动录制嘛
5#
 楼主| pinkLove 发表于 2025-3-19 13:27 |楼主

可以注册到windows服务,或者windows计划,启动开启就好了
6#
FFAE86 发表于 2025-3-19 13:52
学习一下!
7#
房州波哥 发表于 2025-3-19 14:09
我用过一个叫rtsp的,局域网网络硬盘录像机直接录制电脑桌面,
8#
 楼主| pinkLove 发表于 2025-3-19 14:11 |楼主
房州波哥 发表于 2025-3-19 14:09
我用过一个叫rtsp的,局域网网络硬盘录像机直接录制电脑桌面,

我的去看看这个东西。
9#
sjzhy 发表于 2025-3-19 14:13
感谢分享
10#
pwp 发表于 2025-3-19 14:33
可怕的技术,录了客人的隐私
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-23 05:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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