mirror of
https://github.com/Balshgit/mosgortrans.git
synced 2026-02-03 11:20:56 +03:00
run commands in ThreadPool
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import asyncio
|
||||
from concurrent.futures.thread import ThreadPoolExecutor
|
||||
from dataclasses import dataclass
|
||||
|
||||
from aiogram import Bot, types
|
||||
@@ -9,6 +10,8 @@ from aiogram.utils.callback_data import CallbackData
|
||||
from app.core.parse_web import WebParser
|
||||
from app.settings import TELEGRAM_API_TOKEN
|
||||
|
||||
executor = ThreadPoolExecutor(10)
|
||||
|
||||
|
||||
@dataclass
|
||||
class TransportBot:
|
||||
@@ -46,16 +49,14 @@ class TransportBot:
|
||||
async def home_office(
|
||||
query: types.CallbackQuery, callback_data: dict[str, str]
|
||||
) -> types.Message:
|
||||
driver = WebParser.get_driver()
|
||||
text = WebParser.parse_yandex_maps(
|
||||
driver=driver,
|
||||
url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/?ll=37.527924%2C55.823470&tab=overview&z=21',
|
||||
message='Остановка Б. Академическая ул, д. 15',
|
||||
buses=[
|
||||
'300',
|
||||
'т19',
|
||||
],
|
||||
)
|
||||
url = 'https://yandex.ru/maps/213/moscow/stops/stop__9640740/?ll=37.527924%2C55.823470&tab=overview&z=21'
|
||||
message = 'Остановка Б. Академическая ул, д. 15'
|
||||
buses = [
|
||||
'300',
|
||||
'т19',
|
||||
]
|
||||
|
||||
text = await TransportBot._get_buses_data(url=url, message=message, buses=buses)
|
||||
|
||||
return await TransportBot.bot.send_message(
|
||||
query.message.chat.id, text, reply_markup=TransportBot.get_keyboard()
|
||||
@@ -66,16 +67,14 @@ class TransportBot:
|
||||
async def office_home(
|
||||
query: types.CallbackQuery, callback_data: dict[str, str]
|
||||
) -> types.Message:
|
||||
driver = WebParser.get_driver()
|
||||
text = WebParser.parse_yandex_maps(
|
||||
driver=driver,
|
||||
url='https://yandex.ru/maps/213/moscow/stops/stop__9640288/?ll=37.505402%2C55.800214&tab=overview&z=21',
|
||||
message='Остановка Улица Алабяна',
|
||||
buses=[
|
||||
'300',
|
||||
'т19',
|
||||
],
|
||||
)
|
||||
url = 'https://yandex.ru/maps/213/moscow/stops/stop__9640288/?ll=37.505402%2C55.800214&tab=overview&z=21'
|
||||
message = 'Остановка Улица Алабяна'
|
||||
buses = [
|
||||
'300',
|
||||
'т19',
|
||||
]
|
||||
|
||||
text = await TransportBot._get_buses_data(url=url, message=message, buses=buses)
|
||||
|
||||
return await TransportBot.bot.send_message(
|
||||
query.message.chat.id, text, reply_markup=TransportBot.get_keyboard()
|
||||
@@ -97,16 +96,15 @@ class TransportBot:
|
||||
if not chat_ids:
|
||||
return None
|
||||
|
||||
driver = WebParser.get_driver()
|
||||
text = WebParser.parse_yandex_maps(
|
||||
driver=driver,
|
||||
url='https://yandex.ru/maps/213/moscow/stops/stop__9640740/?ll=37.527924%2C55.823470&tab=overview&z=21',
|
||||
message='Остановка Б. Академическая ул, д. 15',
|
||||
buses=[
|
||||
'300',
|
||||
'т19',
|
||||
],
|
||||
)
|
||||
url = 'https://yandex.ru/maps/213/moscow/stops/stop__9640740/?ll=37.527924%2C55.823470&tab=overview&z=21'
|
||||
message = 'Остановка Б. Академическая ул, д. 15'
|
||||
buses = [
|
||||
'300',
|
||||
'т19',
|
||||
]
|
||||
|
||||
text = await TransportBot._get_buses_data(url=url, message=message, buses=buses)
|
||||
|
||||
kwargs = {'reply_markup': TransportBot.get_keyboard()} if show_keyboard else {}
|
||||
|
||||
await asyncio.gather(
|
||||
@@ -120,3 +118,11 @@ class TransportBot:
|
||||
for chat_id in chat_ids
|
||||
]
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
async def _get_buses_data(url: str, message: str, buses: list[str]) -> str:
|
||||
driver = WebParser.get_driver()
|
||||
loop = asyncio.get_event_loop()
|
||||
return await loop.run_in_executor(
|
||||
executor, WebParser.parse_yandex_maps, url, message, buses, driver
|
||||
)
|
||||
|
||||
@@ -15,15 +15,14 @@ from app.settings import DRIVER_SESSION_TTL
|
||||
class WebParser:
|
||||
@staticmethod
|
||||
def parse_yandex_maps(
|
||||
*,
|
||||
url: str,
|
||||
message: str,
|
||||
buses: list[str],
|
||||
driver: WebDriver | None = None,
|
||||
driver: WebDriver | None,
|
||||
) -> str:
|
||||
if not driver:
|
||||
logger.error('Driver is not configured')
|
||||
return 'Что-то пошло не так. :( Драйвер Firefox не сконфигурирован.'
|
||||
logger.error('Web driver is not configured')
|
||||
return 'Что-то пошло не так. :( Веб драйвер не сконфигурирован.'
|
||||
|
||||
driver.get(url)
|
||||
time.sleep(1)
|
||||
@@ -63,7 +62,7 @@ class WebParser:
|
||||
|
||||
@staticmethod
|
||||
@timed_cache(seconds=DRIVER_SESSION_TTL)
|
||||
def get_driver() -> WebDriver:
|
||||
def get_driver() -> WebDriver | None:
|
||||
opt = webdriver.ChromeOptions()
|
||||
opt.add_argument('--headless')
|
||||
driver = webdriver.Remote(
|
||||
|
||||
@@ -4,6 +4,7 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
|
||||
from app.core.bot import TransportBot
|
||||
from app.core.utils import logger
|
||||
from settings import CHAT_IDS
|
||||
|
||||
bot_cron_jobs = {
|
||||
'morning_home->work_bus': {
|
||||
@@ -39,10 +40,7 @@ bot_cron_jobs = {
|
||||
},
|
||||
],
|
||||
'func_kwargs': {
|
||||
'chat_ids': [
|
||||
417070387, # me
|
||||
# 431571617, # Lenok
|
||||
]
|
||||
'chat_ids': CHAT_IDS,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user