X / Twitter VIP PANEL v10.0
1. Tampermonkey Kurulumu
Tarayıcınıza Tampermonkey uzantısını yükleyin. Ardından uzantı ayarlarından Geliştirici Modunu açın ve gerekiyorsa Dosya URL'lerine erişim iznini etkinleştirin.
2. Scripti Ekleme
Yeni bir Tampermonkey script'i oluşturun ve aşağıdaki kopyala butonu ile kodu yapıştırın. Kaydedin ve sayfayı yenileyin.
3. Nasıl Kullanılır?
Twitter (X)'e giriş yaptıktan sonra sayfayı yenileyin. CODUM.TR VIP X PANEL açılacaktır ve butonları kullanabilirsiniz.
// ==UserScript==
// @name CODUM.TR VIP X PANEL
// @namespace https://codum.tr/
// @version 10.0
// @description CODUM.TR Özel Twitter (X) VIP Otomasyon Paneli (Neon Dark Theme + >_ Küçültülebilir)
// @author CODUM.TR
// @match https://x.com/*
// @match https://twitter.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=x.com
// @grant none
// ==/UserScript==
(function() {
'use strict';
const sleep = (min, max) => new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * (max - min + 1)) + min));
let isRunning = false;
let isMinimized = false;
// İSTATİSTİK MOTORU
let stats = JSON.parse(localStorage.getItem('codum_x_stats')) || { follow: 0, like: 0, unfollow: 0 };
function saveStats() {
localStorage.setItem('codum_x_stats', JSON.stringify(stats));
updateDashboardStats();
}
// EKRAN DÖNGÜSÜ (PANELİ CANLI TUTAR)
setInterval(() => {
if (!document.getElementById('codum-vip-panel')) {
createEnterpriseUI();
}
}, 2000);
// PANEL ARAYÜZÜ
function createEnterpriseUI() {
if (document.getElementById('codum-vip-panel')) return;
const panel = document.createElement('div');
panel.id = 'codum-vip-panel';
panel.style.cssText = `
position: fixed; top: 80px; right: 20px; width: 330px;
background-color: #0f141c; border-radius: 14px; z-index: 999999;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
box-shadow: 0 0 25px rgba(0, 255, 102, 0.2); color: #e6edf3;
overflow: hidden; border: 1.5px solid #00ff66; box-sizing: border-box;
`;
panel.innerHTML = `
<!-- Header (Sürükleme ve Logo Stili Küçültme Butonu) -->
<div id="codum-header" style="padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; cursor: move; user-select: none; background: #0c1017; border-bottom: 1px solid #1a222d;">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="color: #00ff66; font-family: monospace; font-weight: 900; font-size: 13px; letter-spacing: 0.5px;">>_ CODUM.TR VIP X PANEL</span>
</div>
<div style="display: flex; align-items: center; gap: 6px;">
<span style="background: #0c2b1a; color: #00ff66; border: 1px solid #00ff66; padding: 2px 6px; border-radius: 6px; font-size: 10px; font-family: monospace; font-weight: bold;">v10.0</span>
<button id="codum-toggle-btn" style="background: #080b10; color: #00ff66; border: 1px solid #00ff66; border-radius: 6px; width: 26px; height: 26px; font-family: monospace; font-weight: 900; font-size: 14px; cursor: pointer; display: flex; align-items: center; justify-content: center; outline: none; transition: all 0.2s;">_</button>
</div>
</div>
<!-- Panel Gövdesi (Açılır / Kapanır) -->
<div id="codum-panel-body" style="padding: 16px; display: block;">
<!-- Sayaçlar -->
<div style="display: flex; justify-content: space-around; text-align: center; background: #080b10; border-radius: 10px; padding: 10px; margin-bottom: 12px; border: 1px solid #1a222d;">
<div><div style="font-size: 11px; color: #8b949e; font-weight: 600; margin-bottom: 2px;">Takip</div><div id="st-fol" style="font-weight: 800; font-size: 16px; color: #00ff66;">0</div></div>
<div><div style="font-size: 11px; color: #8b949e; font-weight: 600; margin-bottom: 2px;">Beğeni</div><div id="st-lik" style="font-weight: 800; font-size: 16px; color: #ff2a8d;">0</div></div>
<div><div style="font-size: 11px; color: #8b949e; font-weight: 600; margin-bottom: 2px;">İşlem</div><div id="st-unf" style="font-weight: 800; font-size: 16px; color: #ff4747;">0</div></div>
</div>
<!-- Hız Seçeneği -->
<div style="margin-bottom: 10px;">
<select id="codum-speed" style="width: 100%; padding: 9px 12px; background: #080b10; color: #00ff66; border: 1px solid #1a222d; border-radius: 8px; font-weight: 700; font-size: 13px; outline: none; cursor: pointer;">
<option value="slow">🚶 Yavaş (Güvenli)</option>
<option value="medium" selected>🚶 Orta (Dengeli)</option>
<option value="fast">🏃 Hızlı (Riskli)</option>
<option value="very_fast">⚡ Çok Hızlı (Agresif)</option>
<option value="flight">🛸 Uçuş (Limit Tanımaz!)</option>
</select>
</div>
<!-- Arama Filtresi Input -->
<div style="margin-bottom: 12px;">
<input type="text" id="codum-keywords" placeholder="Arama Filtresi (Örn: kripto, yazılım)" style="width: 100%; padding: 9px 12px; background: #080b10; color: #e6edf3; border: 1px solid #1a222d; border-radius: 8px; font-size: 12px; outline: none; box-sizing: border-box;">
</div>
<!-- Buton Grid (2x3) -->
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 10px;">
<button id="btn-follow" style="padding: 10px; background: #080b10; color: #00ff66; border: 1px solid #00c853; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Takip Et</button>
<button id="btn-like" style="padding: 10px; background: #080b10; color: #ff2a8d; border: 1px solid #d81b60; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Beğeni</button>
<button id="btn-unfollow-non" style="padding: 10px; background: #080b10; color: #b388ff; border: 1px solid #7c4dff; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Unfollow</button>
<button id="btn-unfollow-all" style="padding: 10px; background: #080b10; color: #ff5252; border: 1px solid #ff1744; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Herkesi Takipten Çık</button>
<button id="btn-undo-rt" style="padding: 10px; background: #080b10; color: #00ff66; border: 1px solid #00c853; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">RT Sil</button>
<button id="btn-delete-tweet" style="padding: 10px; background: #080b10; color: #ffd600; border: 1px solid #ffab00; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Tweet Sil</button>
</div>
<!-- İşlemi Durdur Butonu -->
<button id="btn-stop" style="width: 100%; padding: 10px; background: #080b10; color: #ff3344; border: 1px solid #ff3344; border-radius: 8px; font-weight: bold; font-size: 13px; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 12px;">
<span style="font-size: 12px;">🔴</span> İşlemi Durdur
</button>
<!-- Status / Log Yazısı -->
<div id="codum-log" style="font-size: 12px; text-align: center; color: #00ff66; font-weight: bold;">Hazır bekleniyor...</div>
</div>
`;
document.body.appendChild(panel);
dragElement(panel, document.getElementById('codum-header'));
// Logo Şekilli Küçültme / Açma Butonu Entegrasyonu
const toggleBtn = document.getElementById('codum-toggle-btn');
const panelBody = document.getElementById('codum-panel-body');
toggleBtn.addEventListener('click', (e) => {
e.stopPropagation();
isMinimized = !isMinimized;
if (isMinimized) {
panelBody.style.display = 'none';
toggleBtn.innerText = '>';
toggleBtn.style.color = '#ffd600';
toggleBtn.style.borderColor = '#ffd600';
} else {
panelBody.style.display = 'block';
toggleBtn.innerText = '_';
toggleBtn.style.color = '#00ff66';
toggleBtn.style.borderColor = '#00ff66';
}
});
document.getElementById('btn-follow').addEventListener('click', () => startProcess('follow'));
document.getElementById('btn-like').addEventListener('click', () => startProcess('like'));
document.getElementById('btn-unfollow-non').addEventListener('click', () => startProcess('unfollow_non'));
document.getElementById('btn-unfollow-all').addEventListener('click', () => startProcess('unfollow_all'));
document.getElementById('btn-undo-rt').addEventListener('click', () => startProcess('unretweet'));
document.getElementById('btn-delete-tweet').addEventListener('click', () => startProcess('delete_tweet'));
document.getElementById('btn-stop').addEventListener('click', () => { isRunning = false; updateLog("İşlem Durduruldu.", "#ff3344"); });
}
function updateDashboardStats() {
if(document.getElementById('st-fol')) document.getElementById('st-fol').innerText = stats.follow;
if(document.getElementById('st-lik')) document.getElementById('st-lik').innerText = stats.like;
if(document.getElementById('st-unf')) document.getElementById('st-unf').innerText = stats.unfollow;
}
// OTOMASYON MOTORU
async function startProcess(type) {
if (isRunning) return updateLog("Zaten işlem çalışıyor!", "#ffd600");
isRunning = true;
const rawKeywords = document.getElementById('codum-keywords').value.toLowerCase();
const keywords = rawKeywords ? rawKeywords.split(',').map(k => k.trim()).filter(k => k) : [];
let actionName = type.includes('unfollow') ? "Takipten Çıkarma" : type === 'unretweet' ? "RT Silme" : type === 'delete_tweet' ? "Tweet Silme" : type === 'like' ? "Beğeni" : "Takip";
updateLog(`${actionName} başlatıldı...`, "#00ff66");
while (isRunning) {
let target = null;
let targetType = "unfollow";
if (type === 'follow') {
target = Array.from(document.querySelectorAll('[role="button"]')).find(btn => btn.innerText === 'Takip et' || btn.innerText === 'Follow');
targetType = "follow";
} else if (type === 'like') {
const likeBtns = document.querySelectorAll('[data-testid="like"]');
for(let btn of likeBtns) {
if (keywords.length > 0) {
const tweetContainer = btn.closest('[data-testid="tweet"]');
if (tweetContainer && keywords.some(k => tweetContainer.innerText.toLowerCase().includes(k))) {
target = btn; break;
}
} else {
target = btn; break;
}
}
targetType = "like";
} else if (type === 'unfollow_non') {
const userCells = Array.from(document.querySelectorAll('[data-testid="UserCell"]'));
for (let cell of userCells) {
const textContent = cell.innerText || "";
if (!textContent.includes("Seni takip ediyor") && !textContent.includes("Follows you")) {
const unfollowBtn = Array.from(cell.querySelectorAll('[role="button"]')).find(b => b.innerText === 'Takip ediliyor' || b.innerText === 'Following');
if (unfollowBtn) { target = unfollowBtn; break; }
}
}
} else if (type === 'unfollow_all') {
target = Array.from(document.querySelectorAll('[role="button"]')).find(btn => btn.innerText === 'Takip ediliyor' || btn.innerText === 'Following');
} else if (type === 'unretweet') {
target = document.querySelector('[data-testid="unretweet"]');
} else if (type === 'delete_tweet') {
target = Array.from(document.querySelectorAll('[data-testid="caret"]')).find(btn => !btn.dataset.codum);
}
if (target) {
target.scrollIntoView({ behavior: 'smooth', block: 'center' });
await sleep(300, 500);
if (!isRunning) break;
if (type === 'delete_tweet') {
target.dataset.codum = "1";
target.click();
await sleep(300, 500);
const menuItems = Array.from(document.querySelectorAll('[role="menuitem"]'));
const deleteBtn = menuItems.find(item => item.innerText === 'Sil' || item.innerText === 'Delete');
if (deleteBtn) {
deleteBtn.click();
await sleep(300, 500);
const confirmBtn = document.querySelector('[data-testid="confirmationSheetConfirm"]');
if (confirmBtn) { confirmBtn.click(); stats.unfollow++; saveStats(); updateLog(`Tweet Silindi!`, "#00ff66"); }
} else {
document.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'}));
}
} else if (type === 'unretweet') {
target.click();
await sleep(300, 500);
const confirmMenu = document.querySelector('[data-testid="unretweetConfirm"]');
if (confirmMenu) { confirmMenu.click(); stats.unfollow++; saveStats(); updateLog(`RT Silindi!`, "#00ff66"); }
else { document.dispatchEvent(new KeyboardEvent('keydown', {'key': 'Escape'})); }
} else {
target.click();
if(targetType === "follow") stats.follow++;
else if(targetType === "like") stats.like++;
else stats.unfollow++;
saveStats();
updateLog(`İşlem yapıldı! (${stats[targetType]})`, "#00ff66");
if (type === 'unfollow_non' || type === 'unfollow_all') {
await sleep(300, 500);
const confirmBtn = document.querySelector('[data-testid="confirmationSheetConfirm"]');
if (confirmBtn) confirmBtn.click();
}
}
const speedSetting = document.getElementById('codum-speed').value;
let minWait, maxWait;
switch(speedSetting) {
case 'slow': minWait = 3000; maxWait = 5000; break;
case 'medium': minWait = 1500; maxWait = 3000; break;
case 'fast': minWait = 800; maxWait = 1500; break;
case 'very_fast': minWait = 400; maxWait = 800; break;
case 'flight': minWait = 100; maxWait = 300; break;
}
await sleep(minWait, maxWait);
} else {
updateLog(`Aşağı kaydırılıyor... ⬇️`, "#ffd600");
window.scrollBy(0, 800);
await sleep(1500, 2500);
}
}
updateLog("İşlem Durduruldu. ✅", "#ff3344");
}
function updateLog(msg, color) {
const logDiv = document.getElementById('codum-log');
if (logDiv) { logDiv.innerText = msg; logDiv.style.color = color; }
}
function dragElement(elmnt, header) {
let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
header.onmousedown = (e) => {
e.preventDefault();
pos3 = e.clientX; pos4 = e.clientY;
document.onmouseup = () => { document.onmouseup = null; document.onmousemove = null; };
document.onmousemove = (e) => {
e.preventDefault();
pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY;
pos3 = e.clientX; pos4 = e.clientY;
elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
elmnt.style.right = "auto";
};
};
}
})();
Instagram VIP PANEL v3.0.0
1. Tampermonkey Kurulumu
Tarayıcınıza Tampermonkey uzantısını yükleyin. Ardından uzantı ayarlarından Geliştirici Modunu açın ve gerekiyorsa Dosya URL'lerine erişim iznini etkinleştirin.
2. Scripti Ekleme
Instagram için aşağıdaki kodu 📋 KOPYALA ile alın, Tampermonkey'de yeni script açıp yapıştırın ve kaydedin.
3. Nasıl Kullanılır?
Instagram sitesine giriş yapın, sayfayı yenileyin ve panel butonlarını kullanın.
Instagram hesabında script panelini açın, tarama başlatın ve takip etmeyenleri listeden seçip bırakın.
// ==UserScript==
// @name CODUM.TR INSTAGRAM VIP PANEL
// @namespace https://codum.tr/
// @version 3.0.0
// @description Instagram Seni Takip Etmeyenleri Bulma ve Otomatik Unfollow Paneli
// @author CODUM.TR
// @match https://www.instagram.com/*
// @match https://instagram.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=instagram.com
// @grant none
// @run-at document-idle
// ==/UserScript==
(() => {
"use strict";
if (!location.hostname.includes("instagram.com")) return;
const APP_ID = "iu-app";
const STYLE_ID = "iu-style";
const STORAGE_KEY = "iu_state_v3";
const IG_HEADERS = { "x-ig-app-id": "936619743392459", "x-requested-with": "XMLHttpRequest" };
const PANEL_WIDTH = 380;
const state = { mode: "idle", users: [], selected: new Set() };
function injectStyles() {
if (document.getElementById(STYLE_ID)) return;
const style = document.createElement("style");
style.id = STYLE_ID;
style.textContent = `
#${APP_ID} { position: fixed; inset: 0; pointer-events: none; z-index: 2147483647; color: #f1f3f5; font-family: sans-serif; font-size: 14px; }
#${APP_ID} > * { pointer-events: auto; }
#${APP_ID} .iu-panel { position: absolute; width: ${PANEL_WIDTH}px; background: #0d1117; border: 1px solid #20e371; border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,0.8); overflow: hidden; right: 18px; bottom: 18px; }
#${APP_ID} .iu-header { display: flex; justify-content: space-between; align-items: center; padding: 12px; background: #161b22; border-bottom: 1px solid #21262d; }
#${APP_ID} .iu-brand-text strong { color: #20e371; font-size: 13px; }
#${APP_ID} .iu-welcome { padding: 24px 18px; text-align: center; }
#${APP_ID} .iu-btn { background: #161b22; border: 1px solid #20e371; color: #20e371; padding: 8px 16px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-top: 10px; }
#${APP_ID} .iu-btn:hover { background: #20e371; color: #0d1117; }
#${APP_ID} .iu-progress { padding: 20px; }
#${APP_ID} .iu-bar { height: 6px; background: rgba(255,255,255,0.1); border-radius: 3px; overflow: hidden; margin: 10px 0; }
#${APP_ID} .iu-bar > span { display: block; height: 100%; background: #20e371; transition: width 0.3s; }
#${APP_ID} .iu-list { max-height: 40vh; overflow-y: auto; border-top: 1px solid #21262d; border-bottom: 1px solid #21262d; }
#${APP_ID} .iu-row { display: grid; grid-template-columns: 20px 36px 1fr; gap: 8px; padding: 8px 12px; align-items: center; border-bottom: 1px solid #161b22; }
#${APP_ID} .iu-avatar { width: 32px; height: 32px; border-radius: 50%; object-fit: cover; }
#${APP_ID} .iu-actionbar { display: flex; justify-content: space-between; padding: 10px 12px; background: #0d1117; }
`;
document.head.appendChild(style);
}
function mount() {
let root = document.getElementById(APP_ID);
if (!root) { root = document.createElement("div"); root.id = APP_ID; document.body.appendChild(root); }
injectStyles();
renderShell();
}
function renderShell() {
const root = document.getElementById(APP_ID);
if (!root) return;
root.innerHTML = `
<section class="iu-panel">
<header class="iu-header">
<div class="iu-brand-text"><strong>>_ CODUM.TR INSTAGRAM VIP</strong></div>
</header>
<div id="iu-body"></div>
</section>
`;
renderBody();
}
function renderBody() {
const body = document.getElementById("iu-body");
if (!body) return;
if (state.mode === "scanning") {
body.innerHTML = `<div class="iu-progress"><h2>Takip Ettikleriniz Yükleniyor...</h2><div class="iu-bar"><span style="width:50%"></span></div></div>`;
} else if (state.mode === "results") {
const nonFollowers = state.users.filter(u => !u.follows_viewer);
body.innerHTML = `
<div class="iu-results">
<div style="padding:10px; font-size:12px; color:#8b949e;">${nonFollowers.length} takip etmeyen bulundu</div>
<div class="iu-list">${nonFollowers.map(u => `
<div class="iu-row">
<input type="checkbox" ${state.selected.has(u.id) ? 'checked' : ''} onclick="window.iuToggle('${u.id}')">
<img class="iu-avatar" src="${u.profile_pic_url}" alt="">
<div style="font-size:12px; font-weight:bold;">@${u.username}</div>
</div>
`).join('')}</div>
<div class="iu-actionbar">
<button class="iu-btn" onclick="window.iuUnfollow()">Takibi Bırak (${state.selected.size})</button>
</div>
</div>
`;
} else {
body.innerHTML = `
<div class="iu-welcome">
<h2>Hazır olduğunda başlat</h2>
<p style="font-size:12px; color:#8b949e; margin-top:6px;">Sadece takip ettikleriniz taranır ve geri takip yapmayanlar listelenir.</p>
<button class="iu-btn" id="iu-scan-btn">Taramayı Başlat</button>
</div>
`;
document.getElementById("iu-scan-btn")?.addEventListener("click", startScan);
}
}
function getCookie(name) {
const match = document.cookie.match(new RegExp("(^|; )" + name.replace(/[.*+?^$${}()|[\]\\]/g, "\\$&") + "=([^;]*)"));
return match ? decodeURIComponent(match[2]) : null;
}
async function startScan() {
const viewerId = getCookie("ds_user_id");
if (!viewerId) { alert("Instagram çerezi okunamadı. Oturum açtığınızdan emin olun."); return; }
state.mode = "scanning";
state.users = [];
renderBody();
try {
let cursor = "";
while (true) {
const variables = { id: viewerId, include_reel: true, fetch_mutual: false, first: 24 };
if (cursor) variables.after = cursor;
const url = `/graphql/query/?query_hash=3dec7e2c57367ef3da3d987d89f9dbc8&variables=${encodeURIComponent(JSON.stringify(variables))}`;
const res = await fetch(url, { headers: IG_HEADERS, credentials: "include" });
const json = await res.json();
const edge = json?.data?.user?.edge_follow;
if (!edge?.edges) break;
state.users.push(...edge.edges.map(e => ({
id: String(e.node.id),
username: String(e.node.username),
profile_pic_url: String(e.node.profile_pic_url),
follows_viewer: Boolean(e.node.follows_viewer)
})));
cursor = edge.page_info?.end_cursor;
if (!edge.page_info?.has_next_page || !cursor) break;
await new Promise(r => setTimeout(r, 800));
}
state.mode = "results";
renderBody();
} catch (e) {
alert("Hata: " + e.message);
state.mode = "idle";
renderBody();
}
}
window.iuToggle = id => {
if (state.selected.has(id)) state.selected.delete(id);
else state.selected.add(id);
renderBody();
};
window.iuUnfollow = async () => {
const csrf = getCookie("csrftoken");
if (!csrf) return alert("csrftoken okunamadı.");
for (let id of Array.from(state.selected)) {
await fetch(`/api/v1/friendships/destroy/${id}/`, {
method: "POST", credentials: "include",
headers: { ...IG_HEADERS, "content-type": "application/x-www-form-urlencoded", "x-csrftoken": csrf }
});
state.selected.delete(id);
state.users = state.users.filter(u => u.id !== id);
renderBody();
await new Promise(r => setTimeout(r, 4000));
}
alert("Tamamlandı!");
};
mount();
})();
Threads VIP PANEL v2.0
1. Tampermonkey Kurulumu
Tarayıcınıza Tampermonkey uzantısını yükleyin. Ardından uzantı ayarlarından Geliştirici Modunu açın ve gerekiyorsa Dosya URL'lerine erişim iznini etkinleştirin.
2. Scripti Ekleme
Threads için aşağıdaki kodu 📋 KOPYALA ile alın, Tampermonkey'de yeni script açıp yapıştırın ve kaydedin.
3. Nasıl Kullanılır?
Threads sitesine giriş yapın, sayfayı yenileyin ve panel butonlarını kullanın.
Threads sayfasında paneli açıp etkileşim/takip işlemlerini yönetebilirsiniz.
console.log("Threads script placeholder");
Tumblr VIP PANEL v10.0
1. Tampermonkey Kurulumu
Tarayıcınıza Tampermonkey uzantısını yükleyin. Ardından uzantı ayarlarından Geliştirici Modunu açın ve gerekiyorsa Dosya URL'lerine erişim iznini etkinleştirin.
2. Scripti Ekleme
Tumblr için aşağıdaki kodu 📋 KOPYALA ile alın, Tampermonkey'de yeni script açıp yapıştırın ve kaydedin.
3. Nasıl Kullanılır?
Tumblr sitesine giriş yapın, sayfayı yenileyin ve panel butonlarını kullanın.
Tumblr sayfasında script panelini kullanarak otomasyon işlemlerini başlatabilirsiniz.
// ==UserScript==
// @name CODUM.TR VIP TUMBLR PANEL v10.0
// @namespace https://codum.tr/
// @version 10.0
// @description CODUM.TR Tumblr VIP Otomasyon Paneli (Neon Dark Theme)
// @author Codum.tr
// @match *://*.tumblr.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// --- DURUM & HAFIZA YÖNETİMİ ---
const ProcessedElements = new Set();
let actionTimeout = null;
let modalInterval = null;
let isRunning = false;
// Hız Ayarları
const SPEED_SETTINGS = {
slow: { min: 2000, max: 3500 },
medium: { min: 800, max: 1600 },
fast: { min: 400, max: 800 },
turbo: { min: 150, max: 350 }
};
let currentSpeed = 'medium';
const stats = {
takip: 0,
begeni: 0,
islem: 0
};
// --- ARAYÜZ (PANEL - NEON DARK THEME) ---
const panelHTML = `
<div id="codumVipPanel" style="position: fixed; top: 70px; right: 20px; width: 330px; background-color: #0f141c; border-radius: 14px; z-index: 999999; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; box-shadow: 0 0 25px rgba(0, 255, 102, 0.15); color: #e6edf3; overflow: hidden; border: 1.5px solid #00ff66; box-sizing: border-box;">
<!-- Header -->
<div id="panelHeader" style="padding: 14px 16px 10px 16px; display: flex; justify-content: space-between; align-items: center; cursor: move; user-select: none;">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="color: #00ff66; font-family: monospace; font-weight: 900; font-size: 14px; letter-spacing: 0.5px;">>_ CODUM.TR VIP TUMBLR PANEL</span>
</div>
<span style="background: #0c2b1a; color: #00ff66; border: 1px solid #00ff66; padding: 2px 8px; border-radius: 6px; font-size: 11px; font-family: monospace; font-weight: bold;">v10.0</span>
</div>
<div style="padding: 0 16px 16px 16px;">
<!-- Sayaçlar (Takip, Beğeni, İşlem) -->
<div style="display: flex; justify-content: space-around; text-align: center; background: #080b10; border-radius: 10px; padding: 10px; margin-bottom: 12px; border: 1px solid #1a222d;">
<div><div style="font-size: 11px; color: #8b949e; font-weight: 600; margin-bottom: 2px;">Takip</div><div id="statTakip" style="color: #00ff66; font-weight: 800; font-size: 16px;">0</div></div>
<div><div style="font-size: 11px; color: #8b949e; font-weight: 600; margin-bottom: 2px;">Beğeni</div><div id="statBegeni" style="color: #ff2a8d; font-weight: 800; font-size: 16px;">0</div></div>
<div><div style="font-size: 11px; color: #8b949e; font-weight: 600; margin-bottom: 2px;">İşlem</div><div id="statIslem" style="color: #ff4747; font-weight: 800; font-size: 16px;">0</div></div>
</div>
<!-- Hız Seçim Dropdown -->
<div style="margin-bottom: 10px;">
<select id="speedSelect" style="width: 100%; padding: 9px 12px; background: #080b10; color: #00ff66; border: 1px solid #1a222d; border-radius: 8px; font-weight: 700; font-size: 13px; outline: none; cursor: pointer;">
<option value="slow">🚶 Yavaş (Güvenli)</option>
<option value="medium" selected>🚶 Orta (Dengeli)</option>
<option value="fast">🏃 Hızlı</option>
<option value="turbo">🚀 Turbo</option>
</select>
</div>
<!-- Arama Filtresi Input -->
<div style="margin-bottom: 12px;">
<input type="text" id="filterInput" placeholder="Arama Filtresi (Örn: art, blog)" style="width: 100%; padding: 9px 12px; background: #080b10; color: #e6edf3; border: 1px solid #1a222d; border-radius: 8px; font-size: 12px; outline: none; box-sizing: border-box;">
</div>
<!-- Butonlar -->
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 8px;">
<button id="btnFollow" style="padding: 10px; background: #080b10; color: #00ff66; border: 1px solid #00c853; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Takip Et</button>
<button id="btnLike" style="padding: 10px; background: #080b10; color: #ff2a8d; border: 1px solid #d81b60; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer;">Beğeni</button>
</div>
<button id="btnUnfollowAll" style="width: 100%; padding: 10px; background: #080b10; color: #ff5252; border: 1px solid #ff1744; border-radius: 8px; font-weight: bold; font-size: 12px; cursor: pointer; margin-bottom: 10px;">Herkesi Takipten Çık</button>
<!-- İşlemi Durdur Butonu -->
<button id="btnStop" style="width: 100%; padding: 10px; background: #080b10; color: #ff3344; border: 1px solid #ff3344; border-radius: 8px; font-weight: bold; font-size: 13px; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 12px;">
<span style="font-size: 12px;">🔴</span> İşlemi Durdur
</button>
<!-- Durum Yazısı -->
<div id="statusText" style="font-size: 12px; text-align: center; color: #00ff66; font-weight: bold;">Hazır bekleniyor...</div>
</div>
</div>
`;
document.body.insertAdjacentHTML('beforeend', panelHTML);
const codumVipPanel = document.getElementById('codumVipPanel');
const panelHeader = document.getElementById('panelHeader');
const statusText = document.getElementById('statusText');
const statTakip = document.getElementById('statTakip');
const statBegeni = document.getElementById('statBegeni');
const statIslem = document.getElementById('statIslem');
const speedSelect = document.getElementById('speedSelect');
speedSelect.addEventListener('change', (e) => {
currentSpeed = e.target.value;
});
// --- DRAG & DROP (PANELİ SÜRÜKLEME) ---
let isDragging = false, currentX, currentY, initialX, initialY, xOffset = 0, yOffset = 0;
panelHeader.addEventListener("mousedown", (e) => {
initialX = e.clientX - xOffset;
initialY = e.clientY - yOffset;
isDragging = true;
});
document.addEventListener("mouseup", () => { isDragging = false; });
document.addEventListener("mousemove", (e) => {
if (isDragging) {
e.preventDefault();
currentX = e.clientX - initialX;
currentY = e.clientY - initialY;
xOffset = currentX;
yOffset = currentY;
codumVipPanel.style.transform = `translate3d(${currentX}px, ${currentY}px, 0)`;
}
});
// --- YARDIMCI FONKSİYONLAR ---
const getRandomDelay = () => {
const config = SPEED_SETTINGS[currentSpeed] || SPEED_SETTINGS.medium;
return Math.floor(Math.random() * (config.max - config.min + 1)) + config.min;
};
const updateStatus = (text, color = "#00ff66") => {
statusText.innerText = text;
statusText.style.color = color;
};
const incrementIslem = () => {
stats.islem++;
statIslem.innerText = stats.islem;
};
const stopAllProcess = () => {
if (actionTimeout) clearTimeout(actionTimeout);
if (modalInterval) clearInterval(modalInterval);
isRunning = false;
updateStatus("İşlem Durduruldu.", "#ff3344");
};
document.getElementById('btnStop').addEventListener('click', stopAllProcess);
// Tumblr Onay Pencerelerini Otomatik Kapatıcı (Unfollow Modal Killer)
function startModalKiller() {
modalInterval = setInterval(() => {
const buttons = document.querySelectorAll('[role="dialog"] button, .glass-overlay button, .modal button, div[data-is-modal] button');
buttons.forEach(btn => {
const txt = (btn.textContent || '').toLowerCase();
if (['bırak', 'kaldır', 'evet', 'unfollow', 'tamam', 'confirm', 'ok'].some(t => txt.includes(t))) {
btn.click();
}
});
}, 250);
}
// --- OTOMASYON MOTORLARI ---
// 1. TAKİP ET
const runFollowLoop = () => {
if (!isRunning) return;
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'));
const target = buttons.find(btn => {
if (ProcessedElements.has(btn)) return false;
if (btn.closest('#codumVipPanel')) return false;
const txt = (btn.textContent || '').toLowerCase().trim();
const aria = (btn.getAttribute('aria-label') || '').toLowerCase().trim();
if (txt.includes('bırak') || aria.includes('bırak') || txt.includes('unfollow') || txt.includes('following')) {
ProcessedElements.add(btn);
return false;
}
return txt === 'takip et' || txt === 'follow' || aria === 'takip et' || aria === 'follow';
});
if (target) {
ProcessedElements.add(target);
target.click();
stats.takip++;
statTakip.innerText = stats.takip;
incrementIslem();
updateStatus(`Takip Edildi: ${stats.takip}`, "#00ff66");
actionTimeout = setTimeout(runFollowLoop, getRandomDelay());
} else {
updateStatus("Tumblr blogları taranıyor...", "#00ff66");
window.scrollBy(0, 800);
actionTimeout = setTimeout(runFollowLoop, getRandomDelay() + 1000);
}
};
document.getElementById('btnFollow').addEventListener('click', () => {
if (isRunning) return;
isRunning = true;
updateStatus("Takip İşlemi Çalışıyor...", "#00ff66");
runFollowLoop();
});
// 2. BEĞENİ
const runLikeLoop = () => {
if (!isRunning) return;
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'));
const target = buttons.find(btn => {
if (ProcessedElements.has(btn)) return false;
if (btn.closest('#codumVipPanel')) return false;
const aria = (btn.getAttribute('aria-label') || '').toLowerCase();
const title = (btn.getAttribute('title') || '').toLowerCase();
const isLiked = btn.querySelector('svg[data-is-liked="true"]') || btn.classList.contains('is-liked');
if (isLiked || aria.includes('vazgeç') || aria.includes('unlike') || title.includes('unlike')) {
ProcessedElements.add(btn);
return false;
}
return aria.includes('beğen') || aria === 'like' || title.includes('beğen') || title === 'like';
});
if (target) {
ProcessedElements.add(target);
target.click();
stats.begeni++;
statBegeni.innerText = stats.begeni;
incrementIslem();
updateStatus(`Beğenildi: ${stats.begeni}`, "#ff2a8d");
actionTimeout = setTimeout(runLikeLoop, getRandomDelay());
} else {
updateStatus("Aşağı kaydırılıyor...", "#ff2a8d");
window.scrollBy(0, 800);
actionTimeout = setTimeout(runLikeLoop, getRandomDelay() + 1000);
}
};
document.getElementById('btnLike').addEventListener('click', () => {
if (isRunning) return;
isRunning = true;
updateStatus("Beğeni İşlemi Çalışıyor...", "#ff2a8d");
runLikeLoop();
});
// 3. HERKESİ TAKİPTEN ÇIK
const runUnfollowLoop = () => {
if (!isRunning) return;
const buttons = Array.from(document.querySelectorAll('button, [role="button"]'));
const target = buttons.find(btn => {
if (ProcessedElements.has(btn)) return false;
if (btn.closest('#codumVipPanel')) return false;
const txt = (btn.textContent || '').toLowerCase();
const aria = (btn.getAttribute('aria-label') || '').toLowerCase();
return txt.includes('takibi bırak') || aria.includes('takibi bırak') || txt.includes('unfollow') || txt.includes('takip ediliyor');
});
if (target) {
ProcessedElements.add(target);
target.click();
incrementIslem();
updateStatus(`Takipten Çıkarılıyor...`, "#ff5252");
actionTimeout = setTimeout(runUnfollowLoop, getRandomDelay());
} else {
window.scrollBy(0, 1000);
actionTimeout = setTimeout(runUnfollowLoop, getRandomDelay() + 1000);
}
};
document.getElementById('btnUnfollowAll').addEventListener('click', () => {
if (isRunning) return;
isRunning = true;
updateStatus("Herkesi Takipten Çıkarılıyor...", "#ff5252");
startModalKiller();
runUnfollowLoop();
});
})();
Netflix VIP PANEL v7.1
1. Tampermonkey Kurulumu
Tarayıcınıza Tampermonkey uzantısını yükleyin. Ardından uzantı ayarlarından Geliştirici Modunu açın ve gerekiyorsa Dosya URL'lerine erişim iznini etkinleştirin.
2. Scripti Ekleme
Netflix için aşağıdaki kodu 📋 KOPYALA ile alın, Tampermonkey'de yeni script açıp yapıştırın ve kaydedin.
3. Nasıl Kullanılır?
Netflix sitesine giriş yapın, sayfayı yenileyin ve panel butonlarını kullanın.
Netflix viewing activity sayfasında script panelini açın, isterseniz CSV yükleyin veya sayfayı taratın.
// ==UserScript==
// @name CODUM.TR NETFLİX ANALİZATÖR VIP
// @namespace http://tampermonkey.net/
// @version 7.1
// @description CODUM.TR - Netflix VIP İzleme Analiz Paneli
// @author CODUM.TR
// @match https://www.netflix.com/viewingactivity*
// @match https://www.netflix.com/*/viewingactivity*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// ==/UserScript==
(function() {
'use strict';
class CodumNetflixAnalyzer {
constructor() {
if (document.getElementById('codum-vip-panel')) return;
this.shows = new Map();
this.movies = [];
this.totalEpisodes = 0;
this.isAnalyzing = false;
this.watchedEpisodes = new Set();
this.watchedMovies = new Set();
this.dataSource = 'none';
this.init();
}
init() {
this.createPanel();
this.loadData();
this.setupEvents();
setTimeout(() => {
if (this.dataSource !== 'csv') {
this.scrapePage();
}
}, 1500);
}
createPanel() {
const panel = document.createElement('div');
panel.id = 'codum-vip-panel';
panel.innerHTML = `
<style>
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;600;700;800;900&family=Inter:wght@300;400;500;600;700&display=swap');
#codum-vip-panel * {
margin: 0;
padding: 0;
box-sizing: border-box;
}
#codum-vip-panel {
position: fixed;
top: 80px;
right: 24px;
z-index: 999999;
width: 360px;
max-height: 85vh;
overflow-y: auto;
background: #0a0a0f;
border-radius: 20px;
padding: 24px;
border: 2px solid #ff0040;
box-shadow:
0 0 30px rgba(255, 0, 64, 0.2),
0 0 60px rgba(255, 0, 64, 0.08),
inset 0 0 30px rgba(255, 0, 64, 0.03);
color: #fff;
font-family: 'Inter', sans-serif;
transition: all 0.3s ease;
}
#codum-vip-panel::-webkit-scrollbar {
width: 4px;
}
#codum-vip-panel::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.02);
}
#codum-vip-panel::-webkit-scrollbar-thumb {
background: #ff0040;
border-radius: 10px;
}
/* ===== HEADER ===== */
.neon-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 16px;
border-bottom: 1px solid rgba(255, 0, 64, 0.15);
}
.neon-header .brand {
display: flex;
align-items: center;
}
.neon-header .brand .info h3 {
font-family: 'Orbitron', monospace;
font-size: 16px;
font-weight: 800;
background: linear-gradient(90deg, #ff0040, #ff6b9d, #ff0040);
background-size: 200% auto;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: neonText 3s linear infinite;
letter-spacing: 0.5px;
}
@keyframes neonText {
0% { background-position: 0% center; }
100% { background-position: 200% center; }
}
.neon-header .brand .info .badge-container {
display: flex;
align-items: center;
gap: 6px;
margin-top: 4px;
}
.neon-header .brand .info .badge {
font-size: 9px;
font-weight: 700;
padding: 2px 8px;
border-radius: 20px;
font-family: 'Orbitron', monospace;
letter-spacing: 0.5px;
text-transform: uppercase;
}
.neon-header .brand .info .badge.csv {
background: rgba(0, 255, 255, 0.1);
border: 1px solid rgba(0, 255, 255, 0.2);
color: #00ffff;
}
.neon-header .brand .info .badge.page {
background: rgba(255, 0, 64, 0.1);
border: 1px solid rgba(255, 0, 64, 0.2);
color: #ff0040;
}
.neon-header .brand .info .badge.vip {
background: linear-gradient(135deg, #ffd700, #ffaa00);
color: #000;
font-weight: 900;
}
.neon-header .close-btn {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.3);
width: 32px;
height: 32px;
border-radius: 10px;
cursor: pointer;
font-size: 16px;
transition: all 0.3s;
display: flex;
align-items: center;
justify-content: center;
}
.neon-header .close-btn:hover {
background: rgba(255, 0, 64, 0.1);
border-color: #ff0040;
color: #ff0040;
}
/* ===== DROP ZONE ===== */
.neon-drop {
border: 2px dashed rgba(255, 0, 64, 0.2);
border-radius: 14px;
padding: 18px 16px;
text-align: center;
margin-bottom: 18px;
cursor: pointer;
transition: all 0.3s ease;
background: rgba(255, 0, 64, 0.02);
}
.neon-drop:hover {
border-color: rgba(255, 0, 64, 0.5);
background: rgba(255, 0, 64, 0.05);
}
.neon-drop.dragover {
border-color: #ff0040;
background: rgba(255, 0, 64, 0.08);
transform: scale(1.01);
}
.neon-drop .icon {
font-size: 26px;
display: block;
margin-bottom: 4px;
}
.neon-drop .main-text {
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.7);
}
.neon-drop .main-text strong {
color: #ff0040;
}
.neon-drop .sub-text {
font-size: 10px;
color: rgba(255, 255, 255, 0.25);
margin-top: 4px;
}
#file-input { display: none; }
.file-info {
display: none;
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
text-align: center;
padding: 6px 0 12px 0;
border-bottom: 1px solid rgba(255, 0, 64, 0.08);
margin-bottom: 16px;
}
.file-info.show { display: block; }
.file-info .name { color: #00ffff; font-weight: 600; }
/* ===== STATS ===== */
.neon-stats {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 8px;
margin-bottom: 16px;
}
.neon-stat {
background: rgba(255, 255, 255, 0.02);
border-radius: 12px;
padding: 12px 8px;
text-align: center;
border: 1px solid rgba(255, 255, 255, 0.04);
transition: all 0.3s;
}
.neon-stat:hover {
transform: translateY(-2px);
border-color: rgba(255, 0, 64, 0.3);
}
.neon-stat .number {
font-family: 'Orbitron', monospace;
font-size: 22px;
font-weight: 800;
letter-spacing: 1px;
}
.neon-stat .number.red { color: #ff0040; }
.neon-stat .number.cyan { color: #00ffff; }
.neon-stat .number.pink { color: #ff6b9d; }
.neon-stat .label {
font-size: 8px;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.3);
font-weight: 600;
margin-top: 4px;
font-family: 'Orbitron', monospace;
}
/* ===== TOP LIST ===== */
.neon-top {
background: rgba(255, 255, 255, 0.01);
border-radius: 12px;
padding: 12px 14px;
margin-bottom: 14px;
border: 1px solid rgba(255, 0, 64, 0.08);
max-height: 150px;
overflow-y: auto;
}
.neon-top::-webkit-scrollbar { width: 3px; }
.neon-top::-webkit-scrollbar-thumb { background: #ff0040; border-radius: 10px; }
.neon-top .top-header {
display: flex;
justify-content: space-between;
font-size: 9px;
color: rgba(255, 255, 255, 0.25);
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
padding-bottom: 6px;
border-bottom: 1px solid rgba(255, 0, 64, 0.08);
margin-bottom: 6px;
font-family: 'Orbitron', monospace;
}
.neon-top .top-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 5px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.02);
}
.neon-top .top-item .rank {
font-size: 10px;
color: rgba(255, 255, 255, 0.2);
font-weight: 700;
width: 24px;
font-family: 'Orbitron', monospace;
}
.neon-top .top-item .name {
flex: 1;
font-size: 11px;
color: rgba(255, 255, 255, 0.8);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: 0 8px;
}
.neon-top .top-item .count {
font-size: 10px;
font-weight: 700;
color: #ff0040;
background: rgba(255, 0, 64, 0.08);
padding: 1px 8px;
border-radius: 20px;
font-family: 'Orbitron', monospace;
}
.neon-top .empty-state {
color: rgba(255, 255, 255, 0.15);
font-size: 11px;
text-align: center;
padding: 16px 0;
font-family: 'Orbitron', monospace;
}
/* ===== PROGRESS ===== */
.neon-progress {
margin: 12px 0 8px 0;
display: none;
}
.neon-progress.active { display: block; }
.neon-progress .bar {
height: 3px;
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
overflow: hidden;
}
.neon-progress .bar .fill {
height: 100%;
background: linear-gradient(90deg, #ff0040, #00ffff);
width: 0%;
transition: width 0.3s;
}
.neon-progress .text {
font-size: 9px;
color: rgba(255, 255, 255, 0.3);
text-align: center;
margin-top: 4px;
font-family: 'Orbitron', monospace;
}
/* ===== BUTTONS ===== */
.neon-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.neon-actions .full { grid-column: 1 / -1; }
.neon-btn {
padding: 10px 14px;
border: none;
border-radius: 10px;
font-size: 10px;
font-weight: 700;
cursor: pointer;
transition: all 0.3s;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-family: 'Orbitron', monospace;
text-transform: uppercase;
}
.neon-btn-primary {
background: linear-gradient(135deg, #ff0040, #cc0033);
color: #fff;
box-shadow: 0 4px 15px rgba(255, 0, 64, 0.25);
}
.neon-btn-primary:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(255, 0, 64, 0.4);
}
.neon-btn-primary:disabled { opacity: 0.3; cursor: not-allowed; }
.neon-btn-secondary {
background: rgba(255, 255, 255, 0.03);
color: rgba(255, 255, 255, 0.6);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.neon-btn-secondary:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.08);
color: #fff;
}
.neon-btn-danger {
background: rgba(255, 0, 64, 0.05);
color: rgba(255, 0, 64, 0.6);
border: 1px solid rgba(255, 0, 64, 0.15);
}
.neon-btn-danger:hover:not(:disabled) {
background: rgba(255, 0, 64, 0.15);
color: #ff0040;
}
/* ===== STATUS ===== */
.neon-status {
margin-top: 14px;
padding: 8px 12px;
border-radius: 8px;
font-size: 10px;
text-align: center;
background: rgba(255, 255, 255, 0.02);
color: rgba(255, 255, 255, 0.3);
border: 1px solid rgba(255, 255, 255, 0.04);
font-family: 'Orbitron', monospace;
}
.neon-status.success { background: rgba(0, 255, 200, 0.05); color: #00ffc8; border-color: rgba(0, 255, 200, 0.1); }
.neon-status.info { background: rgba(0, 255, 255, 0.05); color: #00ffff; border-color: rgba(0, 255, 200, 0.1); }
.neon-status.warning { background: rgba(255, 107, 157, 0.05); color: #ff6b9d; border-color: rgba(255, 107, 157, 0.1); }
/* ===== MINI TOGGLE ===== */
.neon-toggle {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 999998;
width: 50px;
height: 50px;
border-radius: 14px;
background: #0a0a0f;
border: 2px solid #ff0040;
color: #ff0040;
font-size: 14px;
font-weight: 900;
font-family: 'Orbitron', monospace;
cursor: pointer;
box-shadow: 0 0 20px rgba(255, 0, 64, 0.2);
display: none;
align-items: center;
justify-content: center;
}
.neon-toggle:hover { transform: scale(1.05); }
</style>
<!-- PANEL -->
<div class="neon-header">
<div class="brand">
<div class="info">
<h3>CODUM.TR</h3>
<div class="badge-container">
<span class="badge vip">VIP</span>
<span class="badge page" id="source-badge">⚡ SAYFA</span>
</div>
</div>
</div>
<button class="close-btn" id="panel-close">✕</button>
</div>
<!-- DROP ZONE -->
<div class="neon-drop" id="drop-zone">
<span class="icon">📂</span>
<div class="main-text">
<strong>CSV</strong> dosyasını sürükle veya tıkla
</div>
<div class="sub-text">Netflix CSV geçmiş dosyasını yükle</div>
</div>
<input type="file" id="file-input" accept=".csv">
<div class="file-info" id="file-info">
📄 <span class="name" id="file-name">dosya.csv</span> aktarıldı
</div>
<!-- STATS -->
<div class="neon-stats">
<div class="neon-stat">
<div class="number red" id="stat-shows">0</div>
<div class="label">Diziler</div>
</div>
<div class="neon-stat">
<div class="number cyan" id="stat-episodes">0</div>
<div class="label">Bölümler</div>
</div>
<div class="neon-stat">
<div class="number pink" id="stat-movies">0</div>
<div class="label">Filmler</div>
</div>
</div>
<!-- TOP LIST -->
<div class="neon-top">
<div class="top-header">
<span>🏆 EN ÇOK İZLENENLER</span>
<span>✦</span>
</div>
<div id="top-list">
<div class="empty-state">VERİ YOK</div>
</div>
</div>
<!-- PROGRESS -->
<div class="neon-progress" id="progress-wrap">
<div class="bar">
<div class="fill" id="progress-fill"></div>
</div>
<div class="text" id="progress-text">TARANIYOR...</div>
</div>
<!-- ACTIONS -->
<div class="neon-actions">
<button class="neon-btn neon-btn-primary full" id="btn-scan">⟳ SAYFAYI TARA</button>
<button class="neon-btn neon-btn-secondary" id="btn-export">⤓ DIŞA AKTAR</button>
<button class="neon-btn neon-btn-danger" id="btn-reset">✕ TEMİZLE</button>
</div>
<!-- STATUS -->
<div class="neon-status" id="status">
⚡ CODUM.TR Hazır
</div>
<!-- MINI TOGGLE -->
<button class="neon-toggle" id="mini-toggle">CODUM</button>
`;
document.body.appendChild(panel);
}
// ========== EVENT LİSTENER ==========
setupEvents() {
const dropZone = document.getElementById('drop-zone');
const fileInput = document.getElementById('file-input');
dropZone.addEventListener('click', () => fileInput.click());
dropZone.addEventListener('dragover', (e) => {
e.preventDefault();
dropZone.classList.add('dragover');
});
dropZone.addEventListener('dragleave', () => {
dropZone.classList.remove('dragover');
});
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
dropZone.classList.remove('dragover');
if (e.dataTransfer.files.length > 0) {
this.handleFile(e.dataTransfer.files[0]);
}
});
fileInput.addEventListener('change', (e) => {
if (e.target.files.length > 0) {
this.handleFile(e.target.files[0]);
}
});
document.getElementById('btn-scan').addEventListener('click', () => this.fullScan());
document.getElementById('btn-export').addEventListener('click', () => this.exportData());
document.getElementById('btn-reset').addEventListener('click', () => this.resetData());
document.getElementById('panel-close').addEventListener('click', () => this.togglePanel());
document.getElementById('mini-toggle').addEventListener('click', () => this.togglePanel());
}
togglePanel() {
const panel = document.getElementById('codum-vip-panel');
const toggle = document.getElementById('mini-toggle');
if (panel.style.display === 'none') {
panel.style.display = 'block';
toggle.style.display = 'none';
} else {
panel.style.display = 'none';
toggle.style.display = 'flex';
}
}
// ========== CSV İŞLEME ==========
handleFile(file) {
if (!file.name.endsWith('.csv')) {
this.setStatus('Lütfen geçerli CSV dosyası yükleyin', 'warning');
return;
}
this.shows.clear();
this.movies = [];
this.totalEpisodes = 0;
this.watchedEpisodes.clear();
this.watchedMovies.clear();
this.setStatus(`${file.name} işleniyor...`, 'info');
document.getElementById('file-name').textContent = file.name;
document.getElementById('file-info').classList.add('show');
const badge = document.getElementById('source-badge');
badge.textContent = '📁 CSV';
badge.className = 'badge csv';
this.dataSource = 'csv';
const reader = new FileReader();
reader.onload = (e) => {
try {
this.parseCSV(e.target.result);
this.setStatus(`✅ ${file.name} başarıyla yüklendi!`, 'success');
} catch (err) {
this.setStatus('CSV okunamadı: ' + err.message, 'warning');
}
};
reader.readAsText(file, 'UTF-8');
}
parseCSV(content) {
const lines = content.split('\n').filter(line => line.trim());
let startIndex = 0;
for (let i = 0; i < Math.min(lines.length, 5); i++) {
if (lines[i].toLowerCase().includes('title')) {
startIndex = i + 1;
break;
}
}
for (let i = startIndex; i < lines.length; i++) {
const line = lines[i];
const parts = line.split(',');
let title = parts[0]?.trim();
if (title && title.startsWith('"')) title = title.substring(1);
if (title && title.endsWith('"')) title = title.substring(0, title.length - 1);
title = title?.replace(/^"|"$/g, '').trim();
if (!title || title.length < 2) continue;
const uniqueId = title;
if (title.includes(':')) {
const showName = title.split(':')[0].trim();
if (showName) {
if (!this.shows.has(showName)) {
this.shows.set(showName, { episodes: 0 });
}
if (!this.watchedEpisodes.has(uniqueId)) {
const show = this.shows.get(showName);
show.episodes = (show.episodes || 0) + 1;
this.totalEpisodes++;
this.watchedEpisodes.add(uniqueId);
}
}
} else {
if (!this.watchedMovies.has(uniqueId)) {
if (!this.movies.includes(title)) {
this.movies.push(title);
}
this.watchedMovies.add(uniqueId);
}
}
}
this.saveData();
this.updateUI();
}
// ========== SAYFA TARAMA ==========
scrapePage() {
if (this.dataSource === 'csv') return;
const rows = document.querySelectorAll('.retableRow .title a, [data-uia="item-title"]');
if (!rows || rows.length === 0) return;
let newShows = 0;
let newEpisodes = 0;
rows.forEach(el => {
const title = el.innerText?.trim();
if (!title) return;
const uniqueId = title;
if (title.includes(':')) {
const showName = title.split(':')[0].trim();
if (showName) {
if (!this.shows.has(showName)) {
this.shows.set(showName, { episodes: 0 });
newShows++;
}
if (!this.watchedEpisodes.has(uniqueId)) {
const show = this.shows.get(showName);
show.episodes = (show.episodes || 0) + 1;
this.totalEpisodes++;
this.watchedEpisodes.add(uniqueId);
newEpisodes++;
}
}
} else {
if (!this.watchedMovies.has(uniqueId)) {
if (!this.movies.includes(title)) {
this.movies.push(title);
}
this.watchedMovies.add(uniqueId);
}
}
});
if (newShows > 0 || newEpisodes > 0) {
this.saveData();
this.updateUI();
this.setStatus(`✅ ${newShows} yeni dizi, ${newEpisodes} yeni bölüm eklendi`, 'success');
}
}
// ========== TAM TARAMA ==========
fullScan() {
if (this.isAnalyzing) return;
if (this.dataSource === 'csv') {
this.setStatus('⚠️ CSV modundasınız, sayfa taranamaz!', 'warning');
return;
}
this.isAnalyzing = true;
const btn = document.getElementById('btn-scan');
const progressWrap = document.getElementById('progress-wrap');
const progressFill = document.getElementById('progress-fill');
const progressText = document.getElementById('progress-text');
btn.disabled = true;
btn.textContent = '⟳ TARANIYOR...';
progressWrap.classList.add('active');
let lastHeight = 0;
let scrollCount = 0;
let previousTotal = this.totalEpisodes;
const timer = setInterval(() => {
window.scrollTo(0, document.body.scrollHeight);
this.scrapePage();
scrollCount++;
const currentHeight = document.body.scrollHeight;
const progress = Math.min((scrollCount / 30) * 100, 95);
progressFill.style.width = progress + '%';
progressText.textContent = `TARANIYOR... %${Math.round(progress)}`;
if (currentHeight === lastHeight || scrollCount >= 80) {
clearInterval(timer);
progressFill.style.width = '100%';
progressText.textContent = '✓ TAMAMLANDI';
setTimeout(() => {
progressWrap.classList.remove('active');
btn.disabled = false;
btn.textContent = '⟳ SAYFAYI TARA';
this.isAnalyzing = false;
const totalNew = this.totalEpisodes - previousTotal;
if (totalNew > 0) {
this.setStatus(`✅ Tarama bitti! ${totalNew} yeni bölüm eklendi`, 'success');
} else {
this.setStatus('⚡ Veriler zaten güncel', 'info');
}
}, 600);
}
lastHeight = currentHeight;
}, 500);
}
// ========== VERİ YÖNETİMİ ==========
saveData() {
try {
const data = {
shows: Object.fromEntries(this.shows),
movies: this.movies,
totalEpisodes: this.totalEpisodes,
watchedEpisodes: Array.from(this.watchedEpisodes),
watchedMovies: Array.from(this.watchedMovies),
dataSource: this.dataSource
};
GM_setValue('codum_netflix_data', JSON.stringify(data));
} catch (e) {}
}
loadData() {
try {
const saved = GM_getValue('codum_netflix_data');
if (saved) {
const data = JSON.parse(saved);
this.shows = new Map(Object.entries(data.shows || {}));
this.movies = data.movies || [];
this.totalEpisodes = data.totalEpisodes || 0;
this.watchedEpisodes = new Set(data.watchedEpisodes || []);
this.watchedMovies = new Set(data.watchedMovies || []);
this.dataSource = data.dataSource || 'page';
const badge = document.getElementById('source-badge');
if (this.dataSource === 'csv') {
badge.textContent = '📁 CSV';
badge.className = 'badge csv';
} else {
badge.textContent = '⚡ SAYFA';
badge.className = 'badge page';
}
this.updateUI();
return true;
}
} catch (e) {}
return false;
}
// ========== UI GÜNCELLE ==========
updateUI() {
document.getElementById('stat-shows').textContent = this.shows.size || 0;
document.getElementById('stat-episodes').textContent = this.totalEpisodes || 0;
document.getElementById('stat-movies').textContent = this.movies.length || 0;
const sorted = Array.from(this.shows.entries())
.sort((a, b) => (b[1]?.episodes || 0) - (a[1]?.episodes || 0))
.slice(0, 6);
const container = document.getElementById('top-list');
if (sorted.length === 0) {
container.innerHTML = '<div class="empty-state">VERİ YOK</div>';
} else {
container.innerHTML = sorted.map(([name, data], index) => `
<div class="top-item">
<span class="rank">#${index + 1}</span>
<span class="name">${this.escapeHtml(name)}</span>
<span class="count">${data?.episodes || 0}</span>
</div>
`).join('');
}
}
// ========== DIŞA AKTAR ==========
exportData() {
if (this.shows.size === 0 && this.movies.length === 0) {
this.setStatus('Dışa aktarılacak veri yok', 'warning');
return;
}
const data = {
site: "codum.tr",
shows: Object.fromEntries(this.shows),
movies: this.movies,
totalEpisodes: this.totalEpisodes,
totalShows: this.shows.size,
totalMovies: this.movies.length,
dataSource: this.dataSource,
exportDate: new Date().toISOString()
};
const json = JSON.stringify(data, null, 2);
const blob = new Blob([json], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `codum_netflix_analiz_${new Date().toISOString().slice(0,10)}.json`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
this.setStatus('✅ Veriler JSON olarak aktarıldı!', 'success');
}
// ========== SIFIRLA ==========
resetData() {
if (!confirm('⚡ Tüm CODUM.TR verileri silinecektir. Onaylıyor musunuz?')) return;
this.shows.clear();
this.movies = [];
this.totalEpisodes = 0;
this.watchedEpisodes.clear();
this.watchedMovies.clear();
this.dataSource = 'none';
GM_deleteValue('codum_netflix_data');
document.getElementById('file-info').classList.remove('show');
const badge = document.getElementById('source-badge');
badge.textContent = '⚡ SAYFA';
badge.className = 'badge page';
this.updateUI();
this.setStatus('🗑️ Veriler temizlendi', '');
}
// ========== YARDIMCI ==========
setStatus(text, type = '') {
const el = document.getElementById('status');
const emoji = text.match(/^[^\s]+/)?.[0] || '⚡';
const cleanText = text.replace(/^[^\s]+\s/, '');
el.innerHTML = `${emoji} ${cleanText || text}`;
el.className = 'neon-status' + (type ? ' ' + type : '');
}
escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
}
// ========== BAŞLAT ==========
window.addEventListener('load', () => {
setTimeout(() => new CodumNetflixAnalyzer(), 1200);
});
})();