Skip to content

Instantly share code, notes, and snippets.

@minimasoft
Last active March 16, 2025 05:09
Show Gist options
  • Save minimasoft/b423fd6b6416b53fe8351137acb3e87d to your computer and use it in GitHub Desktop.
Save minimasoft/b423fd6b6416b53fe8351137acb3e87d to your computer and use it in GitHub Desktop.
blockatroll 9000
/* Esto funciona pegandolo a la consola en x.com, guarda una lista en local storage de los ya bloqueados.
Hace falta hacer click en el boton para que arranque, luego es automático, va bloqueando cada 2 segundos
un troll.
PERO PARA!!!
¡¿Vas a pegar código a la consola del navegador sin saber lo que hace?!
🤪 🤪 🤪
Es peligroso eso. Solo hacelo con este código que fue aprobado por el mismísimo Elon Musk.
Dale... Pegalo... Fácil, tocás RAW, seleccionás todo y lo pegás en la consola.
También podés seguir leyendo y si hace falta consultar con gente que sepa antes de hacerlo.
Se utiliza client_event.json (llamada de tracking) para obtener un request válido. (osea, digamos, :V
si dejan el tab en el fondo y no usan twitter no se generan eventos de tracking y no se bloquean trolls).
El código está al fondo de la lista de trolls.
*/
const troll_list = [
{
"id": "1463988037277397000",
"screen_name": "GordoDan_",
"name": "FLAN"
}//hackeado^2
];
// Guarda la lista de ya bloqueados, si exportás tu lista de bloqueados podes agregarla
// Igual por ahora si intentás bloquear a alguien ya bloqueado no pasa nada, para unblock es otra API
let blocked_trolls = [];
if(window.localStorage.getItem("blocked_trolls")){
blocked_trolls = window.localStorage.getItem("blocked_trolls").split(',');
}
// Hace falta optimizar esto un poco, pero elige random de la lista un troll que no esté en 'blocked_trolls'
function troll_lottery() {
let current_troll;
do{
troll_candidate = Math.floor(Math.random()*troll_list.length);
current_troll = troll_list[troll_candidate];
}while(current_troll["id"] in blocked_trolls);
return current_troll;
}
// Guardamos las funciones originales de http open y send
const XMLHttpRequest_open = XMLHttpRequest.prototype.open;
const XMLHttpRequest_send = XMLHttpRequest.prototype.send;
// Variables globales para facilitar debugging, marcan el próximo request
let inject_url = ""; //"https://x.com/i/api/1.1/blocks/create.json";
let inject_data = ""; //"user_id=993940977927774210";
let inject_now = false;
let inject_callback = () => 1;
// Colocamos funciones para modificar requests hechos por la API de tracking de twitter
// A estos les conservamos los headers y autorizacion pero modificamos URL y datos
function patch_requests(){
console.log("patching requests");
XMLHttpRequest.prototype.open = function(method,url) {
if (method == "POST" && url == "https://x.com/i/api/1.1/jot/client_event.json"){
if(inject_url.length > 1)
{
url = inject_url;
inject_now = true;
}
}
return XMLHttpRequest_open.apply(this, [method, url])
}
XMLHttpRequest.prototype.send = function(data) {
if(inject_now){
inject_now=false;
inject_url="";
data = inject_data;
inject_callback();
}
return XMLHttpRequest_send.apply(this, [data]);
}
}
function unpatch_requests(){
console.log("un-patching requests");
XMLHttpRequest.prototype.open = XMLHttpRequest_open;
XMLHttpRequest.prototype.send = XMLHttpRequest_send;
}
// Una interfaz minimalista y lineas de log explican lo que va sucediendo
function add_blockatroll() {
console.log('holis');
const button = document.createElement('button');
button.style.position = 'fixed';
button.style.top = '10px';
button.style.right = '10px';
button.style.padding = '8px 12px';
button.style.backgroundColor = '#4CAF50';
button.style.color = 'white';
button.style.border = 'none';
button.style.cursor = 'pointer';
document.body.appendChild(button);
function assign_troll(troll){
button.textContent = 'Block ' + troll["name"] + ' (@' + troll["screen_name"] + ')';
// Esto no hace falta guardarlo en el botón, pero troll botón sonaba bien
button.__troll = troll;
button.__ignore_click = false;
}
assign_troll(troll_lottery());
function start_block() {
if (button.__ignore_click == true)
return;
patch_requests();
button.textContent = 'Blocking ' + button.__troll["name"] +'...';
button.__ignore_click = true;
inject_url = "https://x.com/i/api/1.1/blocks/create.json";
inject_data = "user_id=" + button.__troll["id"];
inject_callback = () => {
blocked_trolls.push(button.__troll["id"]);
window.localStorage.setItem("blocked_trolls", blocked_trolls);
console.log("just blocked: " + button.__troll["id"] + " total: " + blocked_trolls.length);
assign_troll(troll_lottery());
unpatch_requests();
// Activa el bloqueo automático cada 2.222 segundos, si tienen paciencia 5 segundos es mejor.
setTimeout(start_block, 2222)
};
};
button.addEventListener('click', start_block);
}
add_blockatroll();
@minimasoft
Copy link
Author

TODO:

  • Mejorar la selección
  • Actualizar la lista de trolls (no se puede hacer carga remota)
  • Hacer una animación bonita cuando se va cada troll

@minimasoft
Copy link
Author

Código documentado para que sea fácil reutilizar y modificar. Por ahora esta metodología permite hacer cualquier tipo de llamadas a la API de twitter como si fueran legítimas gracias al excesivo tracking de las acciones del usuario utilizando el mismo protocolo de seguridad de transacciones y autorización.

LICENCIA:
Si crees que se justifica la violencia por diferencias ideológicas usar este código te puede contagiar zurditis aguda.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment