Skip to content

Instantly share code, notes, and snippets.

@r1ckya
Forked from PolarNick239/printerbot.py
Created March 11, 2018 15:21
Show Gist options
  • Save r1ckya/ba4aff9c0152f1b0751f7093835e7be1 to your computer and use it in GitHub Desktop.
Save r1ckya/ba4aff9c0152f1b0751f7093835e7be1 to your computer and use it in GitHub Desktop.
Telegram bot for printer (Linux)
import os
import pathlib
import logging
from telegram.ext import Updater
from telegram.ext import Filters
from telegram.ext import CommandHandler
from telegram.ext import MessageHandler
# This is the Telegram Bot that prints all input documents. It can print pdf and txt files.
# Before sending files for printing user must enter the password by command "/auth <password>".
# This implementation uses "lp -d <printer> <file>" to print files (see function "print_file").
# To adopt this for Windows - extend print_file function with something like https://stackoverflow.com/questions/4498099/silent-printing-of-a-pdf-in-python
# TODO: Set here printer name (Choose one from output of command 'lpstat -p'):
printer_name = "PRINTER_NAME"
# TODO: Set here your bot's token key (from Telegram BotFather)
token_key = "239239239:UNICORNSUNICORNSUNICORNSUNICORNS239"
password = "password"
file_size_limit = 64*1024*1024 # 64Mb
# Directory where files for printing should be saved
files_dir = "printed_files"
pathlib.Path(files_dir).mkdir(parents=True, exist_ok=True)
def print_file(file_path):
os.system('lp -d {} {}'.format(printer_name, file_path))
# Configuring logging
log_formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger()
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler("printerbot.log")
file_handler.setFormatter(log_formatter)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler()
console_handler.setFormatter(log_formatter)
logger.addHandler(console_handler)
def start(bot, update):
logger.info("User {} started...".format(update.message.from_user.username))
bot.send_message(chat_id=update.message.chat_id, text="I'm a printer bot for Math circle! "
"Unicorns prance in the clearing. "
"You need to authorize by \"/auth <password>\" to print files.")
authorized_chats = set()
def auth_passed(update):
return update.message.chat_id in authorized_chats
def authorize(bot, update, args):
args = ''.join(args)
if auth_passed(update):
logger.info("User {} tried to authorize multiple times.".format(update.message.from_user.username))
bot.send_message(chat_id=update.message.chat_id, text="You already authorized!")
return
if password == args:
authorized_chats.add(update.message.chat_id)
logger.info("User {} authorized.".format(update.message.from_user.username))
bot.send_message(chat_id=update.message.chat_id, text="Now you can print files via sending.")
else:
logger.info("User {} entered wrong password: {}.".format(update.message.from_user.username, args))
bot.send_message(chat_id=update.message.chat_id, text="Wrong password!")
def print_file(bot, update):
if not auth_passed(update):
bot.send_message(chat_id=update.message.chat_id, text="Please, pass authorization by \"/auth <password>\".")
return
file_id = update.message.document.file_id
file_name = update.message.document.file_name
file_size = update.message.document.file_size
if file_size > file_size_limit:
bot.send_message(chat_id=update.message.chat_id, text="File is too big ({} > {})!".format(file_size, file_size_limit))
return
bot.send_message(chat_id=update.message.chat_id, text="Downloading file...")
file_path = files_dir + '/' + file_name
logger.info("Downloading file {} from {}...".format(file_name, update.message.from_user.username))
new_file = bot.get_file(file_id)
new_file.download(file_path)
logger.info("Downloaded file {} from {}!".format(file_name, update.message.from_user.username))
logger.info("Printing file {}...".format(file_path))
print_file(file_path)
logger.info("File {} sent for printing on {}!".format(file_path, printer_name))
bot.send_message(chat_id=update.message.chat_id, text="File printed!")
updater = Updater(token=token_key)
dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CommandHandler('auth', authorize, pass_args=True))
dispatcher.add_handler(MessageHandler(Filters.document, print_file))
logger.info("Listening...")
updater.start_polling()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment