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 | 175 | kind = "enrichment" |
| 176 | 176 | platform = "" # plateforme canonique (§6.2) |
| 177 | 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 | 182 | cap = 3000 # comptes max par passage (shardé en parallèle) |
| 179 | 183 | revisit_days = REVISIT_DAYS # re-sonde hebdo par défaut (env APIFY_REVISIT_DAYS) |
| 180 | 184 | content_key = "" # clé du contenu récent dans l'item acteur |
@@ -229,7 +233,7 @@ class _ApifySocialEnrich(BaseConnector): | ||
| 229 | 233 | items = run_actor_sharded( |
| 230 | 234 | self.actor, |
| 231 | 235 | {"proxyConfiguration": RESIDENTIAL, |
| 232 | − "concurrency": RUN_CONCURRENCY, | |
| 236 | + "concurrency": self.run_concurrency, | |
| 233 | 237 | **self.extra_input()}, |
| 234 | 238 | sorted(targets), |
| 235 | 239 | # passage forcé : tranches plus grosses (bassin entier / 32 runs) |
@@ -368,6 +372,9 @@ class ApifyX(_ApifySocialEnrich): | ||
| 368 | 372 | source_id = "x-apify" |
| 369 | 373 | platform = "x" |
| 370 | 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 | 378 | cap = 1800 |
| 372 | 379 | content_key = "recent_tweets" |
| 373 | 380 | metric_map = {"following": "following", "tweets_count": "tweets", |
@@ -385,9 +392,7 @@ class ApifyX(_ApifySocialEnrich): | ||
| 385 | 392 | "top_hashtags": "top_hashtags", "top_tweet": "top_tweet"} |
| 386 | 393 | |
| 387 | 394 | def extra_input(self) -> dict: |
| 388 | − # concurrence réduite : l'endpoint syndication de X rend des 429 en | |
| 389 | − # rafale au-delà de ~4 requêtes simultanées par run (constat 2026-08-21) | |
| 390 | − return {"maxTweets": 20, "concurrency": 4} | |
| 395 | + return {"maxTweets": 20} | |
| 391 | 396 | |
| 392 | 397 | def bio_urls(self, it: dict) -> list[str]: |
| 393 | 398 | return [it.get("website") or ""] |
@@ -397,6 +402,7 @@ class ApifyFacebook(_ApifySocialEnrich): | ||
| 397 | 402 | source_id = "facebook-apify" |
| 398 | 403 | platform = "facebook" |
| 399 | 404 | actor = "ka-facebook" |
| 405 | + run_concurrency = 6 # maximum du schéma d'input de ka-facebook | |
| 400 | 406 | cap = 400 |
| 401 | 407 | revisit_days = 7 |
| 402 | 408 | metric_map = {"category": "category"} |
@@ -406,6 +412,7 @@ class ApifyThreads(_ApifySocialEnrich): | ||
| 406 | 412 | source_id = "threads-apify" |
| 407 | 413 | platform = "threads" |
| 408 | 414 | actor = "ka-threads" |
| 415 | + run_concurrency = 6 # maximum du schéma d'input de ka-threads | |
| 409 | 416 | cap = 60 |
| 410 | 417 | revisit_days = 7 |
| 411 | 418 | content_key = "recent_posts" |
| 412 | 419 | |