[零基礎上手] Discord 自動參加抽獎機器人(雲端穩定版)

Discord bot 抽獎機器人

本篇教學會帶大家部署一個自動參加 Discord 抽獎機器人,會使用雲端主機 Google Cloud Function,好處是不會面臨電腦關機時機器人就休息的情況,然後 Google 也有提供一定使用額度內免費,所以基本上是完全零成本免費部署,讓大家都可以解放雙手和注意力,不會再錯過任何 Discord 的抽獎項目!

會有這篇文章的誕生,主要感謝 Fomo dog 社群中的 meta Simon 和 saibalmars 狗友們,不斷地改進和修正程式碼 (如下連結),才會有今天的 Discord 抽獎機器人(雲端穩定版本)

1. 申請 Google Cloud Platform

首先我們要申請 Google Cloud Platform 的帳號,可以從這裡進入,Google 目前有提供 3 個月內 300 美金的額度使用,而我們這次會使用 GCP 裡面的 Google Cloud Function,以這次部署的程式的每用使用量來說,每月的花費在 0 塊台幣以內。

接下來建立第一個專案,專案名稱可以依自己喜好命名

2. 創建 Cloud Function

接下來在搜尋欄中搜尋 “Cloud Function”,並且選擇建立函式

創建 Cloud Function – Step 1

  1. 函式名稱:可以自由填寫
  2. 選擇區域:可以挑選自己喜歡的主機所在地,這邊選擇 asia-east1 台灣
  3. 觸發條件:選擇 Cloud Pub / Sub
  4. 建立一個 Pub / Sun 主題 > 輸入主題 ID (可隨意填) > 選擇建立主題
  5. 選擇儲存
  6. 並點選下一步

創建 Cloud Function – Step 2

  1. 選擇啟用 API
  2. 選擇執行階段 Python 3.9
create GCF step3

創建 Cloud Function – Step 3

  1. 選擇 main.py
  2. 輸入進入點:getlist
  3. 輸入我們的抽獎機器人程式碼

步驟 3 裡面的完整程式碼如下: (請在 bots_setting 中加入自己想要追蹤的抽獎頻道,關於參數設定可以參考 Simon 的這篇)

import requests
import json
import random
import time
from datetime import datetime

def getlist(event, context):

    # You can add more than one bot if you have multiple discord accounts.
    bots_setting = [
        {
            "name": "bot1",
            "authorizations": [
                    "token1","token2",
                ],  # Please remember to put in your discord message authorization code
                    # spearate by comma if you have more than one token.
            "channel_lists": [
                {
                    "name": "Alpha Shark",  # Nickname for the channel
                    "settings": {
                        "channel_id": "927557825486536764",     # Channel's discord ID
                        "lottery_keyword": "React with \\ud83c\\udf89 to enter!",      # Lottery keyword to detect:  "React with 🎉 to enter!"
                        "emojis_to_click": ["%F0%9F%8E%89"]     # emoji to click
                    }
                },{
                    "name": "channel2",  # Nickname for the channel
                    "settings": {
                        "channel_id": "927557825486536764",     # Channel's discord ID
                        "lottery_keyword": "React with \\ud83c\\udf89 to enter!",      # Lottery keyword to detect:  "React with 🎉 to enter!"
                        "emojis_to_click": ["%F0%9F%8E%89"]     # emoji to click
                    }
                }
# can add more channel here




            ]
        }
    ]

    limit=10
    
    for bot in bots_setting:
        for auth in bot["authorizations"]:
            header = {
                "Authorization": auth,
                "Content-Type": "application/json",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36",
            }
            for channel in bot["channel_lists"]:
                url = "https://discord.com/api/v9/channels/{}/messages?limit={}".format(channel["settings"]["channel_id"], limit)
                try:
                    res = requests.get(url=url, headers=header)
                    messages_json = json.loads(res.text)
                    for message in messages_json:
                        try:
                            if channel["settings"]["lottery_keyword"] in json.dumps(message):
                                is_lottery_post = True
                            else:
                                is_lottery_post = False

                            if is_lottery_post:
                                print("-------------Lottery captured!--------------")
                                print("Date:", datetime.now())
                                print("Channel:", channel["name"])
                                print("Message ID:", message["id"])
                                print("Content:", message["content"])
                                print("embeds:", message["embeds"])
                                for emoji in channel["settings"]["emojis_to_click"]:
                                    url = "https://discord.com/api/v9/channels/{}/messages/{}/reactions/{}/%40me".format(
                                        channel["settings"]["channel_id"], message["id"], emoji)
                                    requests.put(url=url, headers=header)
                                    time.sleep(1)

                        except:
                            print("Failed to expand messages.")
                            pass
                except:
                    print("Failed to get discord message.")
                    pass

在步驟 4 裡面的 requirements.txt 裡面加入 requests,完整程式碼如下:

# Function dependencies, for example:
# package>=version
requests

最後點擊部署!但程式目前還不會自動執行,我們還要加上觸發時間

3. 設定觸發時間

  1. 在搜尋欄中,搜尋 cloud scheduler,並建立一個新工作
  2. 名稱:Hourly (這邊可以隨意填)
  3. 地區:選擇台灣
  4. 頻率:30 * * * * (這個意思是每個小時會執行一次)
  5. 時區:世界標準時間
  6. Pub / Sub 主題:選擇我們稍早在創立 Cloud function 時所創造的 hourly 的 Pub / Sub
  7. 訊息內文:這邊可以隨便填

最後選擇建立!就完成觸發條件設定囉

4. 如何檢查 Discord 抽獎機器人

如何確定程式有執行?基本上只要沒事去看一下 Discord 抽獎頻道,確認有沒有點擊抽獎就可以了

擔心的話可以到 Cloud Function > 紀錄裡面,可以看到程式執行過程 (如下圖)

那 [零基礎上手] Discord 自動參加抽獎機器人(雲端穩定版) 就到這邊感謝收看,如文章內容有誤請不吝指正!

▍相關延伸閱讀:

▍其他延伸閱讀:

在〈[零基礎上手] Discord 自動參加抽獎機器人(雲端穩定版)〉中有 7 則留言

  1. 請問有 twitter raffle 版本的嗎?
    前陣子有在研究,但 twitter API 被擋。看來只能用自動化測試工具來做了…

      1. 目前這個方案是每小時掃一次,不要去調整成每分鐘掃或搭配其他抽獎機器人使用的話,正常使用下是不會有問題的!

      1. 感謝回應 !
        另外想了解,是否有研究過 “button” 類型,而不是 “emoji” 的抽獎?
        我看 trait sniper 很愛用這種,有個綠色的 “enter” 可以按。
        不知道這樣的動作是否也能透過 API 實現?

發佈回覆給「Abel Peng」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。