[精讚] [會員登入]
1285

【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

你可能感興趣的文章

【Minecraft】[CoreProtect|BungeeCord]如何重新命名世界或維度名稱 當只有一個伺服器的時候,問題往往處理起來非常簡單,但是一旦當伺服器成長至兩台以上,事情便開始有趣了起來

【Wicket】[CSP] Content-Security-Policy & Content-Security-Policy-Report-Only Wicket 預設開啟的,所以如果要加載外部資源甚至是同源資源都會被擋下。

【Wildfly/jBoss】[Linux](Connection Datasource)如何與MySQL資料庫建立連線 網頁瀏覽器和資料庫的關係密不可分,而通常會將兩者分開架設在不同的伺服器上面來提供服務,這時要如何進行連線呢?

【Java】(Project Valhalla)關於Java未來重大的變革 讓 Java 再次偉大!Make Java Great Again!

【Maven】如何創建一個簡單可執行的JAR檔 滿重要的一個小功能,畢竟有時候是要傳遞的是JAR檔,而不是直接透過Maven直接部屬之類的

【Java】[debug]多維泛型的大坑 incompatible types error

隨機好文

【手遊介紹】小品手遊─寶箱是我的!(SUMMONER'S GREED) 輕鬆無腦的塔防遊戲,殺時間本小編推薦的遊戲之一

高捷少女:布拉格體驗㊦ 「各位想到盧卡站的乘客,請到我們左手邊排隊!」婕兒大聲地喊道。     「這孩子怎麼穿著地鐵站制服?童工嗎?」一位大嬸歪頭問道。

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

高捷少女:地下城的探險少女② 「等我一下喔,我好像有帶去漬的清潔噴霧。」婕兒翻翻飛揚,拿出噴霧劑給小穹,小穹趕緊對著汙漬噴了噴,紅茶漬果然乾淨了許多。「婕兒,謝謝妳。來,還妳。」小穹感謝地把噴霧還給她,卻發現婕兒盯著打開的飛揚,一

高捷少女:購票大作戰③  歐巴桑露出懷疑的表情。「怎麼了,您跟夏尼爾小姐不是朋友嗎?只要打電話確認就好了,不是嗎?」「是……是這樣沒錯……可是……」小穹支支吾吾地說。我的確是潔西塔的朋友,但