Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
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()
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
        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)
Ejemplo n.º 8
0
        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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
        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)
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
    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
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
    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