Запуск асинхронной функции в потоке

Вопрос такой у меня есть некоторая функция которая должна работать фоново, проверяя сообщения в телеграмме, она сделана на telethon

def getSMS(self):
        def pars(T_, ForS, _T):
            if (T_ == '') or (ForS == '') or (_T == ''):
                return ''
            try:
                indexT_ = ForS.index(T_)
                ForS1 = ForS[indexT_ + len(T_):]
                index_T = ForS1.index(_T)
                res = ForS1[:index_T]
                return res
            except:
                return ''


        while True:
            print(f'Ждем смс')
            timeout = 180 / 3
            time_is = 0
            while True:
                try:
                    msg = self.TELETHON.get_messages(tgid, limit=1)[0]
                    print(msg)
                    if int(msg.date.timestamp()) > self.today:
                        code = pars('Login code: ', msg.message, '.')
                        print(f'Получили сообщение: {code}')
                        self.phone_code = code
                        return code
                    time_is += 1
                    sleep(3)
                    if time_is >= timeout:
                        print('Вышло время ожидания смс')
                        return ''
                except Exception as e:
                    print(f'Неудалось получить последнее сообщение, ошибка {str(e)}')
                    time_is += 1
                    sleep(3)

Есть так же функция от pyrogram.

    async def authorize(self) -> User:
        if self.bot_token:
            return await self.sign_in_bot(self.bot_token)

        while True:
            try:
                if not self.phone_number:
                    while True:
                        value = await ainput("Enter phone number or bot token: ")

                        if not value:
                            continue

                        confirm = (await ainput(f'Is "{value}" correct? (y/N): ')).lower()

                        if confirm == "y":
                            break

                    if ":" in value:
                        self.bot_token = value
                        return await self.sign_in_bot(value)
                    else:
                        self.phone_number = value

                sent_code = await self.send_code(self.phone_number)
            except BadRequest as e:
                print(e.MESSAGE)
                self.phone_number = None
                self.bot_token = None
            else:
                break

        sent_code_descriptions = {
            enums.SentCodeType.APP: "приложение telegram",
            enums.SentCodeType.SMS: "смс",
            enums.SentCodeType.CALL: "телефонный звонок",
            enums.SentCodeType.FLASH_CALL: "phone flash call"
        }

        print(f"Отправили сообщение через {sent_code_descriptions[sent_code.type]}")


        while True:
            asyncio.create_task(self.getSMS())

            while len(code) < 4:
                sleep(2)

            try:
                signed_in = await self.sign_in(self.phone_number, sent_code.phone_code_hash, self.phone_code)
            except BadRequest as e:
                print(e.MESSAGE)
                self.phone_code = None
            except SessionPasswordNeeded as e:
                print(e.MESSAGE)

                while True:
                    try:
                        if not self.password:
                            confirm = await ainput("Confirm password recovery (y/n): ")

                            if confirm == "y":
                                email_pattern = await self.send_recovery_code()
                                print(f"The recovery code has been sent to {email_pattern}")

                                while True:
                                    recovery_code = await ainput("Enter recovery code: ")

                                    try:
                                        return await self.recover_password(recovery_code)
                                    except BadRequest as e:
                                        print(e.MESSAGE)
                                    except Exception as e:
                                        log.error(e, exc_info=True)
                                        raise
                            else:
                                self.password = None
                        else:
                            return await self.check_password(self.password)
                    except BadRequest as e:
                        print(e.MESSAGE)
                        self.password = None
            else:
                break

        if isinstance(signed_in, User):
            return signed_in

        while True:
            first_name = await ainput("Enter first name: ")
            last_name = await ainput("Enter last name (empty to skip): ")

            try:
                signed_up = await self.sign_up(
                    self.phone_number,
                    sent_code.phone_code_hash,
                    first_name,
                    last_name
                )
            except BadRequest as e:
                print(e.MESSAGE)
            else:
                break

        if isinstance(signed_in, TermsOfService):
            print("\n" + signed_in.text + "\n")
            await self.accept_terms_of_service(signed_in.id)

        return signed_up

Я хочу сделать так чтобы код сессии что пришел передавался автоматически в pyrogram. Т.е. Есть еще асинхронная функция, которая ждет пока в чате будет определенное сообщение, никак не пойму как запустить это, пытался вызывать это в потоке, но безуспешно т.к. ругается что асинхронная функция должна быть в основном потоке... Пытался создавать новый Loop и передавать аргументом в поток, но что-то тоже не вышло...

Пытался вызвать функцию асинхронно, но получаю: 'MessageMethods.get_messages' was never awaited

Когда просто вызываю получаю ошибку 'coroutine' object is not subscriptable и не знаю что с этим делать


Ответы (0 шт):