Integrate full instagram oauth
This commit is contained in:
26
app.js
26
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(`
|
||||
<html lang="en">
|
||||
<head><title>Authentication</title></head>
|
||||
<body>${resMsg}</body>
|
||||
</html>
|
||||
`);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/health", (req, res) => {
|
||||
|
||||
78
bot.js
78
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)
|
||||
}
|
||||
} catch(err){
|
||||
await Logger.error("Unexpected error", err)
|
||||
}
|
||||
}
|
||||
|
||||
export {launch}
|
||||
|
||||
@@ -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" +
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>The Jailor auth</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="result-text"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<script type="module">
|
||||
import {data} from "../core/appData.js";
|
||||
|
||||
try{
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const code = urlParams.get("code");
|
||||
|
||||
await data.instagramTokenManager.generate(code)
|
||||
|
||||
document.querySelector("#code").innerText = "Authentication successful. You can close this tab";
|
||||
} catch(err){
|
||||
document.querySelector("#code").innerText = "Authentication failed.";
|
||||
}
|
||||
|
||||
</script>
|
||||
Reference in New Issue
Block a user