Compare commits

...
11 Commits
Author SHA1 Message Date
tanner c3301d9276 Upgrade dependencies 2024-06-30 19:39:43 +00:00
tanner bcef114a02 Add delete script 2024-06-30 19:39:36 +00:00
tanner 41e41b3f02 Add dark mode, viewport meta 2024-02-26 01:33:59 +00:00
tanner 0698e695bf Add misc cleaning scripts for t0txt 2022-06-20 00:53:56 +00:00
tanner 6361a23977 Ignore log files 2022-06-20 00:53:24 +00:00
Tanner Collin a2eaf44ffe Merge pull request #2 from tannercollin/dependabot/pip/jinja2-2.11.3
Bump jinja2 from 2.10.1 to 2.11.3
2022-06-12 22:01:26 +00:00
tanner b6e82f0d42 Adjust CAPTCHA 2022-06-12 22:00:40 +00:00
tanner 52892f88e2 Add CAPTCHA 2021-08-20 20:23:43 +00:00
dependabot[bot] b7b58e6192 Bump jinja2 from 2.10.1 to 2.11.3
Bumps [jinja2](https://github.com/pallets/jinja) from 2.10.1 to 2.11.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/master/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/2.10.1...2.11.3)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-20 01:38:59 +00:00
Tanner Collin e51f7e98df Merge pull request #1 from AndrewLaneX/filename-param
Add an optional filename URL parameter
2020-08-20 14:25:41 -06:00
Andrew Lane 6436454003 Add an optional filename URL parameter 2020-08-20 16:15:35 -04:00
8 changed files with 231 additions and 35 deletions
+1
View File
@@ -106,3 +106,4 @@ ENV/
db.sqlite3 db.sqlite3
data/* data/*
*.log
-21
View File
@@ -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
View File
@@ -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.')
+27
View File
@@ -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
View File
@@ -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.')
+28
View File
@@ -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
View File
@@ -1,7 +1,9 @@
Click==7.0 blinker==1.8.2
Flask==1.1.1 click==8.1.7
itsdangerous==1.1.0 flask==3.0.3
Jinja2==2.10.1 importlib-metadata==8.0.0
MarkupSafe==1.1.1 itsdangerous==2.2.0
pkg-resources==0.0.0 jinja2==3.1.4
Werkzeug==0.15.5 MarkupSafe==2.1.5
werkzeug==3.0.3
zipp==3.19.2
+33 -7
View File
@@ -16,10 +16,14 @@ def help():
form = ( form = (
'<form action="{0}" method="POST" accept-charset="UTF-8">' '<form action="{0}" method="POST" accept-charset="UTF-8">'
'<input name="web" type="hidden" value="true">' '<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) '<br><button type="submit">Submit</button></form>'.format(URL, POST)
) )
return """ return """
<meta name="color-scheme" content="light dark" />
<meta name="viewport" content="width=1%" />
<pre> <pre>
txt.t0.vc txt.t0.vc
NAME NAME
@@ -28,7 +32,6 @@ NAME
USAGE USAGE
&lt;command&gt; | curl -F '{0}=&lt;-' {1} &lt;command&gt; | curl -F '{0}=&lt;-' {1}
or upload from the web: or upload from the web:
{2} {2}
DESCRIPTION DESCRIPTION
@@ -68,21 +71,43 @@ def index():
@flask_app.route('/', methods=['POST']) @flask_app.route('/', methods=['POST'])
def new(): def new():
print()
try: 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: with shelve.open(DB) as db:
nid = new_id() nid = new_id()
while nid in db: while nid in db:
nid = new_id() nid = new_id()
txt = request.form['txt'] 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 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) url = '{}/{}'.format(URL, nid)
if 'web' in request.form:
if is_web:
return redirect(url) return redirect(url)
else: else:
return url + '\n' return url + '\n'
@@ -90,7 +115,8 @@ def new():
abort(400) abort(400)
@flask_app.route('/<nid>', methods=['GET']) @flask_app.route('/<nid>', methods=['GET'])
def get(nid): @flask_app.route('/<nid>/<filename>', methods=['GET'])
def get(nid, filename=None):
try: try:
with shelve.open(DB) as db: with shelve.open(DB) as db:
return db[nid] + '\n', 200, {'Content-Type': 'text/plain; charset=utf-8'} return db[nid] + '\n', 200, {'Content-Type': 'text/plain; charset=utf-8'}