UNPKG

fb-group-unblocker

Version:

a powerfull group tool to unblock member.

324 lines (299 loc) 11.2 kB
/* * 2018/10/7 by Facoder & Illi */ 'use strict'; const bluebird = require("bluebird"); const request = bluebird.promisify(require("request").defaults({ jar: true })); const fs = require("fs"); const path = require("path"); const cheerio = require("cheerio"); var jar = request.jar(); function getHeaders(url, options) { var headers = { "Content-Type": "application/x-www-form-urlencoded", Referer: "https://www.facebook.com/", Host: url.replace("https://", "").split("/")[0], Origin: "https://www.facebook.com", "User-Agent": options.userAgent, Connection: "keep-alive" }; return headers; } function saveCookies(jar) { return function(res) { var cookies = res.headers["set-cookie"] || []; cookies.forEach(function(c) { if (c.indexOf(".facebook.com") > -1) { jar.setCookie(c, "https://www.facebook.com"); } var c2 = c.replace(/domain=\.facebook\.com/, "domain=.messenger.com"); jar.setCookie(c2, "https://www.messenger.com"); }); return res; }; } function getType(obj) { return Object.prototype.toString.call(obj).slice(8, -1); } function getFrom(str, startToken, endToken) { var start = str.indexOf(startToken) + startToken.length; if (start < startToken.length) return ""; var lastHalf = str.substring(start); var end = lastHalf.indexOf(endToken); if (end === -1) { throw Error( "Could not find endTime `" + endToken + "` in the given string." ); } return lastHalf.substring(0, end); } function arrayToObject(arr, getKey, getValue) { return arr.reduce(function(acc, val) { acc[getKey(val)] = getValue(val); return acc; }, {}); } function formatCookie(arr, url) { return ( arr[0] + "=" + arr[1] + "; Path=" + arr[3] + "; Domain=" + url + ".com" ); } function arrToForm(form) { return arrayToObject( form, function(v) { return v.name; }, function(v) { return v.val; } ); } function createForm(data,confirm,uid){ let form = { "jazoest": data.jazoest, "fb_dtsg": data.fb_dtsg, "__user": uid, "__a": "1", "__pc": "PHASED:DEFAULT", "__rev": data.revision, "__be": 1 } if (confirm) return () => Object.assign({"remove_block": "1"},form) else return (groupID,targetID) => Object.assign({ "group_id": groupID, "user_id": targetID, "action": "remove_block", "source": "profilebrowser_blocked", "nctr[_mod]": "pagelet_group_blocked", "__asyncDialog": "3" },form) } function createHeader(cookie){ return({ 'User-Agent': '"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"', 'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://www.facebook.com/groups/602067756856479/blocked/', 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', 'TE': 'Trailers', 'Cookie': cookie }) } const globalOption = { selfListen: false, listenEvents: false, updatePresence: false, forceLogin: false, logRecordSize: 100, userAgent: "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" } function get(url, jar, qs, options) { if (getType(qs) === "Object") { for (var prop in qs) { if (qs.hasOwnProperty(prop) && getType(qs[prop]) === "Object") { qs[prop] = JSON.stringify(qs[prop]); } } } var op = { headers: getHeaders(url, options), timeout: 60000, qs: qs, url: url, method: "GET", jar: jar, gzip: true }; return request(op).then(function(res) { return res; }); } function unblock(targetID,groupID,data){ return new Promise((resolve) => { function send(submit){ let querystring = { "group_id": groupID, "user_id": targetID, "dpr": "1" } let opt = { method: "POST", url: (submit) ? "https://www.facebook.com/ajax/groups/admin_post/" : "https://www.facebook.com/ajax/groups/admins_get.php", headers: createHeader(data.cookie), form: (submit) ? createForm(data,true)() : createForm(data,false)(groupID,targetID), qs: (submit) ? Object.assign({"source": "profilebrowser_blocked","operation": "confirm_remove_block"},querystring) : Object.assign({"action": "remove_block","source": "profilebrowser_blocked"}), timeout: 60000 } request(opt); } send(false); setTimeout(() => {send(true)},1000); resolve(targetID); }); } const requestp = require("request-promise"); /* var groupId = 123, // Group ID cooki = ``; // Your Cookie user = cooki.match(/(?<=c_user=)\d+(?=;)/g)[0], memIds = []; */ let memIds = []; function conv(obj) { return "?" + Object.keys(obj).map((e) => (obj[e] == "" || obj[e] == undefined) ? (`${encodeURIComponent(e)}=`) : (`${encodeURIComponent(e)}=${encodeURIComponent(obj[e])}`)).join("&"); } function getID(cur,groupID,data,uid) { let cookie = data.cookie; let param = {gid: groupID, order: "default", view: "list", cursor: cur, dpr: 1, __user: uid, __a: 1 }; return new Promise((resolve, reject) => { requestp({ uri: `https://www.facebook.com/ajax/browser/list/group_blocked_users/${conv(param)}`, headers: { "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", "Cookie": cookie } }).then((e) => { let ids = e.match(/(?<=member_)\d+(?=\\")/g), cur = e.match(/(?<=cursor=)\S+(?=&)/g), stat = e.match(/(?<=start=)\d+/g), data = {mem: ids, cursor: cur}; resolve(data); }) }); } function getAll(cur,groupID,data,uid,callback) { getID(cur,groupID,data,uid).then((e) => { if (e.mem) { callback(e.mem,() => { if (e.cursor != null) { getAll(e.cursor[0],groupID,data,uid,callback); } else return; }); } }); } function post(url, jar, form, options) { var op = { headers: getHeaders(url, options), timeout: 60000, url: url, method: "POST", form: form, jar: jar, gzip: true }; return request(op).then(function(res) { return res; }); } function getCookieData(jar) { return jar .getCookies("https://www.facebook.com") .concat(jar.getCookies("https://facebook.com")) .concat(jar.getCookies("https://www.messenger.com")); } const cpath = path.join(__dirname,"cookie.json"); const main = function(user_data,groupID,filter){ get('https://www.facebook.com/', null, null, globalOption).then(saveCookies(jar)).then((res) => { let email = user_data.email; let password = user_data.password; var html = res.body; var $ = cheerio.load(html); var arr = []; $("#login_form input").map(function(i, v){ arr.push({val: $(v).val(), name: $(v).attr("name")}); }); arr = arr.filter(function(v) { return v.val && v.val.length; }); var form = arrToForm(arr); form.lsd = getFrom(html, "[\"LSD\",[],{\"token\":\"", "\"}"); form.lgndim = new Buffer.from("{\"w\":1440,\"h\":900,\"aw\":1440,\"ah\":834,\"c\":24}").toString('base64'); form.email = email; form.pass = password; form.default_persistent = '0'; form.lgnrnd = getFrom(html, "name=\"lgnrnd\" value=\"", "\""); form.locale = 'en_US'; form.timezone = '240'; form.lgnjs = ~~(Date.now() / 1000); var willBeCookies = html.split("\"_js_"); willBeCookies.slice(1).map(function(val) { var cookieData = JSON.parse("[\"" + getFrom(val, "", "]") + "]"); jar.setCookie(formatCookie(cookieData, "facebook"), "https://www.facebook.com"); }); let apps = false; if (fs.existsSync(cpath)) { apps = JSON.parse(fs.readFileSync(cpath,"utf-8")); apps.map(function(c) { var str = c.key + "=" + c.value + "; expires=" + c.expires + "; domain=" + c.domain + "; path=" + c.path + ";"; jar.setCookie(str, "http://" + c.domain); }); get('https://www.facebook.com/', jar, null, globalOption) .then(saveCookies(jar)).then(function(res) { var html = res.body; var fb_dtsg = getFrom(html, 'name="fb_dtsg" value="', '"'); var revision = getFrom(html, 'revision":', ","); let cookie = ""; jar.getCookies("https://www.facebook.com").forEach(el => { el = el.toString(); let data = el.slice(0,el.indexOf(";")); cookie+=(data+";") }); var jazoest = "2"; for (var i = 0; i < fb_dtsg.length; i++) { jazoest += fb_dtsg.charCodeAt(i); } const uid = cookie.match(/(?<=c_user=)\d+(?=;)/g)[0]; let data = {fb_dtsg,revision,cookie,jazoest}; getAll(null,groupID,data,uid, function(ids,callback) { let arr = []; ids.map(id => {arr.push(unblock(id,groupID,data))}); Promise.all(arr).then(res => { res.map(id => console.log("\x1b[32m","[!Log],"+"\x1b[0m"+" đã gỡ chặn user "+id+".")); callback(); }); }) }); } else { post("https://www.facebook.com/login.php?login_attempt=1&lwv=110", jar, form, globalOption) .then(saveCookies(jar)) .then(function(res) { console.log("\x1b[33m","[WARN]","\x1b[0m"," đang tạo file cookie"); var headers = res.headers; if (!headers.location) { throw {error: "Sai tên tài khoản hoặc mật khẩu :("}; } else if (headers.location.indexOf('https://www.facebook.com/checkpoint/') > -1) { console.log("Checkpoint cmnr, :>."); } else { fs.writeFileSync(cpath,JSON.stringify(getCookieData(jar))); main(user_data,groupID,filter); } }) } }) } module.exports = main;