Planifier sur les réseaux sociaux
Configuration : à remplir
Remplacez chaque placeholder ci-dessous avant la première exécution.
| placeholder | description |
|---|---|
<VOTRE_ID_METRICOOL_BLOG> | Votre blogId de marque Metricool (depuis getBrandSettings) |
<VOTRE_FUSEAU_HORAIRE> | Fuseau horaire IANA pour la planification, ex. America/Chicago |
<VOTRE_HEURE_PUBLICATION> | Heure de publication quotidienne par défaut, ex. 10:00 |
<VOTRE_HANDLE_IG>, <VOTRE_HANDLE_TIKTOK>, <VOTRE_ID_CHAINE_YOUTUBE> | Les comptes connectés dans Metricool |
<VOTRE_ID_DOSSIER_UPLOAD_DRIVE> | Un dossier Google Drive partagé avec « toute personne disposant du lien » (voir le media hop) |
<VOTRE_BIBLIOTHEQUE_VIDEO> | Où les fichiers finis sont conservés, ex. ~/Videos/Finished |
<VOTRE_CTA_STANDARD> | Ligne de clôture optionnelle que vous mettez sur chaque légende |
<VOTRE_FICHIER_VOIX> | Optionnel : chemin vers un fichier guide vocal/de style pour les légendes |
Marque : blogId <VOTRE_ID_METRICOOL_BLOG>, fuseau horaire <VOTRE_FUSEAU_HORAIRE>.
Connecté : Instagram (<VOTRE_HANDLE_IG>), TikTok (<VOTRE_HANDLE_TIKTOK>), YouTube (<VOTRE_ID_CHAINE_YOUTUBE>).
Le media hop (la partie qui n'est pas évidente)
L'API de Metricool n'accepte que des URL publiques. Elle ne peut pas accepter un fichier local. La chaîne de travail :
- Téléversez le MP4 dans un dossier Drive tel que
Metricool Uploads (Claude)(<VOTRE_ID_DOSSIER_UPLOAD_DRIVE>). Partagez le dossier une fois avec « toute personne disposant du lien » ; les fichiers héritent de ce partage, donc pas de partage par fichier.cd <dossier avec le fichier> && gws drive files create \ --params '{"uploadType":"multipart","supportsAllDrives":true}' \ --json '{"name":"<nom>.mp4","mimeType":"video/mp4","parents":["<VOTRE_ID_DOSSIER_UPLOAD_DRIVE>"]}' \ --upload "<fichier>" - Planifiez avec l'URL de téléchargement direct :
https://drive.google.com/uc?id=<fileId>&export=download. Le lien/viewéchoue avec « Échec de la normalisation du média ». - Metricool copie le fichier dans son propre stockage ; le
mediade la réponse passe àstatic.metricool.com/.... - Supprimez la copie Drive une fois que vous voyez cela. Le stockage ne s'accumule jamais.
Claude ne peut généralement pas rendre les fichiers Drive publics (le sandbox le bloque) et ne peut pas modifier ses propres autorisations. C'est pourquoi le dossier partagé existe. Si un fichier se retrouve en dehors du dossier, demandez à l'utilisateur de le déplacer plutôt que d'essayer de le partager.
Légendes
Si vous conservez un guide vocal, lisez d'abord <VOTRE_FICHIER_VOIX> et mettez-vous en accord. Sinon, utilisez ces valeurs par défaut.
Quand le reel a un CTA par mot-clé en commentaire (un mot-clé qui déclenche un DM ou un email automatisé), la ligne 1 est le CTA :
- Ligne 1 :
Commentez <MOT_CLÉ> et je vous enverrai <nom de la ressource> gratuitement 👇, mot-clé en majuscules, exactement comme prononcé dans le clip CTA du reel. - Ensuite la ligne d'accroche et les 2 à 4 lignes pédagogiques ci-dessous.
- Terminez par le CTA standard, si vous en utilisez un.
- Le mot-clé doit correspondre au CTA parlé du reel (
reel_ctadans le fichier d'état de la vidéo). Un mot-clé par vidéo.
Format pour les reels sans CTA par mot-clé :
- La ligne 1 est l'accroche. C'est la seule ligne visible dans le fil d'actualité. Généralement la même ligne par laquelle le reel commence.
- 2 à 4 lignes courtes qui enseignent une chose. Des sauts de ligne entre elles, pas un paragraphe.
- Pas de spam de hashtags. Peu ou pas.
- Terminez par
<VOTRE_CTA_STANDARD>textuellement si vous en avez un.
Écrivez à partir de ce qui est réellement dans le reel, en utilisant les mots du créateur issus de la transcription, pas des conseils génériques. Court mais éducatif : le spectateur doit apprendre une chose utilisable à partir de la seule légende.
Exemples génériques de la forme :
« Publier tous les jours = ÉPUISEMENT / Publier 3 bonnes vidéos par semaine = CROISSANCE »
« Petit conseil si vous voulez un meilleur son : rapprochez le micro, pas augmenter le gain... »
Rendu
Les légendes sont incrustées : video-reels les place sur V3 sous forme de clip alpha overlay, avec la carte d'accroche texte sur V2. Rien à importer, pas de case à cocher pour l'incrustation.
- L'utilisateur coupe le reel. Les deux pistes d'overlay sont des clips indépendants, donc couper V1 ne les déplace pas. Si le timing est recoupé, refaites le rendu des légendes de ce reel plutôt que de les glisser.
- Claude en fait le rendu via l'API Resolve. Quatre reels prennent environ 90 secondes.
out = os.path.expanduser("~/Movies/<video>-deliverables/reels-final")
os.makedirs(out, exist_ok=True)
project.DeleteAllRenderJobs()
for i in range(project.GetTimelineCount()):
t = project.GetTimelineByIndex(i+1)
if not t.GetName().startswith("Reel"):
continue
project.SetCurrentTimeline(t)
project.SetRenderSettings({"TargetDir": out, "CustomName": t.GetName().replace(" ", "_"),
"SelectAllFrames": True, "FormatWidth": 1080, "FormatHeight": 1920,
"ExportVideo": True, "ExportAudio": True})
project.SetCurrentRenderFormatAndCodec("mp4", "H264")
project.AddRenderJob()
Puis start_rendering. La chaîne de codec est "H264", pas "H.264", et le format est "mp4". Interrogez le répertoire de sortie plutôt que le statut du travail ; les fichiers apparaissent au fur et à mesure. Attendez-vous à environ 40 Mo pour 30 secondes.
3. Le rendu est le point de non-retour pour le timing, donc effectuez d'abord tout recadrage.
4. Vérifiez la sortie avec ffmpeg avant de téléverser, une image à l'intérieur de la fenêtre d'accroche et une au milieu du reel :
ffmpeg -v error -ss 1.5 -i reel.mp4 -frames:v 1 hook.png -y
ffmpeg -v error -ss 8 -i reel.mp4 -frames:v 1 cap.png -y
Empilez-les dans une seule feuille de preuve et regardez-la réellement. C'est le dernier endroit où une carte d'accroche manquante ou une piste de légende vide peut être détectée, et après la planification, il n'y a pas de suppression.
Où vont les fichiers finis
Tout ce qui est conservé atterrit dans <VOTRE_BIBLIOTHEQUE_VIDEO>/, un dossier par vidéo :
<VOTRE_BIBLIOTHEQUE_VIDEO>/<Vidéo> AAAA-MM-JJ/
Reels/ ce qui a été publié. 1080x1920 H.264
Reels/Masters/ même montage, archive 60 Mbps
Timelines/ un .drt par timeline + le projet .drp
Covers/ les couvertures de reel Instagram approuvées, 1080x1920 JPG
Thumbnails/ les options en taille réelle
YouTube/ l'export longue durée, livraison + master
Posting schedule.txt ce qui sort, où et quand
Le fichier de téléversement : aussi élevé que l'API de publication d'Instagram le permet
Metricool publie via l'API de publication de contenu de Meta, qui plafonne ce qu'elle accepte. Téléversez le meilleur fichier qui tient dans ces limites, fabriqué à partir du master 60 Mbps et non du rendu de livraison de Resolve :
- H.264 High, yuv420p, 1080x1920, GOP fermé, moov au début (
+faststart) - vidéo max 24 Mbps (la limite est de 25), audio AAC 128 kbps à 48 kHz (Resolve écrit 320 kbps, ce qui est trop)
- flux vidéo et audio uniquement. Resolve ajoute une piste de données timecode ; supprimez-la avec
-dn
ffmpeg -i "Masters/<n>.mp4" -map 0:v:0 -map 0:a:0 -map_metadata -1 -dn \
-c:v libx264 -preset slow -crf 11 -maxrate 24M -bufsize 48M -pix_fmt yuv420p -profile:v high \
-g 48 -keyint_min 48 -sc_threshold 0 -flags +cgop \
-c:a aac -b:a 128k -ar 48000 -movflags +faststart "Reels/<n>.mp4"
Avec CRF 16, les séquences de tête parlante n'utilisaient qu'environ 8 Mbps, donc CRF 11 dépense plus du budget. Exécutez-le en arrière-plan, car plusieurs reels prennent des minutes avec -preset slow. Encodez un fichier à la fois, pas en parallèle : plusieurs encodages parallèles peuvent remplir le disque en cours d'écriture et tronquer tous les fichiers. Instagram re-compresse toujours de son côté ; cela garantit que ce à partir de quoi il commence est aussi propre que possible.
Deux rendus par reel, pas un. Même codec, même résolution, débit différent :
| résolution | débit | pour | |
|---|---|---|---|
| livraison | 1080x1920 H.264 | Passage Resolve, puis remplacé par le fichier de téléversement ci-dessus | téléversement |
| master | 1080x1920 H.264 | 60 Mbps via "VideoQuality": 60000 | archive |
Mêmes deux passes pour le long format en 1920x1080 : environ 900 Mo pour la livraison, environ 4,5 Go pour le master pour une vidéo de 10 minutes.
1080x1920 est la bonne résolution : Instagram sert du 1080 de large de toute façon, et le crop du reel est déjà sur-échantillonné à partir du 4K. Ne proposez pas ProRes ou une trame plus grande sauf si demandé.
VideoQuality est collant. Définissez-le à chaque passage.
Les paramètres de rendu vivent sur le projet, pas sur le travail. Laissez VideoQuality de côté dans un appel SetRenderSettings et le rendu réutilise silencieusement ce que le précédent a utilisé. Un passage de livraison longue durée qui hérite de 60000 des masters de reel sort environ 5 fois plus gros que prévu.
project.SetRenderSettings({..., "VideoQuality": 12000}) # livraison, ~12 Mbps
project.SetRenderSettings({..., "VideoQuality": 60000}) # master, ~60 Mbps
Ne comptez jamais sur la valeur par défaut pour le passage de livraison. Et ne faites jamais confiance à la liste des travaux : VideoQuality est lu comme None depuis GetRenderJobList() même lorsqu'il a été appliqué. Vérifiez le fichier fini :
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of csv=p=0 out.mp4
Vérifiez l'espace libre avant de mettre en file d'attente une paire longue durée. Un master de 10 minutes à 60 Mbps pèse environ 4,5 Go.
Exportez également les timelines dans le dossier, afin que le montage soit portable sans la base de données du projet :
for i in range(project.GetTimelineCount()):
t = project.GetTimelineByIndex(i+1)
t.Export(os.path.join(d, t.GetName() + ".drt"), resolve.EXPORT_DRT)
resolve.GetProjectManager().ExportProject(project.GetName(), os.path.join(d, project.GetName() + ".drp"))
- Faites le rendu directement dedans. Définissez
TargetDirde Resolve sur<ce dossier>/Reels, de sorte que rien n'ait à être déplacé plus tard. - Renommez à partir des noms de timeline Resolve.
Reel_2_-_my_best_tip.mp4devient2. my best tip.mp4: numérotés pour qu'ils se trient, lisibles en un coup d'œil. Mêmes noms pour les masters et les fichiers .drt, de sorte que les trois dossiers s'alignent. - Déplacez, ne copiez pas.
~/Movies/<video>-*contient les fichiers de travail (Whisper JSON, SRT, overlay movs, caption movs). Ceux-ci restent en place pour les re-rendus ; les exports finis partent. - Écrivez
Posting schedule.txtaprès la planification, listant la date, l'heure et les réseaux de chaque reel, afin que l'utilisateur puisse voir ce qui est déjà parti sans ouvrir Metricool.
Mentionnez l'espace disque uniquement si un rendu échoue réellement pour cause d'espace, ou si une paire longue durée ne tient manifestement pas.
Couvertures (Instagram uniquement)
Chaque reel reçoit une couverture Instagram personnalisée avant d'être planifié. Exécutez la compétence reel-covers après que les légendes ont été approuvées et avant la planification. Elle renvoie un JPG approuvé par reel dans <Video>/Covers/. Montrez les couvertures en même temps que les légendes et les créneaux, de sorte que tout soit approuvé en une seule passe.
Téléversez chaque couverture via le même media hop Drive que la vidéo (même dossier <VOTRE_ID_DOSSIER_UPLOAD_DRIVE>, mimeType: image/jpeg), et passez-la comme videoThumbnailUrl en utilisant le format uc?id=...&export=download. Supprimez la copie Drive une fois que Metricool a sa propre copie, comme avec la vidéo.
Planification
Un post par reel, les trois réseaux, couverture incluse. La couverture n'a d'importance que sur Instagram. TikTok l'ignore sur un compte personnel, et Shorts ne l'affiche que sur une chaîne vérifiée. Ne divisez pas le post.
"providers":[{"network":"instagram"},{"network":"tiktok"},{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<id vidéo>&export=download"],
"videoThumbnailUrl":"https://drive.google.com/uc?id=<id couverture>&export=download",
"instagramData":{"type":"REEL","showReelOnFeed":true,"isAiGenerated":false},
"tiktokData":{"privacyOption":"PUBLIC_TO_EVERYONE","title":"<titre court>"},
"youtubeData":{"type":"short","privacy":"public","madeForKids":false,"title":"<titre, <100 caractères>"}
- Ajouter une couverture à un post déjà planifié :
updateScheduledPostavec les champs originaux complets du post (texte, providers, media, toutes les données réseau, date) plusvideoThumbnailUrl. Cela écrase et n'a pas d'annulation, donc copiez les champs degetScheduledPoststextuellement. Ne remplacez jamais unvideoThumbnailUrlouvideoCoverMillisecondsexistant : un post qui en a déjà un a déjà une couverture choisie. - Si une mise à jour échoue avec « Échec de la normalisation du média » alors que les autres ont fonctionné, la récupération depuis Drive a échoué cette fois. Le post reste inchangé. Téléversez à nouveau le fichier (nouvel id) et réessayez. Réessayer la même URL n'aidera pas.
- Ensuite, vérifiez avec
getScheduledPostsque tous lesvideoThumbnailUrldes posts commencent maintenant parstatic.metricool.com, et supprimez les copies Drive. - YouTube requiert un titre et
madeForKids. TikTok veut un titre court. autoPublish: truepermet à Metricool de le publier automatiquement.
Quand planifier (règle par défaut, ajustez selon vos goûts)
Commencez le lendemain d'aujourd'hui. Un post par jour. Si un jour a déjà du contenu, passez au jour libre suivant.
jour = demain
pour chaque post dans l'ordre :
tant que jour a déjà un post planifié : jour += 1
planifier à <VOTRE_HEURE_PUBLICATION> locale le jour
jour += 1
<VOTRE_HEURE_PUBLICATION>dans<VOTRE_FUSEAU_HORAIRE>est l'heure de publication par défaut.- Appelez toujours
getScheduledPostsen premier, couvrant demain à demain + (nombre de posts + 14 jours), afin de pouvoir voir les trous. Sauter cette vérification peut faire atterrir un post sur un créneau déjà pris. - Un jour est considéré comme pris si quoi que ce soit est planifié ce jour-là, brouillons inclus.
- Ne regroupez pas plusieurs posts sur un même jour et ne laissez pas de trous : le but est une série quotidienne régulière commençant immédiatement.
- Ne mettez jamais d'étiquette de test dans le texte de la légende. Pas de « TEST BROUILLON », pas de « peut être supprimé ». La légende est la copie finale, toujours, même lors d'un test ; l'utilisateur voudra peut-être la conserver.
Marquez les posts de test avec
draft: true+autoPublish: false(les brouillons sont visuellement distincts dans le planificateur) et transmettezplannerUrlainsi que l'id du post pour qu'il puisse être supprimé en un clic.
Long format YouTube (la vidéo principale, pas un Short)
Recommandé : n'envoyez pas de gros fichiers long format via Metricool. Téléversez-les dans YouTube Studio. Un export d'environ 1 Go envoyé via Metricool peut être stocké tronqué en cours de transfert. Resolve place l'index MP4 (moov) à la fin du fichier, donc une copie tronquée est illisible, et YouTube signale « traitement abandonné » après avoir déjà « publié ». Metricool peut ne pas signaler d'erreur. Remettez à l'utilisateur le fichier, le titre, la description et la vignette à coller dans Studio, rendus en 4K (Studio n'a pas de problème de taille). Tout ce qui suit est conservé pour référence.
Si Metricool est utilisé pour un gros fichier, vérifiez le fichier stocké après téléversement avec
--fsizeou une vérification de taille, et si la taille du fichier stocké est inférieure de plus de 5 % au fichier local, signalez-le et ne procédez pas à la planification.
Rendu long format
- Format de livraison : H.264 High, yuv420p, 1920x1080, GOP fermé,
+faststart, débit vidéo 12 Mbps (12000 dansVideoQuality), audio AAC 320 kbps (le défaut de Resolve, laissez-le). Pas de-maxratecar le codec Instagram ne limite pas YouTube. - Format master : Mêmes codec/résolution,
VideoQuality60000, 60 Mbps. Destiné à l'archivage, pas au téléversement. - Couverture : une miniature personnalisée, générée hors ligne et non via la compétence reel-covers. Demandez à l'utilisateur s'il veut une image fixe de la vidéo ou une image séparée. S'il choisit une image séparée, téléversez-la dans le dossier Drive partagé, puis transmettez-la comme
thumbnailUrllors de l'appelupdateScheduledPost.
Planification long format
"providers":[{"network":"youtube"}],
"media":["https://drive.google.com/uc?id=<id vidéo>&export=download"],
"youtubeData":{"type":"video","privacy":"public","madeForKids":false,"title":"<titre>","description":"<description>","thumbnailUrl":"https://drive.google.com/uc?id=<id miniature>&export=download"}
La planification long format n'utilise qu'un seul créneau calendaire et n'est pas regroupée avec les Shorts. Les créneaux Shorts et long format sont séparés dans Metricool, donc vous pouvez planifier un long format et un Short le même jour sans conflit. Ne les laissez pas interférer entre eux.
Le script
Entrée : un répertoire de livraison de reels (sortie de compile-reels) avec state.json. Le script le lit, rend les légendes, vérifie les fichiers, puis appelle MetricoolService pour publier.
1. Lire state.json. Obtenir : chemins de reels, chemins de couvertures, transcripts, reel_ctas.
2. Rendre chaque reel. Produire le fichier de téléversement et le fichier master. Vérifier avec ffmpeg.
3. Copier les exports dans <VOTRE_BIBLIOTHEQUE_VIDEO>/<Vidéo> AAAA-MM-JJ/.
4. Écrire les légendes. Utiliser le guide vocal s'il existe, sinon les règles par défaut.
5. Appeler reel-covers. Chaque couverture doit déjà exister ; sinon, échouer.
6. Appeler MetricoolService.getBrandSettings pour obtenir blogId et les comptes connectés.
7. Appeler MetricoolService.getScheduledPosts pour les 14 prochains jours.
8. Trouver les créneaux libres. Planifier chaque reel sur le prochain jour libre.
9. Appeler MetricoolService.schedulePost pour chaque reel.
10. Vérifier que chaque post a maintenant un static.metricool.com videoThumbnailUrl.
11. Supprimer les fichiers Drive.
12. Écrire Posting schedule.txt dans le dossier vidéo.
13. Enregistrer le state.json mis à jour dans le dossier vidéo.
Connexion Metricool
- hôte :
https://api2.metricool.com - compte de service : un jeton API Metricool (
METRICOOL_API_KEY). Un par utilisateur. Stocké dans.envlocalement, pas dans le dépôt. - Méthodes d'API utilisées :
GET /app/gmb/account/getBrandSettings→ récupèreblogId, les comptes connectés.GET /app/gmb/engagement/getScheduledPosts?blogId=X&limit=50&offset=0→ posts planifiés existants.POST /app/gmb/publishing/schedulePost→ planifier un post.PUT /app/gmb/publishing/updateScheduledPost→ mettre à jour un post planifié.DELETE /app/gmb/engagement/deleteScheduledPost?blogId=X&postId=Y→ supprimer un post planifié.
Consultez la documentation de l'API Metricool pour les corps de requête détaillés et les formats de réponse. Toutes les requêtes nécessitent un en-tête Authorization: Bearer <METRICOOL_API_KEY>.
Gestion des erreurs
- Échec de rendu : le rendu Resolve peut échouer silencieusement ; vérifiez toujours que le fichier existe et a une taille non nulle après
start_rendering. Si un fichier fait 0 octet, signalez-le et ne procédez pas au téléversement. - Échec de téléversement Drive : si
gws drive files createéchoue, le dossier partagé a peut-être changé d'id ou les autorisations ont été révoquées. Demandez à l'utilisateur de vérifier<VOTRE_ID_DOSSIER_UPLOAD_DRIVE>. - Échec de planification Metricool : si
schedulePostrenvoie une erreur, imprimez le corps de la réponse et arrêtez-vous. Ne continuez pas à planifier les reels restants, car l'ordre des créneaux serait alors incorrect. - Conflit de créneau : si
getScheduledPostsmontre qu'un créneau est déjà pris, passez au jour suivant, mais imprimez un avertissement afin que l'utilisateur sache pourquoi un jour a été sauté.
Exemple de flux de travail
Utilisateur : « Planifie les nouveaux reels »
Claude :
1. Trouve le répertoire de livraison le plus récent.
2. Lit state.json.
3. Rendu de chaque reel (environ 90 secondes pour 4 reels).
4. Vérification ffmpeg : montre les images d'accroche et de légende.
5. Rédige les légendes pour chaque reel.
6. Appelle reel-covers → obtient les couvertures.
7. Affiche tout pour approbation : légendes, couvertures, créneaux proposés.
8. L'utilisateur approuve.
9. Téléverse sur Drive, planifie via Metricool.
10. Nettoie Drive.
11. Écrit Posting schedule.txt.
12. Signale : « 4 reels planifiés à partir de demain, 10h, sur IG, TT, YT. »