Tengo una lista de archivos que estoy recuperando de Drive:
const list = await drive.files.list({ q: `parents in '${process.env.DRIVE_DIR}' and name contains 'test_'`, spaces: 'drive', fields: 'files(id, mimeType, webViewLink)' })Después de obtener los archivos, quiero enviar mensajes incrustados con la imagen de Drive:
const embed = new MessageEmbed() .setColor('#6adada') .setTitle('Test') .setImage(list.data.files[index].webViewLink) message.channel.send({embeds: [embed]})Revisé todos los permisos en Google Drive y son correctos, si accedo al enlace como invitado, puedo ver la imagen en el navegador. ¿Hay algo que me estoy perdiendo? Gracias por adelantado.
Resolví este problema usando FS para descargar el archivo de la unidad, luego lo adjunté al mensaje incrustado usando la ruta de attachment en la función setImage . Entonces, después de obtener la list de archivos, la descargo (en mi caso, siempre será un archivo):
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)Debe enviar webViewLink a discord, donde cambia el parámetro de consulta usp en la URL de drivesdk a sharing.
Como referencia, esta es la API de webhook entrante de Discord: https://discord.com/developers/docs/resources/webhook#execute-webhook
la API de reposo de Google Drive: https://developers.google.com/drive/api/v3/reference/files#resource
Echa un vistazo a una implementación simple aquí:
| Implementación de ejemplo | Ejecutar en 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;