85 lines
2.8 KiB
JavaScript
85 lines
2.8 KiB
JavaScript
#!/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 || 'EAAM8GXpb76wBSCcthLkKMySDBEMP6mCxl1yIeNnPUQ4oSmO15L56TRWPh5LZBfAPJmtYYzPIul5QeogjTvcVrwg4FrTxfZAkxB0kEgjONeUYH5QzTHUYkbfW9N2GyUDsPIke0esrxvfnLXU5Vm4wdJ7pCpyNZB3nnN00Ek4ngriwWsGWZBP9HZCPAMMPFVfH6LVdZAcyl8f31rNYKsL2vp0IZClMVWuNoif6Jlr3SRmfD1tnPIuFz3BnPDp2ymXXVAqsLc2c5rX5EgtkrdMdGdu';
|
|
|
|
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 };
|