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 DatosPrimero, 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`)
);
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 BitTorrentLos 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.