iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
AI & Data

網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術系列 第 23

【Day 23】- 想用個人的帳號在 Discord 自動留言? 爬蟲能做到!(實戰 Selenium 在 Discord 文字頻道內留言)

  • 分享至 

  • xImage
  •  

前情提要

前一篇帶各位實作了 Instagram 點選朋友的所有文章,並按讚,再鎖定並點擊關閉按鈕。

開始之前

今天要來實戰 Discord 的自動留言機器人,原理是讓 Selenium 用自己的帳號密碼登入 Discord,讓其重新導向到平到,並鎖定對話框,輸入訊息後自動傳出。

我們這次帳號密碼的部分會使用環境變數的方式來儲存。

預期效果

將帳號密碼寫於 .env 檔案中

執行程式後能夠在指定伺服器與頻道內發言

實戰

首先,我們要使用 dotenv 這個套件來進行環境變數的操作。先安裝這個套件。

pipenv install python-dotenv

安裝完畢後,我們就能將環境變數寫在 .env 這個檔案內了。接下來,開啟一個新的檔案叫 .env 注意 . 的前面沒有文字,將 Discord 的信箱與密碼輸入。

再來,我們就能在 Python 中去取得這些環境變數了,只要進行以下操作。

from dotenv import load_dotenv
import os

load_dotenv()
email = os.getenv('email')
password = os.getenv('password')

接下來,我們進入想要發言的伺服器內的頻道 https://discord.com/channels/868043633197195314/874469620164227143,用 Selenium 開啟會發現被導向了登入的頁面,我們能分析一下郵件與密碼的欄位。

再來,我們將其的 XPath 複製,並撰寫個 Selenium 鎖定他們,並將資料用 send_keys() 傳入。

可以發現成功將信箱與密碼傳入了,我們再利用開發工具鎖定登入按鈕,並用 click() 點擊該按鈕進行登入。

from selenium import webdriver
from time import sleep
from dotenv import load_dotenv
import json
import os

load_dotenv()
email = os.getenv('email')
password = os.getenv('password')

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get('https://discord.com/channels/868043633197195314/874469620164227143')
    sleep(1)
    driver.find_element_by_xpath(
        '/html/body/div/div[2]/div/div/div/div/form/div/div/div[1]/div[2]/div[1]/div/div[2]/input').send_keys(email)
    driver.find_element_by_xpath(
        '/html/body/div/div[2]/div/div/div/div/form/div/div/div[1]/div[2]/div[2]/div/input').send_keys(password)

成功進行登入。

接下來,利用開發工具定位到留言框複製 XPath ,並在程式中鎖定該元素,之後 send_keys 傳入需要發言的文字,最後加個 \n 來進行發送。

from selenium import webdriver
from time import sleep
from dotenv import load_dotenv
import json
import os

load_dotenv()
email = os.getenv('email')
password = os.getenv('password')

if __name__ == '__main__':
    with open('cookies_jar.json') as f:
        cookies = json.load(f)
    driver = webdriver.Chrome()
    driver.get(
        'https://discord.com/channels/868043633197195314/874469620164227143')
    sleep(1)
    driver.find_element_by_xpath(
        '/html/body/div/div[2]/div/div/div/div/form/div/div/div[1]/div[2]/div[1]/div/div[2]/input').send_keys(email)
    driver.find_element_by_xpath(
        '/html/body/div/div[2]/div/div/div/div/form/div/div/div[1]/div[2]/div[2]/div/input').send_keys(password)
    driver.find_element_by_xpath(
        '/html/body/div/div[2]/div/div/div/div/form/div/div/div[1]/div[2]/button[2]/div').click()
    sleep(4)
    driver.find_element_by_xpath(
        '/html/body/div[1]/div[2]/div/div[2]/div/div/div/div[2]/div[2]/div[2]/main/form/div[1]/div/div/div[1]/div/div[3]/div[2]/div').send_keys('大家好\n')

結語

今天實作了自動發送留言至 Discord 的頻道中,如果想要擴充,可以使用 crontab 定時發言。也使用了 python-dotenv 來做環境變數的取得。

在版本控制的狀況下,需要在 .gitignore 下寫入 .env 避免將個資也 public 上去。

明日內容

明天會帶各位爬取已經寫好的 API 上的資料。

補充資料

Python dotenv 介紹與使用教學: https://myapollo.com.tw/zh-tw/python-dotenv/

Discord on web : https://discord.com/app

Selenium docs : https://readthedocs.org/projects/selenium-python/downloads/pdf/latest/


上一篇
【Day 22】- 將朋朋的 Instagram 貼文全部按讚owo(實戰 Selenium 自動點擊 Instagram 好友貼文贊 2/2)
下一篇
【Day 24】- 用方便的 Postman 儲存或測試 API
系列文
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言