0% found this document useful (0 votes)
20 views

Function To Export Data To CSV - Automatic Scrooling

The document contains functions to export data to CSV, build a download button, process API responses, parse API response text, and run the main scraping logic. It intercepts network requests to Facebook's Graph API to scrape member data from groups and build a CSV file for download.

Uploaded by

Younes Amensar
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
20 views

Function To Export Data To CSV - Automatic Scrooling

The document contains functions to export data to CSV, build a download button, process API responses, parse API response text, and run the main scraping logic. It intercepts network requests to Facebook's Graph API to scrape member data from groups and build a CSV file for download.

Uploaded by

Younes Amensar
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 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