instagram: add three more ways to get post info (#469)

for total of fucking SIX???
This commit is contained in:
wukko 2024-04-29 15:06:30 +06:00 committed by GitHub
parent 331f055367
commit d780192ada
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2,11 +2,38 @@ import { createStream } from "../../stream/manage.js";
import { genericUserAgent } from "../../config.js"; import { genericUserAgent } from "../../config.js";
import { getCookie, updateCookie } from "../cookie/manager.js"; import { getCookie, updateCookie } from "../cookie/manager.js";
const commonInstagramHeaders = { const commonHeaders = {
'user-agent': genericUserAgent, "user-agent": genericUserAgent,
'sec-gpc': '1', "sec-gpc": "1",
'sec-fetch-site': 'same-origin', "sec-fetch-site": "same-origin",
'x-ig-app-id': '936619743392459' "x-ig-app-id": "936619743392459"
}
const mobileHeaders = {
"x-ig-app-locale": "en_US",
"x-ig-device-locale": "en_US",
"x-ig-mapped-locale": "en_US",
"user-agent": "Instagram 275.0.0.27.98 Android (33/13; 280dpi; 720x1423; Xiaomi; Redmi 7; onclite; qcom; en_US; 458229237)",
"accept-language": "en-US",
"x-fb-http-engine": "Liger",
"x-fb-client-ip": "True",
"x-fb-server-cluster": "True",
"content-length": "0",
}
const embedHeaders = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "en-GB,en;q=0.9",
"Cache-Control": "max-age=0",
"Dnt": "1",
"Priority": "u=0, i",
"Sec-Ch-Ua": 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "macOS",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
} }
const cachedDtsg = { const cachedDtsg = {
@ -20,7 +47,7 @@ async function findDtsgId(cookie) {
const data = await fetch('https://www.instagram.com/', { const data = await fetch('https://www.instagram.com/', {
headers: { headers: {
...commonInstagramHeaders, ...commonHeaders,
cookie cookie
} }
}).then(r => r.text()); }).then(r => r.text());
@ -38,7 +65,7 @@ async function findDtsgId(cookie) {
async function request(url, cookie, method = 'GET', requestData) { async function request(url, cookie, method = 'GET', requestData) {
let headers = { let headers = {
...commonInstagramHeaders, ...commonHeaders,
'x-ig-www-claim': cookie?._wwwClaim || '0', 'x-ig-www-claim': cookie?._wwwClaim || '0',
'x-csrftoken': cookie?.values()?.csrftoken, 'x-csrftoken': cookie?.values()?.csrftoken,
cookie cookie
@ -60,26 +87,36 @@ async function request(url, cookie, method = 'GET', requestData) {
return data.json(); return data.json();
} }
async function requestMobileApi(id, cookie) {
const oembedURL = new URL('https://i.instagram.com/api/v1/oembed/');
oembedURL.searchParams.set('url', `https://www.instagram.com/p/${id}/`);
const oembed = await fetch(oembedURL, {
headers: {
...mobileHeaders,
cookie
}
}).then(r => r.json()).catch(() => {});
const mediaId = oembed?.media_id;
if (!mediaId) return false;
const mediaInfo = await fetch(`https://i.instagram.com/api/v1/media/${mediaId}/info/`, {
headers: {
...mobileHeaders,
cookie
}
}).then(r => r.json()).catch(() => {});
return mediaInfo?.items?.[0];
}
async function requestHTML(id, cookie) { async function requestHTML(id, cookie) {
const data = await fetch(`https://www.instagram.com/p/${id}/embed/captioned/`, { const data = await fetch(`https://www.instagram.com/p/${id}/embed/captioned/`, {
headers: { headers: {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", ...embedHeaders,
"Accept-Language": "en-GB,en;q=0.9", cookie
"Cache-Control": "max-age=0",
"Dnt": "1",
"Priority": "u=0, i",
"Sec-Ch-Ua": 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "macOS",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
...cookie
} }
}).then(r => r.text()); }).then(r => r.text()).catch(() => {});
let embedData = JSON.parse(data?.match(/"init",\[\],\[(.*?)\]\],/)[1]); let embedData = JSON.parse(data?.match(/"init",\[\],\[(.*?)\]\],/)[1]);
@ -196,25 +233,29 @@ function extractNewPost(data, id) {
} }
async function getPost(id) { async function getPost(id) {
let data, result, dataType = 'old'; let data, result;
try { try {
const cookie = getCookie('instagram'); const cookie = getCookie('instagram');
data = await requestHTML(id); // mobile api (no cookie, cookie)
data = await requestMobileApi(id);
if (!data && cookie) data = await requestMobileApi(id, cookie);
// html embed (no cookie, cookie)
if (!data) data = await requestHTML(id);
if (!data && cookie) data = await requestHTML(id, cookie); if (!data && cookie) data = await requestHTML(id, cookie);
if (!data) { // web app graphql api (no cookie, cookie)
dataType = 'new'; if (!data) data = await requestGQL(id);
data = await requestGQL(id, cookie); if (!data && cookie) data = await requestGQL(id, cookie);
}
} catch {} } catch {}
if (!data) return { error: 'ErrorCouldntFetch' }; if (!data) return { error: 'ErrorCouldntFetch' };
if (dataType === 'new') { if (data?.gql_data) {
result = extractNewPost(data, id)
} else {
result = extractOldPost(data, id) result = extractOldPost(data, id)
} else {
result = extractNewPost(data, id)
} }
if (result) return result; if (result) return result;