docs: add vulgar-word/fragment-sold reserved-username lists and CSVs, reserve script
Some checks are pending
CI / Grammy store bot (push) Waiting to run
CI / Docker main topology smoke (push) Waiting to run
CI / Go tests (push) Waiting to run
CI / Admin web build (push) Waiting to run

Extends the reserved-usernames doc with a vulgar/offensive section, adds
CSV exports (username,reason) for both the categorized reserved-usernames
list and a filtered snapshot of fragment.com's sold usernames, and adds a
scripts/reserve_usernames.py CLI to bulk-feed a CSV into the admin panel's
reserved-usernames blocklist via the real login -> CSRF -> reserve-username
API flow.
This commit is contained in:
Astra 2026-09-21 15:57:36 +01:00
parent 492bd9a934
commit 9b76ef4041
5 changed files with 1030 additions and 0 deletions

View file

@ -0,0 +1,285 @@
gaoshou,Chinese slang for 'expert/master'
danbao,Chinese term for 'guarantee/escrow' - common in gray-market deal-broker slang
waifu,adult content term
erotic,adult content term
playboy,adult content term
ebank,crypto/finance term
ether,crypto/finance term
token,crypto/finance term
trade,crypto/finance term
zcash,crypto/finance term
crypto,crypto/finance term
tokens,crypto/finance term
trades,crypto/finance term
finance,crypto/finance term
neobank,crypto/finance term
trading,crypto/finance term
venture,crypto/finance term
currency,crypto/finance term
dogecoin,crypto/finance term
exchange,crypto/finance term
investor,crypto/finance term
memecoin,crypto/finance term
shitcoin,crypto/finance term
stockbot,crypto/finance term
cryptodev,crypto/finance term
metaverse,crypto/finance term
cryptocard,crypto/finance term
cryptofund,crypto/finance term
polymarket,crypto/finance term
wallstreet,crypto/finance term
cryptoholder,crypto/finance term
investbanker,crypto/finance term
cocaine,drug reference
bocai,gambling term/brand
slots,gambling term/brand
stake,gambling term/brand
casino,gambling term/brand
gamble,gambling term/brand
betting,gambling term/brand
jackpot,gambling term/brand
lottery,gambling term/brand
gambling,gambling term/brand
roulette,gambling term/brand
betmobile,gambling term/brand
betwinner,gambling term/brand
blackjack,gambling term/brand
casino_bot,gambling term/brand
highroller,gambling term/brand
agent,generic high-value dictionary word
ahmed,generic high-value dictionary word
anime,generic high-value dictionary word
arena,generic high-value dictionary word
asset,generic high-value dictionary word
atlas,generic high-value dictionary word
banki,generic high-value dictionary word
beach,generic high-value dictionary word
black,generic high-value dictionary word
blood,generic high-value dictionary word
brute,generic high-value dictionary word
chart,generic high-value dictionary word
chats,generic high-value dictionary word
chess,generic high-value dictionary word
chief,generic high-value dictionary word
clown,generic high-value dictionary word
court,generic high-value dictionary word
dance,generic high-value dictionary word
decor,generic high-value dictionary word
devil,generic high-value dictionary word
digit,generic high-value dictionary word
dream,generic high-value dictionary word
elite,generic high-value dictionary word
faith,generic high-value dictionary word
frail,generic high-value dictionary word
funny,generic high-value dictionary word
games,generic high-value dictionary word
gbots,generic high-value dictionary word
gifts,generic high-value dictionary word
grand,generic high-value dictionary word
house,generic high-value dictionary word
human,generic high-value dictionary word
karma,generic high-value dictionary word
knife,generic high-value dictionary word
local,generic high-value dictionary word
mango,generic high-value dictionary word
match,generic high-value dictionary word
money,generic high-value dictionary word
multi,generic high-value dictionary word
north,generic high-value dictionary word
offer,generic high-value dictionary word
order,generic high-value dictionary word
panel,generic high-value dictionary word
pasta,generic high-value dictionary word
payme,generic high-value dictionary word
pizza,generic high-value dictionary word
plain,generic high-value dictionary word
plane,generic high-value dictionary word
plate,generic high-value dictionary word
point,generic high-value dictionary word
poker,generic high-value dictionary word
price,generic high-value dictionary word
pride,generic high-value dictionary word
promo,generic high-value dictionary word
queen,generic high-value dictionary word
sales,generic high-value dictionary word
score,generic high-value dictionary word
seven,generic high-value dictionary word
sleep,generic high-value dictionary word
smart,generic high-value dictionary word
stars,generic high-value dictionary word
start,generic high-value dictionary word
store,generic high-value dictionary word
story,generic high-value dictionary word
sweet,generic high-value dictionary word
tiger,generic high-value dictionary word
today,generic high-value dictionary word
total,generic high-value dictionary word
trace,generic high-value dictionary word
trust,generic high-value dictionary word
union,generic high-value dictionary word
viral,generic high-value dictionary word
watch,generic high-value dictionary word
weird,generic high-value dictionary word
woman,generic high-value dictionary word
world,generic high-value dictionary word
bridge,generic high-value dictionary word
buybot,generic high-value dictionary word
create,generic high-value dictionary word
credit,generic high-value dictionary word
desire,generic high-value dictionary word
dragon,generic high-value dictionary word
empire,generic high-value dictionary word
esport,generic high-value dictionary word
europa,generic high-value dictionary word
events,generic high-value dictionary word
family,generic high-value dictionary word
genius,generic high-value dictionary word
honest,generic high-value dictionary word
hotels,generic high-value dictionary word
island,generic high-value dictionary word
lonely,generic high-value dictionary word
misery,generic high-value dictionary word
monkey,generic high-value dictionary word
paybox,generic high-value dictionary word
player,generic high-value dictionary word
please,generic high-value dictionary word
poison,generic high-value dictionary word
police,generic high-value dictionary word
qrcode,generic high-value dictionary word
racing,generic high-value dictionary word
schizo,generic high-value dictionary word
school,generic high-value dictionary word
scores,generic high-value dictionary word
secret,generic high-value dictionary word
server,generic high-value dictionary word
sevens,generic high-value dictionary word
sports,generic high-value dictionary word
studio,generic high-value dictionary word
superb,generic high-value dictionary word
system,generic high-value dictionary word
ticket,generic high-value dictionary word
trauma,generic high-value dictionary word
unreal,generic high-value dictionary word
videos,generic high-value dictionary word
wealth,generic high-value dictionary word
wizard,generic high-value dictionary word
adviser,generic high-value dictionary word
airport,generic high-value dictionary word
balance,generic high-value dictionary word
bignews,generic high-value dictionary word
capital,generic high-value dictionary word
checkup,generic high-value dictionary word
connect,generic high-value dictionary word
deposit,generic high-value dictionary word
domains,generic high-value dictionary word
easypay,generic high-value dictionary word
english,generic high-value dictionary word
fabrika,generic high-value dictionary word
fishing,generic high-value dictionary word
fitness,generic high-value dictionary word
giftbot,generic high-value dictionary word
lessons,generic high-value dictionary word
liberty,generic high-value dictionary word
listing,generic high-value dictionary word
maestro,generic high-value dictionary word
message,generic high-value dictionary word
payment,generic high-value dictionary word
tickets,generic high-value dictionary word
tourist,generic high-value dictionary word
travels,generic high-value dictionary word
trinity,generic high-value dictionary word
vehicle,generic high-value dictionary word
baseball,generic high-value dictionary word
calendar,generic high-value dictionary word
checkout,generic high-value dictionary word
delivery,generic high-value dictionary word
discount,generic high-value dictionary word
feedback,generic high-value dictionary word
football,generic high-value dictionary word
forecast,generic high-value dictionary word
innocent,generic high-value dictionary word
interior,generic high-value dictionary word
internet,generic high-value dictionary word
military,generic high-value dictionary word
nickname,generic high-value dictionary word
prestige,generic high-value dictionary word
property,generic high-value dictionary word
superior,generic high-value dictionary word
anonymous,generic high-value dictionary word
celebrity,generic high-value dictionary word
concierge,generic high-value dictionary word
insurance,generic high-value dictionary word
livechart,generic high-value dictionary word
middleman,generic high-value dictionary word
nightmare,generic high-value dictionary word
president,generic high-value dictionary word
psychopath,generic high-value dictionary word
realestate,generic high-value dictionary word
technology,generic high-value dictionary word
marketplace,generic high-value dictionary word
hitler,impersonates a real historical figure
nigga,racial slur
nigger,racial slur
alexa,real company/brand name
apple,real company/brand name
baidu,real company/brand name
canon,real company/brand name
damac,real company/brand name
emaar,real company/brand name
fendi,real company/brand name
gmail,real company/brand name
gucci,real company/brand name
huobi,real company/brand name
insta,real company/brand name
kamaz,real company/brand name
msnbc,real company/brand name
opera,real company/brand name
pepsi,real company/brand name
volvo,real company/brand name
yahoo,real company/brand name
adidas,real company/brand name
amazon,real company/brand name
armani,real company/brand name
chanel,real company/brand name
fonbet,real company/brand name
forbes,real company/brand name
gitlab,real company/brand name
nestle,real company/brand name
nissan,real company/brand name
openai,real company/brand name
oracle,real company/brand name
proton,real company/brand name
tinder,real company/brand name
toyota,real company/brand name
arsenal,real company/brand name
chatgpt,real company/brand name
mancity,real company/brand name
nakheel,real company/brand name
pandora,real company/brand name
alphabet,real company/brand name
coinbase,real company/brand name
facebook,real company/brand name
flydubai,real company/brand name
jpmorgan,real company/brand name
legoland,real company/brand name
linkedin,real company/brand name
meduza,real company/brand name (independent news outlet)
boris,real person's name
diana,real person's name
frank,real person's name
putin,real person's name
hayden,real person's name
anthony,real person's name
brandon,real person's name
nicolas,real person's name
dubai,real place name
india,real place name
brazil,real place name
mexico,real place name
moscow,real place name
florida,real place name
abudhabi,real place name
portugal,real place name
russia24,real place name
bollywood,real place name
potus,title referring to a real office (President of the United States)
1 gaoshou Chinese slang for 'expert/master'
2 danbao Chinese term for 'guarantee/escrow' - common in gray-market deal-broker slang
3 waifu adult content term
4 erotic adult content term
5 playboy adult content term
6 ebank crypto/finance term
7 ether crypto/finance term
8 token crypto/finance term
9 trade crypto/finance term
10 zcash crypto/finance term
11 crypto crypto/finance term
12 tokens crypto/finance term
13 trades crypto/finance term
14 finance crypto/finance term
15 neobank crypto/finance term
16 trading crypto/finance term
17 venture crypto/finance term
18 currency crypto/finance term
19 dogecoin crypto/finance term
20 exchange crypto/finance term
21 investor crypto/finance term
22 memecoin crypto/finance term
23 shitcoin crypto/finance term
24 stockbot crypto/finance term
25 cryptodev crypto/finance term
26 metaverse crypto/finance term
27 cryptocard crypto/finance term
28 cryptofund crypto/finance term
29 polymarket crypto/finance term
30 wallstreet crypto/finance term
31 cryptoholder crypto/finance term
32 investbanker crypto/finance term
33 cocaine drug reference
34 bocai gambling term/brand
35 slots gambling term/brand
36 stake gambling term/brand
37 casino gambling term/brand
38 gamble gambling term/brand
39 betting gambling term/brand
40 jackpot gambling term/brand
41 lottery gambling term/brand
42 gambling gambling term/brand
43 roulette gambling term/brand
44 betmobile gambling term/brand
45 betwinner gambling term/brand
46 blackjack gambling term/brand
47 casino_bot gambling term/brand
48 highroller gambling term/brand
49 agent generic high-value dictionary word
50 ahmed generic high-value dictionary word
51 anime generic high-value dictionary word
52 arena generic high-value dictionary word
53 asset generic high-value dictionary word
54 atlas generic high-value dictionary word
55 banki generic high-value dictionary word
56 beach generic high-value dictionary word
57 black generic high-value dictionary word
58 blood generic high-value dictionary word
59 brute generic high-value dictionary word
60 chart generic high-value dictionary word
61 chats generic high-value dictionary word
62 chess generic high-value dictionary word
63 chief generic high-value dictionary word
64 clown generic high-value dictionary word
65 court generic high-value dictionary word
66 dance generic high-value dictionary word
67 decor generic high-value dictionary word
68 devil generic high-value dictionary word
69 digit generic high-value dictionary word
70 dream generic high-value dictionary word
71 elite generic high-value dictionary word
72 faith generic high-value dictionary word
73 frail generic high-value dictionary word
74 funny generic high-value dictionary word
75 games generic high-value dictionary word
76 gbots generic high-value dictionary word
77 gifts generic high-value dictionary word
78 grand generic high-value dictionary word
79 house generic high-value dictionary word
80 human generic high-value dictionary word
81 karma generic high-value dictionary word
82 knife generic high-value dictionary word
83 local generic high-value dictionary word
84 mango generic high-value dictionary word
85 match generic high-value dictionary word
86 money generic high-value dictionary word
87 multi generic high-value dictionary word
88 north generic high-value dictionary word
89 offer generic high-value dictionary word
90 order generic high-value dictionary word
91 panel generic high-value dictionary word
92 pasta generic high-value dictionary word
93 payme generic high-value dictionary word
94 pizza generic high-value dictionary word
95 plain generic high-value dictionary word
96 plane generic high-value dictionary word
97 plate generic high-value dictionary word
98 point generic high-value dictionary word
99 poker generic high-value dictionary word
100 price generic high-value dictionary word
101 pride generic high-value dictionary word
102 promo generic high-value dictionary word
103 queen generic high-value dictionary word
104 sales generic high-value dictionary word
105 score generic high-value dictionary word
106 seven generic high-value dictionary word
107 sleep generic high-value dictionary word
108 smart generic high-value dictionary word
109 stars generic high-value dictionary word
110 start generic high-value dictionary word
111 store generic high-value dictionary word
112 story generic high-value dictionary word
113 sweet generic high-value dictionary word
114 tiger generic high-value dictionary word
115 today generic high-value dictionary word
116 total generic high-value dictionary word
117 trace generic high-value dictionary word
118 trust generic high-value dictionary word
119 union generic high-value dictionary word
120 viral generic high-value dictionary word
121 watch generic high-value dictionary word
122 weird generic high-value dictionary word
123 woman generic high-value dictionary word
124 world generic high-value dictionary word
125 bridge generic high-value dictionary word
126 buybot generic high-value dictionary word
127 create generic high-value dictionary word
128 credit generic high-value dictionary word
129 desire generic high-value dictionary word
130 dragon generic high-value dictionary word
131 empire generic high-value dictionary word
132 esport generic high-value dictionary word
133 europa generic high-value dictionary word
134 events generic high-value dictionary word
135 family generic high-value dictionary word
136 genius generic high-value dictionary word
137 honest generic high-value dictionary word
138 hotels generic high-value dictionary word
139 island generic high-value dictionary word
140 lonely generic high-value dictionary word
141 misery generic high-value dictionary word
142 monkey generic high-value dictionary word
143 paybox generic high-value dictionary word
144 player generic high-value dictionary word
145 please generic high-value dictionary word
146 poison generic high-value dictionary word
147 police generic high-value dictionary word
148 qrcode generic high-value dictionary word
149 racing generic high-value dictionary word
150 schizo generic high-value dictionary word
151 school generic high-value dictionary word
152 scores generic high-value dictionary word
153 secret generic high-value dictionary word
154 server generic high-value dictionary word
155 sevens generic high-value dictionary word
156 sports generic high-value dictionary word
157 studio generic high-value dictionary word
158 superb generic high-value dictionary word
159 system generic high-value dictionary word
160 ticket generic high-value dictionary word
161 trauma generic high-value dictionary word
162 unreal generic high-value dictionary word
163 videos generic high-value dictionary word
164 wealth generic high-value dictionary word
165 wizard generic high-value dictionary word
166 adviser generic high-value dictionary word
167 airport generic high-value dictionary word
168 balance generic high-value dictionary word
169 bignews generic high-value dictionary word
170 capital generic high-value dictionary word
171 checkup generic high-value dictionary word
172 connect generic high-value dictionary word
173 deposit generic high-value dictionary word
174 domains generic high-value dictionary word
175 easypay generic high-value dictionary word
176 english generic high-value dictionary word
177 fabrika generic high-value dictionary word
178 fishing generic high-value dictionary word
179 fitness generic high-value dictionary word
180 giftbot generic high-value dictionary word
181 lessons generic high-value dictionary word
182 liberty generic high-value dictionary word
183 listing generic high-value dictionary word
184 maestro generic high-value dictionary word
185 message generic high-value dictionary word
186 payment generic high-value dictionary word
187 tickets generic high-value dictionary word
188 tourist generic high-value dictionary word
189 travels generic high-value dictionary word
190 trinity generic high-value dictionary word
191 vehicle generic high-value dictionary word
192 baseball generic high-value dictionary word
193 calendar generic high-value dictionary word
194 checkout generic high-value dictionary word
195 delivery generic high-value dictionary word
196 discount generic high-value dictionary word
197 feedback generic high-value dictionary word
198 football generic high-value dictionary word
199 forecast generic high-value dictionary word
200 innocent generic high-value dictionary word
201 interior generic high-value dictionary word
202 internet generic high-value dictionary word
203 military generic high-value dictionary word
204 nickname generic high-value dictionary word
205 prestige generic high-value dictionary word
206 property generic high-value dictionary word
207 superior generic high-value dictionary word
208 anonymous generic high-value dictionary word
209 celebrity generic high-value dictionary word
210 concierge generic high-value dictionary word
211 insurance generic high-value dictionary word
212 livechart generic high-value dictionary word
213 middleman generic high-value dictionary word
214 nightmare generic high-value dictionary word
215 president generic high-value dictionary word
216 psychopath generic high-value dictionary word
217 realestate generic high-value dictionary word
218 technology generic high-value dictionary word
219 marketplace generic high-value dictionary word
220 hitler impersonates a real historical figure
221 nigga racial slur
222 nigger racial slur
223 alexa real company/brand name
224 apple real company/brand name
225 baidu real company/brand name
226 canon real company/brand name
227 damac real company/brand name
228 emaar real company/brand name
229 fendi real company/brand name
230 gmail real company/brand name
231 gucci real company/brand name
232 huobi real company/brand name
233 insta real company/brand name
234 kamaz real company/brand name
235 msnbc real company/brand name
236 opera real company/brand name
237 pepsi real company/brand name
238 volvo real company/brand name
239 yahoo real company/brand name
240 adidas real company/brand name
241 amazon real company/brand name
242 armani real company/brand name
243 chanel real company/brand name
244 fonbet real company/brand name
245 forbes real company/brand name
246 gitlab real company/brand name
247 nestle real company/brand name
248 nissan real company/brand name
249 openai real company/brand name
250 oracle real company/brand name
251 proton real company/brand name
252 tinder real company/brand name
253 toyota real company/brand name
254 arsenal real company/brand name
255 chatgpt real company/brand name
256 mancity real company/brand name
257 nakheel real company/brand name
258 pandora real company/brand name
259 alphabet real company/brand name
260 coinbase real company/brand name
261 facebook real company/brand name
262 flydubai real company/brand name
263 jpmorgan real company/brand name
264 legoland real company/brand name
265 linkedin real company/brand name
266 meduza real company/brand name (independent news outlet)
267 boris real person's name
268 diana real person's name
269 frank real person's name
270 putin real person's name
271 hayden real person's name
272 anthony real person's name
273 brandon real person's name
274 nicolas real person's name
275 dubai real place name
276 india real place name
277 brazil real place name
278 mexico real place name
279 moscow real place name
280 florida real place name
281 abudhabi real place name
282 portugal real place name
283 russia24 real place name
284 bollywood real place name
285 potus title referring to a real office (President of the United States)

View file

@ -0,0 +1,494 @@
# Fragment.com sold usernames
Snapshot of the 500 usernames shown at <https://fragment.com/?filter=sold> as of
2026-09-17 (fetched via curl - the page is server-rendered but its results
aren't paginated past this batch through a plain request). Each of these
changed hands on Fragment's TON-based marketplace, which makes them a decent
reference list of squatting targets worth considering for
`TELESRV_RESERVED_USERNAMES` (see [reserved-usernames.md](reserved-usernames.md))
beyond the impersonation/profanity angle those entries cover - these are
blocked purely because they have proven resale value.
Ordered by sale price (TON), highest first.
| Username | Price (TON) |
|---|---|
| @danbao | 1,583,948 |
| @news | 994,000 |
| @auto | 900,000 |
| @bank | 850,000 |
| @avia | 800,000 |
| @chat | 700,000 |
| @king | 675,000 |
| @fifa | 600,000 |
| @devil | 555,555 |
| @game | 500,000 |
| @sber | 471,000 |
| @meta | 404,000 |
| @casino | 400,000 |
| @polymarket | 354,900 |
| @doge | 350,000 |
| @hotels | 350,000 |
| @pizza | 346,000 |
| @nike | 330,000 |
| @gram | 313,000 |
| @play | 302,000 |
| @alfa | 300,000 |
| @coin | 300,000 |
| @cash | 284,000 |
| @rich | 266,000 |
| @checkout | 265,000 |
| @amazon | 262,500 |
| @ecom | 258,000 |
| @adidas | 250,000 |
| @cryptoholder | 250,000 |
| @defi | 250,000 |
| @trade | 245,000 |
| @chief | 242,000 |
| @trip | 237,000 |
| @web3 | 224,000 |
| @fuck | 219,000 |
| @payment | 207,000 |
| @fund | 206,000 |
| @interior | 203,000 |
| @love | 200,000 |
| @meet | 200,000 |
| @secret | 200,000 |
| @connect | 199,000 |
| @adviser | 189,000 |
| @promo | 187,000 |
| @tiger | 185,000 |
| @baseball | 179,000 |
| @mancity | 175,000 |
| @usdt | 174,000 |
| @chef | 171,000 |
| @forecast | 170,000 |
| @investor | 170,000 |
| @travels | 170,000 |
| @jpmorgan | 168,000 |
| @prestige | 168,000 |
| @fans | 167,000 |
| @potus | 165,000 |
| @balance | 160,000 |
| @esport | 160,000 |
| @insurance | 158,000 |
| @neobank | 158,000 |
| @dapp | 157,000 |
| @join | 155,000 |
| @land | 155,000 |
| @elite | 154,000 |
| @crypto | 153,000 |
| @events | 153,000 |
| @gold | 151,000 |
| @lord | 151,000 |
| @cars | 150,000 |
| @chart | 150,000 |
| @mail | 150,000 |
| @plate | 150,000 |
| @server | 150,000 |
| @visa | 150,000 |
| @sale | 147,000 |
| @bars | 145,000 |
| @swap | 145,000 |
| @msnbc | 141,000 |
| @start | 140,000 |
| @scores | 138,000 |
| @aero | 137,000 |
| @football | 137,000 |
| @payme | 137,000 |
| @union | 137,000 |
| @poker | 136,500 |
| @usdc | 136,000 |
| @checkup | 135,000 |
| @home | 135,000 |
| @trauma | 134,669 |
| @alphabet | 134,000 |
| @listing | 134,000 |
| @hack | 133,000 |
| @bets | 130,000 |
| @gbots | 130,000 |
| @name | 130,000 |
| @paybox | 130,000 |
| @putin | 130,000 |
| @queen | 128,000 |
| @beer | 127,000 |
| @date | 127,000 |
| @offer | 127,000 |
| @data | 126,000 |
| @food | 126,000 |
| @dice | 125,000 |
| @jets | 125,000 |
| @property | 125,000 |
| @deal | 122,000 |
| @host | 120,000 |
| @bocai | 118,888 |
| @armani | 115,000 |
| @dior | 115,000 |
| @fast | 114,000 |
| @middleman | 110,250 |
| @empire | 110,000 |
| @story | 107,000 |
| @trust | 107,000 |
| @oracle | 106,000 |
| @betting | 105,000 |
| @token | 105,000 |
| @ebank | 104,000 |
| @live | 104,000 |
| @beta | 103,000 |
| @doha | 103,000 |
| @busd | 101,000 |
| @anime | 100,000 |
| @canon | 100,000 |
| @club | 100,000 |
| @crew | 100,000 |
| @dogecoin | 100,000 |
| @elon | 100,000 |
| @huobi | 100,000 |
| @list | 100,000 |
| @porn | 100,000 |
| @psychopath | 100,000 |
| @english | 98,000 |
| @gain | 98,000 |
| @coke | 97,000 |
| @earn | 96,000 |
| @volvo | 96,000 |
| @csgo | 95,000 |
| @lottery | 95,000 |
| @toyota | 94,000 |
| @openai | 93,331 |
| @asset | 93,000 |
| @gate | 93,000 |
| @money | 92,400 |
| @bull | 92,000 |
| @mall | 92,000 |
| @plus | 92,000 |
| @point | 92,000 |
| @aura | 91,000 |
| @city | 91,000 |
| @livechart | 91,000 |
| @pandora | 91,000 |
| @racing | 91,000 |
| @chanel | 90,000 |
| @lion | 90,000 |
| @nestle | 90,000 |
| @today | 90,000 |
| @cafe | 89,000 |
| @goat | 89,000 |
| @life | 89,000 |
| @shib | 89,000 |
| @stake | 88,200 |
| @fishing | 88,000 |
| @nasa | 88,000 |
| @alexa | 87,000 |
| @mind | 87,000 |
| @human | 86,666 |
| @capital | 86,000 |
| @dragon | 86,000 |
| @studio | 86,000 |
| @funny | 85,000 |
| @plane | 85,000 |
| @gifts | 84,000 |
| @realestate | 84,000 |
| @lessons | 83,000 |
| @proton | 83,000 |
| @asia | 82,000 |
| @bond | 82,000 |
| @chats | 82,000 |
| @expo | 82,000 |
| @link | 82,000 |
| @tron | 82,000 |
| @games | 81,088 |
| @cast | 81,000 |
| @court | 81,000 |
| @dewa | 81,000 |
| @okex | 81,000 |
| @webx | 81,000 |
| @credit | 80,850 |
| @blackjack | 80,000 |
| @chatgpt | 80,000 |
| @dance | 80,000 |
| @hype | 80,000 |
| @maestro | 80,000 |
| @player | 80,000 |
| @roulette | 80,000 |
| @nakheel | 79,000 |
| @neom | 79,000 |
| @ticket | 79,000 |
| @tokens | 79,000 |
| @gems | 78,000 |
| @match | 78,000 |
| @pepsi | 78,000 |
| @trace | 78,000 |
| @vlog | 78,000 |
| @sevens | 77,777 |
| @cctv | 77,000 |
| @slot | 77,000 |
| @brazil | 76,000 |
| @dell | 76,000 |
| @port | 76,000 |
| @black | 75,000 |
| @deposit | 75,000 |
| @highroller | 75,000 |
| @score | 75,000 |
| @total | 75,000 |
| @cryptofund | 74,000 |
| @grand | 74,000 |
| @hell | 74,000 |
| @ebay | 73,000 |
| @gucci | 73,000 |
| @local | 73,000 |
| @pride | 73,000 |
| @bitc | 72,331 |
| @dubai | 72,106 |
| @xbox | 72,000 |
| @pass | 71,000 |
| @agent | 70,000 |
| @airport | 70,000 |
| @banki | 70,000 |
| @core | 70,000 |
| @erotic | 70,000 |
| @europa | 70,000 |
| @gitlab | 70,000 |
| @smart | 70,000 |
| @gift | 69,000 |
| @iqos | 69,000 |
| @move | 69,000 |
| @playboy | 69,000 |
| @code | 68,000 |
| @digit | 68,000 |
| @florida | 68,000 |
| @flydubai | 68,000 |
| @iran | 68,000 |
| @knife | 68,000 |
| @aqua | 67,000 |
| @dota | 67,000 |
| @feedback | 67,000 |
| @file | 67,000 |
| @house | 67,000 |
| @lady | 67,000 |
| @mega | 67,000 |
| @nude | 67,000 |
| @watch | 67,000 |
| @police | 66,666 |
| @domains | 66,000 |
| @pets | 66,000 |
| @tinder | 65,100 |
| @idea | 65,000 |
| @kiev | 65,000 |
| @moon | 65,000 |
| @ball | 64,000 |
| @book | 64,000 |
| @create | 64,000 |
| @nightmare | 63,800 |
| @good | 63,000 |
| @kiss | 63,000 |
| @plain | 63,000 |
| @casino_bot | 62,000 |
| @north | 62,000 |
| @cure | 61,750 |
| @best | 61,000 |
| @audi | 60,000 |
| @desire | 60,000 |
| @dzen | 60,000 |
| @facebook | 60,000 |
| @island | 60,000 |
| @sony | 60,000 |
| @stockbot | 60,000 |
| @tech | 60,000 |
| @hitler | 59,000 |
| @slots | 59,000 |
| @military | 58,000 |
| @qiwi | 57,882 |
| @fitness | 57,000 |
| @trinity | 57,000 |
| @hash | 56,000 |
| @unreal | 56,000 |
| @cocaine | 55,555 |
| @fish | 55,000 |
| @girl | 55,000 |
| @lonely | 55,000 |
| @sports | 55,000 |
| @teen | 54,600 |
| @stars | 54,500 |
| @ford | 54,000 |
| @goal | 54,000 |
| @vehicle | 54,000 |
| @exmo | 53,550 |
| @schizo | 53,550 |
| @asap | 53,000 |
| @discount | 53,000 |
| @hope | 53,000 |
| @marketplace | 53,000 |
| @easypay | 52,500 |
| @arsenal | 52,000 |
| @trading | 51,660 |
| @abudhabi | 51,450 |
| @euro | 51,000 |
| @nissan | 51,000 |
| @pasta | 51,000 |
| @price | 51,000 |
| @betmobile | 50,000 |
| @celebrity | 50,000 |
| @igor | 50,000 |
| @kamaz | 50,000 |
| @open | 50,000 |
| @poison | 50,000 |
| @time | 50,000 |
| @india | 49,645 |
| @atlas | 49,000 |
| @bridge | 49,000 |
| @fire | 49,000 |
| @golf | 49,000 |
| @linkedin | 49,000 |
| @mexico | 49,000 |
| @opera | 49,000 |
| @soul | 49,000 |
| @world | 49,000 |
| @wizard | 48,300 |
| @calendar | 48,000 |
| @decor | 48,000 |
| @gett | 48,000 |
| @mars | 48,000 |
| @nickname | 48,000 |
| @oman | 48,000 |
| @seven | 48,000 |
| @tourist | 48,000 |
| @xbet | 48,000 |
| @zero | 48,000 |
| @dawn | 47,000 |
| @logo | 47,000 |
| @order | 47,000 |
| @wifi | 47,000 |
| @gaoshou | 46,666 |
| @gamble | 46,544 |
| @school | 46,200 |
| @gulf | 46,000 |
| @drop | 45,000 |
| @frank | 45,000 |
| @liberty | 45,000 |
| @nigga | 45,000 |
| @please | 45,000 |
| @insta | 44,500 |
| @chess | 44,444 |
| @genius | 44,444 |
| @message | 44,444 |
| @hsbc | 44,000 |
| @kids | 44,000 |
| @waifu | 43,000 |
| @karma | 42,069 |
| @memecoin | 42,069 |
| @beach | 42,000 |
| @camp | 42,000 |
| @weird | 42,000 |
| @ahmed | 41,948 |
| @brute | 41,000 |
| @president | 40,500 |
| @base | 40,000 |
| @boss | 40,000 |
| @buybot | 40,000 |
| @care | 40,000 |
| @ether | 40,000 |
| @fabrika | 40,000 |
| @fendi | 40,000 |
| @jackpot | 40,000 |
| @moscow | 40,000 |
| @sales | 40,000 |
| @sleep | 40,000 |
| @hugo | 39,000 |
| @arena | 38,000 |
| @cryptodev | 38,000 |
| @portugal | 38,000 |
| @sell | 38,000 |
| @coinbase | 37,500 |
| @brandon | 37,357 |
| @cryptocard | 37,000 |
| @diana | 37,000 |
| @faith | 37,000 |
| @giftbot | 36,750 |
| @doom | 36,000 |
| @drug | 36,000 |
| @dude | 36,000 |
| @pure | 36,000 |
| @woman | 36,000 |
| @pepe | 35,887 |
| @adam | 35,000 |
| @army | 35,000 |
| @russia24 | 35,000 |
| @boris | 34,900 |
| @nfts | 34,729 |
| @innocent | 34,300 |
| @forbes | 34,000 |
| @mango | 34,000 |
| @bignews | 33,834 |
| @gmail | 33,333 |
| @exchange | 33,075 |
| @apple | 33,000 |
| @anthony | 32,955 |
| @trades | 32,550 |
| @blood | 32,000 |
| @panel | 32,000 |
| @viral | 32,000 |
| @baidu | 31,500 |
| @currency | 31,500 |
| @ethe | 31,500 |
| @lava | 31,500 |
| @tickets | 31,500 |
| @videos | 31,500 |
| @wealth | 31,500 |
| @metaverse | 31,300 |
| @shitcoin | 31,300 |
| @multi | 31,000 |
| @system | 30,335 |
| @burn | 30,000 |
| @easy | 30,000 |
| @finance | 30,000 |
| @fine | 30,000 |
| @fonbet | 30,000 |
| @investbanker | 30,000 |
| @misery | 30,000 |
| @ozon | 30,000 |
| @zcash | 30,000 |
| @nigger | 29,768 |
| @anonymous | 29,708 |
| @store | 29,520 |
| @cats | 29,500 |
| @family | 29,000 |
| @hayden | 29,000 |
| @top1 | 29,000 |
| @nicolas | 28,200 |
| @free | 28,000 |
| @honest | 27,500 |
| @superior | 27,300 |
| @oppo | 27,183 |
| @gambling | 27,000 |
| @john | 27,000 |
| @superb | 27,000 |
| @monkey | 26,686 |
| @damac | 26,250 |
| @delivery | 26,250 |
| @emaar | 26,250 |
| @find | 26,250 |
| @mary | 26,250 |
| @dream | 26,000 |
| @quit | 26,000 |
| @betwinner | 25,424 |
| @some | 25,309 |
| @bollywood | 25,000 |
| @frail | 25,000 |
| @hero | 25,000 |
| @ilya | 25,000 |
| @internet | 25,000 |
| @meduza | 25,000 |
| @qrcode | 25,000 |
| @sweet | 25,000 |
| @technology | 25,000 |
| @venture | 25,000 |
| @yahoo | 25,000 |
| @grok | 24,890 |
| @kill | 24,149 |
| @clown | 24,000 |
| @wallstreet | 23,725 |
| @concierge | 23,520 |
| @jake | 23,334 |
| @ares | 23,000 |
| @legoland | 23,000 |

102
docs/reserved-usernames.csv Normal file
View file

@ -0,0 +1,102 @@
telegram,official-sounding / staff-impersonation
telegramofficial,official-sounding / staff-impersonation
telegramsupport,official-sounding / staff-impersonation
telegramteam,official-sounding / staff-impersonation
telegramstaff,official-sounding / staff-impersonation
telegramhq,official-sounding / staff-impersonation
telegramnews,official-sounding / staff-impersonation
telegramnotifications,official-sounding / staff-impersonation
telegramverify,official-sounding / staff-impersonation
telegrambot,official-sounding / staff-impersonation
telegramservice,official-sounding / staff-impersonation
security,official-sounding / staff-impersonation
securityteam,official-sounding / staff-impersonation
verify,official-sounding / staff-impersonation
verification,official-sounding / staff-impersonation
verified,official-sounding / staff-impersonation
helpdesk,official-sounding / staff-impersonation
helpcenter,official-sounding / staff-impersonation
customerservice,official-sounding / staff-impersonation
customersupport,official-sounding / staff-impersonation
servicedesk,official-sounding / staff-impersonation
service,official-sounding / staff-impersonation
system,official-sounding / staff-impersonation
systemmessage,official-sounding / staff-impersonation
systembot,official-sounding / staff-impersonation
notifications,official-sounding / staff-impersonation
notification,official-sounding / staff-impersonation
alerts,official-sounding / staff-impersonation
announcements,official-sounding / staff-impersonation
announcement,official-sounding / staff-impersonation
newsroom,official-sounding / staff-impersonation
press,official-sounding / staff-impersonation
pressoffice,official-sounding / staff-impersonation
spambot,official-sounding / staff-impersonation
antispam,official-sounding / staff-impersonation
abuse,official-sounding / staff-impersonation
abusereport,official-sounding / staff-impersonation
reports,official-sounding / staff-impersonation
legal,official-sounding / staff-impersonation
compliance,official-sounding / staff-impersonation
billing,official-sounding / staff-impersonation
payments,official-sounding / staff-impersonation
finance,official-sounding / staff-impersonation
accounts,official-sounding / staff-impersonation
accountservices,official-sounding / staff-impersonation
recovery,official-sounding / staff-impersonation
unlock,official-sounding / staff-impersonation
restore,official-sounding / staff-impersonation
backup,official-sounding / staff-impersonation
headquarters,official-sounding / staff-impersonation
staffteam,official-sounding / staff-impersonation
modteam,official-sounding / staff-impersonation
moderation,official-sounding / staff-impersonation
moderators,official-sounding / staff-impersonation
founder,official-sounding / staff-impersonation
cofounder,official-sounding / staff-impersonation
management,official-sounding / staff-impersonation
durov,impersonates real Telegram leadership
pavel,impersonates real Telegram leadership
paveldurov,impersonates real Telegram leadership
pdurov,impersonates real Telegram leadership
nikolai,impersonates real Telegram leadership
nikolaidurov,impersonates real Telegram leadership
ndurov,impersonates real Telegram leadership
durovpavel,impersonates real Telegram leadership
telegramceo,impersonates real Telegram leadership
telegramfounder,impersonates real Telegram leadership
bitcoin,crypto / scam-bait impersonation
ethereum,crypto / scam-bait impersonation
toncoin,crypto / scam-bait impersonation
tonwallet,crypto / scam-bait impersonation
tonfoundation,crypto / scam-bait impersonation
crypto,crypto / scam-bait impersonation
cryptowallet,crypto / scam-bait impersonation
wallet,crypto / scam-bait impersonation
airdrop,crypto / scam-bait impersonation
giveaway,crypto / scam-bait impersonation
bonus,crypto / scam-bait impersonation
freecoins,crypto / scam-bait impersonation
claim,crypto / scam-bait impersonation
claimnow,crypto / scam-bait impersonation
binance,crypto / scam-bait impersonation
coinbase,crypto / scam-bait impersonation
kraken,crypto / scam-bait impersonation
metamask,crypto / scam-bait impersonation
trustwallet,crypto / scam-bait impersonation
ledger,crypto / scam-bait impersonation
opensea,crypto / scam-bait impersonation
uniswap,crypto / scam-bait impersonation
elonmusk,crypto / scam-bait impersonation
tesla,crypto / scam-bait impersonation
spacex,crypto / scam-bait impersonation
cryptosupport,crypto / scam-bait impersonation
walletsupport,crypto / scam-bait impersonation
tonsupport,crypto / scam-bait impersonation
binancesupport,crypto / scam-bait impersonation
investment,crypto / scam-bait impersonation
investmentteam,crypto / scam-bait impersonation
forextrading,crypto / scam-bait impersonation
tradingbot,crypto / scam-bait impersonation
signals,crypto / scam-bait impersonation
cryptosignals,crypto / scam-bait impersonation
1 telegram official-sounding / staff-impersonation
2 telegramofficial official-sounding / staff-impersonation
3 telegramsupport official-sounding / staff-impersonation
4 telegramteam official-sounding / staff-impersonation
5 telegramstaff official-sounding / staff-impersonation
6 telegramhq official-sounding / staff-impersonation
7 telegramnews official-sounding / staff-impersonation
8 telegramnotifications official-sounding / staff-impersonation
9 telegramverify official-sounding / staff-impersonation
10 telegrambot official-sounding / staff-impersonation
11 telegramservice official-sounding / staff-impersonation
12 security official-sounding / staff-impersonation
13 securityteam official-sounding / staff-impersonation
14 verify official-sounding / staff-impersonation
15 verification official-sounding / staff-impersonation
16 verified official-sounding / staff-impersonation
17 helpdesk official-sounding / staff-impersonation
18 helpcenter official-sounding / staff-impersonation
19 customerservice official-sounding / staff-impersonation
20 customersupport official-sounding / staff-impersonation
21 servicedesk official-sounding / staff-impersonation
22 service official-sounding / staff-impersonation
23 system official-sounding / staff-impersonation
24 systemmessage official-sounding / staff-impersonation
25 systembot official-sounding / staff-impersonation
26 notifications official-sounding / staff-impersonation
27 notification official-sounding / staff-impersonation
28 alerts official-sounding / staff-impersonation
29 announcements official-sounding / staff-impersonation
30 announcement official-sounding / staff-impersonation
31 newsroom official-sounding / staff-impersonation
32 press official-sounding / staff-impersonation
33 pressoffice official-sounding / staff-impersonation
34 spambot official-sounding / staff-impersonation
35 antispam official-sounding / staff-impersonation
36 abuse official-sounding / staff-impersonation
37 abusereport official-sounding / staff-impersonation
38 reports official-sounding / staff-impersonation
39 legal official-sounding / staff-impersonation
40 compliance official-sounding / staff-impersonation
41 billing official-sounding / staff-impersonation
42 payments official-sounding / staff-impersonation
43 finance official-sounding / staff-impersonation
44 accounts official-sounding / staff-impersonation
45 accountservices official-sounding / staff-impersonation
46 recovery official-sounding / staff-impersonation
47 unlock official-sounding / staff-impersonation
48 restore official-sounding / staff-impersonation
49 backup official-sounding / staff-impersonation
50 headquarters official-sounding / staff-impersonation
51 staffteam official-sounding / staff-impersonation
52 modteam official-sounding / staff-impersonation
53 moderation official-sounding / staff-impersonation
54 moderators official-sounding / staff-impersonation
55 founder official-sounding / staff-impersonation
56 cofounder official-sounding / staff-impersonation
57 management official-sounding / staff-impersonation
58 durov impersonates real Telegram leadership
59 pavel impersonates real Telegram leadership
60 paveldurov impersonates real Telegram leadership
61 pdurov impersonates real Telegram leadership
62 nikolai impersonates real Telegram leadership
63 nikolaidurov impersonates real Telegram leadership
64 ndurov impersonates real Telegram leadership
65 durovpavel impersonates real Telegram leadership
66 telegramceo impersonates real Telegram leadership
67 telegramfounder impersonates real Telegram leadership
68 bitcoin crypto / scam-bait impersonation
69 ethereum crypto / scam-bait impersonation
70 toncoin crypto / scam-bait impersonation
71 tonwallet crypto / scam-bait impersonation
72 tonfoundation crypto / scam-bait impersonation
73 crypto crypto / scam-bait impersonation
74 cryptowallet crypto / scam-bait impersonation
75 wallet crypto / scam-bait impersonation
76 airdrop crypto / scam-bait impersonation
77 giveaway crypto / scam-bait impersonation
78 bonus crypto / scam-bait impersonation
79 freecoins crypto / scam-bait impersonation
80 claim crypto / scam-bait impersonation
81 claimnow crypto / scam-bait impersonation
82 binance crypto / scam-bait impersonation
83 coinbase crypto / scam-bait impersonation
84 kraken crypto / scam-bait impersonation
85 metamask crypto / scam-bait impersonation
86 trustwallet crypto / scam-bait impersonation
87 ledger crypto / scam-bait impersonation
88 opensea crypto / scam-bait impersonation
89 uniswap crypto / scam-bait impersonation
90 elonmusk crypto / scam-bait impersonation
91 tesla crypto / scam-bait impersonation
92 spacex crypto / scam-bait impersonation
93 cryptosupport crypto / scam-bait impersonation
94 walletsupport crypto / scam-bait impersonation
95 tonsupport crypto / scam-bait impersonation
96 binancesupport crypto / scam-bait impersonation
97 investment crypto / scam-bait impersonation
98 investmentteam crypto / scam-bait impersonation
99 forextrading crypto / scam-bait impersonation
100 tradingbot crypto / scam-bait impersonation
101 signals crypto / scam-bait impersonation
102 cryptosignals crypto / scam-bait impersonation

View file

@ -12,6 +12,12 @@ Organized by why each entry is worth blocking. Trim or extend per your own
deployment — none of this is enforced by the server itself, it's just a deployment — none of this is enforced by the server itself, it's just a
starting list to feed into the env var. starting list to feed into the env var.
The same entries, one per line as `username,reason`, are in
[reserved-usernames.csv](reserved-usernames.csv) — that's the format
`scripts/reserve_usernames.py` reads, for feeding this list straight into the
admin panel's reserved-usernames blocklist (a per-username admin action,
distinct from `TELESRV_RESERVED_USERNAMES`) instead of the env var.
## Official-sounding / staff-impersonation ## Official-sounding / staff-impersonation
Names that would read as "this account speaks for the operator" if a Names that would read as "this account speaks for the operator" if a
@ -51,6 +57,20 @@ tesla, spacex, cryptosupport, walletsupport, tonsupport, binancesupport,
investment, investmentteam, forextrading, tradingbot, signals, cryptosignals investment, investmentteam, forextrading, tradingbot, signals, cryptosignals
``` ```
## Vulgar / offensive
Common profanity and slurs worth blocking outright, independent of any
impersonation angle. Limited to entries of 5+ characters, since anything
shorter is already unreachable through self-service `account.updateUsername`
/ `channels.updateUsername` (5-character length floor). Not included in the
`TELESRV_RESERVED_USERNAMES` suggestion below - add these separately if your
deployment wants them.
```text
fucker, fucking, motherfucker, bullshit, asshole, bitch, bastard, dickhead,
pussy, whore, nigger, nigga, faggot, retard, rapist, pedophile, hitler
```
## Suggested env var ## Suggested env var
Comma-separated, matching `envListOr`'s parsing: Comma-separated, matching `envListOr`'s parsing:

129
scripts/reserve_usernames.py Executable file
View file

@ -0,0 +1,129 @@
#!/usr/bin/env python3
"""Bulk-reserve usernames through the telesrv-admin panel API.
Reads a CSV file of `username,reason` lines and calls
POST /api/actions/reserve-username for each one, using the same
login -> cookie session -> CSRF token flow the panel frontend uses
(see docs/admin-panel-api.en.md).
Usage:
python3 scripts/reserve_usernames.py \
--host https://admin.example.com \
--username operator_name \
--file usernames.csv
`--username` is your own named admin_console_users account - use the same
username/password you log into the panel with. (The panel also has an
"owpengram" break-glass login backed by TELESRV_ADMIN_UI_PASSWORD / _TOKEN,
but that's a fallback for when the database or named accounts aren't
available, not something to use day-to-day.) The script prompts for your
password either way - it's never passed as a CLI argument or stored.
CSV format, one entry per line, no header:
somename,squatting on a brand name
othername,profanity
"""
import argparse
import csv
import getpass
import http.cookiejar
import json
import sys
import urllib.error
import urllib.request
def build_opener():
jar = http.cookiejar.CookieJar()
return urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar)), jar
def post_json(opener, url, payload, extra_headers=None):
data = json.dumps(payload).encode("utf-8")
headers = {"Content-Type": "application/json"}
if extra_headers:
headers.update(extra_headers)
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
try:
with opener.open(req) as resp:
body = resp.read()
return resp.status, json.loads(body) if body else {}
except urllib.error.HTTPError as e:
body = e.read()
try:
return e.code, json.loads(body) if body else {}
except json.JSONDecodeError:
return e.code, {"error": body.decode("utf-8", "replace")}
def login(opener, host, username, secret):
status, resp = post_json(opener, f"{host}/api/login", {"username": username, "secret": secret})
if status != 200:
raise SystemExit(f"login failed: HTTP {status} {resp}")
return resp["csrf_token"]
def reserve_username(opener, host, csrf_token, username, reason):
status, resp = post_json(
opener,
f"{host}/api/actions/reserve-username",
{"username": username, "reason": reason, "confirm": True},
extra_headers={"X-CSRF-Token": csrf_token},
)
return status, resp
def read_entries(path):
entries = []
with open(path, newline="") as f:
for lineno, row in enumerate(csv.reader(f), start=1):
if not row or not row[0].strip():
continue
if len(row) < 2:
raise SystemExit(f"{path}:{lineno}: expected 'username,reason', got {row!r}")
username = row[0].strip()
reason = ",".join(row[1:]).strip()
if not username or not reason:
raise SystemExit(f"{path}:{lineno}: empty username or reason")
entries.append((username, reason))
return entries
def main():
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("--host", required=True, help="panel base URL, e.g. https://admin.example.com")
parser.add_argument("--username", required=True, help="your named admin_console_users account")
parser.add_argument("--file", required=True, help="CSV file of username,reason lines")
args = parser.parse_args()
host = args.host.rstrip("/")
entries = read_entries(args.file)
if not entries:
raise SystemExit("no entries found in " + args.file)
secret = getpass.getpass("Password/secret: ")
opener, _jar = build_opener()
csrf_token = login(opener, host, args.username, secret)
ok, failed = 0, []
for username, reason in entries:
status, resp = reserve_username(opener, host, csrf_token, username, reason)
if status == 200:
ok += 1
print(f"reserved {username!r} ({reason})")
else:
failed.append((username, reason, status, resp))
print(f"FAILED {username!r} HTTP {status} {resp.get('error') or resp.get('message') or resp}")
print(f"\n{ok}/{len(entries)} reserved")
if failed:
print(f"{len(failed)} failed:")
for username, reason, status, resp in failed:
print(f" {username}: HTTP {status} {resp}")
sys.exit(1)
if __name__ == "__main__":
main()