new(basic.gblib): SEND FILE pdf as temporary images.
This commit is contained in:
parent
4656e1d57d
commit
8590607aa9
2 changed files with 86 additions and 47 deletions
|
@ -1462,7 +1462,7 @@ export class DialogKeywords {
|
||||||
const pngs = await GBUtil.pdfPageAsImage(min, pdf, undefined);
|
const pngs = await GBUtil.pdfPageAsImage(min, pdf, undefined);
|
||||||
|
|
||||||
await CollectionUtil.asyncForEach(pngs, async png => {
|
await CollectionUtil.asyncForEach(pngs, async png => {
|
||||||
|
await GBUtil.sleep(500);
|
||||||
// Prepare a cache to be referenced by Bot Framework.
|
// Prepare a cache to be referenced by Bot Framework.
|
||||||
|
|
||||||
url = urlJoin(GBServer.globals.publicAddress, min.botId, 'cache', path.basename(png.localName));
|
url = urlJoin(GBServer.globals.publicAddress, min.botId, 'cache', path.basename(png.localName));
|
||||||
|
@ -1476,8 +1476,8 @@ export class DialogKeywords {
|
||||||
contentUrl: url
|
contentUrl: url
|
||||||
});
|
});
|
||||||
|
|
||||||
if (channel === 'omnichannel' || !user) {
|
if (channel === 'omnichannel' || channel === 'whatsapp' || !user) {
|
||||||
await min.whatsAppDirectLine.sendFileToDevice(mobile, url, filename, caption);
|
await min.whatsAppDirectLine.sendFileToDevice(mobile, url, filename, caption, undefined, true);
|
||||||
} else {
|
} else {
|
||||||
await min.conversationalService['sendOnConversation'](min, user, reply);
|
await min.conversationalService['sendOnConversation'](min, user, reply);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import mime from 'mime-types';
|
||||||
import urlJoin from 'url-join';
|
import urlJoin from 'url-join';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
|
import Fs from 'fs';
|
||||||
import { GBLog, GBMinInstance, GBService, IGBPackage } from 'botlib';
|
import { GBLog, GBMinInstance, GBService, IGBPackage } from 'botlib';
|
||||||
import { CollectionUtil } from 'pragmatismo-io-framework';
|
import { CollectionUtil } from 'pragmatismo-io-framework';
|
||||||
import { GBServer } from '../../../src/app.js';
|
import { GBServer } from '../../../src/app.js';
|
||||||
|
@ -291,24 +292,22 @@ export class WhatsappDirectLine extends GBService {
|
||||||
fromName = req.body.entry[0].changes[0].value.contacts[0].profile.name;
|
fromName = req.body.entry[0].changes[0].value.contacts[0].profile.name;
|
||||||
|
|
||||||
// Check for media in the 'meta' case
|
// Check for media in the 'meta' case
|
||||||
if (req.body.entry[0].changes[0].value.messages[0].hasMedia) {
|
if (req.body.entry[0].changes[0].value.messages[0].type === 'image') {
|
||||||
const base64Image = await req.body.entry[0].changes[0].value.messages[0].downloadMedia(); // Ensure this method exists
|
|
||||||
|
|
||||||
let buf = Buffer.from(base64Image.data, 'base64');
|
|
||||||
const gbaiName = GBUtil.getGBAIPath(this.min.botId);
|
const gbaiName = GBUtil.getGBAIPath(this.min.botId);
|
||||||
const localName = path.join(
|
const localName = path.join(
|
||||||
'work',
|
'work',
|
||||||
gbaiName,
|
gbaiName,
|
||||||
'cache',
|
'cache',
|
||||||
`tmp${GBAdminService.getRndReadableIdentifier()}` // No extension
|
`tmp${GBAdminService.getRndReadableIdentifier()}`
|
||||||
);
|
);
|
||||||
await fs.writeFile(localName, buf, { encoding: null });
|
const image = req.body.entry[0].changes[0].value.messages[0].image;
|
||||||
|
await this.downloadImage(image.id, localName);
|
||||||
const url = urlJoin(GBServer.globals.publicAddress, this.min.botId, 'cache', path.basename(localName));
|
const url = urlJoin(GBServer.globals.publicAddress, this.min.botId, 'cache', path.basename(localName));
|
||||||
|
|
||||||
attachments = [{
|
attachments = [{
|
||||||
name: `${new Date().toISOString().replace(/:/g, '')}`, // No extension
|
name: path.basename(localName),
|
||||||
noName: true,
|
noName: true,
|
||||||
contentType: base64Image.mimetype,
|
contentType: image.mime_type,
|
||||||
contentUrl: url
|
contentUrl: url
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
@ -365,8 +364,8 @@ export class WhatsappDirectLine extends GBService {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
text = text.replace(/\@\d+ /gi, '');
|
text = text ? text.replace(/\@\d+ /gi, '') : null;
|
||||||
GBLogEx.info(0, `GBWhatsapp: RCV ${from}(${fromName}): ${text})`);
|
GBLogEx.info(0, `GBWhatsapp: RCV ${from}(${fromName}): ${text ? text : 'binary'})`);
|
||||||
|
|
||||||
let botGroupID = WhatsappDirectLine.botGroups[this.min.botId];
|
let botGroupID = WhatsappDirectLine.botGroups[this.min.botId];
|
||||||
let botShortcuts = this.min.core.getParam<string>(this.min.instance, 'WhatsApp Group Shortcuts', null);
|
let botShortcuts = this.min.core.getParam<string>(this.min.instance, 'WhatsApp Group Shortcuts', null);
|
||||||
|
@ -725,10 +724,10 @@ export class WhatsappDirectLine extends GBService {
|
||||||
whatsappServiceNumber = GBServer.globals.minBoot.instance.whatsappServiceNumber;
|
whatsappServiceNumber = GBServer.globals.minBoot.instance.whatsappServiceNumber;
|
||||||
whatsappServiceKey = GBServer.globals.minBoot.instance.whatsappServiceKey;
|
whatsappServiceKey = GBServer.globals.minBoot.instance.whatsappServiceKey;
|
||||||
}
|
}
|
||||||
if (viewOnce){
|
if (viewOnce) {
|
||||||
this.sendImageViewOnce(to, url, caption);
|
await this.sendImageViewOnce(to, url, caption);
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
const driver = createBot(whatsappServiceNumber, whatsappServiceKey);
|
const driver = createBot(whatsappServiceNumber, whatsappServiceKey);
|
||||||
await driver.sendImage(to, url, { caption: caption });
|
await driver.sendImage(to, url, { caption: caption });
|
||||||
}
|
}
|
||||||
|
@ -793,7 +792,7 @@ export class WhatsappDirectLine extends GBService {
|
||||||
|
|
||||||
|
|
||||||
const accessToken = this.whatsappServiceKey;
|
const accessToken = this.whatsappServiceKey;
|
||||||
const sendMessageEndpoint = `${baseUrl}/${this.whatsappBusinessManagerId}/messages`;
|
const sendMessageEndpoint = `${baseUrl}/${this.whatsappServiceNumber}/messages`;
|
||||||
|
|
||||||
const messageData = {
|
const messageData = {
|
||||||
messaging_product: 'whatsapp',
|
messaging_product: 'whatsapp',
|
||||||
|
@ -802,9 +801,9 @@ export class WhatsappDirectLine extends GBService {
|
||||||
type: 'image',
|
type: 'image',
|
||||||
image: {
|
image: {
|
||||||
link: imageUrl,
|
link: imageUrl,
|
||||||
caption: caption
|
caption: caption,
|
||||||
},
|
|
||||||
view_once: true
|
view_once: true
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const response = await fetch(sendMessageEndpoint, {
|
const response = await fetch(sendMessageEndpoint, {
|
||||||
|
@ -1039,11 +1038,6 @@ export class WhatsappDirectLine extends GBService {
|
||||||
text = req.body.entry[0].changes[0].value.messages[0].text.body;
|
text = req.body.entry[0].changes[0].value.messages[0].text.body;
|
||||||
} else if (req.body.entry[0].changes[0].value.messages[0].button) {
|
} else if (req.body.entry[0].changes[0].value.messages[0].button) {
|
||||||
text = req.body.entry[0].changes[0].value.messages[0].button.text;
|
text = req.body.entry[0].changes[0].value.messages[0].button.text;
|
||||||
} else {
|
|
||||||
res.status(200);
|
|
||||||
res.end();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
id = req.body.entry[0].changes[0].value.messages[0].from;
|
id = req.body.entry[0].changes[0].value.messages[0].from;
|
||||||
senderName = req.body.entry[0].changes[0].value.contacts[0].profile.name;
|
senderName = req.body.entry[0].changes[0].value.contacts[0].profile.name;
|
||||||
|
@ -1076,12 +1070,15 @@ export class WhatsappDirectLine extends GBService {
|
||||||
}
|
}
|
||||||
|
|
||||||
const sec = new SecService();
|
const sec = new SecService();
|
||||||
|
let toSwitchMin;
|
||||||
|
|
||||||
// Tries to find if user wants to switch bots.
|
// Tries to find if user wants to switch bots.
|
||||||
|
|
||||||
let toSwitchMin = GBServer.globals.minInstances.filter(
|
if (text) {
|
||||||
|
toSwitchMin = GBServer.globals.minInstances.filter(
|
||||||
p => p.instance.botId.toLowerCase() === text.toLowerCase()
|
p => p.instance.botId.toLowerCase() === text.toLowerCase()
|
||||||
)[0];
|
)[0];
|
||||||
|
}
|
||||||
|
|
||||||
botId = botId ?? GBServer.globals.minBoot.botId;
|
botId = botId ?? GBServer.globals.minBoot.botId;
|
||||||
GBLogEx.info(this.min, `A WhatsApp mobile requested instance for: ${botId}.`);
|
GBLogEx.info(this.min, `A WhatsApp mobile requested instance for: ${botId}.`);
|
||||||
|
@ -1139,7 +1136,7 @@ export class WhatsappDirectLine extends GBService {
|
||||||
|
|
||||||
// Processes group behaviour.
|
// Processes group behaviour.
|
||||||
|
|
||||||
text = text.replace(/\@\d+ /gi, '');
|
text = text ? text.replace(/\@\d+ /gi, '') : null;
|
||||||
|
|
||||||
let group;
|
let group;
|
||||||
if (provider === 'GeneralBots') {
|
if (provider === 'GeneralBots') {
|
||||||
|
@ -1184,7 +1181,7 @@ export class WhatsappDirectLine extends GBService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!toSwitchMin) {
|
if (!toSwitchMin && text) {
|
||||||
toSwitchMin = GBServer.globals.minInstances.filter(p =>
|
toSwitchMin = GBServer.globals.minInstances.filter(p =>
|
||||||
p.instance.activationCode ? p.instance.activationCode.toLowerCase() === text.toLowerCase() : false
|
p.instance.activationCode ? p.instance.activationCode.toLowerCase() === text.toLowerCase() : false
|
||||||
)[0];
|
)[0];
|
||||||
|
@ -1355,4 +1352,46 @@ export class WhatsappDirectLine extends GBService {
|
||||||
console.error('Error during file upload:', error);
|
console.error('Error during file upload:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async downloadImage(mediaId, outputPath) {
|
||||||
|
const userAccessToken = this.whatsappServiceKey;
|
||||||
|
let imageUrl;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Step 1: Fetch the media metadata
|
||||||
|
const metadataResponse = await fetch(
|
||||||
|
`https://graph.facebook.com/v20.0/${mediaId}`, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${userAccessToken}`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const metadataData = await metadataResponse.json();
|
||||||
|
if (!metadataResponse.ok) {
|
||||||
|
throw new Error(metadataData.error.message);
|
||||||
|
}
|
||||||
|
imageUrl = metadataData.url; // Assuming the API returns the image URL in this field
|
||||||
|
console.log('Image URL retrieved:', imageUrl);
|
||||||
|
|
||||||
|
// Step 2: Download the image
|
||||||
|
const imageResponse = await fetch(imageUrl, {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${userAccessToken}`,
|
||||||
|
'User-Agent': 'gb/5.0.0'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!imageResponse.ok) {
|
||||||
|
throw new Error('Failed to download image: ' + imageResponse.statusText);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3: Save the image to the specified output path
|
||||||
|
const fileStream = Fs.createWriteStream(outputPath);
|
||||||
|
imageResponse.body.pipe(fileStream);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error during image download:', error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue