#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
CampNetwork Address Checker v1.0
Проверка адресов на блокировку в testnet.campnetwork.xyz
Автор: Community Edition
Дата: 2024
ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ:
1. Установите Python 3.7+ с https://python.org
2. Установите необходимые библиотеки:
pip install requests cloudscraper
3. Создайте файл addresses.txt и поместите туда адреса (по одному на строку)
4. Запустите скрипт: python campnetwork_checker.py
5. Выберите метод проверки из предложенных
"""
import os
import sys
import time
import json
import random
import webbrowser
from datetime import datetime
# Проверка версии Python
if sys.version_info < (3, 7):
print("❌ Требуется Python 3.7 или выше!")
print(f" У вас установлен Python {sys.version}")
input("\nНажмите Enter для выхода...")
sys.exit(1)
# Попытка импорта необходимых библиотек
try:
import requests
except ImportError:
print("❌ Модуль 'requests' не установлен!")
print("📦 Установите его командой: pip install requests")
input("\nНажмите Enter для выхода...")
sys.exit(1)
# Глобальные настройки
ADDRESSES_FILE = "addresses.txt"
BLOCKED_FILE = "blocked_addresses.txt"
PROGRESS_FILE = "check_progress.json"
API_BASE_URL = "https://testnet.campnetwork.xyz/api/snag/user?walletAddress="
# Цвета для Windows консоли (опционально)
try:
import colorama
colorama.init()
GREEN = colorama.Fore.GREEN
RED = colorama.Fore.RED
YELLOW = colorama.Fore.YELLOW
BLUE = colorama.Fore.BLUE
RESET = colorama.Style.RESET_ALL
except:
GREEN = RED = YELLOW = BLUE = RESET = ""
def print_banner():
"""Выводит баннер программы"""
banner = f"""
{BLUE}╔═══════════════════════════════════════════════════════╗
║ CampNetwork Address Checker v1.0 ║
║ Проверка адресов на блокировку ║
╚═══════════════════════════════════════════════════════╝{RESET}
"""
print(banner)
def load_addresses():
"""Загружает адреса из файла"""
if not os.path.exists(ADDRESSES_FILE):
print(f"{RED}❌ Файл {ADDRESSES_FILE} не найден!{RESET}")
print(f"\nСоздайте файл {ADDRESSES_FILE} и добавьте адреса (по одному на строку)")
# Создаем пример файла
with open(ADDRESSES_FILE, 'w') as f:
f.write("0x1234567890123456789012345678901234567890\n")
f.write("0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\n")
print(f"{GREEN}✅ Создан пример файла {ADDRESSES_FILE}{RESET}")
return None
with open(ADDRESSES_FILE, 'r', encoding='utf-8') as f:
addresses = [line.strip() for line in f if line.strip() and line.strip().startswith('0x')]
if not addresses:
print(f"{RED}❌ Файл {ADDRESSES_FILE} пуст или не содержит валидных адресов!{RESET}")
return None
return addresses
def save_results(blocked_addresses):
"""Сохраняет результаты в файл"""
with open(BLOCKED_FILE, 'w', encoding='utf-8') as f:
f.write(f"# CampNetwork Blocked Addresses\n")
f.write(f"# Дата проверки: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"# Всего заблокировано: {len(blocked_addresses)}\n\n")
for addr in blocked_addresses:
f.write(f"{addr}\n")
def method1_requests_check(addresses):
"""Метод 1: Проверка через requests (может не работать из-за Cloudflare)"""
print(f"\n{BLUE}🔄 Метод 1: Проверка через HTTP запросы{RESET}")
session = requests.Session()
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'Referer': 'https://testnet.campnetwork.xyz/'
})
blocked_addresses = []
successful = 0
failed = 0
for i, address in enumerate(addresses, 1):
print(f"[{i}/{len(addresses)}] Проверяю: {address}")
try:
response = session.get(API_BASE_URL + address, timeout=10)
if response.status_code == 200:
try:
data = response.json()
is_blocked = str(data.get('isBlocked', '')).lower()
if is_blocked in ['yes', 'true', '1']:
blocked_addresses.append(address)
successful += 1
print(f" {RED}❌ ЗАБЛОКИРОВАН{RESET}")
else:
successful += 1
print(f" {GREEN}✅ Активен{RESET}")
except:
failed += 1
print(f" {YELLOW}⚠️ Ошибка разбора ответа{RESET}")
elif response.status_code == 403:
print(f" {RED}❌ 403 Forbidden - Cloudflare блокирует запросы{RESET}")
print(f"\n{YELLOW}Cloudflare защита обнаружена! Попробуйте другой метод.{RESET}")
return None
else:
failed += 1
print(f" {YELLOW}⚠️ HTTP {response.status_code}{RESET}")
time.sleep(random.uniform(1, 2))
except Exception as e:
failed += 1
print(f" {YELLOW}⚠️ Ошибка: {str(e)[:50]}{RESET}")
return blocked_addresses
def method2_cloudscraper_check(addresses):
"""Метод 2: Проверка через cloudscraper (обход базовой Cloudflare защиты)"""
print(f"\n{BLUE}🔄 Метод 2: Проверка через CloudScraper{RESET}")
try:
import cloudscraper
except ImportError:
print(f"{RED}❌ Модуль cloudscraper не установлен!{RESET}")
print(f"📦 Установите: pip install cloudscraper")
return None
scraper = cloudscraper.create_scraper()
blocked_addresses = []
successful = 0
for i, address in enumerate(addresses, 1):
print(f"[{i}/{len(addresses)}] Проверяю: {address}")
try:
response = scraper.get(API_BASE_URL + address, timeout=15)
if response.status_code == 200:
try:
data = response.json()
is_blocked = str(data.get('isBlocked', '')).lower()
if is_blocked in ['yes', 'true', '1']:
blocked_addresses.append(address)
successful += 1
print(f" {RED}❌ ЗАБЛОКИРОВАН{RESET}")
else:
successful += 1
print(f" {GREEN}✅ Активен{RESET}")
except:
print(f" {YELLOW}⚠️ Ошибка разбора JSON{RESET}")
else:
print(f" {YELLOW}⚠️ HTTP {response.status_code}{RESET}")
time.sleep(random.uniform(2, 4))
except Exception as e:
print(f" {YELLOW}⚠️ Ошибка: {str(e)[:50]}{RESET}")
return blocked_addresses
def method3_manual_check(addresses):
"""Метод 3: Полуавтоматическая проверка через браузер"""
print(f"\n{BLUE}🔄 Метод 3: Полуавтоматическая проверка{RESET}")
print("\n📝 Инструкция:")
print("1. Я буду открывать каждый адрес в браузере")
print("2. Посмотрите на значение 'isBlocked' в JSON ответе")
print("3. Нажмите 'y' если isBlocked: 'Yes' или true")
print("4. Нажмите 'n' если isBlocked: 'No' или false")
print("5. Нажмите 's' чтобы пропустить адрес")
print("6. Нажмите 'q' чтобы выйти")
input(f"\n{BLUE}Нажмите Enter для начала...{RESET}")
blocked_addresses = []
for i, address in enumerate(addresses, 1):
print(f"\n[{i}/{len(addresses)}] Адрес: {address}")
url = API_BASE_URL + address
print(f"🔗 Открываю в браузере...")
webbrowser.open(url)
time.sleep(1.5)
while True:
answer = input("Заблокирован? (y/n/s/q): ").lower().strip()
if answer == 'y':
blocked_addresses.append(address)
print(f" {RED}❌ Помечен как заблокированный{RESET}")
break
elif answer == 'n':
print(f" {GREEN}✅ Активен{RESET}")
break
elif answer == 's':
print(f" {YELLOW}⏭️ Пропущен{RESET}")
break
elif answer == 'q':
print(f" {YELLOW}🛑 Выход...{RESET}")
return blocked_addresses
else:
print(" ❓ Используйте: y/n/s/q")
return blocked_addresses
def method4_batch_urls(addresses):
"""Метод 4: Генерация списка URL для массовой проверки"""
print(f"\n{BLUE}🔄 Метод 4: Генерация URL для массовой проверки{RESET}")
urls_file = "urls_to_check.txt"
with open(urls_file, 'w', encoding='utf-8') as f:
for addr in addresses:
f.write(f"{API_BASE_URL}{addr}\n")
print(f"\n{GREEN}✅ Создан файл {urls_file} с {len(addresses)} URL{RESET}")
print("\n📝 Что делать дальше:")
print("1. Откройте файл urls_to_check.txt")
print("2. Используйте расширение браузера для массового открытия вкладок")
print("3. Или импортируйте в инструмент для массовой проверки URL")
print("4. Проверьте значение 'isBlocked' на каждой странице")
return []
def main():
"""Главная функция"""
print_banner()
# Загрузка адресов
addresses = load_addresses()
if not addresses:
input(f"\n{YELLOW}Нажмите Enter для выхода...{RESET}")
return
print(f"\n{GREEN}📋 Загружено {len(addresses)} адресов{RESET}")
# Меню выбора метода
while True:
print(f"\n{BLUE}Выберите метод проверки:{RESET}")
print("1. HTTP запросы (быстро, но может не работать)")
print("2. CloudScraper (обход базовой защиты)")
print("3. Полуавтоматический (через браузер)")
print("4. Генерация URL для массовой проверки")
print("5. Выход")
choice = input(f"\n{BLUE}Ваш выбор (1-5): {RESET}").strip()
blocked_addresses = None
if choice == '1':
blocked_addresses = method1_requests_check(addresses)
elif choice == '2':
blocked_addresses = method2_cloudscraper_check(addresses)
elif choice == '3':
blocked_addresses = method3_manual_check(addresses)
elif choice == '4':
method4_batch_urls(addresses)
continue
elif choice == '5':
print(f"\n{YELLOW}До свидания!{RESET}")
break
else:
print(f"{RED}❌ Неверный выбор!{RESET}")
continue
# Сохранение результатов
if blocked_addresses is not None:
print(f"\n{'='*50}")
print(f"{GREEN}✅ Проверено адресов: {len(addresses)}{RESET}")
print(f"{RED}❌ Заблокировано: {len(blocked_addresses)}{RESET}")
print(f"{'='*50}")
if blocked_addresses:
save_results(blocked_addresses)
print(f"\n{GREEN}💾 Результаты сохранены в {BLOCKED_FILE}{RESET}")
print(f"\n{RED}Первые заблокированные адреса:{RESET}")
for addr in blocked_addresses[:5]:
print(f" {addr}")
if len(blocked_addresses) > 5:
print(f" ... и еще {len(blocked_addresses) - 5}")
another = input(f"\n{BLUE}Проверить другим методом? (y/n): {RESET}").lower()
if another != 'y':
break
input(f"\n{BLUE}Нажмите Enter для выхода...{RESET}")
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print(f"\n\n{YELLOW}Прервано пользователем{RESET}")
except Exception as e:
print(f"\n{RED}Критическая ошибка: {e}{RESET}")
input("\nНажмите Enter для выхода...")