Compare commits
11
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3301d9276 | ||
|
|
bcef114a02 | ||
|
|
41e41b3f02 | ||
|
|
0698e695bf | ||
|
|
6361a23977 | ||
|
|
a2eaf44ffe | ||
|
|
b6e82f0d42 | ||
|
|
52892f88e2 | ||
|
|
b7b58e6192 | ||
|
|
e51f7e98df | ||
|
|
6436454003 |
@@ -106,3 +106,4 @@ ENV/
|
||||
db.sqlite3
|
||||
|
||||
data/*
|
||||
*.log
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
import shelve
|
||||
|
||||
db = shelve.open('t0txt')
|
||||
|
||||
new = shelve.open('new')
|
||||
|
||||
for k in db.keys():
|
||||
try:
|
||||
note = db[k]
|
||||
except:
|
||||
print('error', k)
|
||||
continue
|
||||
|
||||
if not note and not isinstance(note, str):
|
||||
print('bad', k)
|
||||
continue
|
||||
|
||||
if k == 'HVQH':
|
||||
continue
|
||||
|
||||
new[k] = note
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
import shelve
|
||||
|
||||
db = shelve.open('data/t0txt')
|
||||
|
||||
to_delete = []
|
||||
|
||||
WHITELIST = ['t0.vc', 'tanner', 'protospace', 'seed combinations', 'tcoins in circulation', 'pokemon trade', 'pokemon battle', 'unique in collection', '%) left.', 'telethon', 'datetime', ' +0000', 'print(', 'console.log', 'systemd', '-Iinclude', 'BOOT_IMAGE', '#endif', '/bin/bash', 'python3.', 'stdio.h', 'int main(']
|
||||
BAD_WORDS = ['blogspot.com', 'livejournal.com', 'tumblr.com', 'noname.fun', 'biturl.top', 'google.com/url?q', '.ru/">', '.ru">', 'viagra']
|
||||
BAD_COMBO = ['jackpot', 'casino', 'sex', 'porn', 'naked', 'xxx', 'lesbian', 'gay', 'crypto', 'pussy', 'fuck', 'cialis', 'pharmacy', 'doxycycline', 'zantac', 'ivermectin', 'drug', 'prescri', 'amateur', 'kratom', 'medicament', 'medicine', 'medication', 'lisinopril', 'pepcid', 'prilosec', 'lolita', 'bitcoin', 'ethereum', 'essay', 'professor']
|
||||
|
||||
LANGUAGE = [
|
||||
'fælde oversøiske får effektivitet symptomerne',
|
||||
'лучить полную консультацию нашего Менеджера также оставить заявку получение справки формы',
|
||||
'Привет нашел классный сайт про автомобили много полезной информации',
|
||||
'lekárskeho predpisu lekárni liekové interakcie lekárňach kúpiť',
|
||||
'gået årene bære мошенники пидорасы здесь обман отзывы',
|
||||
'sjukdom dysfunktion njurinfektion läser när läkemedel kända',
|
||||
'Создание дома вашей мечты это оригинальная возможность спланировать претворить жизнь нечто воистину уникальное всех отношениях',
|
||||
'Узнайте сваи винтовые для фундамента цены вытегре спспециалистовециалистов корпорации',
|
||||
'criptovaluta descuento tecnologicos portafoglio informazioni crittografia koronaviru quimioterapia',
|
||||
'ігрові автомати Казино украина отзывы киеве закрыли поездки зарубеж',
|
||||
'только недавно они вошли рынке этой продукции Предлагаем Вашему вниманию изделия',
|
||||
'Искалка интернет магазинам Без рекламы прочих прелестей современного интернета вакансии тур операторов',
|
||||
'rychlé doručení inzulín měchýře formuláře předpis během těhotenství předpis potřeby hyperkalémie kloubů možnou přijatelné',
|
||||
'第 借 錢 網 擁 有 全 台 最 多 的 借 錢 資 訊 歐 客 佬 精 品 咖 啡 遊 戲 情 報 專 業 光 碟 教 學 網 站 娛 樂 城 介 紹',
|
||||
'карта для оплаты интернете займы счет банке номер телефона монеза подпольное казино киева новости туризма операторов сыр Пинап казино',
|
||||
'Bán đến dưới giá đổi thời điểm',
|
||||
'bære strømper stråler nødvendige hænder',
|
||||
'stråling bløde antibakterielle også søvn forretningsrejse repræsenterer opnås',
|
||||
'кливленд кавальерс состав доска липа сухая москва доска дубовая обрезная сухая купить брус ясень купить новые фото кубань руна человек значение',
|
||||
'Присутствие данном присутствие больших пакгаузных комнат создало допустимым формирование постоянных поставок абсолютно всем покупателям',
|
||||
'очень интересно чичего понятно Портал котором собраны все будет полезен всем',
|
||||
'jednostavno prednosti korisnicka podrska kvalitetna',
|
||||
'antibiootikumid kasumijaotus haavandite kasutamine',
|
||||
'större säker övningar sköldkörteln Även migræne læge være træt',
|
||||
'Возможности программы компьютера новости поездок programД спасибо интересное чтиво',
|
||||
'medizinisches nutzliches gefunden',
|
||||
'يشتمل موقعنا على روابط تشعبية وتفاصيل عن مواقع خاصة بأطراف ثالثة علمًا بأنه ليس لدينا أي سيطرة على سياسات الخصوصية وممارسات الأطراف الثالثة كما أننا لسنا مسؤولين عنها',
|
||||
'psoriasi trattamento dermatite',
|
||||
'סר ט סקס ח נם',
|
||||
'ссылка Зацените Ваше мнение юмз фронтальный погрузчик или самых сексуальных моделей кредит для ип онлайн заработок на стейкинге Ботвинья Рецепт Приготовления',
|
||||
'antivirale medicijnen antivirale geneesmiddelen richten antiviraal antivirovГЅch virЕЇm',
|
||||
'заработок криптовалюте заработок стейкинге кормить почему доверяю кормам Гидра официальный сайт нем дает Заказчикам стейкинге криптовалют заработок курсы английского языка',
|
||||
'взыскание задолженности по договору поможем вернуть долг Пограничное расстройство личности',
|
||||
'ケ ー ス コ ピ シ ャ ネ ル',
|
||||
]
|
||||
|
||||
|
||||
for lang in LANGUAGE:
|
||||
BAD_COMBO += [x.strip() for x in lang.split(' ')]
|
||||
BAD_COMBO = list(set(BAD_COMBO))
|
||||
|
||||
num_before = len(db)
|
||||
|
||||
for key, value in db.items():
|
||||
content = value.lower()
|
||||
skip = False
|
||||
|
||||
for good_word in WHITELIST:
|
||||
if good_word in content:
|
||||
skip = True
|
||||
break
|
||||
|
||||
if skip: continue
|
||||
|
||||
for bad_word in BAD_WORDS:
|
||||
if bad_word in content:
|
||||
print('Deleting note', key, 'bad word:', bad_word)
|
||||
to_delete.append(key)
|
||||
skip = True
|
||||
break
|
||||
|
||||
if skip: continue
|
||||
|
||||
combo_hits = set()
|
||||
|
||||
for bad_word in BAD_COMBO:
|
||||
if bad_word in content:
|
||||
combo_hits.add(bad_word)
|
||||
|
||||
if len(combo_hits) >= 2:
|
||||
print('Deleting note', key, 'bad combo:', ', '.join(list(combo_hits)))
|
||||
to_delete.append(key)
|
||||
continue
|
||||
|
||||
num_http = content.count('http')
|
||||
num_line = content.replace('\n\n', '\n').count('\n')
|
||||
link_ratio = num_http / num_line if num_line else 999
|
||||
|
||||
if num_http > 7 and link_ratio > 0.75:
|
||||
print('Deleting note', key, 'links:', num_http, 'ratio:', round(link_ratio, 2))
|
||||
to_delete.append(key)
|
||||
continue
|
||||
|
||||
to_delete = list(set(to_delete))
|
||||
|
||||
print('found', len(to_delete), 'notes to delete')
|
||||
|
||||
for key in to_delete:
|
||||
del db[key]
|
||||
|
||||
#import random
|
||||
#while True:
|
||||
# note_id = random.choice(to_delete)
|
||||
# note = db[note_id]
|
||||
#
|
||||
# print()
|
||||
# print('===================================================')
|
||||
# print()
|
||||
# print(note)
|
||||
# input()
|
||||
|
||||
print('done.')
|
||||
@@ -0,0 +1,27 @@
|
||||
import sys
|
||||
import shelve
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print('Please give the note ID to delete.')
|
||||
print('Example: python misc/delete.py IEGA')
|
||||
exit()
|
||||
else:
|
||||
del_id = sys.argv[1]
|
||||
|
||||
print('Deleting note:', del_id)
|
||||
|
||||
with shelve.open('data/t0txt') as db:
|
||||
if del_id not in db:
|
||||
print('Not found.')
|
||||
exit()
|
||||
|
||||
print('Contents:')
|
||||
print(db[del_id])
|
||||
|
||||
print()
|
||||
print('Enter to confirm, ctrl-c to cancel')
|
||||
input()
|
||||
|
||||
del db[del_id]
|
||||
|
||||
print('done.')
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
import shelve
|
||||
|
||||
db = shelve.open('data/t0txt')
|
||||
|
||||
num_qot = 0
|
||||
num_not = 0
|
||||
|
||||
for key, value in db.items():
|
||||
content = value.lower()
|
||||
|
||||
if 'qot' in content:
|
||||
num_qot += 1
|
||||
else:
|
||||
num_not += 1
|
||||
|
||||
print('num qot:', num_qot)
|
||||
print('num not:', num_not)
|
||||
|
||||
print('ratio:', num_qot / len(db))
|
||||
print('Qot.')
|
||||
@@ -0,0 +1,28 @@
|
||||
import shelve
|
||||
import random
|
||||
|
||||
WHITELIST = ['t0.vc', 'tanner', 'protospace', 'seed combinations', 'tcoins in circulation', 'pokemon trade', 'pokemon battle', 'unique in collection', '%) left.', 'telethon', 'datetime', ' +0000', 'print(', 'console.log', 'systemd', '-Iinclude', 'BOOT_IMAGE', '#endif', '/bin/bash', 'python3.', 'stdio.h']
|
||||
|
||||
db = shelve.open('data/t0txt')
|
||||
|
||||
keys = list(db.keys())
|
||||
|
||||
while True:
|
||||
while True:
|
||||
note_id = random.choice(keys)
|
||||
note = db[note_id]
|
||||
|
||||
for good_word in WHITELIST:
|
||||
if good_word in note.lower():
|
||||
break
|
||||
else: #for
|
||||
break
|
||||
|
||||
print(note)
|
||||
|
||||
num_http = note.count('http')
|
||||
num_line = note.count('\n')
|
||||
|
||||
print('num http:', num_http, 'lines:', num_line, 'ratio:', num_http / num_line if num_line else 'inf')
|
||||
|
||||
input()
|
||||
+9
-7
@@ -1,7 +1,9 @@
|
||||
Click==7.0
|
||||
Flask==1.1.1
|
||||
itsdangerous==1.1.0
|
||||
Jinja2==2.10.1
|
||||
MarkupSafe==1.1.1
|
||||
pkg-resources==0.0.0
|
||||
Werkzeug==0.15.5
|
||||
blinker==1.8.2
|
||||
click==8.1.7
|
||||
flask==3.0.3
|
||||
importlib-metadata==8.0.0
|
||||
itsdangerous==2.2.0
|
||||
jinja2==3.1.4
|
||||
MarkupSafe==2.1.5
|
||||
werkzeug==3.0.3
|
||||
zipp==3.19.2
|
||||
|
||||
@@ -16,10 +16,14 @@ def help():
|
||||
form = (
|
||||
'<form action="{0}" method="POST" accept-charset="UTF-8">'
|
||||
'<input name="web" type="hidden" value="true">'
|
||||
'<textarea name="{1}" cols="60" rows="18"></textarea>'
|
||||
'<input name="name" style="border: none;">'
|
||||
'<br><textarea name="{1}" cols="60" rows="18"></textarea>'
|
||||
'<br>CAPTCHA: Who owns this site? <input name="captcha">'
|
||||
'<br><button type="submit">Submit</button></form>'.format(URL, POST)
|
||||
)
|
||||
return """
|
||||
<meta name="color-scheme" content="light dark" />
|
||||
<meta name="viewport" content="width=1%" />
|
||||
<pre>
|
||||
txt.t0.vc
|
||||
NAME
|
||||
@@ -28,7 +32,6 @@ NAME
|
||||
USAGE
|
||||
<command> | curl -F '{0}=<-' {1}
|
||||
or upload from the web:
|
||||
|
||||
{2}
|
||||
|
||||
DESCRIPTION
|
||||
@@ -68,21 +71,43 @@ def index():
|
||||
|
||||
@flask_app.route('/', methods=['POST'])
|
||||
def new():
|
||||
print()
|
||||
try:
|
||||
is_web = 'web' in request.form
|
||||
|
||||
name = request.form.get('name', None)
|
||||
if name:
|
||||
# TODO: fail if name field is filled out
|
||||
print('Name filled out:', name)
|
||||
|
||||
captcha = request.form.get('captcha', None)
|
||||
if is_web and 'tanner' not in captcha.lower() and 'collin' not in captcha.lower():
|
||||
print('Captcha failed:', captcha)
|
||||
return redirect('https://txt.t0.vc/LPPZ')
|
||||
else:
|
||||
print('Captcha passed:', captcha)
|
||||
|
||||
with shelve.open(DB) as db:
|
||||
nid = new_id()
|
||||
while nid in db:
|
||||
nid = new_id()
|
||||
|
||||
txt = request.form['txt']
|
||||
if not txt: raise
|
||||
if len(txt) > 250000: raise
|
||||
|
||||
if not txt:
|
||||
print('Note is empty.')
|
||||
raise
|
||||
if len(txt) > 250000:
|
||||
print('Note too large.')
|
||||
raise
|
||||
|
||||
db[nid] = txt
|
||||
|
||||
print('Adding note {}:\n{}'.format(nid, txt))
|
||||
print('Adding note {} via {}:\n{}'.format(nid, 'web' if is_web else 'api', txt))
|
||||
|
||||
url = '{}/{}'.format(URL, nid)
|
||||
if 'web' in request.form:
|
||||
|
||||
if is_web:
|
||||
return redirect(url)
|
||||
else:
|
||||
return url + '\n'
|
||||
@@ -90,7 +115,8 @@ def new():
|
||||
abort(400)
|
||||
|
||||
@flask_app.route('/<nid>', methods=['GET'])
|
||||
def get(nid):
|
||||
@flask_app.route('/<nid>/<filename>', methods=['GET'])
|
||||
def get(nid, filename=None):
|
||||
try:
|
||||
with shelve.open(DB) as db:
|
||||
return db[nid] + '\n', 200, {'Content-Type': 'text/plain; charset=utf-8'}
|
||||
|
||||
Reference in New Issue
Block a user