Concurrence par acteur (run_concurrency) : ka-facebook et ka-threads plafonnent concurrency à 6 dans leur schéma d'input — l'envoi de 10 faisait rejeter TOUS leurs runs en 400 depuis des jours (cause réelle des passages à zéro, pas un mur de login). Facebook débloqué : 1 402 fiches enrichies au passage forcé
1 changed file +11 −4
modified
creaka/connectors/apify_social.py
+11 −4
@@ -175,6 +175,10 @@ class _ApifySocialEnrich(BaseConnector): | |||||
| 175 | kind = "enrichment" | 175 | kind = "enrichment" | ||
| 176 | platform = "" # plateforme canonique (§6.2) | 176 | platform = "" # plateforme canonique (§6.2) | ||
| 177 | actor = "" # nom court de l'acteur (ka-instagram…) | 177 | actor = "" # nom court de l'acteur (ka-instagram…) | ||
| 178 | + # concurrence interne du run — DOIT respecter le `maximum` du schéma | ||||
| 179 | + # d'input de l'acteur, sinon Apify rejette le run en 400 (cause des | ||||
| 180 | + # passages facebook/threads à zéro, diagnostiqué le 2026-08-21) | ||||
| 181 | + run_concurrency = RUN_CONCURRENCY | ||||
| 178 | cap = 3000 # comptes max par passage (shardé en parallèle) | 182 | cap = 3000 # comptes max par passage (shardé en parallèle) | ||
| 179 | revisit_days = REVISIT_DAYS # re-sonde hebdo par défaut (env APIFY_REVISIT_DAYS) | 183 | revisit_days = REVISIT_DAYS # re-sonde hebdo par défaut (env APIFY_REVISIT_DAYS) | ||
| 180 | content_key = "" # clé du contenu récent dans l'item acteur | 184 | content_key = "" # clé du contenu récent dans l'item acteur | ||
@@ -229,7 +233,7 @@ class _ApifySocialEnrich(BaseConnector): | |||||
| 229 | items = run_actor_sharded( | 233 | items = run_actor_sharded( | ||
| 230 | self.actor, | 234 | self.actor, | ||
| 231 | {"proxyConfiguration": RESIDENTIAL, | 235 | {"proxyConfiguration": RESIDENTIAL, | ||
| 232 | − "concurrency": RUN_CONCURRENCY, | 236 | + "concurrency": self.run_concurrency, | ||
| 233 | **self.extra_input()}, | 237 | **self.extra_input()}, | ||
| 234 | sorted(targets), | 238 | sorted(targets), | ||
| 235 | # passage forcé : tranches plus grosses (bassin entier / 32 runs) | 239 | # passage forcé : tranches plus grosses (bassin entier / 32 runs) | ||
@@ -368,6 +372,9 @@ class ApifyX(_ApifySocialEnrich): | |||||
| 368 | source_id = "x-apify" | 372 | source_id = "x-apify" | ||
| 369 | platform = "x" | 373 | platform = "x" | ||
| 370 | actor = "ka-x" | 374 | actor = "ka-x" | ||
| 375 | + # l'endpoint syndication de X rend des 429 en rafale au-delà de ~4 | ||||
| 376 | + # requêtes simultanées par run (constat 2026-08-21) | ||||
| 377 | + run_concurrency = 4 | ||||
| 371 | cap = 1800 | 378 | cap = 1800 | ||
| 372 | content_key = "recent_tweets" | 379 | content_key = "recent_tweets" | ||
| 373 | metric_map = {"following": "following", "tweets_count": "tweets", | 380 | metric_map = {"following": "following", "tweets_count": "tweets", | ||
@@ -385,9 +392,7 @@ class ApifyX(_ApifySocialEnrich): | |||||
| 385 | "top_hashtags": "top_hashtags", "top_tweet": "top_tweet"} | 392 | "top_hashtags": "top_hashtags", "top_tweet": "top_tweet"} | ||
| 386 | 393 | ||||
| 387 | def extra_input(self) -> dict: | 394 | def extra_input(self) -> dict: | ||
| 388 | − # concurrence réduite : l'endpoint syndication de X rend des 429 en | 395 | + return {"maxTweets": 20} | ||
| 389 | − # rafale au-delà de ~4 requêtes simultanées par run (constat 2026-08-21) | ||||
| 390 | − return {"maxTweets": 20, "concurrency": 4} | ||||
| 391 | 396 | ||||
| 392 | def bio_urls(self, it: dict) -> list[str]: | 397 | def bio_urls(self, it: dict) -> list[str]: | ||
| 393 | return [it.get("website") or ""] | 398 | return [it.get("website") or ""] | ||
@@ -397,6 +402,7 @@ class ApifyFacebook(_ApifySocialEnrich): | |||||
| 397 | source_id = "facebook-apify" | 402 | source_id = "facebook-apify" | ||
| 398 | platform = "facebook" | 403 | platform = "facebook" | ||
| 399 | actor = "ka-facebook" | 404 | actor = "ka-facebook" | ||
| 405 | + run_concurrency = 6 # maximum du schéma d'input de ka-facebook | ||||
| 400 | cap = 400 | 406 | cap = 400 | ||
| 401 | revisit_days = 7 | 407 | revisit_days = 7 | ||
| 402 | metric_map = {"category": "category"} | 408 | metric_map = {"category": "category"} | ||
@@ -406,6 +412,7 @@ class ApifyThreads(_ApifySocialEnrich): | |||||
| 406 | source_id = "threads-apify" | 412 | source_id = "threads-apify" | ||
| 407 | platform = "threads" | 413 | platform = "threads" | ||
| 408 | actor = "ka-threads" | 414 | actor = "ka-threads" | ||
| 415 | + run_concurrency = 6 # maximum du schéma d'input de ka-threads | ||||
| 409 | cap = 60 | 416 | cap = 60 | ||
| 410 | revisit_days = 7 | 417 | revisit_days = 7 | ||
| 411 | content_key = "recent_posts" | 418 | content_key = "recent_posts" | ||
| 412 | 419 | ||||