Запуск асинхронной функции в потоке
Вопрос такой у меня есть некоторая функция которая должна работать фоново, проверяя сообщения в телеграмме, она сделана на 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 и не знаю что с этим делать