From 8ca2bc9909463ae3f34a6c40e3b250a03a980d9c Mon Sep 17 00:00:00 2001 From: Laurent Date: Sun, 9 Nov 2025 11:59:36 +0100 Subject: [PATCH] Integrate full instagram oauth --- app.js | 26 ++++++- bot.js | 78 ++++++++++--------- .../core/instagram/instagramTokenManager.js | 12 +-- wwwroot/core/logging/logger.js | 2 +- wwwroot/core/utils/requester.js | 8 +- wwwroot/oauth/index.html | 26 ------- 6 files changed, 79 insertions(+), 73 deletions(-) delete mode 100644 wwwroot/oauth/index.html diff --git a/app.js b/app.js index 8b87591..146bd35 100644 --- a/app.js +++ b/app.js @@ -1,14 +1,34 @@ import { data } from "./wwwroot/core/appData.js"; import express from "express"; +import {Logger} from "./wwwroot/core/logging/logger.js"; +import {launch} from "./bot.js"; + +//await launch(); +console.log(data.instagramTokenManager.getOauthUrl()); const app = express(); app.use(express.json()); app.get("/oauth/", async (req, res) => { const code = req.query.code; - console.log("Received OAuth code:", code); - await data.instagramTokenManager.generate(code); - + let resMsg = ""; + try{ + const shortLived = await data.instagramTokenManager.generateShortLivedToken(code); + const longLived = await data.instagramTokenManager.generateLongLivedToken(shortLived); + console.log(longLived); + resMsg = "Authentication successful. You can close this tab"; + } catch(err){ + console.log(err); + await Logger.error(`Unable to generate token from code ${code}`, err); + resMsg = "An error occurred. Try again in few minutes."; + } finally { + res.send(` + + Authentication + ${resMsg} + + `); + } }); app.get("/api/health", (req, res) => { diff --git a/bot.js b/bot.js index dea0825..8f25e9b 100644 --- a/bot.js +++ b/bot.js @@ -2,50 +2,54 @@ import {data} from "./wwwroot/core/appData.js"; import JsonManager from "./wwwroot/core/utils/jsonManager.js"; import {Logger} from "./wwwroot/core/logging/logger.js"; -try{ +const launch = async () => { + try{ - data.instagramTokenManager.startWatching(); + data.instagramTokenManager.startWatching(); - //data.tiktokTokenManager.startWatching(); + //data.tiktokTokenManager.startWatching(); - data.instagramPoller.on("newPost", async ({permalink, userId}) => { - const modified = JsonManager.upsertPost("./posts.json", {permalink, userId}) - if(!modified) return; + data.instagramPoller.on("newPost", async ({permalink, userId}) => { + const modified = JsonManager.upsertPost("./posts.json", {permalink, userId}) + if(!modified) return; - const message = `Behold ! Some new awesome content has been posted ! \n\n${permalink}`; - await data.sender.send(data.socialChannelID, message) - }); + const message = `Behold ! Some new awesome content has been posted ! \n\n${permalink}`; + await data.sender.send(data.socialChannelID, message) + }); - data.client.once('clientReady', async () => { - await data.sender.send(data.updateChannelID, "I'm now online ! ✅") - console.log(`✅ Logged in as ${data.client.user.tag}`); - }); + data.client.once('clientReady', async () => { + await data.sender.send(data.updateChannelID, "I'm now online ! ✅") + console.log(`✅ Logged in as ${data.client.user.tag}`); + }); - data.client.on('messageCreate', (message) => { - const isGuildOwner = message.guild && message.author.id === message.guild.ownerId; - if (message.content === '/login' && isGuildOwner) { - message.reply(data.instagramTokenManager.getOauthUrl()); - } - }); + data.client.on('messageCreate', (message) => { + const isGuildOwner = message.guild && message.author.id === message.guild.ownerId; + if (message.content === '/login' && isGuildOwner) { + message.reply(data.instagramTokenManager.getOauthUrl()); + } + }); - data.client.on('guildMemberAdd', member => { - const avatar = member.user.avatarURL(); - }); + data.client.on('guildMemberAdd', member => { + const avatar = member.user.avatarURL(); + }); - process.on('SIGINT', async () => { - try { - await data.sender.send(data.updateChannelID, "I'm shutting down, now. Bye! 👋") - } catch (error) { - await Logger.error("Error while shutting down", error); - } finally { - await data.client.destroy(); - process.exit(0); - } - }); + process.on('SIGINT', async () => { + try { + await data.sender.send(data.updateChannelID, "I'm shutting down, now. Bye! 👋") + } catch (error) { + await Logger.error("Error while shutting down", error); + } finally { + await data.client.destroy(); + process.exit(0); + } + }); - await data.client.login(process.env.DISCORD_TOKEN); - data.instagramPoller.start(600000); + await data.client.login(process.env.DISCORD_TOKEN); + data.instagramPoller.start(600000); -} catch(err){ - await Logger.error("Unexpected error", err) -} \ No newline at end of file + } catch(err){ + await Logger.error("Unexpected error", err) + } +} + +export {launch} diff --git a/wwwroot/core/instagram/instagramTokenManager.js b/wwwroot/core/instagram/instagramTokenManager.js index d2124db..c952201 100644 --- a/wwwroot/core/instagram/instagramTokenManager.js +++ b/wwwroot/core/instagram/instagramTokenManager.js @@ -24,8 +24,7 @@ export class InstagramTokenManager extends BaseTokenManager { + "&response_type=code"; } - async generate(code) { - + async generateShortLivedToken(code){ let headers = { "Content-Type": "application/x-www-form-urlencoded" }; @@ -40,11 +39,14 @@ export class InstagramTokenManager extends BaseTokenManager { let encodedBody = new URLSearchParams(body); - let shortLiveAccessTokenData = await Requester.doPostRequest( + return await Requester.doPostRequest( "https://api.instagram.com/oauth/access_token", headers, encodedBody); + } - let userId = shortLiveAccessTokenData.user_id; - let shortLiveAccessToken = shortLiveAccessTokenData.access_token; + async generateLongLivedToken(shortLivedToken) { + + let userId = shortLivedToken.user_id; + let shortLiveAccessToken = shortLivedToken.access_token; let longLiveAccessTokenData = await Requester.doGetRequest( "https://graph.instagram.com/access_token?grant_type=ig_exchange_token" + diff --git a/wwwroot/core/logging/logger.js b/wwwroot/core/logging/logger.js index 27f4bf6..bbabc5b 100644 --- a/wwwroot/core/logging/logger.js +++ b/wwwroot/core/logging/logger.js @@ -29,7 +29,7 @@ export class Logger{ await mkdir(logsDir, { recursive: true }); - await appendFile(fullPath, `${time} - ${message} -> ${JSON.stringify(error)} \n`); + await appendFile(fullPath, `${time} - ${message} -> ${error.message} \n`); console.error(`An error occured. The incident has been logged in ${fullPath}`) } catch (err) { console.error("Error writing log:", err); diff --git a/wwwroot/core/utils/requester.js b/wwwroot/core/utils/requester.js index d4df9b8..800de3c 100644 --- a/wwwroot/core/utils/requester.js +++ b/wwwroot/core/utils/requester.js @@ -24,12 +24,18 @@ export class Requester { headers: headers, body: body }) - .then(response => response.json()) + .then(async response => { + if (!response.ok) { + throw new Error(`HTTP ${response.status} ${response.statusText} : ${await response.text()}`); + } + return response.json() + }) .then(data => { return data; }) .catch(error => { Logger.error(`Unable to fetch`, error); + throw error; }); } } \ No newline at end of file diff --git a/wwwroot/oauth/index.html b/wwwroot/oauth/index.html deleted file mode 100644 index 96b7704..0000000 --- a/wwwroot/oauth/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - The Jailor auth - - -
- - - - \ No newline at end of file