Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Tracker BitTorrent con PHP + MySQL (Integración SMF)

Iniciado por Mr.X, Jul 27, 2025, 12:26 PM

Tema anterior - Siguiente tema

Mr.X

Crear un tracker BitTorrent integrado con tu foro SMF puede tener varios beneficios, dependiendo del tipo de comunidad que gestiones.

Aquí te explico las principales ventajas:

Beneficios de un Tracker Privado para SMF

  • 1. Control de Usuarios y Exclusividad
    • ✅ Solo miembros registrados en tu foro pueden usar el tracker.
    • ✅ Puedes limitar el acceso por rango (ejemplo: solo usuarios con +50 posts).
    • ✅ Evitas leechers anónimos y bots de otros trackers públicos.
  • 2. Monetización / Donaciones
    • 💰 Ofrecer acceso VIP (ejemplo: mejor ratio, más descargas, etc.).
    • 💰 Vender invitaciones para nuevos usuarios.
    • 💰 Donaciones a cambio de créditos de ratio.
  • 3. Comunidad más Activa y Comprometida
    • 📈 Los usuarios participan más en el foro para mantener su ratio.
    • 📈 Genera discusiones sobre el contenido compartido (películas, juegos, software, etc.).
    • 📈 Atrae a uploaders profesionales que quieren reputación en tu comunidad.
  • 4. Mejor Control del Contenido
    • 🛡� Moderación centralizada: Puedes borrar torrents desde el foro.
    • 🛡� Sistema de reportes integrado con SMF.
    • 🛡� Whitelist de archivos (evitar malware o contenido no deseado).
  • 5. Estadísticas y Ratio Personalizado
    • 📊 Sistema de ratio (descarga/subida) para incentivar la colaboración.
    • 📊 Gráficos de actividad en los perfiles de usuario.
    • 📊 Top 10 uploaders (rankings en el foro).
  • 6. Posibilidad de Crear una "Red Privada" (Private Tracker)
    • 🌐 Trackers privados son más difíciles de rastrear por la ley (dependiendo del contenido).
    • 🌐 Más velocidad porque solo comparten usuarios de confianza.
    • 🌐 Menos DMCA takedowns que en trackers públicos.

🚨 Posibles Desventajas
  • ⚠️ Requiere mantenimiento (ataques DDoS, exploits, etc.).
  • ⚠️ Alto consumo de ancho de banda (necesitas buen hosting/VPS).
  • ⚠️ Problemas legales si se comparte contenido con copyright (depende del país).

🎯 Casos de Uso Comunes
  • 🎥 Cine y Series (como el antiguo "TorrentLeech")
  • 🎮 Videojuegos y ROMs (para preservación)
  • 📚 Libros y Cursos (comunidades educativas)
  • 🖥� Software y Apps (versiones antiguas o abandonware)

* La idea de esto, es la de subir todo el contenido adjunto en torrents para evitar su perdida y mejorar su rate de descarga.



1. Estructura de la Base de Datos

Primero, crea las tablas necesarias para el tracker:

  • Tabla users (si no usas SMF directamente)

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `passkey` varchar(32) NOT NULL,  -- Clave única para cada usuario (como en torrentleech)
  PRIMARY KEY (`id`)
);

  • Tabla torrents

CREATE TABLE `torrents` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `info_hash` binary(20) NOT NULL,  -- Hash del torrent (en binario)
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `info_hash` (`info_hash`)
);

  • Tabla peers (seeds y leechers)

CREATE TABLE `peers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `torrent_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `peer_id` binary(20) NOT NULL,
  `ip` varchar(45) NOT NULL,
  `port` smallint(5) UNSIGNED NOT NULL,
  `uploaded` bigint(20) NOT NULL DEFAULT 0,
  `downloaded` bigint(20) NOT NULL DEFAULT 0,
  `left` bigint(20) NOT NULL DEFAULT 0,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `torrent_user_peer` (`torrent_id`,`user_id`,`peer_id`)
);

2. Archivo announce.php (Tracker principal)

<?php
header('Content-Type: text/plain');
require 'config.php';

// Conexión a la base de datos SMF
$smf_db = new mysqli(SMF_DB_HOST, SMF_DB_USER, SMF_DB_PASS, SMF_DB_NAME);
$tracker_db = new mysqli(TRACKER_DB_HOST, TRACKER_DB_USER, TRACKER_DB_PASS, TRACKER_DB_NAME);

// Parámetros del tracker BitTorrent
$info_hash = isset($_GET['info_hash']) ? bin2hex(urldecode($_GET['info_hash'])) : null;
$peer_id = isset($_GET['peer_id']) ? $_GET['peer_id'] : null;
$user_id = isset($_GET['userid']) ? (int)$_GET['userid'] : 0;
$passkey = isset($_GET['passkey']) ? $_GET['passkey'] : '';

// Verificar usuario contra SMF
$stmt = $smf_db->prepare("SELECT id_member FROM smf_members WHERE id_member = ?");
$stmt->bind_param('i', $user_id);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows === 0) {
    die('d14:failure reason25:Usuario no autorizadoe');
}

// Verificar torrent
$stmt = $tracker_db->prepare("SELECT id FROM torrents WHERE info_hash = UNHEX(?)");
$stmt->bind_param('s', $info_hash);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows === 0) {
    die('d14:failure reason20:Torrent no encontradoe');
}

// Actualizar peer (seed/leecher)
$ip = $_SERVER['REMOTE_ADDR'];
$port = (int)$_GET['port'];
$uploaded = (int)$_GET['uploaded'];
$downloaded = (int)$_GET['downloaded'];
$left = (int)$_GET['left'];

$query = "INSERT INTO peers (torrent_id, user_id, peer_id, ip, port, uploaded, downloaded, left, last_update)
          VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())
          ON DUPLICATE KEY UPDATE
          ip = VALUES(ip), port = VALUES(port), uploaded = VALUES(uploaded),
          downloaded = VALUES(downloaded), left = VALUES(left), last_update = NOW()";

$stmt = $tracker_db->prepare($query);
$stmt->bind_param('iisssiii', $torrent_id, $user_id, $peer_id, $ip, $port, $uploaded, $downloaded, $left);
$stmt->execute();

// Obtener lista de peers (simplificado)
$peers = [];
$result = $tracker_db->query("SELECT peer_id, ip, port FROM peers WHERE torrent_id = $torrent_id");
while ($row = $result->fetch_assoc()) {
    $peers[] = $row;
}

// Respuesta en formato BitTorrent
$response = [
    'interval' => 1800, // 30 minutos
    'peers' => $peers,
];

echo bencode($response);

// Función para codificar en formato Bencode
function bencode($data) {
    if (is_array($data)) {
        $result = 'd';
        foreach ($data as $key => $value) {
            $result .= strlen($key) . ':' . $key;
            $result .= bencode($value);
        }
        return $result . 'e';
    } elseif (is_int($data)) {
        return 'i' . $data . 'e';
    } else {
        return strlen($data) . ':' . $data;
    }
}
?>

3. Archivo announce.php (Tracker principal)

<?php
// Configuración SMF
define('SMF_DB_HOST', 'localhost');
define('SMF_DB_USER', 'smf_user');
define('SMF_DB_PASS', 'password');
define('SMF_DB_NAME', 'smf_database');

// Configuración Tracker
define('TRACKER_DB_HOST', 'localhost');
define('TRACKER_DB_USER', 'tracker_user');
define('TRACKER_DB_PASS', 'tracker_password');
define('TRACKER_DB_NAME', 'tracker_database');
?>

4. Cómo usarlo desde un cliente BitTorrent

Los usuarios deben incluir su ID de SMF y un passkey en la URL del tracker:

http://tudominio.com/announce.php?info_hash=XXXX&peer_id=YYYY&userid=123&passkey=abc123&port=6881&uploaded=0&downloaded=0&left=1000

5. Recomendaciones adicionales

  • Usa memcached o Redis para cachear peers y reducir consultas SQL.
  • Protege el tracker con .htaccess si no quieres que sea público.
  • Implementa scrape.php para estadísticas (opcional).
  • Usa prepared statements para evitar SQL injection.

Swarlog

Gracias por el aporte, en cuanto pueda lo pruebo y os comento.