almeira-web/zapply-app/src/lib/facebook-publisher.ts

86 lines
2.2 KiB
TypeScript

import axios from 'axios';
import { generateSalesCopy } from './pricing-engine';
export interface PublishToFacebookParams {
productName: string;
brand: string;
retailPrice: number;
sizes: string[];
images: string[];
cityName?: string;
whatsappNumber?: string;
pageId?: string;
accessToken?: string;
}
export interface PublishResult {
success: boolean;
postId?: string;
postUrl?: string;
generatedCopy: string;
error?: string;
}
/**
* Publicador automático en Páginas de Facebook mediante Meta Graph API
*/
export async function publishToFacebookPage(params: PublishToFacebookParams): Promise<PublishResult> {
const {
productName,
brand,
retailPrice,
sizes,
images,
cityName = 'Cali',
whatsappNumber = process.env.NEXT_PUBLIC_WHATSAPP_PHONE || '573134848203',
pageId = process.env.FACEBOOK_PAGE_ID,
accessToken = process.env.FACEBOOK_ACCESS_TOKEN,
} = params;
const copy = generateSalesCopy({
productName,
brand,
retailPrice,
sizes,
cityName,
whatsappNumber,
});
// Si no hay token de Facebook configurado, simular publicación exitosa para pruebas
if (!pageId || !accessToken) {
const mockPostId = `fb_${Date.now()}_${Math.floor(Math.random() * 10000)}`;
return {
success: true,
postId: mockPostId,
postUrl: `https://facebook.com/${mockPostId}`,
generatedCopy: copy,
};
}
try {
// Si tiene una imagen principal, publicamos como photo post con caption
const primaryImage = images[0];
const fbEndpoint = `https://graph.facebook.com/v19.0/${pageId}/photos`;
const response = await axios.post(fbEndpoint, {
url: primaryImage,
caption: copy,
access_token: accessToken,
});
return {
success: true,
postId: response.data.id || response.data.post_id,
postUrl: `https://facebook.com/${response.data.id}`,
generatedCopy: copy,
};
} catch (error: any) {
console.error('Error publicando en Facebook Graph API:', error?.response?.data || error?.message);
return {
success: false,
error: error?.response?.data?.error?.message || error.message,
generatedCopy: copy,
};
}
}