[精讚] [會員登入]
983

【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

你可能感興趣的文章

【Linux】[CentOS 8]如何更新sudo指令 上次會想要更新sudo這個指令的時間應該是2017年了吧?轉眼間就2021了耶

【!@#$%^&*()_+ language】!@#$%^&*()_+ 程式語言介紹 一款看起來像是在鬧的程式語言

【CoreProtect】自行升級至 Minecraft 1.21.x、1.22.x 或更高版本 不知道為什麼,官方竟然無預警停止更新,我們只好自行救濟

【Docker hub】[Linux]以IPv6來pull容器(container)吧! 在一個 IPv6 還不盛行的年代,做事情總是特別麻煩

【PaperMC】從 Waterfall 切換至 Velocity waterfall 已經停止支援,最後停留在支援 Minecraft 1.21.6,之後的 Minecraft 版本便不再支援

【Firefox \ Maven】[Headless](Linux) 如何使用Maven打包並驅動Firefox 有時候我們需要取得渲染後的網頁,當然是直接呼叫瀏覽器出來用啦

隨機好文

【分享、整合串】什麼?!高捷少女竟然有二創小說!! 由時零宇宙大大在巴哈上面連載的二創高捷少女小說,就讓我們來看看,究竟在時零大大的巧手下,高捷少女們會擦出什麼樣的火花吧!

高捷少女:地下城的探險少女① 婕兒心中一奇,便走上前看著仔細。那塊凹進去的地方中心大約三公分厚,越往邊緣就越淺,圓型直徑十五公分。婕兒拿出銅盤對比一下,發現兩者大小竟然一致,銅盤似乎能夠完整的嵌進去。     婕兒看著凹槽,心中

高捷少女:美麗島的守護者① 婕兒跟耐耐嚇得臉色發白。「耐耐,小穹有這方面的愛好喔?」婕兒小聲地說。耐耐默默的拿出筆記本,臉上浮現一層微笑:「這麼大的新聞,要趕快記下來!」

高捷少女:美麗島的守護者⑤  雖然暫時不用怕牠們了,可是一直躲在這裡終究不是辦法,小雅心想。她看看四周,這間更衣室沒有窗戶或後門,她不禁著急起來,不可能一直躲在這裡面,但從門出去只會被群貓圍攻而已。小雅低下頭苦思該怎麼辦,過了不

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