25'ten fazla konu seçemezsiniz
Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
133 satır
4.0 KiB
133 satır
4.0 KiB
import os |
|
import logging |
|
logging.basicConfig( |
|
format='[%(asctime)s] %(levelname)s %(module)s/%(funcName)s - %(message)s', |
|
level=logging.DEBUG if os.environ.get('DEBUG') else logging.INFO) |
|
|
|
import settings |
|
import asyncio |
|
import json |
|
import requests |
|
from datetime import datetime |
|
from uuid import uuid4 |
|
from telethon import TelegramClient, events |
|
|
|
from aiohttp import web |
|
|
|
bot = TelegramClient('data/bot', settings.API_ID, settings.API_HASH).start(bot_token=settings.API_TOKEN) |
|
TANNER = 79316791 |
|
|
|
messages = {} |
|
|
|
def controller_message(message): |
|
payload = dict(misc=message) |
|
r = requests.post('https://tbot.tannercollin.com/message', data=payload, timeout=10) |
|
if r.status_code == 200: |
|
return True |
|
else: |
|
logging.exception('Unable to communicate with controller! Message: ' + message) |
|
return False |
|
|
|
@bot.on(events.NewMessage(incoming=True)) |
|
async def new_message(event): |
|
text = event.raw_text |
|
sender = event.sender_id |
|
logging.info('{} {}'.format(sender, text)) |
|
|
|
if sender != TANNER: |
|
return |
|
if not text.startswith('/allow_'): |
|
return |
|
|
|
mid = text.replace('/allow_', '') |
|
try: |
|
data = messages[mid] |
|
except KeyError: |
|
await event.reply('Message ID not found. Did the bot restart?') |
|
return |
|
|
|
entry = '\n\n{} - {}'.format(data['date'], data['name']) |
|
|
|
website = data['website'] |
|
if website: |
|
prefixes = ['http://', 'https://', 'gemini://', 'gopher://'] |
|
for prefix in prefixes: |
|
if website.lower().startswith(prefix): |
|
break |
|
else: # for loop |
|
website = 'http://' + website |
|
|
|
entry += ' (<a href="{0}" target="_blank" rel="noreferrer noopener">{0}</a>)'.format(website) |
|
|
|
entry += '\n\n{}\n\n------------------------------------------------------------'.format(data['message']) |
|
|
|
with open('data/g/index.html', 'r') as f: |
|
page = f.read() |
|
|
|
with open('data/g/index.html', 'w') as f: |
|
header, entries = page.split('===========', maxsplit=1) |
|
|
|
f.write(header) |
|
f.write('===========') |
|
f.write(entry) |
|
f.write(entries) |
|
|
|
await event.reply('Entry added to t0.vc/g') |
|
logging.info('Added: {}'.format(data)) |
|
|
|
async def message_tanner(name, website, message, captcha, mid): |
|
if 'tanner' not in captcha.lower(): |
|
return |
|
|
|
if name.replace(' ', '') in ['website', 'webpage', 'homepage']: |
|
return |
|
|
|
report = 'Name: {}\n\nWebsite: {}\n\nMessage: {}\n\n/allow_{}' |
|
try: |
|
await bot.send_message(TANNER, message=report.format(name, website, message, mid)) |
|
except: |
|
logging.error('Problem sending bot message.') |
|
controller_message('t0sig: problem sending bot message!') |
|
exit() |
|
|
|
|
|
async def submit(request): |
|
data = dict(await request.post()) |
|
data['date'] = str(datetime.today().date()) |
|
mid = str(uuid4()).split('-')[0] |
|
logging.info('{} {}'.format(mid, data)) |
|
|
|
try: |
|
fake_username = data.get('fake_username', '') # not used yet |
|
name = data['name'] |
|
website = data.get('website', '') |
|
message = data['message'] |
|
captcha = data.get('captcha', '') |
|
except KeyError: |
|
raise web.HTTPBadRequest(reason='You are missing something.') |
|
|
|
if not len(name) or not len(message): |
|
raise web.HTTPBadRequest(reason='You are missing something.') |
|
|
|
if len(name) > 50: |
|
raise web.HTTPBadRequest(reason='Name is too long.') |
|
if len(website) > 100: |
|
raise web.HTTPBadRequest(reason='Website is too long.') |
|
if len(message) > 1000: |
|
raise web.HTTPBadRequest(reason='Message is too long.') |
|
|
|
await message_tanner(name, website, message, captcha, mid) |
|
|
|
messages[mid] = data |
|
|
|
with open('data/messages.log', 'a') as f: |
|
f.write(json.dumps(data)+'\n') |
|
|
|
return web.Response(text='Thanks! Your message is pending approval.') |
|
|
|
|
|
if __name__ == '__main__': |
|
bot.start() |
|
app = web.Application() |
|
app.router.add_post('/', submit) |
|
web.run_app(app, port=8123)
|
|
|