Commit bee590c7 authored by Dmitry Shelepnev's avatar Dmitry Shelepnev
Browse files

Create telegramm download file

parent b02814d9
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -39,37 +39,45 @@ def getFileData(book):
    z = None
    fz = None
    s = None
    fo = None

    #print("************ ТИП КНИГИ: %s"%book.cat_type)

    if book.cat_type==opdsdb.CAT_NORMAL:
        file_path=os.path.join(full_path, book.filename)
        try:
            #print("************ ПУТЬ К КНИГЕ: %s" % file_path)
            fo=codecs.open(file_path, "rb")
            s = fo.read()
            #s = fo.read()
        except FileNotFoundError:
            s = None
            #s = None
            fo = None

    elif book.cat_type in [opdsdb.CAT_ZIP, opdsdb.CAT_INP]:
        try:
            fz=codecs.open(full_path, "rb")
            z = zipfile.ZipFile(fz, 'r', allowZip64=True)
            fo= z.open(book.filename)
            s=fo.read()
            #s=fo.read()
        except FileNotFoundError:
            s = None
            #s = None
            fo = None

    fo.close()
    if z: z.close()
    if fz: fz.close()
    #if fo: fo.close()
    #if z: z.close()
    #if fz: fz.close()

    return s
    return fo

def getFileDataZip(s,transname):
def getFileDataZip(fo,transname):
    dio = io.BytesIO()
    zo = zipfile.ZipFile(dio, 'w', zipfile.ZIP_DEFLATED)
    zo.writestr(transname, s)
    zo.writestr(transname, fo.read())
    zo.close()
    buf = dio.getvalue()
    dio.seek(0)
    #buf = dio.getvalue()

    return buf
    return dio

def Download(request, book_id, zip_flag):
    """ Загрузка файла книги """
+30 −31
Original line number Diff line number Diff line
@@ -11,8 +11,8 @@ from django.urls import reverse
from opds_catalog.models import Book, Author
from opds_catalog import settings, dl
from constance import config
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, RegexHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, RegexHandler, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Document

class Command(BaseCommand):
    help = 'SimpleOPDS Telegram Bot engine.'
@@ -111,7 +111,7 @@ class Command(BaseCommand):
        authors = ', '.join([a['full_name'] for a in book.authors.values()])
        response = '<b>%(title)s</b>\n%(author)s\n<b>Аннотация:</b>%(annotation)s\n' % {'title': book.title, 'author': authors, 'annotation':book.annotation}

        buttons = [InlineKeyboardButton(book.format.upper(), callback_data='/getfile%s'%book_id)]
        buttons = [InlineKeyboardButton(book.format.upper(), callback_data='/getfileorig%s'%book_id)]
                                        # url=config.SOPDS_SITE_ROOT+reverse("opds_catalog:download", kwargs={"book_id": book.id, "zip_flag": 0}))]
        if not book.format in settings.NOZIP_FORMATS:
            buttons += [InlineKeyboardButton(book.format.upper()+'.ZIP', callback_data='/getfilezip%s'%book_id)]
@@ -127,8 +127,9 @@ class Command(BaseCommand):
        bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML', reply_markup=markup)
        self.logger.info("Send download buttons.")

    def getBookFile(self, bot, update):
        book_id_set=re.findall(r'\d+$',update.message.text)
    def getBookFile(self, bot, update, user_data):
        query = update.callback_query
        book_id_set=re.findall(r'\d+$',query.data)
        if len(book_id_set)==1:
            try:
                book_id=int(book_id_set[0])
@@ -141,35 +142,35 @@ class Command(BaseCommand):

        if book==None:
            response = 'Книга по указанной Вами ссылке не найдена, попробуйте повторить поиск книги сначала.'
            bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML')
            bot.sendMessage(chat_id=query.message.chat_id, text=response, parse_mode='HTML')
            self.logger.info("Not find download links: %s" % response)
            return

        filename = dl.getFileName(book)
        bot.send_document(chat_id=update.message.chat_id, document=dl.getFileData(book),filename=filename)
        self.logger.info("Send file: %s" % filename)
        document = None

    def getBookFileZip(self, bot, update):
        book_id_set=re.findall(r'\d+$',update.message.text)
        if len(book_id_set)==1:
            try:
                book_id=int(book_id_set[0])
                book=Book.objects.get(id=book_id)
            except:
                book=None
        else:
            book_id=None
            book=None
        if re.match(r'/getfileorig',query.data):
            document = dl.getFileData(book)
            #document = config.SOPDS_SITE_ROOT + reverse("opds_catalog:download",kwargs={"book_id": book.id, "zip_flag": 0})

        if book==None:
            response = 'Книга по указанной Вами ссылке не найдена, попробуйте повторить поиск книги сначала.'
            bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML')
            self.logger.info("Not find download links: %s" % response)

        if re.match(r'/getfilezip',query.data):
            document = dl.getFileDataZip(dl.getFileData(book), filename)
            #document = config.SOPDS_SITE_ROOT + reverse("opds_catalog:download", kwargs={"book_id": book.id, "zip_flag": 1})
            filename = filename + '.zip'

        if document:
            bot.send_document(chat_id=query.message.chat_id,document=document,filename=filename)
            self.logger.info("Send file: %s" % filename)
        else:
            response = 'Возникла техническая ошибка, обратитесь к администратору сайта.'
            bot.sendMessage(chat_id=query.message.chat_id, text=response, parse_mode='HTML')
            self.logger.info("Book get error: %s" % response)
            return

        filename=dl.getFileName(book)
        bot.send_document(chat_id=update.message.chat_id, document=dl.getFileDataZip(dl.getFileData(book),filename),filename=filename+'.zip')
        self.logger.info("Send file: %s" % (filename+'.zip'))
        user_data['type'] = query.data;

        return

    def start(self):
        writepid(self.pidfile)
@@ -181,14 +182,12 @@ class Command(BaseCommand):
            start_command_handler = CommandHandler('start', self.startCommand)
            getBook_handler = MessageHandler(Filters.text, self.getBooks)
            download_handler = RegexHandler('^/download\d+$',self.downloadBooks)
            sendfile_handler = RegexHandler('^/getfile\d+$', self.getBookFile)
            sendfilezip_handler = RegexHandler('^/getfilezip\d+$', self.getBookFileZip)

            updater.dispatcher.add_handler(start_command_handler)
            updater.dispatcher.add_handler(getBook_handler)
            updater.dispatcher.add_handler(download_handler)
            updater.dispatcher.add_handler(sendfile_handler)
            updater.dispatcher.add_handler(sendfilezip_handler)
            updater.dispatcher.add_handler(CallbackQueryHandler(self.getBookFile, pass_user_data=True))

            updater.start_polling(clean=True)
            updater.idle()
        except (KeyboardInterrupt, SystemExit):
+1 −2
Original line number Diff line number Diff line
@@ -175,7 +175,6 @@ CONSTANCE_CONFIG = OrderedDict([
    ('SOPDS_CACHE_TIME', (1200, _('Pages cache time'))),

    ('SOPDS_TELEBOT_API_TOKEN', ('', _('Telegramm API Token'))),
    ('SOPDS_SITE_ROOT', ('http://you_domain:8001/', _('Root URL for your SOPDS Site'))),
    
    ('SOPDS_AUTH', (True,_('Enable authentication'))),
    ('SOPDS_ALPHABET_MENU', (True,_('Enable alphabet submenu'))),   
@@ -219,7 +218,7 @@ CONSTANCE_CONFIG_FIELDSETS = {
    '2. Server Options': ('SOPDS_AUTH', 'SOPDS_ALPHABET_MENU', 'SOPDS_DOUBLES_HIDE', 'SOPDS_COVER_SHOW', 'SOPDS_SPLITITEMS', 'SOPDS_MAXITEMS', 'SOPDS_TITLE_AS_FILENAME', 'SOPDS_NOCOVER_PATH'),    
    '3. Scanner Options': ('SOPDS_FB2SAX','SOPDS_ZIPSCAN','SOPDS_ZIPCODEPAGE', 'SOPDS_INPX_ENABLE', 'SOPDS_INPX_SKIP_UNCHANGED', 'SOPDS_INPX_TEST_ZIP', 'SOPDS_INPX_TEST_FILES', 'SOPDS_DELETE_LOGICAL'),
    '4. Scanner Shedule': ('SOPDS_SCAN_SHED_MIN', 'SOPDS_SCAN_SHED_HOUR', 'SOPDS_SCAN_SHED_DAY','SOPDS_SCAN_SHED_DOW'),
    '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN','SOPDS_SITE_ROOT'),
    '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN'),
    '6. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'),
    '7. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_TELEBOT_LOG','SOPDS_SERVER_PID','SOPDS_SCANNER_PID','SOPDS_TELEBOT_PID'),
}