fb-group-unblocker
Version:
a powerfull group tool to unblock member.
324 lines (299 loc) • 11.2 kB
JavaScript
/*
* 2018/10/7 by Facoder & Illi
*/
;
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;