Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 5

// Function to export data to CSV

function exportToCsv(filename, data) {


var csvContent = "";
for (var i = 0; i < data.length; i++) {
csvContent += (function (row) {
var csvRow = "";
for (var j = 0; j < row.length; j++) {
var cell = null === row[j] || undefined === row[j] ? "" : row[j].toString();
cell = (cell instanceof Date) ? cell.toLocaleString() : cell;
cell = cell.replace(/"/g, '""');
if (j > 0) {
csvRow += ",";
}
csvRow += (cell.search(/("|,|\n)/g) >= 0) ? '"' + cell + '"' : cell;
}
return csvRow + "\n";
})(data[i]);
}

var blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });


var link = document.createElement("a");
if (undefined !== link.download) {
blob = URL.createObjectURL(blob);
link.setAttribute("href", blob);
link.setAttribute("download", filename);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}

// Function to build the download button


function buildCTABtn() {
var container = document.createElement("div");
container.setAttribute("style", [
"position: fixed;",
"top: 0;",
"left: 0;",
"z-index: 10;",
"width: 100%;",
"height: 100%;",
"pointer-events: none;"
].join(""));
var buttonContainer = document.createElement("div");
buttonContainer.setAttribute("style", [
"position: absolute;",
"bottom: 30px;",
"right: 130px;",
"color: white;",
"min-width: 150px;",
"background: var(--primary-button-background);",
"border-radius: var(--button-corner-radius);",
"padding: 0px 12px;",
"cursor: pointer;",
"font-weight: 600;",
"font-size: 15px;",
"display: inline-flex;",
"pointer-events: auto;",
"height: 36px;",
"align-items: center;",
"justify-content: center;"
].join(""));

var buttonText = document.createTextNode("Download ");


var memberCountSpan = document.createElement("span");
memberCountSpan.setAttribute("id", "fb-group-scraper-number-tracker");
memberCountSpan.textContent = "0";
var membersText = document.createTextNode(" members");

buttonContainer.appendChild(buttonText);
buttonContainer.appendChild(memberCountSpan);
buttonContainer.appendChild(membersText);

buttonContainer.addEventListener("click", function () {
var timestamp = (new Date).toISOString();
exportToCsv("groupMemberExport-" + timestamp + ".csv", window.members_list);
});

container.appendChild(buttonContainer);
document.body.appendChild(container);
return container;
}

// Function to process the API response


function processResponse(response) {
var data;
if (response.data && response.data.group) {
data = response.data.group;
} else {
if (response.data && response.data.node && response.data.node.__typename ===
"Group") {
data = response.data.node;
} else {
return;
}
}

var members;
if (data.new_members && data.new_members.edges) {
members = data.new_members.edges;
} else if (data.new_forum_members && data.new_forum_members.edges) {
members = data.new_forum_members.edges;
} else {
if (!data.search_results || !data.search_results.edges) {
return;
}
members = data.search_results.edges;
}

var parsedData = members.map(function (member) {


var node = member.node;
var id = node.id;
var name = node.name;
var link = node.url;
var bio = node.bio_text ? node.bio_text.text : "";
var imageSrc = node.profile_picture ? node.profile_picture.uri : "";
var groupId = (node.group_membership &&
node.group_membership.associated_group.id) || "";
var joinText = (member.join_status_text && member.join_status_text.text) ||
(node.membership && node.membership.join_status_text &&
node.membership.join_status_text.text) || "";
var profileType = node.__isProfile;
return [id, name, link, bio, imageSrc, groupId, joinText, profileType];
});

window.members_list.push.apply(window.members_list, parsedData);
var memberCountSpan = document.getElementById("fb-group-scraper-number-tracker");
if (memberCountSpan) {
memberCountSpan.textContent = window.members_list.length.toString();
}
}
// Function to parse API response
function parseResponse(responseText) {
var responses = [];
try {
responses.push(JSON.parse(responseText));
} catch (error) {
var lines = responseText.split("\n");
if (lines.length <= 1) {
console.error("Fail to parse API response", error);
return;
}
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
try {
responses.push(JSON.parse(line));
} catch (error) {
console.error("Fail to parse API response", error);
}
}
}

for (var j = 0; j < responses.length; j++) {


processResponse(responses[j]);
}
}

// Main function
function main() {
buildCTABtn();
var originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function () {
var xhr = this;
xhr.addEventListener("readystatechange", function () {
if (xhr.responseURL.includes("/api/graphql/") && xhr.readyState === 4) {
parseResponse(xhr.responseText);
}
}, false);
originalSend.apply(this, arguments);
};

// Auto-scrolling
var scrollInterval = setInterval(function () {
window.scrollBy(0, document.body.scrollHeight);
}, 1000); // Adjust scroll interval here (milliseconds)
}

window.members_list = window.members_list || [["Profile Id", "Full Name", "ProfileLink",


"Bio", "Image Src", "Groupe Id", "Group Joining Text", "Profile Type"]];
main();

You might also like