【Day 23】- 想用个人的帐号在 Discord 自动留言? 爬虫能做到!(实战 Selenium 在 Discord 文字频道内留言)

前情提要

前一篇带各位实作了 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 24:605. Can Place Flowers

IT铁人第30天 Elasticsearch 使用python查询资料 Aggregations:Scripted Metric

今天要介绍的是我另外一个也经常用的聚合方式,是Metrics底下的Scripted Metric 今...

第8章:管理本地端主机之使用者与群组(二)

前言 在上一章节中,笔者讲解了一般使用者的资讯、储存密码还有群组等基本概念,本章节继续延伸上一章节的...

资安学习路上-Linux基础与Web基础2

网站+网页绪论 浏览器介绍(推Firefox跟Edge) 上图取自台科大资安社课教材 浏览网页发生的...

Day 10 - 基本语法5(回圈)

昨天我们学完了if、else、else if 的判断,并且学习了布林值的概念。今天我们来学回圈。 正...

Extra05 - Docker - 容器化

此篇为番外,未收入在本篇的原因是 Docker 是个复杂的工具,因此需要更多的篇幅介绍此工具,但是...