Update codebase

This commit is contained in:
Hamza-Ayed
2026-07-24 15:58:57 +03:00
parent f9b55ddf94
commit 535d5b40ef
4 changed files with 271 additions and 36 deletions
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env node
/**
* Meta Ads Automation Manager for Tripz
* Uses Meta Graph API v19.0
*/
const AD_ACCOUNT_ID = process.env.META_AD_ACCOUNT_ID || '1945325153083644';
const ACCESS_TOKEN = process.env.META_ACCESS_TOKEN || 'EAAM8GXpb76wBSLELO5tWBvXM2NG6aSsZBjHUHKK35nATiw5GFgyEAJ5WoiK68NudGqpGlcl2mZB6bUpR5KbtSFPzIpaANhbpXsjDWo8UFCNbWOHKcnGcXM20G4umUoLsoyBNYg9la80wTEhVHFmQmubp7q7ZCVZCrec4BnzXk5iGDMZC38JJOZBRKFMMJHdwthy7';
const API_VERSION = 'v19.0';
const BASE_URL = `https://graph.facebook.com/${API_VERSION}`;
async function apiCall(endpoint, method = 'GET', body = null) {
const token = ACCESS_TOKEN;
if (!token) {
throw new Error('META_ACCESS_TOKEN environment variable is missing.');
}
const url = new URL(`${BASE_URL}/${endpoint}`);
url.searchParams.append('access_token', token);
const options = {
method,
headers: { 'Content-Type': 'application/json' }
};
if (body && method !== 'GET') {
options.body = JSON.stringify(body);
}
const res = await fetch(url.toString(), options);
const data = await res.json();
if (data.error) {
throw new Error(`Meta API Error [${data.error.code}]: ${data.error.message}`);
}
return data;
}
async function getAccountStatus() {
const actId = AD_ACCOUNT_ID.startsWith('act_') ? AD_ACCOUNT_ID : `act_${AD_ACCOUNT_ID}`;
const data = await apiCall(`${actId}?fields=name,account_status,currency,balance,amount_spent`);
return data;
}
async function getCampaigns() {
const actId = AD_ACCOUNT_ID.startsWith('act_') ? AD_ACCOUNT_ID : `act_${AD_ACCOUNT_ID}`;
const data = await apiCall(`${actId}/campaigns?fields=id,name,status,objective,daily_budget,lifetime_budget`);
return data.data || [];
}
async function createCampaign({ name, objective = 'OUTCOME_LEADS', dailyBudgetUsd = 10 }) {
const actId = AD_ACCOUNT_ID.startsWith('act_') ? AD_ACCOUNT_ID : `act_${AD_ACCOUNT_ID}`;
const body = {
name,
objective,
status: 'PAUSED',
special_ad_categories: ['NONE'],
daily_budget: dailyBudgetUsd * 100 // in cents
};
return await apiCall(`${actId}/campaigns`, 'POST', body);
}
async function main() {
const cmd = process.argv[2] || 'status';
try {
if (cmd === 'status') {
const status = await getAccountStatus();
console.log('Ad Account Status:', JSON.stringify(status, null, 2));
} else if (cmd === 'list-campaigns') {
const campaigns = await getCampaigns();
console.log('Campaigns:', JSON.stringify(campaigns, null, 2));
} else {
console.log(`Usage: node scripts/meta-ads-manager.js [status|list-campaigns]`);
}
} catch (err) {
console.error('Error:', err.message);
}
}
if (require.main === module) {
main();
}
module.exports = { apiCall, getAccountStatus, getCampaigns, createCampaign };
+43
View File
@@ -0,0 +1,43 @@
#!/usr/bin/env node
/**
* Publish Post to Facebook Page via Meta Graph API v19.0
*/
const ACCESS_TOKEN = process.env.META_ACCESS_TOKEN || 'EAAM8GXpb76wBSLELO5tWBvXM2NG6aSsZBjHUHKK35nATiw5GFgyEAJ5WoiK68NudGqpGlcl2mZB6bUpR5KbtSFPzIpaANhbpXsjDWo8UFCNbWOHKcnGcXM20G4umUoLsoyBNYg9la80wTEhVHFmQmubp7q7ZCVZCrec4BnzXk5iGDMZC38JJOZBRKFMMJHdwthy7';
const PAGE_ID = process.env.META_PAGE_ID || '61588173848643';
async function publishPost(message, imageUrl = null) {
if (!PAGE_ID) {
throw new Error('META_PAGE_ID (Page ID) is required to publish a post.');
}
const endpoint = imageUrl ? `${PAGE_ID}/photos` : `${PAGE_ID}/feed`;
const url = new URL(`https://graph.facebook.com/v19.0/${endpoint}`);
url.searchParams.append('access_token', ACCESS_TOKEN);
const payload = imageUrl ? { caption: message, url: imageUrl } : { message };
const res = await fetch(url.toString(), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const data = await res.json();
if (data.error) {
throw new Error(`Meta Graph API Error: ${data.error.message}`);
}
return data;
}
if (require.main === module) {
const pageId = process.argv[2] || PAGE_ID;
const msg = process.argv[3] || 'اختبار النشر التلقائي عبر Tripz AI Agent';
if (!pageId) {
console.error('Please provide Page ID as first parameter: node scripts/publish-facebook-post.js <PAGE_ID> "[Message]"');
process.exit(1);
}
publishPost(msg).then(res => console.log('Post published successfully:', res)).catch(err => console.error(err.message));
}
module.exports = { publishPost };
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env node
/**
* Direct Live Publishing Script for Facebook Page
*/
const ACCESS_TOKEN = 'EAAM8GXpb76wBSLELO5tWBvXM2NG6aSsZBjHUHKK35nATiw5GFgyEAJ5WoiK68NudGqpGlcl2mZB6bUpR5KbtSFPzIpaANhbpXsjDWo8UFCNbWOHKcnGcXM20G4umUoLsoyBNYg9la80wTEhVHFmQmubp7q7ZCVZCrec4BnzXk5iGDMZC38JJOZBRKFMMJHdwthy7';
const PAGE_ID = '61588173848643';
const message = `شركتك تحمل اسمك… وتطبيقك يحمل اسم غيرك؟ 🚘📱
كل رحلة ينفذها أسطولك اليوم تبني علامة شركة أخرى. في Tripz نطلق لك منصة نقل متكاملة باسمك، بلونك، وبشعارك خلال 30 يوماً فقط!
🔹 تطبيق الراكب 🔹 تطبيق السائق 🔹 لوحة التحكم و Dispatch
✅ بياناتك ملكك بعقد مكتوب
✅ شفافية مطلقة بأسعار معلنة
✅ محرك مجرّب وسريع منذ 2019
📊 احسب توفيرك السنوي: https://tripz-egypt.com/apps/
💬 تواصل معنا عبر واتساب: https://wa.me/962798583052`;
async function main() {
console.log('Publishing post to Facebook Page', PAGE_ID, '...');
const url = `https://graph.facebook.com/v19.0/${PAGE_ID}/feed`;
const res = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
access_token: ACCESS_TOKEN,
message: message
})
});
const data = await res.json();
console.log('Response from Meta:', JSON.stringify(data, null, 2));
}
main();