創作內容

20 GP

【Discord】偷表情機器人

作者:提督—哞咖可利斯特│2020-08-18 04:12:07│巴幣:40│人氣:11332

沒有Nitro也想用動圖?
想增加表情格數卻不夠用?
想偷別人的表情來用?





不當人類就沒問題了

[Emoji Unlock Bot]


[功能介紹]

機器人將自動偵測所在伺服器的訊息,儲存訊息中的私人表情符號
伺服器成員可藉由輸入機器人前綴+emoji_unlock_mode進入「表情解鎖模式」
(ex:前綴為"flute"則指令為"flute emoji_unlock_mode")
機器人將發送一則模式提醒訊息
進入此模式的成員若輸入原本無法使用的表情符號名稱,
而機器人儲存過此表情符號
將出現一個頭貼暱稱皆與使用者相同的機器人發送使用者原本想輸入的表情
(需確保此伺服器有一格以上的表情符號動畫空間)
使用者也可藉由操作模式提醒訊息的按鈕來查詢可使用的表情符號
或是上傳圖片以創造新的表情符號

[功能示範]

指令:emoji_unlock_mode

表情輸入:
訊息送出後:

可用表情符號查詢:

創造新表情符號:
按下✅


[機器人建置]

首先,一個機器人帳號是必備的
要讓機器人運作,需要以下的檔案及程式:
1.Python 3.8.5(也可使用Python 3以上舊版)
(此機器人的運作基於Windows作業系統)

[Python安裝]
務必確認安裝的python是64位元還是32位元的版本
ImageMagick需安裝相同的版本
底下的"Add Python 3.8 to Path"需打勾
並由"Customize installation"繼續安裝
確認斯勾選項都有勾選後Next
勾選"Install for all users"後Install,完成Python安裝

[ImageMagick安裝]
複製安裝的路徑供之後使用
勾選"Install development headers and libraries for C and C++"後繼續,
完成ImageMagick安裝
接下來需設定ImageMagick的環境變數
開啟控制台->系統及安全性->系統
->進階系統設定
->環境變數
->新增系統變數
變數名稱為"MAGICK_HOME"
變數值為剛才複製的安裝路徑
ImageMagick設定完成

[Emoji Unlock Bot檔案]
為安裝必要的python模組,需執行module_install.bat
執行完畢後即可刪除module_install.bat
接下來就要讓機器人開始動了
(需先邀請機器人至你的伺服器,否則會錯誤)
執行run.bat
因為是第一次執行,需輸入機器人的Token
輸入機器人指令前綴(ex:flute)
為產生表情符號查詢所需的圖片,需要一文字頻道專門放置
(右鍵頻道->複製ID)
接下來機器人就會開始跑了,第一次執行一段時間後將自動關閉
可由執行run.bat再次運作
機器人的建置就此告一段落

[運作原理]

[表情符號儲存]
首先,在我們眼中看到的表情符號雖然是一張圖片,但它在discord的文字形式其實為<:(emoji_name):(emoji_id)><a:(emoji_name):(emoji_id)>
而只要能取出其中的emoji_id,便能透過連結
https://cdn.discordapp.com/emojis/(emoji_id).gif 或https://cdn.discordapp.com/emojis/(emoji_id).png下載表情符號的圖片
discord機器人能透過on_message的事件擷取訊息的內容
再檢測此訊息是否符合<:*:*>或<a:*:*>的形式
若符合便嘗試下載並轉換為48*48大小的gif圖片
至於為什麼要轉為gif,單純是因為我在的伺服器動圖表情還沒爆格
轉為48*48是為了之後的上傳效率,雖然圖片會失真,在手機版看起來會糊掉
還有一點,沒有Nitro的帳號能上傳的表情檔案大小不可超過256kb
壓縮成48*48可以99%保證不會超過此限
至於怎麼轉的呢?
這就跟剛才安裝的ImageMagick有關了
因為轉換過程中的其中一個模組-Wand便是基於ImageMagick作用的
對python影像處理有些接觸的人可能會知道Pillow這個模組
而我在轉換的過程同時用了Wand和Pillow兩個模組
為什麼有Pillow了還要用Wand?
因為Pillow這個模組對於含透明資訊的gif處理有相當大的瑕疵
直接縮放會讓透明部分變為黑色
將每一幀分開後最後一幀會因不明原因被第一幀覆蓋
不管怎麼做都無法解決此問題
所以此部分只能用Wand來處理
而原本是png格式的圖片是怎麼轉的呢?
直接將副檔名改成gif是沒用的
discord的系統會偵測圖片的結構來決定該產生普通表情符號還是動圖表情符號
而就算是gif結構,若每幀的資料一模一樣也將產生普通表情符號
所以必須以原本的靜態圖產生兩幀,並對其中一幀做出些微的改動
我想出的辦法是將原圖分離出R(red)G(green)B(blue)A(transparency)四個頻道
並找出R頻道中第一個值不為0的像素
將其值+1後再混和四頻道
並與另一幀結合產生動圖
以上便是關於圖片的處理

[模式使用者]
在某成員呼叫emoji_unlock_mode指令後,產生一結構來儲存此成員的資料
其中包含提醒訊息的id,翻到第幾層,第幾頁等等
並且用一dictionary來儲存此結構(成員id對應資料)
當有伺服器成員發送訊息,將確認此成員的id是否在dictionary中
若是,判斷是否有:*:形式的內容,並嘗試上傳符合的圖片作為表情符號
判斷與上傳的速度取決於自己的電腦和網路
在經過一連串的轉換後產生新的內容,並由webhook發送
在發送時更改webhook頭像為使用者頭像,暱稱為使用者暱稱
發送前刪除原訊息,發送後刪除表情符號
這便是emoji unlock的原理

[表情符號查詢介面]
在儲存圖片之後,機器人將此圖片上傳至儲存頻道
並紀錄圖片的網址
機器人在發送提醒訊息後便增加表情反應作為按鈕
discord機器人能透過on_message的事件判定使用者所按下的為什麼表情符號
再因應每種表情做出不同的回應
產生embed夾帶圖片的網址
再由webhook發送embed

[創造新表情符號]
由使用者上傳圖片
機器人下載此圖片並由之前的轉換流程製造表情符號

以上便是機器人的運作原理
我大概是太無聊才會做這種功能的機器人
這篇文也只是順便做個紀錄
如果有人要做一樣功能的機器人應該能做得更好
畢竟我的演算法真的是想到怎麼打就怎麼打
沒有做過太多簡化
想用這個機器人的話就敬請下載吧
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4886126
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 17 篇留言

康瑟爾文
趕快假裝自己看得懂以免被當白痴

08-18 09:51

提督—哞咖可利斯特
(ÒωÓ )08-18 12:14
ㄌㄐ
大佬炙

08-18 14:27

有一隻超可愛的狗勾
大佬

08-18 15:11

欸不是欸我沒有欠你欸
大佬炙

08-18 17:20

葉門
為什麼要馬賽克我

10-15 18:55

AungGain
https://i.imgur.com/dh5FxG3.png 錯誤QQ



12-11 00:07

提督—哞咖可利斯特
https://imgur.com/PhsLjLE
雖然沒辦法具體確定是什麼問題
不過依內容推斷
第一個錯誤可能是你邀請機器人到伺服器時沒有給予夠高的權限
所以機器人無法發言
或是根本還沒邀請機器人到任何伺服器
第二個錯誤是路徑中含有特殊字元
因為建立資料夾的機制是由discord群組名稱命名
而資料夾卻不能包含特定字元
導致群祖名與資料夾名的不一致12-13 14:00
AungGain
應該是沒給好權限
然後我的群組有特殊字元

12-14 03:11

LiBibo
請問有方法做到「偵測每個訊息挾帶的 emoji 代碼,若有新的代碼則判定為新貼圖,自動把圖片下載到指定資料夾」的功能嗎?

12-17 22:58

提督—哞咖可利斯特
可以 這就類似我用來儲存emoji圖片的機制12-19 21:39
雨夜
請問一下關於webhook機器人偽裝成用戶的作法,因為我實在不知道我該搜尋什麼關鍵字才能找到教學

12-22 22:46

提督—哞咖可利斯特
通常會利用每種程式語言對應的discord套件發送操控webhook的指令來送訊息
但只是要發送webhook其實也不需要裝到整個discord套件
其中最簡單的方式就是直接打開google chrome的開發人員工具
切換到Console來打javascript
偽裝成用戶需要webook的URL, 用戶名稱, 用戶頭貼圖片連結, 還有發送的訊息內容
在console輸入
var webhook = new XMLHttpRequest();
webhook.open("POST", "webhook網址");
webhook.setRequestHeader('Content-type', 'application/json');
var params = {
username: "用戶",
avatar_url: "用戶頭貼圖片連結",
content: "訊息內容"
};
webhook.send(JSON.stringify(params));
便可使webhook以"用戶的外觀"發送一條訊息
以下以我建的webhook做示範
https://imgur.com/w0OTOCd
https://imgur.com/hGOpAhc01-06 22:45
Shadow月影
不好意思我只有跳出訊息沒有表情符號 https://imgur.com/qyTFbYx https://imgur.com/VwTxXb5

01-06 20:04

提督—哞咖可利斯特
抱歉
光從cmd來看我看不出是哪裡出問題
請問除了這個問題以外的其他功能是否有正常運作?
可能需要你上傳functions自料夾的Emoji_Unlock_User給我01-06 22:19
Haruka51
不好意思我輸入完所有數值後就直接出現錯誤了https://imgur.com/a/eL1QT9U

01-12 22:43

提督—哞咖可利斯特
看起來是token輸錯了01-14 22:44
單推InAyame我老婆<3
你好,我照著"創造新表情符號"那邊做後,有跑出機器人貼一張一樣的圖,
但上傳的那張gif還是不會存在表情符號那邊.
請問要怎麼存gif圖阿?

02-16 23:06

提督—哞咖可利斯特
如果機器人有出來貼圖的話
那張圖片應該以gif形式被存在emote\uncategorized資料夾裡了
如果你是指沒有出現在伺服器表情符號裡那是正常的
只有在打出 :(表情符號名): 的時候機器人才會再將那張圖上傳
訊息送出後即刪除
不過如果你是指連在emote\uncategorized都沒有那可能是又出bug了
抱歉 我只能從cmd顯示的錯誤訊息來判斷是哪裡出錯了02-20 19:42
雨夜
不好意思再問一下,你的webhook去抓取的內容是甚麼呢?是另一個機器人所傳的資訊嗎?
因為我上網查,有些還需要用到ifttt之類的東西,但我看你的似乎不需要。

02-20 17:33

提督—哞咖可利斯特
在discord機器人運行的途中
機器人能夠接收到伺服器裡每個用戶發出的訊息
這裡說的機器人是指我們建置的"機器人用戶"
而非webhook機器人
一條訊息裡包含了發送者、發送內容、發送時間等資訊
機器人用戶從其中擷取了發送者名稱、發送者頭像及發送內容
整理這些資訊後"命令"webhook送出
所以webhook做到的僅有發送訊息而已
ifttt能夠偵測其他網站所發生的事件(例如YT某頻道發布新影片)
進而判斷是否命令discord webhook發送訊息
總而言之
discord webhook就是一個可由程式經過條件判斷或是用戶直接命令
來發送訊息的一項工具02-20 20:03
單推InAyame我老婆<3
感謝你的回覆!!
"沒有Nitro也想用動圖?"<--我可能會錯意了
所以要在表情符號那邊貼gif還是只有買Nitro這個方法嗎?

02-20 20:56

提督—哞咖可利斯特
只是上傳動圖表情符號的話普通用戶就可以了喔02-20 22:18
雨夜
那請問一下我如果想在我的機器人中加入這個功能(例如把兩個不同伺服器連接在一起,A伺服器發話,B伺服器的webhook模擬用戶發話)要在官方api的哪個地方了解寫法?關於discord bot 或許用戶名稱跟頭像我都已經會了,但我不知道該怎麼調用webhook機器人來發話

02-20 20:59

提督—哞咖可利斯特
以discord.py來說
有關webhook的用法可以在https://discordpy.readthedocs.io/en/latest/api.html#webhook-support
找到
至於A伺服器發話、B伺服器webhook發話可以透過
https://discordpy.readthedocs.io/en/latest/api.html#message
message的channel id不同來處理02-20 22:18
雨夜
成功了 謝謝你

02-22 13:06

提督—哞咖可利斯特
不客氣02-22 14:20
小馬すまるまSmallma
好厲害!

04-06 17:11

我要留言提醒:您尚未登入,請先登入再留言

20喜歡★a2823kevin 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:niz4sanhywod... 後一篇:【ウマ娘】馬肉工廠...

追蹤私訊切換新版閱覽

作品資料夾

acgLLkotori上帝
來吧,這次我想要數學兩個b/b+,看看有什麽代價能跟你交換的看更多我要大聲說15小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】