şehirleri arayıp çıkan sunucuları test etme özeliği
arma yeri sorunu hala devam ediyor
// ==UserScript==
// @name Speedtest.net Otomatik Türkiye Sunucu Testi (Geliştirilmiş ve Hatalara Dayanıklı)
// @namespace http://tampermonkey.net/
// @version 3.18
// @description Speedtest.net'te otomatik olarak Türkiye'deki farklı şehirlerdeki sunucularla test yapar, sonuçları kaydeder ve aynı sunucuyu tekrar test etmez. Açılır menü ile şehir seçimi yapılır.
// @author AI Yardımcısı
// @match https://www.speedtest.net/
// @icon https://www.google.com/s2/favicons?sz=64&domain=speedtest.net
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @grant GM_addStyle
// @grant GM_download
// ==/UserScript==
(function() {
'use strict';
// Stil ekleme
GM_addStyle(`
#test-status {
position: fixed;
top: 10px;
left: 10px;
background-color: rgba(0, 0, 0, 0.7);
color: white;
padding: 10px;
border-radius: 5px;
z-index: 9999;
}
#reset-button {
position: fixed;
top: 10px;
right: 10px;
background-color: rgba(255, 0, 0, 0.7);
color: white;
padding: 10px 20px;
border-radius: 5px;
z-index: 9999;
cursor: pointer;
}
#log-container {
position: fixed;
bottom: 10px;
left: 10px;
width: 300px;
height: 200px;
background-color: rgba(0, 0, 0, 0.7);
color: white;
padding: 10px;
border-radius: 5px;
overflow-y: auto;
z-index: 9998;
}
#city-selector {
position: fixed;
top: 60px;
left: 10px;
background-color: rgba(0, 0, 0, 0.7);
color: white;
padding: 10px;
border-radius: 5px;
z-index: 9999;
}
`);
// UI Elemanları Oluşturma
let testStatusDiv = document.createElement('div');
testStatusDiv.id = 'test-status';
document.body.appendChild(testStatusDiv);
let resetButton = document.createElement('div');
resetButton.id = 'reset-button';
resetButton.textContent = 'Sunucu Listesini Sıfırla';
document.body.appendChild(resetButton);
let logContainer = document.createElement('div');
logContainer.id = 'log-container';
document.body.appendChild(logContainer);
let citySelectorDiv = document.createElement('div');
citySelectorDiv.id = 'city-selector';
citySelectorDiv.innerHTML = `
<label for="city-dropdown">Şehir Seç:</label>
<select id="city-dropdown">
<option value="Adana">Adana</option>
<option value="Adıyaman">Adıyaman</option>
<option value="Afyonkarahisar">Afyonkarahisar</option>
<option value="Ağrı">Ağrı</option>
<option value="Amasya">Amasya</option>
<option value="Ankara">Ankara</option>
<option value="Antalya">Antalya</option>
<option value="Artvin">Artvin</option>
<option value="Aydın">Aydın</option>
<option value="Balıkesir">Balıkesir</option>
<option value="Bilecik">Bilecik</option>
<option value="Bingöl">Bingöl</option>
<option value="Bitlis">Bitlis</option>
<option value="Bolu">Bolu</option>
<option value="Burdur">Burdur</option>
<option value="Bursa">Bursa</option>
<option value="Çanakkale">Çanakkale</option>
<option value="Çankırı">Çankırı</option>
<option value="Çorum">Çorum</option>
<option value="Denizli">Denizli</option>
<option value="Diyarbakır">Diyarbakır</option>
<option value="Edirne">Edirne</option>
<option value="Elazığ">Elazığ</option>
<option value="Erzincan">Erzincan</option>
<option value="Erzurum">Erzurum</option>
<option value="Eskişehir">Eskişehir</option>
<option value="Gaziantep">Gaziantep</option>
<option value="Giresun">Giresun</option>
<option value="Gümüşhane">Gümüşhane</option>
<option value="Hakkari">Hakkari</option>
<option value="Hatay">Hatay</option>
<option value="Isparta">Isparta</option>
<option value="Mersin">Mersin</option>
<option value="İstanbul">İstanbul</option>
<option value="İzmir">İzmir</option>
<option value="Kars">Kars</option>
<option value="Kastamonu">Kastamonu</option>
<option value="Kayseri">Kayseri</option>
<option value="Kırklareli">Kırklareli</option>
<option value="Kırşehir">Kırşehir</option>
<option value="Kocaeli">Kocaeli</option>
<option value="Konya">Konya</option>
<option value="Kütahya">Kütahya</option>
<option value="Malatya">Malatya</option>
<option value="Manisa">Manisa</option>
<option value="Kahramanmaraş">Kahramanmaraş</option>
<option value="Mardin">Mardin</option>
<option value="Muğla">Muğla</option>
<option value="Muş">Muş</option>
<option value="Nevşehir">Nevşehir</option>
<option value="Niğde">Niğde</option>
<option value="Ordu">Ordu</option>
<option value="Rize">Rize</option>
<option value="Sakarya">Sakarya</option>
<option value="Samsun">Samsun</option>
<option value="Siirt">Siirt</option>
<option value="Sinop">Sinop</option>
<option value="Sivas">Sivas</option>
<option value="Tekirdağ">Tekirdağ</option>
<option value="Tokat">Tokat</option>
<option value="Trabzon">Trabzon</option>
<option value="Tunceli">Tunceli</option>
<option value="Şanlıurfa">Şanlıurfa</option>
<option value="Uşak">Uşak</option>
<option value="Van">Van</option>
<option value="Yozgat">Yozgat</option>
<option value="Zonguldak">Zonguldak</option>
<option value="Aksaray">Aksaray</option>
<option value="Bayburt">Bayburt</option>
<option value="Karaman">Karaman</option>
<option value="Kırıkkale">Kırıkkale</option>
<option value="Batman">Batman</option>
<option value="Şırnak">Şırnak</option>
<option value="Bartın">Bartın</option>
<option value="Ardahan">Ardahan</option>
<option value="Iğdır">Iğdır</option>
<option value="Yalova">Yalova</option>
<option value="Karabük">Karabük</option>
<option value="Kilis">Kilis</option>
<option value="Osmaniye">Osmaniye</option>
<option value="Düzce">Düzce</option>
</select>
<button id="start-tests">Testleri Başlat</button>
<button id="start-all-tests">Tüm Şehirlerde Test Başlat</button>
`;
document.body.appendChild(citySelectorDiv);
// Durum ve Log Mesajları
const showStatus = (message) => {
testStatusDiv.textContent = message;
};
const logMessage = (message) => {
let logEntry = document.createElement('div');
logEntry.textContent = message;
logContainer.appendChild(logEntry);
logContainer.scrollTop = logContainer.scrollHeight;
};
// Sıfırlama Butonu
resetButton.addEventListener('click', () => {
testedServers = [];
GM_setValue('testedServers', testedServers);
logMessage("Sunucu listesi sıfırlandı.");
showStatus("Sunucu listesi sıfırlandı.");
});
// Test Edilen Sunucular
let testedServers = GM_getValue('testedServers', []);
const işlemBeklemeSüresi = 2500;
const testBeklemeSüresi = 10000;
// Bekleme Fonksiyonu
async function bekle(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// Element Bekleme Fonksiyonu
async function waitForElement(selector, timeout = 15000) {
return new Promise((resolve, reject) => {
const startTime = Date.now();
const interval = setInterval(() => {
const element = document.querySelector(selector);
if (element) {
clearInterval(interval);
resolve(element);
} else if (Date.now() - startTime > timeout) {
clearInterval(interval);
reject(new Error(`Element "${selector}" not found within ${timeout}ms`));
}
}, 250);
});
}
// Test Başlatma Fonksiyonu
async function startTest() {
showStatus("Test Başlatılıyor...");
try {
const startButton = await waitForElement('.js-start-test');
startButton.click();
console.log("Test başlatıldı!");
await bekle(işlemBeklemeSüresi);
await waitForElement('.result-container-speed-active', 90000);
const downloadSpeed = document.querySelector('.download-speed')?.textContent || "Bulunamadı";
const uploadSpeed = document.querySelector('.upload-speed')?.textContent || "Bulunamadı";
const ping = document.querySelector('.ping-speed')?.textContent || "Bulunamadı";
const serverName = document.querySelector('.server-current .hostUrl')?.textContent || "Bulunamadı";
const resultMessage = `Test Sonucu (${serverName}): İndirme: ${downloadSpeed} Mbps, Yükleme: ${uploadSpeed} Mbps, Ping: ${ping} ms`;
console.log(resultMessage);
showStatus(resultMessage);
logMessage(resultMessage);
return serverName;
} catch (error) {
console.error("Test sırasında hata oluştu:", error);
showStatus("Test sırasında hata oluştu!");
logMessage("Test sırasında hata oluştu: " + error.message);
return null;
}
}
// Bir Sonraki Sunucuyu Seçme Fonksiyonu
async function selectNextServer(searchText) {
try {
showStatus("Sunucu Seçiliyor...");
await openServerModal();
await bekle(işlemBeklemeSüresi);
await filterServers(searchText);
await bekle(işlemBeklemeSüresi * 3); // Filtreleme sonrası bekleme süresi artırıldı
const serverListItems = Array.from(document.querySelectorAll('.server-hosts-list li a'));
let nextServer = null;
for (const serverItem of serverListItems) {
const serverId = serverItem.getAttribute('data-server-id');
if (serverId && !testedServers.includes(serverId)) {
nextServer = serverItem;
break;
}
}
if (nextServer) {
nextServer.click();
const serverId = nextServer.getAttribute('data-server-id');
testedServers.push(serverId);
GM_setValue('testedServers', testedServers);
const serverLocation = nextServer.querySelector('.host-location').textContent;
console.log("Yeni sunucu seçildi:", serverLocation);
showStatus("Yeni sunucu seçildi: " + serverLocation);
logMessage("Yeni sunucu seçildi: " + serverLocation);
await bekle(işlemBeklemeSüresi);
return true;
} else {
console.log("Seçilen şehirde test edilecek başka sunucu kalmadı!");
showStatus("Seçilen şehirde test edilecek sunucu kalmadı!");
logMessage("Seçilen şehirde test edilecek sunucu kalmadı.");
return false;
}
} catch (error) {
console.error("Sunucu seçimi sırasında hata oluştu:", error);
showStatus("Sunucu seçimi sırasında hata oluştu!");
logMessage("Sunucu seçimi sırasında hata oluştu: " + error.message);
return false;
}
}
// Sunucu Seçme Modalını Açma Fonksiyonu
async function openServerModal() {
try {
const changeServerButton = await waitForElement('.btn-server-select');
changeServerButton.click();
console.log("Sunucu Seçme Ekranı Açıldı");
await bekle(işlemBeklemeSüresi);
await waitForElement('.server-hosts-list', 10000);
await bekle(işlemBeklemeSüresi);
} catch (error) {
console.error("Sunucu Değiştirme Butonu veya Sunucu Listesi Bulunamadı:", error);
showStatus("Sunucu ekranı açılamadı!");
logMessage("Sunucu ekranı açılamadı: " + error.message);
}
}
// Sunucuları Filtreleme Fonksiyonu
async function filterServers(searchText) {
try {
const searchInput = await waitForElement('#host-search');
searchInput.value = '';
searchInput.focus();
searchInput.click(); // Arama kutusuna tıklama
for (let char of searchText) {
searchInput.value += char;
searchInput.dispatchEvent(new Event('input'));
await bekle(500); // Her harften sonra 500ms bekle
// Enter tuşuna basma olayını tetikle
const enterEvent = new KeyboardEvent('keydown', {
key: 'Enter',
code: 'Enter',
keyCode: 13,
charCode: 13,
which: 13,
shiftKey: false,
ctrlKey: false,
metaKey: false,
altKey: false
});
searchInput.dispatchEvent(enterEvent);
await bekle(500); // Enter sonrası 500ms bekle
}
console.log("Sunucular Filtrelendi:", searchText);
logMessage("Sunucular filtrelendi: " + searchText);
// Liste gelene kadar beklemek için döngü
let listLoaded = false;
for (let i = 0; i < 20; i++) { // Maksimum 20 deneme
await bekle(500); // Her denemede 500ms bekle
if (document.querySelectorAll('.server-hosts-list li a').length > 0) {
listLoaded = true;
break;
}
}
if (!listLoaded) {
throw new Error("Sunucu listesi yüklenemedi!");
}
// Sunucu bulunup bulunmadığına bak
const serverListItems = Array.from(document.querySelectorAll('.server-hosts-list li a'));
const foundServer = serverListItems.some(item => item.querySelector('.host-location').textContent.toLowerCase().includes(searchText.toLowerCase()));
if (!foundServer) {
console.log(`"${searchText}" isimli sunucu bulunamadı. Enter tuşuna basınız...`);
logMessage(`"${searchText}" isimli sunucu bulunamadı. Enter tuşuna basınız...`);
alert(`"${searchText}" isimli sunucu bulunamadı. Lütfen manuel olarak enter tuşuna basınız.`);
return false;
}
await bekle(işlemBeklemeSüresi);
return true;
} catch (error) {
console.error("Arama Kutusu veya Sunucu Listesi Bulunamadı:", error);
showStatus("Arama kutusu veya sunucu listesi bulunamadı!");
logMessage("Arama kutusu veya sunucu listesi bulunamadı: " + error.message);
return false;
}
}
// Testleri Çalıştırma Fonksiyonu
async function runTestsForCity(city) {
try {
showStatus(`Testler Başlatılıyor: ${city}`);
let continueTesting = true;
while (continueTesting) {
if (await selectNextServer(city)) {
await startTest();
await bekle(testBeklemeSüresi);
} else {
continueTesting = false;
break;
}
}
console.log(`Seçilen şehirdeki tüm testler tamamlandı: ${city}. Liste Sıfırlanıyor.`);
showStatus(`Seçilen şehirdeki tüm testler tamamlandı: ${city}!`);
logMessage(`Seçilen şehirdeki tüm testler tamamlandı: ${city}.`);
} catch (error) {
console.error(`Test sırasında hata oluştu: ${city}`, error);
showStatus(`Test sırasında hata oluştu: ${city}!`);
logMessage(`Test sırasında hata oluştu: ${city}: ` + error.message);
}
}
// Tüm Şehirlerde Test Başlatma Fonksiyonu
async function runAllTests() {
try {
const cities = Array.from(document.querySelectorAll('#city-dropdown option')).map(option => option.value);
for (const city of cities) {
testedServers = []; // Her şehirdeki testlerden önce listedeki sunucuları sıfırla
GM_setValue('testedServers', testedServers);
if (await filterServers(city)) {
await runTestsForCity(city);
} else {
// Sunucu bulunamadıysa, bir sonraki şehire geç
logMessage(`"${city}" isimli sunucu bulunamadı. Bir sonraki şehire geçiliyor...`);
showStatus(`"${city}" isimli sunucu bulunamadı. Bir sonraki şehire geçiliyor...`);
}
}
console.log("Tüm şehirlerdeki testler tamamlandı. Liste Sıfırlanıyor.");
showStatus("Tüm şehirlerdeki testler tamamlandı!");
logMessage("Tüm şehirlerdeki testler tamamlandı.");
} catch (error) {
console.error("Test sırasında genel bir hata oluştu:", error);
showStatus("Test sırasında genel bir hata oluştu!");
logMessage("Test sırasında genel bir hata oluştu: " + error.message);
}
}
// Test Başlatma Butonu
document.querySelector('#start-tests').addEventListener('click', () => {
const selectedCity = document.querySelector('#city-dropdown').value;
runTestsForCity(selectedCity);
});
// Tüm Şehirlerde Test Başlatma Butonu
document.querySelector('#start-all-tests').addEventListener('click', () => {
runAllTests();
});
// Sayfa Yüklenme Eventi
window.addEventListener('load', function() {
setTimeout(() => {
document.querySelector('#city-dropdown').focus();
}, 3000);
});
})();