new(basic.gblib): Facebook added.
This commit is contained in:
parent
b7bcd4f4c8
commit
a4995e7f03
2 changed files with 69 additions and 38 deletions
|
@ -15,7 +15,7 @@
|
|||
"Alan Perdomo <alanperdomo@hotmail.com>"
|
||||
],
|
||||
"engines": {
|
||||
"node": "=20.15.0"
|
||||
"node": "=20.17.0"
|
||||
},
|
||||
"license": "AGPL-3.0",
|
||||
"preferGlobal": true,
|
||||
|
|
|
@ -69,6 +69,7 @@ import { SecService } from '../../security.gbapp/services/SecService.js';
|
|||
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
|
||||
import retry from 'async-retry';
|
||||
import { BlobServiceClient, BlockBlobClient, StorageSharedKeyCredential } from '@azure/storage-blob';
|
||||
import { FacebookAdsApi, Page } from 'facebook-nodejs-business-sdk';
|
||||
|
||||
import { md5 } from 'js-md5';
|
||||
import { GBUtil } from '../../../src/util.js';
|
||||
|
@ -172,22 +173,22 @@ export class SystemKeywords {
|
|||
if (date) {
|
||||
return array
|
||||
? array.sort((a, b) => {
|
||||
const c = new Date(a[memberName]);
|
||||
const d = new Date(b[memberName]);
|
||||
return c.getTime() - d.getTime();
|
||||
})
|
||||
const c = new Date(a[memberName]);
|
||||
const d = new Date(b[memberName]);
|
||||
return c.getTime() - d.getTime();
|
||||
})
|
||||
: null;
|
||||
} else {
|
||||
return array
|
||||
? array.sort((a, b) => {
|
||||
if (a[memberName] < b[memberName]) {
|
||||
return -1;
|
||||
}
|
||||
if (a[memberName] > b[memberName]) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
})
|
||||
if (a[memberName] < b[memberName]) {
|
||||
return -1;
|
||||
}
|
||||
if (a[memberName] > b[memberName]) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
})
|
||||
: array;
|
||||
}
|
||||
}
|
||||
|
@ -345,19 +346,19 @@ export class SystemKeywords {
|
|||
const memoryBeforeGC = process.memoryUsage().heapUsed / 1024 / 1024; // in MB
|
||||
|
||||
delete this.cachedMerge[pid];
|
||||
|
||||
|
||||
// Capture memory usage before GC
|
||||
GBLogEx.info(min, ``);
|
||||
|
||||
|
||||
setFlagsFromString('--expose_gc');
|
||||
const gc = runInNewContext('gc'); // nocommit
|
||||
gc();
|
||||
|
||||
|
||||
// Capture memory usage after GC
|
||||
const memoryAfterGC = process.memoryUsage().heapUsed / 1024 / 1024; // in MB
|
||||
GBLogEx.info(min, `BASIC: Closing Handles... From ${memoryBeforeGC.toFixed(2)} MB to ${memoryAfterGC.toFixed(2)} MB`);
|
||||
}
|
||||
|
||||
|
||||
public async asPDF({ pid, data }) {
|
||||
let file = await this.renderTable(pid, data, true, false);
|
||||
return file;
|
||||
|
@ -746,7 +747,7 @@ export class SystemKeywords {
|
|||
*/
|
||||
public async saveToStorageBatch({ pid, table, rows }): Promise<void> {
|
||||
const { min } = await DialogKeywords.getProcessInfo(pid);
|
||||
|
||||
|
||||
if (rows.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -755,7 +756,7 @@ export class SystemKeywords {
|
|||
let rowsDest = [];
|
||||
|
||||
rows.forEach(row => {
|
||||
|
||||
|
||||
if (GBUtil.hasSubObject(row)) {
|
||||
row = this.flattenJSON(row);
|
||||
}
|
||||
|
@ -772,7 +773,7 @@ export class SystemKeywords {
|
|||
row = null;
|
||||
});
|
||||
GBLogEx.info(min, `SAVE '${table}': ${rows.length} row(s).`);
|
||||
|
||||
|
||||
await retry(
|
||||
async bail => {
|
||||
await t.bulkCreate(rowsDest);
|
||||
|
@ -1745,27 +1746,27 @@ export class SystemKeywords {
|
|||
|
||||
private flattenJSON(obj, res = {}, separator = '_', parent = null) {
|
||||
for (let key in obj) {
|
||||
if (!obj.hasOwnProperty(key) || typeof obj[key] === 'function') {
|
||||
continue;
|
||||
}
|
||||
if (typeof obj[key] !== 'object' || obj[key] instanceof Date) {
|
||||
// If not defined already, add the flattened field.
|
||||
const newKey = `${parent ? parent + separator : ''}${key}`;
|
||||
if (!res.hasOwnProperty(newKey)) {
|
||||
res[newKey] = obj[key];
|
||||
} else {
|
||||
GBLog.verbose(`Ignoring duplicated field in flatten operation to storage: ${key}.`);
|
||||
}
|
||||
if (!obj.hasOwnProperty(key) || typeof obj[key] === 'function') {
|
||||
continue;
|
||||
}
|
||||
if (typeof obj[key] !== 'object' || obj[key] instanceof Date) {
|
||||
// If not defined already, add the flattened field.
|
||||
const newKey = `${parent ? parent + separator : ''}${key}`;
|
||||
if (!res.hasOwnProperty(newKey)) {
|
||||
res[newKey] = obj[key];
|
||||
} else {
|
||||
// Create a temporary reference to the nested object to prevent memory leaks.
|
||||
const tempObj = obj[key];
|
||||
this.flattenJSON(tempObj, res, separator, `${parent ? parent + separator : ''}${key}`);
|
||||
// Clear the reference to avoid holding unnecessary objects in memory.
|
||||
obj[key] = null;
|
||||
GBLog.verbose(`Ignoring duplicated field in flatten operation to storage: ${key}.`);
|
||||
}
|
||||
} else {
|
||||
// Create a temporary reference to the nested object to prevent memory leaks.
|
||||
const tempObj = obj[key];
|
||||
this.flattenJSON(tempObj, res, separator, `${parent ? parent + separator : ''}${key}`);
|
||||
// Clear the reference to avoid holding unnecessary objects in memory.
|
||||
obj[key] = null;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public async getCustomToken({ pid, tokenName }) {
|
||||
const { min } = await DialogKeywords.getProcessInfo(pid);
|
||||
|
@ -2349,7 +2350,7 @@ export class SystemKeywords {
|
|||
valueFound = found[e];
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const equals =
|
||||
typeof value === 'string' && typeof valueFound === 'string'
|
||||
? value?.toLowerCase() != valueFound?.toLowerCase()
|
||||
|
@ -2764,6 +2765,36 @@ export class SystemKeywords {
|
|||
);
|
||||
}
|
||||
|
||||
public async postToFacebook({ pid, imagePath, caption, pageId }) {
|
||||
// Obtendo informações do processo para logs (ajuste conforme necessário)
|
||||
const { min, user, params } = await DialogKeywords.getProcessInfo(pid);
|
||||
|
||||
// Leitura do arquivo de imagem
|
||||
const imageBuffer = Fs.readFileSync(Path.resolve(imagePath));
|
||||
|
||||
// Criação de um arquivo temporário para enviar
|
||||
const tempFilePath = Path.resolve('temp_image.jpg');
|
||||
Fs.writeFileSync(tempFilePath, imageBuffer);
|
||||
|
||||
// Publicação da imagem
|
||||
const page = new Page(pageId);
|
||||
const response = await page.createFeed({
|
||||
message: caption,
|
||||
attached_media: [
|
||||
{
|
||||
media_fbid: tempFilePath,
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
// Log do resultado
|
||||
GBLogEx.info(min, `Imagem publicada no Facebook: ${JSON.stringify(response)}`);
|
||||
|
||||
// Limpeza do arquivo temporário
|
||||
Fs.unlinkSync(tempFilePath);
|
||||
}
|
||||
|
||||
|
||||
public async postToInstagram({ pid, username, password, imagePath, caption }) {
|
||||
const { min, user, params } = await DialogKeywords.getProcessInfo(pid);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue