沒有Nitro也想用動圖?
想增加表情格數卻不夠用?
想偷別人的表情來用?
不當人類就沒問題了
[Emoji Unlock Bot]
[功能介紹]
機器人將自動偵測所在伺服器的訊息,儲存訊息中的私人表情符號
伺服器成員可藉由輸入機器人前綴+emoji_unlock_mode進入「表情解鎖模式」
(ex:前綴為"flute"則指令為"flute emoji_unlock_mode")
機器人將發送一則模式提醒訊息
進入此模式的成員若輸入原本無法使用的表情符號名稱,
而機器人儲存過此表情符號
將出現一個頭貼暱稱皆與使用者相同的機器人發送使用者原本想輸入的表情
(需確保此伺服器有一格以上的表情符號動畫空間)
使用者也可藉由操作模式提醒訊息的按鈕來查詢可使用的表情符號
或是上傳圖片以創造新的表情符號
[功能示範]
指令:emoji_unlock_mode
表情輸入:
訊息送出後:
可用表情符號查詢:
創造新表情符號:
按下✅
[機器人建置]
首先,一個機器人帳號是必備的
要讓機器人運作,需要以下的檔案及程式:
(此機器人的運作基於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
[創造新表情符號]
由使用者上傳圖片
機器人下載此圖片並由之前的轉換流程製造表情符號
以上便是機器人的運作原理我大概是太無聊才會做這種功能的機器人
這篇文也只是順便做個紀錄
如果有人要做一樣功能的機器人應該能做得更好
畢竟我的演算法真的是想到怎麼打就怎麼打
沒有做過太多簡化
想用這個機器人的話就敬請下載吧