Как сохранить сообщение из телеграмм канала как переменную

Это мой код, и он не создает переменную, которую можно использовать в другой части моего скрипта Python. Мне нужно работать с этим сообщением, чтобы получить от него информацию.

from telethon import TelegramClient, events, sync
from telethon.errors import SessionPasswordNeededError
import time

# Setting configuration values
api_id = 'my api id'
api_hash ='my api hash'

phone = '+my phone number'
username = 'my username'

# Create the client and connect
client = TelegramClient(username, api_id, api_hash)
client.start()
print("Client Created")
# Ensure you're authorized
if not client.is_user_authorized():
    client.send_code_request(phone)
    try:
        client.sign_in(phone, input('Enter the code: '))
    except SessionPasswordNeededError:
        client.sign_in(password=input('Password: '))

new = '#'
old = 'xd'


async def main():
    limit = 1
    async for message in client.iter_messages('channel sample', limit):
        new = (message.text)
while True:
    with client:
        client.loop.run_until_complete(main())
    if new != old:
        old = new
        print(old)
    time.sleep(5)

Он напечатал # один раз и ничего. (эти # и xd предназначены только для тестирования, они не важны для программы). Но мне нужно получить message.text в 'новую' переменную и иметь возможность использовать его везде, а не только в main(). в то время как цикл в конце только сейчас из-за тестирования. Спасибо всем за помощь. :) Мир.


person Kurina11    schedule 03.10.2020    source источник
comment
Этот код в настоящее время должен подключаться и отключаться от клиента каждые 5 секунд, что не очень эффективно. Было бы лучше просто делать все в main (или дополнительных функциях) и не обязательно в глобальном пространстве имен.   -  person Lonami    schedule 04.10.2020


Ответы (1)


Чтобы ссылаться на переменную из функции, вам нужно объявить ее глобальной в функции, чтобы Python знал, что ему нужно редактировать глобальную переменную, а не частную.

import asyncio
new = 'random text'

# start session

async def main():
    global new
    messages = await client.get_messages('channel sample')
    new = messages[0].text

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print(new)  # message text

Вы также можете опустить ограничение, поскольку, как вы можете прочитать в документы

Если предел не установлен, по умолчанию он будет равен 1, если только не установлены как min_id, так и max_id (как именованные аргументы), и в этом случае будет возвращен весь диапазон.

person TheKill-996    schedule 03.10.2020
comment
Ограничение применяется только к get_messages, а не к iter_messages. Код можно переписать так: использовать get_messages() и получить доступ к первому элементу, установить предел 1 или добавить break после назначения new. - person Lonami; 04.10.2020