(async () => {
// =============================
// HÀM HỖ TRỢ
// =============================
function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }
// Lấy token từ HTML
let html = document.documentElement.innerHTML;
let fb_dtsg = (html.match(/"token":"(.*?)"/) || [])[1];
let lsd_token = (html.match(/"LSD",\[\],{[^}]*"token":"(.*?)"/) || [])[1];
let jazoest = (html.match(/jazoest=(\d+)/) || [])[1];
let c_user = (document.cookie.match(/c_user=(\d+)/) || [])[1];
if (!fb_dtsg || !lsd_token || !jazoest || !c_user) {
alert("Không tìm thấy đủ token, hãy mở trang accountscenter.facebook.com/personal_info rồi chạy lại!");
return;
}
// =============================
// LẤY DANH SÁCH EMAIL
// =============================
let payload = new URLSearchParams({
'__user': c_user,
'fb_dtsg': fb_dtsg,
'jazoest': jazoest,
'lsd': lsd_token,
'variables': JSON.stringify({"interface":"FB_WEB"}),
'doc_id': "9849298431773678"
});
let res = await fetch("https://accountscenter.facebook.com/api/graphql/", {
method: "POST",
headers: {
"content-type": "application/x-www-form-urlencoded",
"x-fb-lsd": lsd_token
},
body: payload
});
let data = await res.json();
let confirmed_emails = [];
for (let cp of data.data.fxcal_settings.node.all_contact_points) {
if (cp.contact_point_type === "EMAIL" && !cp.has_any_pending_status) {
confirmed_emails.push(cp.normalized_contact_point);
}
}
if (confirmed_emails.length === 0) {
alert("Không tìm thấy email nào đã xác nhận!");
return;
}
// =============================
// TẠO FORM TRÊN WEB
// =============================
let div = document.createElement("div");
div.style = `
position:fixed;
top:10px;
right:10px;
z-index:999999;
background:#2c3e50;
color:#ecf0f1;
padding:20px;
border:2px solid #1abc9c;
border-radius:12px;
max-height:90vh;
overflow:auto;
font-size:14px;
box-shadow: 0px 4px 20px rgba(0,0,0,0.2);
font-family: 'Arial', sans-serif;
transition: all 0.3s ease;
`;
div.innerHTML = `
<h3 style="margin:0 0 15px 0; color:#1abc9c; font-size:22px; text-align:center;">Tool Xóa Email</h3>
<div id="email-list" style="margin-bottom:15px; max-height:200px; overflow:auto; font-size:14px;"></div>
<label style="color:#95a5a6; display:block; margin-bottom:10px;">Số luồng: <input id="threads" type="number" value="100" style="width:70px; padding:5px; border-radius:5px; border:1px solid #ecf0f1; background:#34495e; color:#ecf0f1; font-size:14px;"></label>
<label style="color:#95a5a6; display:block; margin-bottom:10px;">Delay(ms): <input id="delay" type="number" value="0" style="width:90px; padding:5px; border-radius:5px; border:1px solid #ecf0f1; background:#34495e; color:#ecf0f1; font-size:14px;"></label>
<label style="color:#95a5a6; display:block; margin-bottom:15px;">
<input type="checkbox" id="autoStop"> Tự dừng khi rate-limit
</label>
<label style="color:#95a5a6; display:block; margin-bottom:15px;">Chế độ:
<select id="mode" style="padding:5px; border-radius:5px; border:1px solid #ecf0f1; background:#34495e; color:#ecf0f1; font-size:14px;">
<option value="sequential">Lần lượt</option>
<option value="concurrent">Đồng thời</option>
</select>
</label>
<div style="text-align:center;">
<button id="startBtn" style="
background:#16a085;
color:white;
padding:12px 20px;
border:none;
border-radius:5px;
font-size:16px;
cursor:pointer;
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
transition: background 0.3s ease;">
▶️ Chạy
</button>
<button id="stopBtn" style="
background:#e74c3c;
color:white;
padding:12px 20px;
border:none;
border-radius:5px;
font-size:16px;
cursor:pointer;
box-shadow: 0px 2px 10px rgba(0, 0, 0, 0.1);
transition: background 0.3s ease;">
⏹ Dừng
</button>
</div>
<div id="log" style="margin-top:15px; max-height:200px; overflow:auto; background:#2c3e50; padding:10px; color:#ecf0f1;"></div>
`;
document.body.appendChild(div);
let emailListDiv = div.querySelector("#email-list");
confirmed_emails.forEach(e => {
let id = "chk_" + e.replace(/[@.]/g, "_");
emailListDiv.innerHTML += `<label style="display:block; margin-bottom:5px; color:#ecf0f1;"><input type="checkbox" id="${id}" value="${e}"> ${e}</label>`;
});
let logDiv = div.querySelector("#log");
function log(msg) {
logDiv.innerHTML += msg + "<br>";
logDiv.scrollTop = logDiv.scrollHeight;
}
// =============================
// HÀM GỬI REQUEST XÓA
// =============================
async function deleteEmail(email) {
let payload = new URLSearchParams({
'__user': c_user,
'fb_dtsg': fb_dtsg,
'jazoest': jazoest,
'lsd': lsd_token,
'variables': JSON.stringify({
"normalized_contact_point": email,
"contact_point_type": "EMAIL",
"selected_accounts": [c_user],
"client_mutation_id": "mutation_" + Date.now() ,
"family_device_id":"device_id_fetch_datr"
}),
'doc_id': "9452525451539774"
});
let r = await fetch("https://accountscenter.facebook.com/api/graphql/", {
method: "POST",
headers: {"content-type": "application/x-www-form-urlencoded", "x-fb-lsd": lsd_token},
body: payload
});
return r.json();
}
// =============================
// LOGIC XÓA
// =============================
let stopFlag = false;
div.querySelector("#stopBtn").onclick = () => {
stopFlag = true;
log("⏹ Dừng!");
};
div.querySelector("#startBtn").onclick = async () => {
stopFlag = false;
log("▶️ Bắt đầu chạy...");
let threads = parseInt(div.querySelector("#threads").value);
let delay = parseInt(div.querySelector("#delay").value);
let autoStop = div.querySelector("#autoStop").checked;
let mode = div.querySelector("#mode").value;
let selected = confirmed_emails.filter(e => div.querySelector(`#chk_${e.replace(/[@.]/g, "_")}`).checked);
if (selected.length === 0) {
alert("Chưa chọn email!");
return;
}
// =============================
// XỬ LÝ XÓA EMAIL VỚI HÌNH THỨC CHẠY LƯỚI
// =============================
async function runEmail(email) {
while (!stopFlag) {
let workers = [];
for (let i = 0; i < threads; i++) {
workers.push(deleteEmail(email).then(resp => {
if (resp.errors) {
if (resp.errors[0].code === 1675004) {
log(`[${email}] ❌ Rate limit reached!`);
if (autoStop) {
stopFlag = true; // Stop immediately when rate limit is hit
log("⚠️ Đã dừng vì đạt rate-limit.");
}
} else {
log(`[${email}] ❌ Thất bại`);
}
} else if (resp.data?.xfb_delete_contact_point?.[0]?.mutation_data?.success) {
log(`[${email}] ✅ Thành công!`);
return "done";
} else {
log(`[${email}] ❌ Lỗi khác`);
}
}));
}
let results = await Promise.all(workers);
if (results.includes("done")) break;
await sleep(delay);
}
}
if (mode === "concurrent") {
await Promise.all(selected.map(e => runEmail(e)));
} else {
for (let e of selected) {
if (stopFlag) break;
await runEmail(e);
}
}
log("🏁 Hoàn tất!");
};
})();