【问题标题】:Discord - Add image from Google Drive in Embed MessageDiscord - 在嵌入消息中添加来自 Google Drive 的图像
【发布时间】:2022-01-25 16:14:39
【问题描述】:

我有一份从云端硬盘中检索的文件列表:

const list = await drive.files.list({
  q: `parents in '${process.env.DRIVE_DIR}' and name contains 'test_'`,
  spaces: 'drive',
  fields: 'files(id, mimeType, webViewLink)'
})

在获取文件后,我想通过云端硬盘的图像发送嵌入消息:

const embed = new MessageEmbed()
  .setColor('#6adada')
  .setTitle('Test')
  .setImage(list.data.files[index].webViewLink)
message.channel.send({embeds: [embed]})

我检查了 Google Drive 上的所有权限并且它们是正确的,如果我以访客身份访问该链接,我可以在浏览器中看到图像。有什么我想念的吗?提前致谢。

【问题讨论】:

  • 如果你登录list.data.files[index].webViewLink会怎样?
  • @Leau 我那里有图片链接,它工作正常。我可以复制链接并粘贴到浏览器中。没有问题
  • 如果你登录embed,链接也会出现?
  • @Leau 是的,链接在image 属性下。 image: { url: 'https://drive.google.com/file/d/1vAO4lmqykalD1uMaCNgaSj3aWi6myIU5/view?usp=drivesdk' },

标签: javascript discord discord.js


【解决方案1】:

您需要将 webViewLink 发送到 discord,在那里您将 URL 中的 usp 查询参数从 drivedk 更改为 shared。

作为参考,这是不和谐的传入 webhook API:https://discord.com/developers/docs/resources/webhook#execute-webhook

Google Drive Rest API: https://developers.google.com/drive/api/v3/reference/files#resource

在这里查看它的简单实现:

Example Implementation                                                                                 Run in Fusebit
const { Integration } = require('@fusebit-int/framework');
const superagent = require('superagent')

const integration = new Integration();
const router = integration.router;
const googleConnector = 'googleConnector';
const discordConnector = 'discordConnector';
router.post('/api/tenant/:tenantId/test', async (ctx) => {
  try {
    const googleClient = await integration.tenant.getSdkByTenant(ctx, googleConnector, ctx.params.tenantId);

  const files = await googleClient
    .drive({
      version: 'v3',
    })
    .files.list({fields: 'files(id, mimeType, webViewLink)'});
  const file = files.data.files[0]
  file.webViewLink = file.webViewLink.replace('drivesdk', 'sharing')
  await discordSendMessage(ctx, file.webViewLink)
  ctx.body = {
    message: `Message with embed sent to discord.`,
  };
  } catch (e) {console.log(e)}
  
});

async function discordSendMessage(ctx, content) {
  const discordClient = await integration.tenant.getSdkByTenant(
    ctx,
    discordConnector,
    ctx.params.tenantId
  );
  const webhook = discordClient?.fusebit?.credentials?.webhook;
  if (!webhook) {
    ctx.throw(404, `The installation does not have a default webhook channel.`);
  }
  try {
  return await superagent.post(webhook.url).send({ content })} catch (e) {console.log(e)}
}

module.exports = integration;

【讨论】:

    【解决方案2】:

    我使用FS 从驱动器下载文件解决了这个问题,然后使用setImage 函数中的attachment 路径将其附加到嵌入消息中。所以在获得list 的文件后,我下载它(在我的情况下它总是一个文件):

    const { data } = await drive.files.get(
      {
        fileId: list.data.files[0].id,
        alt: "media"
      },
      { responseType: "stream" }
    )
    
    const fileName = fID + "." + mimeType.split("/")[1]
    const file = fs.createWriteStream(fileName)
    data.on("end", () => {
      const embed = new MessageEmbed()
        .setColor('#6adada')
        .setTitle('Test Image')
        .setImage('attachment://' + fileName)
      message.channel.send({
        embeds: [embed],
        files: [fileName]
      })
      .then(() => {
        file.end()
        fs.unlinkSync(fileName)
      })
    })
    .on("error", error => message.reply(" Error: " + error.message))
    .pipe(file)
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 2021-08-02
      • 2018-12-04
      • 2021-08-12
      • 2020-06-10
      • 2021-03-17
      • 2021-12-16
      • 2018-06-24
      • 1970-01-01
      相关资源
      最近更新 更多