def choose_groups(chat_id, to_add): """ Предлагает юзеру выбрать группы для подписки/отписки :param chat_id: ID юзера :param to_add: Если True, то диалог добавления, если False - удаления """ storage = Shelver(config.database_file) global list_of_buttons list_of_usergroups = storage.find_all('.*_users') list_of_buttons = [elem[:-6] for elem in list_of_usergroups] markup = types.ReplyKeyboardMarkup() # Позволяем ресайзить клаву markup.resize_keyboard = True # Если добавляем if to_add: for i in range(len(list_of_buttons)): if chat_id not in storage.get(list_of_usergroups[i]): markup.row('/{0}:+{1}'.format('group' + str(i), list_of_buttons[i])) markup.row('/0:Закрыть') tb.send_message(chat_id, 'Выберите нужные категории. Как закончите - нажмите "Закрыть"', reply_markup=markup) list_users_to_subscribe.append(chat_id) if not to_add: for i in range(len(list_of_buttons)): if chat_id in storage.get(list_of_usergroups[i]): markup.row('/{0}:-{1}'.format('group' + str(i), list_of_buttons[i])) markup.row('/0:Закрыть') tb.send_message(chat_id, 'Выберите нужные категории. Как закончите - нажмите "Закрыть"', reply_markup=markup) list_users_to_unsibscribe.append(chat_id)
def get_token(): """ Получает токен из локального хранилища :return: (str) значение токена """ # Небольшой хак, чтобы хранилище всегда было в корне проекта storage = Shelver(os.path.join(os.path.dirname(__file__), config.database_file)) return storage.get('token')
def is_token_valid(): storage = Shelver(config.database_file) cur_time = storage.get_with_create('expire_time', 0) if int(time.time()) < int(cur_time): return True elif int(time.time()) > int(cur_time): logger.info('Token expired. Need to get new one') return False
def update_ids(list_of_groups): from shelver import Shelver from config import database_file storage = Shelver(database_file) for group in list_of_groups: import time time.sleep(1) try: last_id = get_first_post_id(group) # Если это первый запуск, то сохраняем первое же значение storage.get_with_create(group, last_id) except Exception as ex: logger.error('UpdateIDS failed: {0!s}'.format(ex))
def get_list_of_users_in_category(list_name): storage = Shelver(config.database_file) return list(storage.get_with_create(list_name + config.users_db_postfix, []))
def get_list_of_groups_in_category(category_name): storage = Shelver(config.database_file) return storage.get(category_name.strip())
# -*- coding: utf-8 -*- """ При изменении списка групп, необходимо запустить этот файл """ from shelver import Shelver from config import database_file, categories, cat_entries list_categories = categories.split(',') list_entries = cat_entries.split('\n') storage = Shelver(database_file) if len(list_categories) != len(list_entries): print('Размерности массивов не совпадают! Проверьте списки.') else: for i in range(len(list_categories)): for j in range(len(list_entries[i].split(','))): print('Inserting {0} into {1}'.format( list_entries[i].split(',')[j], list_categories[i])) storage.append(list_categories[i], list_entries[i].split(',')[j].strip(), strict=False) print(len(storage.get('Новости')[1]))
def delete_user_from_list_of_subscribers(chat_id, list_name): storage = Shelver(config.database_file) return storage.remove(list_name + config.users_db_postfix, chat_id)
def add_user_to_list_of_subscribers(chat_id, list_name): storage = Shelver(config.database_file) return storage.append(list_name + config.users_db_postfix, chat_id)
m.text[m.text.find(':') + 2:].strip()) # list_users_to_unsibscribe.remove(m.chat.id) send_message_with_hide_keyboard(m.chat.id, 'Вы отписались от категории ' + m.text[m.text.find(':') + 2:].strip()) if m.text == '/0:Закрыть': hider = types.ReplyKeyboardHide() tb.send_message(m.chat.id, 'Готово!', reply_markup=hider) try: list_users_to_unsibscribe.remove(m.chat.id) list_users_to_subscribe.remove(m.chat.id) except: pass # Запускаем бота tb = telebot.TeleBot(config.token) tb.set_update_listener(listener) # Запускаем логгер utils.init_logger() tb.polling(none_stop=True, interval=4) shelver = Shelver(config.database_file) # Ловим сигнал прерывания signal.signal(signal.SIGINT, signal_handler) # В цикле запускается анализ страниц, рекомендую сделать Sleep хотя бы 2 минуты (120) while True: if not utils.is_token_valid(): auth.get_new_token() cycle(config.categories, shelver) time.sleep(config.SCANNING_INTERVAL) pass
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- from shelver import Shelver import shelve import config storage = Shelver(config.database_file) print(config.categories) for entry in config.categories.split(','): storage.save(entry.strip(), []) storage.save(entry.strip() + config.users_db_postfix, []) list_categories = config.categories.split(',') list_entries = config.cat_entries.split('\n') if len(list_categories) != len(list_entries): print('Размерности массивов не совпадают! Проверьте списки.') else: for i in range(len(list_categories)): for j in range(len(list_entries[i].split(','))): print('Inserting {0} into {1}'.format( list_entries[i].split(',')[j], list_categories[i])) storage.append(list_categories[i], list_entries[i].split(',')[j].strip(), strict=True) print(len(storage.get('News')[1])) storage.save('expire_time', 0) storage.save('token', 0) storage.close()
def signal_handler(signal, frame): logger.info('Signal catched, closing DB') print('Signal catched, closing DB') Shelver(config.database_file).close() sys.exit(0)
# -*- coding: utf-8 -*- """ При изменении списка групп, необходимо запустить этот файл """ from shelver import Shelver from config import database_file, categories, cat_entries list_categories = categories.split(',') list_entries = cat_entries.split('\n') storage = Shelver(database_file) if len(list_categories) != len(list_entries): print('Размерности массивов не совпадают! Проверьте списки.') else: for i in range(len(list_categories)): for j in range(len(list_entries[i].split(','))): print('Inserting {0} into {1}'.format(list_entries[i].split(',')[j], list_categories[i])) storage.append(list_categories[i], list_entries[i].split(',')[j].strip(), strict=False) print(len(storage.get('Новости')[1]))
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- from shelver import Shelver import shelve import config storage = Shelver(config.database_file) print(config.categories) for entry in config.categories.split(","): storage.save(entry.strip(), []) storage.save(entry.strip() + config.users_db_postfix, []) list_categories = config.categories.split(",") list_entries = config.cat_entries.split("\n") if len(list_categories) != len(list_entries): print("Размерности массивов не совпадают! Проверьте списки.") else: for i in range(len(list_categories)): for j in range(len(list_entries[i].split(","))): print("Inserting {0} into {1}".format(list_entries[i].split(",")[j], list_categories[i])) storage.append(list_categories[i], list_entries[i].split(",")[j].strip(), strict=True) print(len(storage.get("News")[1])) storage.save("expire_time", 0) storage.save("token", 0) storage.close()