{"id":27946048,"url":"https://github.com/greedyape420/afuera_x_bot","last_synced_at":"2026-04-18T11:02:30.046Z","repository":{"id":291537625,"uuid":"977356420","full_name":"GreedyApe420/AFUERA_X_BOT","owner":"GreedyApe420","description":"Autonomous Twitter bot replying with AI-generated sarcastic punchlines. Powered by the X API \u0026 OpenAI.","archived":false,"fork":false,"pushed_at":"2025-05-05T08:03:38.000Z","size":12,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-14T05:04:23.181Z","etag":null,"topics":["ai","automation","bot","bottleneck","humour","nodejs","openai","sarcasm","sarcastic-tweets","twitter","twitter-api","twitter-bot"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GreedyApe420.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-04T02:31:40.000Z","updated_at":"2025-05-10T19:27:24.000Z","dependencies_parsed_at":"2025-05-05T08:46:51.130Z","dependency_job_id":null,"html_url":"https://github.com/GreedyApe420/AFUERA_X_BOT","commit_stats":null,"previous_names":["greedyape420/afuera_x_bot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/GreedyApe420/AFUERA_X_BOT","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GreedyApe420%2FAFUERA_X_BOT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GreedyApe420%2FAFUERA_X_BOT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GreedyApe420%2FAFUERA_X_BOT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GreedyApe420%2FAFUERA_X_BOT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GreedyApe420","download_url":"https://codeload.github.com/GreedyApe420/AFUERA_X_BOT/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GreedyApe420%2FAFUERA_X_BOT/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31966217,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","automation","bot","bottleneck","humour","nodejs","openai","sarcasm","sarcastic-tweets","twitter","twitter-api","twitter-bot"],"created_at":"2025-05-07T13:47:44.749Z","updated_at":"2026-04-18T11:02:30.023Z","avatar_url":"https://github.com/GreedyApe420.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🤖 AFUERA X BOT\n\nUn bot Twitter (X) autonome qui surveille des comptes, répond automatiquement \"AFUERA 🪓\" à leurs tweets, et génère des réponses IA aux commentaires. Basé sur l'API v2 de X et OpenAI (GPT).\n\n---\n\n## 📁 Structure du projet\n\n```\nAFUERA_X_BOT/\n├── accounts.txt              # Liste des handles à surveiller (@ supprimé)\n├── .env                      # Variables d'environnement sensibles\n├── auth.js                   # Script d'authentification OAuth2 PKCE (token OpenAI + X)\n├── main.js                   # Bot principal : boucle de polling + réponses\n├── lib/\n│   ├── openaiClient.js       # Initialisation client OpenAI\n│   └── xApi.js               # Fonctions Twitter (follow, tweet, reply, etc)\n├── utils/\n│   └── logger.js             # Logger stylé (chalk + dayjs)\n└── README.md\n```\n\n---\n\n## 🔐 fichier .env (A créer toi même)\n\n```env\nX_CLIENT_ID=...              # Depuis portal X\nX_CLIENT_SECRET=...          # Si client confidentiel\nX_ACCESS_TOKEN=...           # Généré via auth.js\nX_REFRESH_TOKEN=...          # Idem\nX_SELF_USER_ID=GreedyApe423  # Ton @ handle sans @\nOPENAI_API_KEY=sk-...        # Ton token OpenAI\nPOLL_INTERVAL_MS=120000      # Délai en ms entre chaque boucle (par défaut: 2min)\n```\n\n---\n\n## ✅ Prérequis\n\n* Node.js v20+\n* Un compte Twitter Developer avec **OAuth 2.0 PKCE activé**\n* Un client OpenAI (GPT-3.5 ou 4)\n\n---\n\n## 🚀 Lancer le bot\n\n### 1. Cloner \u0026 installer\n\n```bash\ngit clone https://github.com/GreedyApe420/AFUERA_X_BOT.git\ncd AFUERA_X_BOT\nnpm install\n```\n\n### 2. Ajouter les handles dans `accounts.txt`\n\n```\nGreedyApe420\nelonmusk\n@OpenAI     # Les @ seront supprimés automatiquement\n```\n\n### 3. Récupérer les tokens OAuth2\n\n```bash\nnode auth.js\n```\n\n* Ouvre une URL, se connecte à X et autorise l'appli.\n* Les tokens seront écrits dans `.env`\n\n### 4. Lancer le bot\n\n```bash\nnode main.js\n```\n\n---\n\n## ⚙️ Fonctionnement\n\n### ✅ Suivi de comptes\n\n* Appelle `GET /users/by/username`\n* Suit les comptes via `POST /users/:id/following` (facultatif)\n\n### 🔄 Polling de tweets\n\n* Appelle `GET /users/:id/tweets`\n* Ignore réponses/retweets\n* Mémorise le dernier tweet vu (in-memory)\n\n### 🔧 Réaction au tweet\n\n* Répond instantanément: `AFUERA 🪓`\n* Cherche les réponses (replies): `GET /tweets/search/recent`\n* Pour chaque reply :\n\n  * Envoie à GPT-4 via `openaiClient.generateResponse()`\n  * Répond à la reply (avec `replyToTweet()`) (désactivé à cause des limites API)\n\n---\n\n## ⏱ Antispam \u0026 Rate Limits\n\n| Action             | Endpoint               | Délai imposé |\n| ------------------ | ---------------------- | ------------ |\n| Lire tweets        | GET /users/\\:id/tweets | 5 sec        |\n| Lire réponses      | GET /tweets/search     | 5 sec        |\n| Poster une réponse | POST /tweets           | 45 sec       |\n\n* Géré avec **Bottleneck** + Group par user.\n* Chaque type de requête a sa propre file.\n* Le polling est répété toutes les 2 minutes (modifiable).\n\n---\n\n## 🧠 OpenAI\n\n* Utilise GPT-4 ou GPT-3.5\n* Appelle `generateResponse(replyText)` pour chaque réponse utilisateur (désactivé)\n* Répond avec humour/sarcasme selon les prompts (configurable).\n\n---\n\n## 🧪 Déploiement VPS\n\n* Lancer `auth.js` en local avec tunnel ou domaine configuré dans `Callback URL`\n* Puis copier `.env` sur VPS\n* Lancer `node main.js` sur le VPS via `pm2`, `screen` ou `nohup`\n\n```bash\npm install -g pm2\npm2 start main.js --name afuera-bot\n```\n\n---\n\n## 🔒 Sécurité\n\n* `.env` doit être dans `.gitignore`\n* Les tokens ont une durée de 2h, mais le `refresh_token` permet de renouveler sans repasser par l'auth\n* Le script d’auth gère tout automatiquement\n\n---\n\n## 📄 Licence\n\nMIT\n\n---\n\n## 👑 Auteur\n\n* Créateur : [@GreedyApe420](https://twitter.com/GreedyApe420)\n* Projet AFUERA™ ✖\n* Pour toute question : DM ou issue GitHub\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreedyape420%2Fafuera_x_bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgreedyape420%2Fafuera_x_bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreedyape420%2Fafuera_x_bot/lists"}