?
| Current Path : /home/w/e/b/webyoo/www/nathan-ai/site/ |
| Current File : /home/w/e/b/webyoo/www/nathan-ai/site/GUIDE.md |
# Auto-post LinkedIn en PHP + cron — Guide d'installation
Un système simple qui publie **3 posts/jour** sur ton profil LinkedIn, via l'**API officielle** (méthode 100 % autorisée, aucun risque de bannissement contrairement aux outils qui simulent un navigateur).
> ⚠️ Ce système automatise **la publication de posts** uniquement. N'automatise **jamais** les demandes de connexion ni les messages privés (ça, c'est interdit et ça fait restreindre le compte). L'outreach reste manuel.
---
## Contenu du dossier
- `config.sample.php` → à renommer `config.php` et remplir.
- `oauth_callback.php` → pour obtenir ton jeton d'accès.
- `get_person_urn.php` → pour récupérer l'identifiant de ton profil.
- `publish.php` → **le script appelé par le cron** (publie 1 post).
- `posts.json` → ta file de posts (6 posts immo déjà prêts dedans).
- `state.json` → mémorise quel post publier ensuite.
- `lib.php` → fonctions internes (ne pas toucher).
---
## Étape 1 — Créer ton app LinkedIn (10 min, gratuit)
1. Va sur **https://www.linkedin.com/developers/apps** → **Create app**.
2. Associe-la à ta **Page entreprise Nathan AI** (obligatoire pour créer une app).
3. Onglet **Products** : ajoute **« Share on LinkedIn »** et **« Sign In with LinkedIn using OpenID Connect »** (généralement validés automatiquement). Ce sont eux qui donnent le scope `w_member_social` (publier) et `openid/profile` (t'identifier).
4. Onglet **Auth** : note ton **Client ID** et **Client Secret**, et ajoute l'**Authorized redirect URL** :
`https://ledmark.fr/li/oauth_callback.php` (adapte le domaine/chemin où tu déposes les fichiers).
## Étape 2 — Déposer les fichiers sur ton hébergement OVH
- Mets tout le dossier dans un répertoire, ex. `www/li/` (accessible en `https://ledmark.fr/li/`).
- Renomme `config.sample.php` → `config.php`.
- Remplis `client_id`, `client_secret`, `redirect_uri` dans `config.php`.
- Protège le dossier : idéalement, mets `config.php`, `posts.json`, `state.json`, `*.log` hors du répertoire public, ou ajoute un `.htaccess` qui bloque leur accès direct (voir Étape 6).
## Étape 3 — Obtenir ton jeton d'accès
1. Ouvre dans ton navigateur : `https://ledmark.fr/li/oauth_callback.php?login=1`
2. Autorise l'application sur LinkedIn.
3. Tu reviens sur une page qui affiche ton **access_token** → copie-le dans `config.php` → `access_token`.
> Le jeton dure **~60 jours**. Pour le renouveler, il suffit de refaire cette étape (reviens sur `?login=1`). Mets-toi un rappel tous les 50 jours.
## Étape 4 — Récupérer ton author_urn
1. Ouvre `https://ledmark.fr/li/get_person_urn.php` (ou en SSH : `php get_person_urn.php`).
2. Il t'affiche `urn:li:person:XXXX` → copie-le dans `config.php` → `author_urn`.
## Étape 5 — Tester
- En SSH : `php publish.php`
- Ou ouvre `https://ledmark.fr/li/publish.php` une fois.
- Va voir ton profil LinkedIn : le 1er post de `posts.json` doit être publié. Vérifie aussi `publish.log`.
## Étape 6 — Programmer le cron (3×/jour) sur OVH
Dans l'**espace client OVH → Hébergement → Tâches planifiées (cron)**, crée **3 tâches** pointant vers `publish.php`, avec la bonne version de PHP. Exemple de commande :
```
/usr/local/php8.3/bin/php /homez.XXX/toncompte/www/li/publish.php
```
Horaires conseillés (heure de forte audience LinkedIn) : **8h00, 13h00, 18h00**.
⏰ **Attention au fuseau horaire du serveur.** OVH est souvent en heure de Paris, mais vérifie : si le serveur est en UTC, décale d'1 ou 2 h pour viser l'heure de Paris.
Sur un VPS classique (crontab), l'équivalent serait :
```
0 8 * * * /usr/bin/php /var/www/li/publish.php >> /var/www/li/cron.log 2>&1
0 13 * * * /usr/bin/php /var/www/li/publish.php >> /var/www/li/cron.log 2>&1
0 18 * * * /usr/bin/php /var/www/li/publish.php >> /var/www/li/cron.log 2>&1
```
Protection `.htaccess` (Ă mettre dans le dossier `li/`) :
```
<FilesMatch "\.(php)$">
</FilesMatch>
<Files "config.php"> Require all denied </Files>
<Files "posts.json"> Require all denied </Files>
<Files "state.json"> Require all denied </Files>
<Files "publish.log"> Require all denied </Files>
```
---
## Alimenter ta file de posts
- Ouvre `posts.json` : c'est un simple tableau. Ajoute autant d'objets `{ "text": "..." }` que tu veux.
- Dans le texte, utilise `\n` pour les retours Ă la ligne.
- Chaque exécution du cron publie **le post suivant** et avance le compteur (`state.json`).
- Quand la file est finie : soit tu la réalimentes et remets `state.json` à `{"next":0}`, soit tu passes `loop_queue` à `true` dans `config.php` pour recycler les posts en boucle.
> 💡 Je peux te générer une **banque de 30 à 90 posts** prête à coller dans `posts.json` (de quoi tenir 1 à 3 mois à 3/jour). Demande-la-moi.
---
## Questions fréquentes / dépannage
- **Erreur 401** au moment de publier → jeton expiré ou invalide : refais l'Étape 3.
- **Erreur de version** (`LinkedIn-Version`) → mets une valeur valide récente (format `AAAAMM`) dans `config.php` en te basant sur la doc LinkedIn du moment.
- **Publier sur la Page entreprise** (au lieu du profil perso) → possible, mais il faut le produit **« Community Management API »** (validation LinkedIn plus stricte) et un `author_urn` en `urn:li:organization:XXXX`. Commence par le profil perso, c'est immédiat.
- **Posts avec image / carrousel** → l'API le permet mais nécessite une étape d'upload du média en plus. Le kit actuel gère le **texte** (l'essentiel pour 3/jour). Dis-moi si tu veux la version avec images.
- **Sécurité** → ne partage jamais `config.php` (il contient tes clés).