Estou tentando atualizar o daily_budget
parâmetro para vários conjuntos de anúncios em uma chamada única. Consegui fazer isso funcionar em lotes, mas infelizmente, de acordo com a documentação em lote :
As solicitações em lote são limitadas a 50 solicitações por lote. Cada chamada no lote é contada separadamente para fins de cálculo dos limites de chamadas de API e limites de recursos. Por exemplo, um lote de 10 chamadas de API contará como 10 chamadas e cada chamada dentro do lote contribui para os limites de recursos da CPU da mesma maneira.
O que é um problema para contas maiores, onde posso precisar atualizar um grande número de conjuntos de anúncios. Portanto, desejo criar uma função para executar esta tarefa em uma única chamada de API, semelhante a como se pode obter daily_budget
s para vários conjuntos de anúncios em uma única chamada de Meta API:
class MetaAPI:
def __init__(
self, access_token: str, ad_account_id_val: str, sqlapi: SQLAPI, test=False
):
self.access_token = access_token
self.ad_account_id = "act_" + ad_account_id_val
self.sqlapi = sqlapi
self.test = test
self.root_url = "https://graph.facebook.com/v18.0/"
self.campaigns_ext = "/campaigns"
self.adsets_ext = "/adsets"
self.insights_ext = "/insights"
def fetch_group_adset_insights(
self, adset_id_list: List[str], insights_list: List[str]
) -> Dict[str, Tuple[Dict[str, float], str]]:
params_insights_get = {
"access_token": self.access_token,
"level": "adset",
"filtering": str(
[
{
"field": "adset.id",
"operator": "IN",
"value": adset_id_list,
}
]
),
"fields": ",".join(
insights_list + ["optimization_goal", "adset_id"]
), # 'objective,impressions',
"time_range[since]": f"{self.date_start}",
"time_range[until]": f"{self.date_end}",
}
response_insights_get = rq.get(
self.root_url + self.ad_account_id + self.insights_ext,
params=params_insights_get,
)
Consegui fazer isso por conjunto de anúncios com a seguinte função:
def update_object_budgets(self, object_id: str, budget: float):
"""
Updates the budget of the object (adset or campaign) to the given value.
"""
url = self.root_url + object_id
params = {"access_token": self.access_token, "daily_budget": f"{budget}"}
response = rq.post(url, data=params)
return response.status_code == 200 # 200: success
mas isso não parece se traduzir em vários conjuntos de anúncios:
def update_objects_budgets(
self, object_id_list: List[str], budget_list: List[float]
):
"""
Updates the budget of the object (adset or campaign) to the given value.
"""
url = self.root_url
params = {
"access_token": self.access_token,
"adset_id": object_id_list,
"daily_budget": budgets_list,
}
response = rq.post(url, data=params)
return response.status_code == 200 # 200: success
já que retorna a seguinte resposta JSON:{'error': {'message': 'Unsupported post request. Please read the Graph API documentation at https://developers.facebook.com/docs/graph-api', 'type': 'GraphMethodException', 'code': 100, 'error_subcode': 33, 'fbtrace_id': 'APtBihvkXqpal9gGI9wCwXZ'}}
Como eu resolvo este problema?
Isso, com toda a probabilidade, não vai ajudar.
A API de marketing tem seu próprio conjunto de regras em termos de limitação de taxa, mas tenho certeza de que o que https://developers.facebook.com/docs/graph-api/overview/rate-limiting/#faq diz se aplica aqui como bem: