Guide · comments:write
Répondre aux commentaires
Un petit bot qui consulte les commentaires de vos derniers posts et répond aux nouveaux, sans jamais répondre deux fois.
Scopes : posts:read et comments:write (facultatif : likes:write).
Les endpoints#
| Endpoint | Usage |
|---|---|
GET /me/posts | Vos derniers posts. |
GET /posts/{id}/comments | Commentaires d'un post (paginés). |
POST /posts/{id}/comments | Écrire un commentaire ou une réponse. |
DELETE /comments/{id} | Supprimer votre commentaire, ou un commentaire sur votre post. |
POST /posts/{id}/like | Aimer un post. |
1. Lire les commentaires#
curl "https://api.linework.app/open/v1/posts/1043/comments?limit=100" \
-H "Authorization: Bearer $LINEWORK_API_KEY"
{
"data": [
{
"id": "88121",
"text": "Where is this?",
"author": { "id": "5512", "username": "giulia" },
"createdAt": "2026-10-14T09:30:00.000Z"
}
],
"next_cursor": null
}
2. Répondre#
Pour répondre à un commentaire précis, transmettez son identifiant dans parentId ; sans lui, le commentaire est publié sur le post.
curl https://api.linework.app/open/v1/posts/1043/comments \
-H "Authorization: Bearer $LINEWORK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "text": "Lake Como, from Varenna 😊", "parentId": "88121" }'
3. Assembler le tout#
Mémorisez les commentaires auxquels vous avez déjà répondu (ici dans un fichier local) et ignorez vos propres commentaires.
import { readFile, writeFile } from "node:fs/promises";
const API = "https://api.linework.app/open/v1";
const headers = {
Authorization: `Bearer ${process.env.LINEWORK_API_KEY}`,
"Content-Type": "application/json",
};
const get = (p) => fetch(API + p, { headers }).then((r) => r.json());
const seen = new Set(JSON.parse(await readFile("seen.json", "utf8").catch(() => "[]")));
const me = await get("/me");
const posts = await get("/me/posts?limit=10");
for (const post of posts.data) {
const comments = await get(`/posts/${post.id}/comments?limit=100`);
for (const c of comments.data) {
if (seen.has(c.id) || c.author.id === me.id) continue;
const reply = answer(c.text);
if (reply) {
await fetch(`${API}/posts/${post.id}/comments`, {
method: "POST",
headers,
body: JSON.stringify({ text: reply, parentId: c.id }),
});
}
seen.add(c.id);
}
}
await writeFile("seen.json", JSON.stringify([...seen]));
function answer(text) {
if (/where|dove/i.test(text)) return "Lake Como, from Varenna 😊";
return null; // no canned answer: leave it to a human
}
import json, os, re, requests
API = "https://api.linework.app/open/v1"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {os.environ['LINEWORK_API_KEY']}"
try:
seen = set(json.load(open("seen.json")))
except FileNotFoundError:
seen = set()
def answer(text):
if re.search(r"where|dove", text, re.I):
return "Lake Como, from Varenna 😊"
return None # no canned answer: leave it to a human
me = s.get(API + "/me", timeout=30).json()
posts = s.get(API + "/me/posts", params={"limit": 10}, timeout=30).json()
for post in posts["data"]:
comments = s.get(f"{API}/posts/{post['id']}/comments", params={"limit": 100}, timeout=30).json()
for c in comments["data"]:
if c["id"] in seen or c["author"]["id"] == me["id"]:
continue
reply = answer(c["text"])
if reply:
s.post(f"{API}/posts/{post['id']}/comments",
json={"text": reply, "parentId": c["id"]}, timeout=30)
seen.add(c["id"])
json.dump(sorted(seen), open("seen.json", "w"))
Exécutez-le toutes les quelques minutes (cron, tâche planifiée, minuteur serverless). Chaque exécution n'effectue qu'une poignée de requêtes, bien en dessous de la limite de 120 par minute.
Règles pour les bots de commentaires#
- Quota journalier : 300 commentaires et 500 j'aime par compte.
- Ne répondez que lorsque la réponse est utile. Ne publiez pas le même texte encore et encore, et ne commentez pas les posts de personnes qui n'ont jamais interagi avec vous.
- Lorsque le bot n'est pas sûr, qu'il reste silencieux et laisse une personne répondre.