[精讚] [會員登入]
479

【JDA/discord bot】如何獲得訊息中的圖片和影片並儲存或轉傳

如何將訊息中的圖片或影片之類的多媒體提取出來之後,再進行相關的處理

分享此文連結 //n.sfs.tw/16358

分享連結 【JDA/discord bot】如何獲得訊息中的圖片和影片並儲存或轉傳@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2024-02-13 12:44:58 最後編修
2024-02-13 03:30:51 By 過路君子
 

哈囉大家好,這裡是持續翻看文檔的小編過路君子

不太確定網路上其他人是否有發類似的文章,但這是小編看著 javadoc 寫出來的程式碼

 

 

小編所使用的 JDA 版本是:5.0.0-alpha.20

因為 JDA 更新快速,請各位先行確認目前使用的版本是否兼容小編所使用的版本。

如果一切都沒問題的話,簡單來說,以下:

import java.util.List;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;


public class DiscordEvents extends ListenerAdapter
{
    @Override
    public void onMessageReceived(MessageReceivedEvent event)
    {
        // Fetch the new channel
        long channelID = 900000000000000000L;
        TextChannel channel = event.getJDA().getTextChannelById(channelID);

        // Getting message attachments
        List<Attachment> attachemnts = event.getMessage().getAttachments();
        if(attachemnts.size() == 0) return;

        // Download attachments and send it to new channel
        for(Attachment attachment : attachemnts)
        {
            try {channel.sendFiles(FileUpload.fromData(attachment.getProxy().download().get(), attachment.getFileName())).queue();}
            catch(Exception error) {System.out.println(error);}
        }
    }
}

上方的程式碼會將檔案從 Discord 伺服器下載下來,且以 java.io.InputStream 的狀態呈現。

緊接著小編再將其轉換成 net.dv8tion.jda.api.utils.FileUpload 的格式以符合 sendFiles 所規範要傳入值的型態。

最後在用 sendFiles 這個函數並配合 queue() 將處理完成的多媒體傳送至新的頻道內。

 

那上面的範例小編是單純的將讀取到的多媒體一個一個的相繼傳送至新頻道。

如果各位需要一次性的將所有的多媒體傳送至新頻道的話,可以先將所有的多媒體先丟到 Collection<? extends FileUpload> 內。

之後在丟入 sendFiles 這個函數就可以囉~(注意單次最大檔案傳送上限!)

 

如果各位需要將檔案存檔另成 java.io.File、 net.dv8tion.jda.api.entities.Icon 或是 java.nio.file.Path 等等其他的格式話。

可以參考以下頁面來自行完成轉檔的動作:JDA5.0.0-alpha.20_AttachmentProxy

那麼,祝各位好運了,希望各位都能成功取得位於訊息中的多媒體!

 

 

 

後記

同場加映,同樣的功能如何使用 discord.py 實現,換句話說就是用 Python 寫。

但小編覺得會來看這篇文章的人應該都不會需要以下的程式碼吧。

反正就都放後記了,就當讓各位客官品個茶香吧~!

class event():
    @commands.Cog.listener()
    async def on_message(self, msg):
        # fetch the new channel
        channelID = 900000000000000000
        channel = await self.bot.fetch_channel(channelID)

        # Getting message attachments
        files = []
        for attachment in msg.attachments:
            files.append(await attachment.to_file())

        # Sending it to new channel
        if len(files) != 0:
            await channel.send(files=files)
END

你可能感興趣的文章

【ThinkSpeak】一個IoT數據分析(IoT analytics)及呈現的網站 世界上有著各式各樣的需求,因而誕生出了各式各樣的網站,絕對不是沒有人提供,而是你不知道哪裡有這東西

【C++】使用SFML創建新視窗和新增圖標(ICON)並隱藏DOS 筆記,怕自己以後忘記怎麼創建並開啓一個新視窗

【Wildfly/jBoss】[Linux] 如何從無到有建立Wildfly網頁伺服器 包含一切所需的指令

【Arduino/LinkIt 7697】實作小小的 MQTT Publish & Subscribe 若是要多點對多點傳輸資料,那使用 MQTT 即可快速的達成我們所需的目的

【MySQL Workbench】如何透過TCP/IP進行SSL連線到遠端MySQL資料庫 通常MySQL伺服器都不是只提供某人連線,而是多人都可以連線進來使用,這時就不能繼續使用localhost的那種寫法

【C++】使用struct array和一維int array模擬二維int array 主要是因為用sort去排序int array的二維陣列小編懶得研究,於是就研究了一種維持一維陣列但是有二維陣列效果的程式,小編就廢~~

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

高捷少女:地下城的探險少女⑤ 小穹寫好後,耐耐看了一遍。「我想我應該辦得到。」她說完跪坐在地上,然後把古箏安放在大腿上,並將樂譜放在前面的地板。「要開始囉。」耐耐閉上眼睛,深呼吸一口氣,小穹等人在一旁看著她,心中暗自替她打氣。

高捷少女:購票大作戰① 「各位乘客,本班機即將降落,感謝各位乘客的搭乘……」隨著空中小姐的廣播音,那架飛機逐漸降落在地面,裡面的乘客們也紛紛開始整理自己的行李。 那個有著歐美人五官的少女抓緊包包,看著外面的小港機場,臉上緩緩

高捷少女:耐耐的新年驚喜② 「各位,我跟爸媽聊完了……」耐耐走進客廳,看到大家在看自己的相簿,臉蛋立刻紅了。「哇啊啊,不要看那個!」她三步併作兩步地走向少女們,將相簿拿走。「為什麼啊?小時候的耐耐很可愛啊。」婕兒不解地說。

婕兒──她的青春② 艾米直搖頭。「我真不敢相信,小穹妳都二十幾歲了,為什麼能想出這種故事呀?」「婕兒也是二十幾歲啊,妳想想她現在是什麼樣子?」小穹不滿地指向火車的方向。

【日翻中歌詞】ピースサイン(Peace Sign) 那一天從我們的頭頂 輕掠而過的那架飛機 有點不可思議 還記得 為何呢?毫無意義