68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
import os
|
|
from pprint import pprint
|
|
|
|
from markdownify import MarkdownConverter
|
|
from telegram import Update
|
|
from telegram.constants import ParseMode
|
|
from telegram.ext import ApplicationBuilder, CallbackContext, CommandHandler
|
|
from telegram.helpers import escape_markdown
|
|
|
|
from state import State
|
|
from tweets import get_tweets
|
|
|
|
|
|
async def start(update: Update, context: CallbackContext.DEFAULT_TYPE):
|
|
await context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, hi.")
|
|
|
|
|
|
class TgMarkdownConverter(MarkdownConverter):
|
|
def convert_a(self, el, text, convert_as_inline):
|
|
el['href'] = escape_markdown(el['href'], version=2)
|
|
return super().convert_a(el, text, convert_as_inline)
|
|
|
|
def process_text(self, el):
|
|
text = super().process_text(el)
|
|
return escape_markdown(text, version=2)
|
|
|
|
def markdownify(html, **options):
|
|
return TgMarkdownConverter(**options).convert(html)
|
|
|
|
|
|
#print(markdownify("<a href=\"b.a\">c</a>"))
|
|
|
|
|
|
async def check(context: CallbackContext):
|
|
tweets = get_tweets(os.environ['TWITTER_USER'])
|
|
state = State(os.environ['DB_PATH'])
|
|
for tweet in tweets:
|
|
if state.has(tweet):
|
|
return
|
|
preamble = f"""\
|
|
<b>{tweet.author}</b><br>
|
|
<a href="{tweet.id}\">Permalink</a><br><br>
|
|
"""
|
|
|
|
md = markdownify(preamble+tweet.content)
|
|
|
|
try:
|
|
await context.bot.send_message(
|
|
chat_id=os.environ['TELEGRAM_CHANNEL'],
|
|
text=md,
|
|
parse_mode=ParseMode.MARKDOWN_V2,
|
|
disable_web_page_preview=True)
|
|
except Exception:
|
|
break
|
|
state.add(tweet)
|
|
|
|
if __name__ == '__main__':
|
|
application = ApplicationBuilder().token(
|
|
os.environ['TELEGRAM_TOKEN']).build()
|
|
|
|
start_handler = CommandHandler('start', start)
|
|
application.add_handler(start_handler)
|
|
|
|
application.job_queue.run_repeating(
|
|
check, int(os.environ['INTERVAL']), first=1, chat_id=os.environ['TELEGRAM_CHANNEL'])
|
|
|
|
application.run_polling()
|