jupyter-lab: telethon. Выполнение методов вида "await telegram_client.send_message()" происходят в хаотичном порядке
Ненавижу асинхронность, она классная (с)
Дано:
- Привет ребят. Практикуюсь в питон, осваиваю асинхронность
- В магазине 5ка есть возможность пожаловаться на очередь через телеграм ks5_bot
- GET запрос с телефона -> Flask (дев на jupyter-lab, прод на Heroku) -> Telethon отправка сообщения
- ks5_bot_force_queue: в этой ф-ии сообщения 1-4 отправляются по разному день ото дня. Вчера - боту отправлялись сообщения 1-3. Сегодня - отправляется сообщение 1 или сообщения 1-2.
- GET запрос возвращает разные ответы раз от раза. Т.е. отправляешь GET запрос с телефона, возвращает "Сообщение 1". Через секунду отправляешь снова - может вернуть "Сообщение 2"
- Если убрать Flask, Ф-ю ks5_bot_force_queue и констр-ю async with TelegramClient, запустив все в одной ячейке jupyter-lab, то вчера все сообщения 1-4 доходили корректно. Сегодня - нет.
Подскажите:
Как добиться последовательной отправки всех 4 сообщений из telethon, при вызове из обработчика запроса Flask-сервера (или любого другого - еще не пробовал) на juputer-lab на windows (или на heroku - еще не пробовал)
как уменьшить интервал между получениями/отправкой(кликами) сообщений (вплоть до 13 секунд). Или, подтвердите что у вас на telethon удавалось проводить циклы получение/отправка(клик) сообщений без задержек - и если да, где (ядро питон, платформа, тип интерпретатора)
# пишет в телеграм-бот 5ки по ускорению очереди async def ks5_bot_force_queue(lat=60.545481, long=56.820507): # ЗАПУСК телеграм-клиента (код по получению параметров подключения опускаю) print ("=== initialaize TelegramClient ===") sys.stdout.flush() async with TelegramClient(StringSession(SESSION_STRING), API_ID, API_HASH) as client: print ("=== starting TelegramClient ===") sys.stdout.flush() client.start() print ("=== TelegramClient started===") sys.stdout.flush() # Инициализация Главного меню бота # https://fooobar.com/questions/18299291/how-do-you-make-the-python-bot-click-on-the-button-in-the-telegram-bot await client.send_message('@ks5_bot', 'Главное меню') messages = await client.get_messages('ks5_bot') await messages[0].click() # Сообщения ниже отправляются не в порядке их определения в коде (в т.ч. некоторые могут не отправляться) # однако вывод сообщ.на экран происходит в порядке определения в коде print("=== messages1 ===") sys.stdout.flush() messages1 = await client.get_messages('ks5_bot') await messages1[0].click() # жмем кнопку "ускорить очередь" print("=== messages2 ===") sys.stdout.flush() messages2 = await client.get_messages('ks5_bot') await messages1[0].click() # жмем кнопку "да" (вы в магазине?) print("=== messages3 ===") sys.stdout.flush() messages3 = await client.get_messages('ks5_bot') await messages1[0].click(share_geo=(lat, long)) # жмем кнопку "поделиться геопозицией" print("=== messages4 ===") sys.stdout.flush() messages4 = await client.get_messages('ks5_bot', limit=3) await messages4[2].click() # жмем кнопку с адресом конкретного магаза # вернули строку с адресом 1 (из 3) магазинов поблизости, которые предложил ботreturn str(messages2.message)
server = Flask(name)
@server.route('/ks5_bot_gps', methods=['GET']) async def process_gps(): lat, long = request.args.get('lat', type=float), request.args.get('long', type=float) magaz = await ks5_bot_force_queue() return magaz
server.run(host='0.0.0.0', port=int(os.environ.get('PORT', 5000)))