def __adding_friend(self): """Добавление пользователя (друга) в список друзей, который будет использоваться автоответчиком.""" def load_users(): """ Попытка загрузить файл со списком друзей, если он создан и найден. Если файл не найден - возвращается словарь, для дальнейшего создания файла со списком друзей """ try: with open(self.USERS, 'r') as file: return load(file) except FileNotFoundError: return {} # попытка загрузить файл users = load_users() # получение ID и Имя пользователя, который будет добавлен в список друзей user_id, user_name = self.__get_user_from_console() # добавление пользователя users[user_name.capitalize()] = user_id # регистрация self.__registration('w', self.USERS, users) # уведомление message = "\n- Успешно добавлено!" print(message + "\n") # логирование functions.logging(message, 'Отсутствует', 'Успешное добавление пользователя в список друзей') time.sleep(3)
def __adding_blocked_user(self): """Добавление пользователя в чёрный список, который будет использован автоответчиком""" def load_blacklist(): """ Попытка загрузить файл с чёрным списком, если он создан. Если файл не найден, возвращается список для дальнейшего использования в создании файла с чёрным списком """ try: with open(self.BLACKLIST) as file: return load(file) except FileNotFoundError: return [] # попытка загрузить файл blacklist = load_blacklist() # получение ID пользователя, который будет добавлен в чёрный список user = self.__get_id_for_blocking_from_console() # добавление пользователя blacklist.append(user) # регистрация self.__registration('w', self.BLACKLIST, blacklist) # уведомление message = "\n - Успешно добавлено!" print(message + "\n") # логирование functions.logging(message, 'Отсутствует', 'Успешное добавление пользователя в чёрный список') time.sleep(3)
def __auth(self): """Авторизация автоответчика в Телеграм-аккаунте, с которого нужно отправлять сообщения""" message = "\n-Ошибка авторизации! Некорректные данные для входа (ID/HASH/PHONE or PASSWORD)" \ "\nПопробуйте зарегестрировать данные ещё раз!!" if self.__PASSWORD: try: return Client(session_name=self.session, api_id=self.__ID, api_hash=self.__HASH, phone_number=self.__PHONE, password=self.__PASSWORD) except errors.RPCError as error: print(message + "\n") functions.logging(message, error) else: try: return Client(session_name=self.session, api_id=self.__ID, api_hash=self.__HASH, phone_number=self.__PHONE) except errors.RPCError as error: print(message + "\n") functions.logging(message, error)
def main_check(user, bl, ul): """Основная проверка: на наличие пользователя в чёрном списке и списке друзей""" try: banned = check_for_banned(user, bl) in_friend_list = check_for_friend(user, ul) return banned, in_friend_list except AttributeError as error: functions.logging("Неизвестно", error) return 0
def __load_file(file): """Загрузка файлов""" try: with open(file, 'r') as of: return json.load(of) except FileNotFoundError as error: message = "\n -Отсутствуют файлы для входа в аккаунт, пожалуйста зарегестрируйте их!" print(message + "\n") functions.logging(message, error) functions.do_command()
def __removing_from_blacklist(self): """Удаление пользователя с чёрного списка""" def remove_user(uid, black_list): """Удаление пользователя""" if uid in black_list: black_list.remove(uid) # уведомление message = "\n - Пользователь успешно удалён!" print(message + "\n") # логирование functions.logging('{} Удалён (ID): {}'.format(message, uid), 'Отсутствует', 'Успешное удаление пользователя с чёрного листа') else: print("\n - Пользователь с данным ID не найден!\n") time.sleep(3) def get_id_from_console(): """Получение ID пользователя с консоли, который будет удалён """ try: got_id = int(input("\nВведите ID пользователя, которого хотите удалить: ")) if len(str(got_id)) == 9: return got_id else: print("\n - ID должен состоять из 9 чисел") return None except ValueError: print("\n - ID должен состоять только из чисел") while True: try: blacklist = functions.load_data(self.BLACKLIST) except FileNotFoundError as error: message = "\n - Файл не найден!" print(message + "\n") functions.logging(message, error) time.sleep(3) else: user_id = get_id_from_console() if user_id: # удаление пользователя remove_user(user_id, blacklist) # обновление чёрного списка self.__registration('w', self.BLACKLIST, blacklist) break
def remove_user(uid, black_list): """Удаление пользователя""" if uid in black_list: black_list.remove(uid) # уведомление message = "\n - Пользователь успешно удалён!" print(message + "\n") # логирование functions.logging('{} Удалён (ID): {}'.format(message, uid), 'Отсутствует', 'Успешное удаление пользователя с чёрного листа') else: print("\n - Пользователь с данным ID не найден!\n") time.sleep(3)
def handling_errors(function_for_handling): """Обработка основных ошибок: превышен лимит запросов, остутствие API ключа""" try: function_for_handling() except errors.FloodWait as error: message = "- Ошибка авторизации! Слишком много запросов,"\ " чтоб попробовать ещё раз ожидайте %s" % functions.flood_wait_error(error.x) print(message + "\n") functions.logging(message, error) except AttributeError as error: message = "- Не найдет ключ API" print(message + "\n") functions.logging(message, error)
def maintain_device_list(): global device_list for device in device_list: result = get_aotc(device["ip"]) if result["success"] == 0: device["active"] = False device["live_status"] = 0 continue while 1: for device in device_list: if device["active"]: response = get_aotc(device["ip"]) if response["success"] == 0: device["live_status"] = 0 time.sleep(2) continue device["live_status"] = 1 device["now_aotc"] = response["occupancy"] device["now_aotc_in"] = response["in"] device["now_aotc_out"] = response["out"] try: date = { "day": response["datetime"].split(' ')[0].split('/')[1], "year": response["datetime"].split(' ')[0].split('/')[2], "month": response["datetime"].split(' ')[0].split('/')[0] } except: logging("Error while parsing datetime" + response["datetime"]) date = { "day": datetime.now().strftime("%d"), "year": datetime.now().strftime("%m"), "month": datetime.now().strftime("%Y") } response2 = get_day_count(device["ip"], '5', date) device["today_latest"] = response2["occupancy"] device["today_latest_in"] = response2["in"] device["today_latest_out"] = response2["out"] get_final_realtime_counts() time.sleep(2)
def remove_user(user_id, users_list): person = find_key_via_value(user_id, users_list) if not person: print("\n - Пользователь с данным ID не найден!") else: if person.capitalize() in users_list.keys(): del users_list[person.capitalize()] # уведомление message = "\n - Пользователь успешно удалён!" print(message + "\n") # логирование functions.logging('{} Удалён: {}'.format(message, person.capitalize()), 'Отсутствует', 'Успешное удаление пользователя со списка друзей') else: print("\n - Пользователь с данным Именем не найден!") time.sleep(3)
def scenario_friends(uid, msg, login): if ('ВАЖНО' or '!ВАЖНО') in msg.upper(): if len(msg) > 6: message = "Отлично! Это сообщение я прочту первым, как освобожусь." important_message = "👤: {}\n📩: {}".format(("@" + login), msg[6:]) application.send_message(uid, message) application.send_message('me', important_message) functions.logging( ' Получено важное сообщение от @{}'.format(login), 'Отсутствует', 'Получено важное сообщение') else: message = "Ты забыл ввести текст, после пометки '!ВАЖНО'. Попробуй ещё раз!" application.send_message(uid, message) else: message = get_message_via_time() message += "\nЕсли у тебя что-то важное, отправь: \n'!ВАЖНО <Текст сообщения>'" application.send_message(uid, message) time.sleep(1)
def __registration_bot_config(self): """Регистрация конфигураций: TOKEN'а бота (управляющего), ID, Часового пояса""" config = {} # получение данных с консоли my_id, bot_token, bot_id, my_timezone = self.__get_config_data_from_console() # добавление данных config['my_ID'] = my_id config['TOKEN'] = bot_token config['ID'] = int(bot_id) config['my_TZ'] = str(my_timezone) # регистрация self.__registration('w', self.CONFIG_BOT, config) # уведомление message = "\n - Успешно зарегистрированно!" print(message + "\n") # логирование functions.logging(message, 'Отсутствует', 'Успешная регистрация конфигураций') time.sleep(3)
def main_definition(): """Определение управляющего бота, регистрации, автоответчика""" try: configs = functions.load_data('data/config-bot.json') bot_token, my_id = configs['TOKEN'], configs['my_ID'] except FileNotFoundError as error: message = "\n - Файл с конфигурациями для бота не найден! Зарегестрируйте данные!" print(message + "\n") functions.logging(message, error) functions.do_command() else: bot = TeleBot(bot_token) bot.remove_webhook() registration = Register() answering_bot = AnsweringBot() if not os.path.exists(registration.LOGS): functions.creating_file(registration.LOGS) return bot, registration, answering_bot, my_id
def __removing_from_user_list(self): """Удаление пользователя со списка друзей""" def find_key_via_value(uid, got_list): """Поиск ключа с помощью значения, для получения пользователя""" if type(uid) == int: if uid in got_list.values(): i = 0 for value in got_list.values(): if value == uid: return list(got_list.keys())[i] else: i += 1 else: return None else: return uid def get_user_from_console(): """Получение данных (ID или Имя) пользователя, который будет удалён со списка друзей""" got_user = input("\nВедите ID или имя пользователя, которого хотите удалить: ") try: got_user = int(got_user) if len(str(got_user)) == 9: return got_user else: print("\n - ID должен состоять из 9 чисел") return None except ValueError: return got_user def remove_user(user_id, users_list): person = find_key_via_value(user_id, users_list) if not person: print("\n - Пользователь с данным ID не найден!") else: if person.capitalize() in users_list.keys(): del users_list[person.capitalize()] # уведомление message = "\n - Пользователь успешно удалён!" print(message + "\n") # логирование functions.logging('{} Удалён: {}'.format(message, person.capitalize()), 'Отсутствует', 'Успешное удаление пользователя со списка друзей') else: print("\n - Пользователь с данным Именем не найден!") time.sleep(3) while True: try: user_list = functions.load_data(self.USERS) except FileNotFoundError as error: message = "\n - Файл не найден" print(message + "\n") # логирование functions.logging(message, error) time.sleep(3) else: user = get_user_from_console() if user: # удаление пользователя remove_user(user, user_list) # обновление списка друзей self.__registration('w', self.USERS, user_list) break
def __registration_data(self): """ Регистрация данных для входа, которые будут использоваться автоответчиком, для входа в аккаунт пользователя, для автоматического ответа пользователям. Под словом 'Регистрация' имеется ввиду получение пользовательские ID, HASH, PHONE и PASSWORD(не обязательно), которые нужны автоответчику для использования и запись этих данных в файл типа json """ def encrypt_and_organize_to_dict(keys, values): """Шифровка и сортировка данных""" def action(num): """Шифровка и сортировка""" organized, crypto_keys = {}, [] i = 0 while i < num: key = Fernet.generate_key() encrypted_key = Fernet(key).encrypt(str(values[i]).encode('utf-8')) organized[keys[i].upper()] = encrypted_key.decode('utf-8') crypto_keys.append(key.decode('utf-8')) i += 1 return organized, crypto_keys # if not values[-1]: organized_dictionary, cryptographic_keys_list = action(3) return organized_dictionary, cryptographic_keys_list else: organized_dictionary, cryptographic_keys_list = action(4) return organized_dictionary, cryptographic_keys_list def generation(to_generate=20): """Генерация дополнительных ключей""" i = 0 keys_list = [] number = randint(to_generate, 100) while i < number: key = Fernet.generate_key() keys_list.append(key.decode('utf-8')) i += 1 return number, keys_list def joining_lists(list_from, list_to): """Сложение списков""" for item in list_from: list_to.append(item) return list_to # получение данных с консоли app_id, app_hash, user_phone, user_password = self.__get_data_from_console() # шифровка данных и сортировка их в словаре dict_keys = ['id', 'hash', 'phone', 'password'] dict_values = [app_id, app_hash, user_phone, user_password] organized_data, cryptographic_keys = encrypt_and_organize_to_dict(dict_keys, dict_values) # генерация криптографических ключей f_count, f_generated_keys = generation() l_count, l_generated_keys = generation(f_count) # Слияние двух списков appended_list = joining_lists(cryptographic_keys, f_generated_keys) finally_list = joining_lists(l_generated_keys, appended_list) # добавление идентификаторов organized_data['IDN0'] = f_count organized_data['IDN1'] = l_count # регистрация self.__registration('w', self.CONFIG_AUTH, organized_data) self.__registration('w', self.SETUPS, finally_list) # уведомление message = "\n- Успешно зарегистрировано!" print(message + "\n") # логирование functions.logging(message, 'Отсутствует', 'Успешная регистрация данных для входа') time.sleep(3)
def run(self): """Запуск автоответчика""" def auto_blocking(): """ Автоматическое блокирование себя и управляющего бота для того, чтоб автоответчик не отвечал на наши сообщения """ black_list = self.__load_file(self.BLACKLIST) if self.MY_ID and self.BOT_ID in black_list: pass else: black_list.append(self.MY_ID) black_list.append(self.BOT_ID) with open(self.BLACKLIST, 'w') as file: json.dump(black_list, file) def handling_errors(function_for_handling): """Обработка основных ошибок: превышен лимит запросов, остутствие API ключа""" try: function_for_handling() except errors.FloodWait as error: message = "- Ошибка авторизации! Слишком много запросов,"\ " чтоб попробовать ещё раз ожидайте %s" % functions.flood_wait_error(error.x) print(message + "\n") functions.logging(message, error) except AttributeError as error: message = "- Не найдет ключ API" print(message + "\n") functions.logging(message, error) def handling_message(msg): """Обработка сообщения: отсортировка ID пользователя от ID группы""" if len(str(msg)) < 11: return msg else: return False def check_for_friend(user, user_dict): """Проверка отправителя, находится ли он в списке друзей""" if user in user_dict.values(): return True else: return False def check_for_banned(sender, black_list): """Проверка отправителя, находится ли он в чёрном списке""" if sender in black_list: return True else: return False def main_check(user, bl, ul): """Основная проверка: на наличие пользователя в чёрном списке и списке друзей""" try: banned = check_for_banned(user, bl) in_friend_list = check_for_friend(user, ul) return banned, in_friend_list except AttributeError as error: functions.logging("Неизвестно", error) return 0 def get_message_via_time(): """Получение характерного сообщения в зависимости от времни""" if self.TIMEZONE: current_time = int( datetime.datetime.now( tz=pytz.timezone(self.TIMEZONE)).strftime('%H')) else: current_time = int(datetime.datetime.now().strftime('%H')) if 0 <= current_time <= 9 or 21 <= current_time <= 23: return "Я сплю, пожалуйста напиши позже!" else: return "Я сейчас занят, пожалуйста напиши позже!🤷♂️" def scenario_all(uid, msg): message = get_message_via_time() application.send_message(uid, message) time.sleep(1) def scenario_friends(uid, msg, login): if ('ВАЖНО' or '!ВАЖНО') in msg.upper(): if len(msg) > 6: message = "Отлично! Это сообщение я прочту первым, как освобожусь." important_message = "👤: {}\n📩: {}".format(("@" + login), msg[6:]) application.send_message(uid, message) application.send_message('me', important_message) functions.logging( ' Получено важное сообщение от @{}'.format(login), 'Отсутствует', 'Получено важное сообщение') else: message = "Ты забыл ввести текст, после пометки '!ВАЖНО'. Попробуй ещё раз!" application.send_message(uid, message) else: message = get_message_via_time() message += "\nЕсли у тебя что-то важное, отправь: \n'!ВАЖНО <Текст сообщения>'" application.send_message(uid, message) time.sleep(1) def handling_notifications(status): if status: # disable notifications # # application.forward_messages() pass else: # enable notifications pass # расшифровка данных self.__decrypt() # загрузка списка с друзьями и чёрного списка users = self.__load_file(self.USERS) blacklist = self.__load_file(self.BLACKLIST) # авторизация application = self.__auth() # блокируем себя и бота, чтоб не получать сообщения auto_blocking() while True: if self.status: application.start() functions.logging(' -Автоответчик запущен', 'Отсутствует', 'Запуск автоответчика') break while True: if self.status: @handling_errors def handled_answering(): @application.on_message() def answering(client, message): try: user_id = handling_message(message.from_user.id) banned, in_friend_list = main_check( user_id, blacklist, users) except AttributeError: pass else: if self.mode == 'friends': if not banned and in_friend_list: scenario_friends( user_id, message.text, message.from_user.username) print(message) if self.mode == 'all': if not banned: if in_friend_list: scenario_friends( user_id, message.text, message.from_user.username) else: scenario_all(user_id, message.text) time.sleep(2) if not self.status: application.stop() functions.logging(' -Автоответчик остановлен', 'Отсутствует', 'Выключение автоответчика') break