[精讚] [會員登入]
233

【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

你可能感興趣的文章

【Wickct】(link) <a> 如何新增超連結 簡單來說有兩種方式,小編個人比較偏好 的方法

【Wicket】[Cookie]如何讀取和設定客戶端的Cookie 對於某些參數需要給予使用者,我們可以使用 Cookie 來讓客戶端記著,之後再跟伺服器裡的比對來達到驗證的目的

【C++】class練習 — 檢測該字串是否為迴圈 第一次的C++結構式寫法,雖然以後應該會見怪不怪,但畢竟是第一次所以還是想保存下來

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

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

【Wicket】[URI]使用Java取得目前網址 這是個還滿常用的功能,可惜 Wicket 沒有內建函式可以快速取得我們要的部分,只能依靠我們自己後期的字串剖析

我有話要說

>>

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

訪客留言

[無留言]

隨機好文

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

艾米莉亞和高捷戀旅3① 「既然艾米莉亞小姐也來了,就把那個拿出來吧。」美麗島捷運商店的負責人說完,一名工作人員推著一個大箱子進入辦公室。他將箱子打開,將裡面的東西抬出來。艾米張大嘴巴

【英翻中歌詞】(二創歌)東方妖妖夢-人形裁判 ~玩弄人偶的少女 人形裁判 ~ 人の形弄びし少女 很久很久以前,在一個神奇的異地,住著一位少女,十分惹人憐愛 她的皮膚就像陶瓷一樣潔白,眼睛就像藍色寶珠般明亮

小穹‧動畫化‧體驗記② 「想不到真的有這麼一天!」婕兒高興地說:「我們要動畫化了耶!我覺得今天晚上我一定會睡不著。」 「就是說啊,如果這個消息傳了出去,粉絲們一定也會很高興的。」耐耐喝了一口湯。

小穹‧動畫化‧體驗記④  美麗島站附近的某家便利商店內,蕾蕾坐在用餐區的桌椅上,盯著玻璃牆外的夜色發呆。   在