From 45e57daa845c0397ffd6b72f2e777913676e3ce8 Mon Sep 17 00:00:00 2001 From: liuguopei Date: Mon, 9 Nov 2020 17:01:03 +0800 Subject: update telegram api --- Pipfile | 2 +- bot.py | 62 ++++++++++++++++++++++++++++++++++---------------------------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/Pipfile b/Pipfile index 076dc6b..d0feac3 100644 --- a/Pipfile +++ b/Pipfile @@ -12,4 +12,4 @@ pyzmail36 = "*" pylint = "*" [requires] -python_version = "3.6" +python_version = "3.9" diff --git a/bot.py b/bot.py index 1a544c7..6e46411 100644 --- a/bot.py +++ b/bot.py @@ -1,13 +1,13 @@ import logging import os -from telegram import ParseMode +from telegram import ParseMode, Update from telegram.constants import MAX_MESSAGE_LENGTH -from telegram.ext import (Updater, CommandHandler) +from telegram.ext import (Updater, CommandHandler, CallbackContext) from utils.client import EmailClient logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s:%(lineno)d' - ' - %(message)s', filename='/var/log/mailbot.log', + ' - %(message)s', filename='/tmp/log/mailbot.log', level=logging.INFO) logger = logging.getLogger(__name__) @@ -23,37 +23,43 @@ def handle_large_text(text): yield out text = text.lstrip(out) -def error(bot, update, _error): +def error(update: Update, context: CallbackContext) -> None: """Log Errors caused by Updates.""" - logger.warning('Update "%s" caused error "%s"', update, _error) + logger.warning('Update "%s" caused error "%s"', update, context.error) -def start_callback(bot, update): +def start_callback(update: Update, context: CallbackContext) -> None: msg = "Use /help to get help" update.message.reply_text(msg) -def _help(bot, update): +def _help(update: Update, context: CallbackContext) -> None: """Send a message when the command /help is issued.""" - help_str = "*Mailbox Setting*: \n" \ - "/setting 123456@example.com yourpassword" - bot.send_message(update.message.chat_id, - parse_mode=ParseMode.MARKDOWN, + help_str = """邮箱设置: +/setting john.doe@example.com password +/inbox +/get mail_index +/help get help""" + # help_str = "*Mailbox Setting*:\n" \ + # "/setting john.doe@example.com password\n" \ + # "/inbox\n" \ + # "/get mail_index" + context.bot.send_message(update.message.chat_id, + # parse_mode=ParseMode.MARKDOWN, text=help_str) -def setting_email(bot, update, args, job_queue, chat_data): +def setting_email(update: Update, context: CallbackContext) -> None: global email_addr, email_passwd, inbox_num - chat_id = update.message.chat_id - email_addr = args[0] - email_passwd = args[1] + email_addr = context.args[0] + email_passwd = context.args[1] logger.info("received setting_email command.") update.message.reply_text("Configure email success!") with EmailClient(email_addr, email_passwd) as client: inbox_num = client.get_mails_count() - job = job_queue.run_repeating(periodic_task, 120, context=chat_id) - chat_data['job'] = job + context.job_queue.run_repeating(periodic_task, interval=60, context=update.message.chat_id) + # chat_data['job'] = job logger.info("periodic task scheduled.") -def periodic_task(bot, job): +def periodic_task(context: CallbackContext) -> None: global inbox_num logger.info("entering periodic task.") with EmailClient(email_addr, email_passwd) as client: @@ -62,11 +68,11 @@ def periodic_task(bot, job): mail = client.get_mail_by_index(new_inbox_num) content = mail.__repr__() for text in handle_large_text(content): - bot.send_message(job.context, + context.bot.send_message(context.job.context, text=text) inbox_num = new_inbox_num -def inbox(bot, update): +def inbox(update: Update, context: CallbackContext) -> None: logger.info("received inbox command.") with EmailClient(email_addr, email_passwd) as client: global inbox_num @@ -76,23 +82,24 @@ def inbox(bot, update): " time you checked." % \ (new_num, new_num - inbox_num) inbox_num = new_num - bot.send_message(update.message.chat_id, + context.bot.send_message(update.message.chat_id, parse_mode=ParseMode.MARKDOWN, text=reply_text) -def get_email(bot, update, args): - index = args[0] +def get_email(update: Update, context: CallbackContext) -> None: + index = context.args[0] logger.info("received get command.") with EmailClient(email_addr, email_passwd) as client: mail = client.get_mail_by_index(index) content = mail.__repr__() for text in handle_large_text(content): - bot.send_message(update.message.chat_id, + context.bot.send_message(update.message.chat_id, text=text) def main(): # Create the EventHandler and pass it your bot's token. - updater = Updater(token=bot_token) + updater = Updater(token=bot_token, use_context=True) + print(bot_token) # Get the dispatcher to register handlers dp = updater.dispatcher @@ -103,12 +110,11 @@ def main(): dp.add_handler(CommandHandler("help", _help)) # # Add command handler to set email address and account. - dp.add_handler(CommandHandler("setting", setting_email, pass_args=True, - pass_job_queue=True, pass_chat_data=True)) + dp.add_handler(CommandHandler("setting", setting_email)) dp.add_handler(CommandHandler("inbox", inbox)) - dp.add_handler(CommandHandler("get", get_email, pass_args=True)) + dp.add_handler(CommandHandler("get", get_email)) dp.add_error_handler(error) -- cgit v1.2.3 From 6aff23b69219ba93b2ba6850a72affc52870c15f Mon Sep 17 00:00:00 2001 From: liuguopei Date: Mon, 9 Nov 2020 19:33:45 +0800 Subject: add Dockerfile --- Dockerfile | 12 ++++++++++++ bot.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2aca3f3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +from python:3.9 + +RUN pip install --no-cache-dir pytz python-telegram-bot pyzmail36 + +COPY utils /opt/workdir/telegram-mail-bot/utils +COPY bot.py /opt/workdir/telegram-mail-bot/ + +WORKDIR /opt/workdir/telegram-mail-bot + +ENV TELEGRAM_TOKEN= + +CMD ["/bin/sh", "-c", "/usr/local/bin/python bot.py" ] \ No newline at end of file diff --git a/bot.py b/bot.py index 6e46411..b9c84b3 100644 --- a/bot.py +++ b/bot.py @@ -7,7 +7,7 @@ from utils.client import EmailClient logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s:%(lineno)d' - ' - %(message)s', filename='/tmp/log/mailbot.log', + ' - %(message)s', filename='/var/log/mailbot.log', level=logging.INFO) logger = logging.getLogger(__name__) -- cgit v1.2.3 From f59cc54b7a2742b45cc359a5a0729ee4640aa3fb Mon Sep 17 00:00:00 2001 From: liuguopei Date: Tue, 10 Nov 2020 09:49:23 +0800 Subject: check owner --- bot.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/bot.py b/bot.py index b9c84b3..13692ab 100644 --- a/bot.py +++ b/bot.py @@ -13,6 +13,11 @@ logger = logging.getLogger(__name__) bot_token = os.environ['TELEGRAM_TOKEN'] +owner_chat_id = int(os.environ['OWNER_CHAT_ID']) + +def is_owner(update: Update) -> bool: + return update.message.chat_id == owner_chat_id + def handle_large_text(text): while text: if len(text) < MAX_MESSAGE_LENGTH: @@ -28,10 +33,15 @@ def error(update: Update, context: CallbackContext) -> None: logger.warning('Update "%s" caused error "%s"', update, context.error) def start_callback(update: Update, context: CallbackContext) -> None: + if not is_owner(update): + return msg = "Use /help to get help" + # print(update) update.message.reply_text(msg) def _help(update: Update, context: CallbackContext) -> None: + if not is_owner(update): + return """Send a message when the command /help is issued.""" help_str = """邮箱设置: /setting john.doe@example.com password @@ -47,6 +57,8 @@ def _help(update: Update, context: CallbackContext) -> None: text=help_str) def setting_email(update: Update, context: CallbackContext) -> None: + if not is_owner(update): + return global email_addr, email_passwd, inbox_num email_addr = context.args[0] email_passwd = context.args[1] @@ -73,6 +85,8 @@ def periodic_task(context: CallbackContext) -> None: inbox_num = new_inbox_num def inbox(update: Update, context: CallbackContext) -> None: + if not is_owner(update): + return logger.info("received inbox command.") with EmailClient(email_addr, email_passwd) as client: global inbox_num @@ -87,6 +101,8 @@ def inbox(update: Update, context: CallbackContext) -> None: text=reply_text) def get_email(update: Update, context: CallbackContext) -> None: + if not is_owner(update): + return index = context.args[0] logger.info("received get command.") with EmailClient(email_addr, email_passwd) as client: -- cgit v1.2.3 From 477b4cdaf60bae65a809697465e89197e7c877ea Mon Sep 17 00:00:00 2001 From: liuguopei Date: Tue, 10 Nov 2020 09:55:15 +0800 Subject: logging stdout --- bot.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bot.py b/bot.py index 13692ab..b562768 100644 --- a/bot.py +++ b/bot.py @@ -1,13 +1,14 @@ import logging import os +import sys from telegram import ParseMode, Update from telegram.constants import MAX_MESSAGE_LENGTH from telegram.ext import (Updater, CommandHandler, CallbackContext) from utils.client import EmailClient -logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s:%(lineno)d' - ' - %(message)s', filename='/var/log/mailbot.log', +logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s:%(lineno)d - %(message)s', + stream=sys.stdout, level=logging.INFO) logger = logging.getLogger(__name__) -- cgit v1.2.3