You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.Net(C#)机器人附件过期链接更新方案求助

解决Discord机器人过期附件链接更新问题(无本地存储依赖)

针对你遇到的Discord附件链接过期、主机存储空间不足无法重传的问题,这里提供两个可行的解决方案:

方案一:正确配置User Agent调用refresh-urls接口

你之前调用refresh-urls失败的核心原因是User Agent不符合Discord官方规范,只需按要求设置UA即可实现无下载式链接刷新:

  1. UA格式要求:需包含使用的库名称、版本,示例格式为Discord.Net/[版本号] (+https://github.com/discord-net/Discord.Net)
  2. C#代码实现:
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading.Tasks;

public async Task<string> RefreshExpiredAttachmentUrl(string expiredUrl, string botToken)
{
    using var httpClient = new HttpClient();
    // 替换为你实际使用的Discord.Net版本
    httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Discord.Net/3.12.0 (+https://github.com/discord-net/Discord.Net)");
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bot", botToken);

    var requestPayload = new { url = expiredUrl };
    var response = await httpClient.PostAsJsonAsync("https://discord.com/api/v10/attachments/refresh-urls", requestPayload);
    
    response.EnsureSuccessStatusCode();
    var responseContent = await response.Content.ReadAsStringAsync();
    var result = JsonSerializer.Deserialize<RefreshResponse>(responseContent);
    
    return result?.RefreshedUrls.TryGetValue(expiredUrl, out var newUrl) == true ? newUrl : null;
}

// 对应API响应的模型类
public class RefreshResponse
{
    public Dictionary<string, string> RefreshedUrls { get; set; } = new();
}

该方法直接调用Discord API刷新链接,无需下载任何附件,完美适配存储空间有限的场景。

方案二:优化存储策略,从根源避免链接过期

临时链接过期是Discord的默认机制,建议调整存储逻辑,放弃存储临时Url,改为存储附件的唯一标识信息:

  • 存储字段:保存附件所属的GuildId、ChannelId、MessageId、AttachmentId
  • 动态获取有效链接:当需要发送附件时,通过Discord.Net API获取原消息,提取最新的有效链接:
using Discord;
using Discord.WebSocket;

public async Task<string> GetValidAttachmentUrl(ulong guildId, ulong channelId, ulong messageId, ulong attachmentId, DiscordSocketClient client)
{
    var guild = client.GetGuild(guildId);
    var channel = guild.GetTextChannel(channelId);
    var message = await channel.GetMessageAsync(messageId);
    
    if (message is not IUserMessage userMessage) return null;
    var attachment = userMessage.Attachments.FirstOrDefault(a => a.Id == attachmentId);
    
    return attachment?.Url;
}

这种方式每次获取的都是当前有效的临时链接,彻底解决过期问题,且无需依赖任何刷新接口。

注意事项

  • 如果原消息已被删除或机器人失去对应频道的访问权限,方案二会失效,此时只能依赖方案一的刷新接口
  • 调用refresh-urls接口有频率限制,批量处理时需注意速率控制

内容的提问来源于stack exchange,提问作者SteinweR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:50:06