100 lines
2.6 KiB
JavaScript
100 lines
2.6 KiB
JavaScript
const { default: axios } = require('axios');
|
|
|
|
const META_API_VERSION = process.env.META_API_VERSION || 'v21.0';
|
|
const META_API_BASE_URL = `https://graph.facebook.com/${META_API_VERSION}`;
|
|
const META_ACCESS_TOKEN = process.env.META_ACCESS_TOKEN;
|
|
const AD_ACCOUNT_ID = process.env.META_AD_ACCOUNT_ID;
|
|
|
|
const metaApiRequest = async (endpoint, params = {}) => {
|
|
try {
|
|
const response = await axios.get(`${META_API_BASE_URL}/${endpoint}`, {
|
|
params: {
|
|
access_token: META_ACCESS_TOKEN,
|
|
time_zone: 'America/New_York',
|
|
...params,
|
|
},
|
|
});
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Meta API Error:', {
|
|
message: error.message,
|
|
response: error.response?.data,
|
|
endpoint,
|
|
});
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
const fetchCampaigns = async (since, until) => {
|
|
const campaigns = await metaApiRequest(`act_${AD_ACCOUNT_ID}/campaigns`, {
|
|
fields: [
|
|
'id',
|
|
'name',
|
|
'status',
|
|
'objective',
|
|
'daily_budget',
|
|
'lifetime_budget',
|
|
'adsets{daily_budget,lifetime_budget}',
|
|
`insights.time_range({'since':'${since}','until':'${until}'}).level(campaign){
|
|
spend,
|
|
impressions,
|
|
clicks,
|
|
ctr,
|
|
reach,
|
|
frequency,
|
|
cpm,
|
|
cpc,
|
|
actions,
|
|
action_values,
|
|
cost_per_action_type
|
|
}`,
|
|
].join(','),
|
|
limit: 100,
|
|
});
|
|
|
|
return campaigns.data.filter(c => c.insights?.data?.[0]?.spend > 0);
|
|
};
|
|
|
|
const fetchAccountInsights = async (since, until) => {
|
|
const accountInsights = await metaApiRequest(`act_${AD_ACCOUNT_ID}/insights`, {
|
|
fields: 'reach,spend,impressions,clicks,ctr,cpm,actions,action_values',
|
|
time_range: JSON.stringify({ since, until }),
|
|
});
|
|
|
|
return accountInsights.data[0] || null;
|
|
};
|
|
|
|
const updateCampaignBudget = async (campaignId, budget) => {
|
|
try {
|
|
const response = await axios.post(`${META_API_BASE_URL}/${campaignId}`, {
|
|
access_token: META_ACCESS_TOKEN,
|
|
daily_budget: budget * 100, // Convert to cents
|
|
});
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Update campaign budget error:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
const updateCampaignStatus = async (campaignId, action) => {
|
|
try {
|
|
const status = action === 'pause' ? 'PAUSED' : 'ACTIVE';
|
|
const response = await axios.post(`${META_API_BASE_URL}/${campaignId}`, {
|
|
access_token: META_ACCESS_TOKEN,
|
|
status,
|
|
});
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error('Update campaign status error:', error);
|
|
throw error;
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
fetchCampaigns,
|
|
fetchAccountInsights,
|
|
updateCampaignBudget,
|
|
updateCampaignStatus,
|
|
};
|