• Как подружить непрерывно выполняющую функцию по мониторингу сети и Телеграм бота на aiogram?

    Tapokpy
    @Tapokpy Автор вопроса
    Кому интересно, рабочий код асинхронного пингования гугла/интернет соединения

    import asyncio
    import logging
    from utils.logger import logger
    # from loader import dp
    
    from icecream import ic
    
    async def ping_google():
        try:
            reader, writer = await asyncio.open_connection('google.com', 443)
            await asyncio.sleep(1)
    
        except Exception as ex:
            logger.info(ex)
            await asyncio.sleep(1)
            return False
        else:
            writer.close()  # может и надо
            await asyncio.sleep(1)
            return True
    
    
    async def start_monitoring():
        ic("Мониторинг сетевого подключения начат.")
        logger.info(f"\n Мониторинг сетевого подключения начат.")
        await asyncio.sleep(1)
    
    
    async def mon_net_connection(ping_freq=3):
        ping = asyncio.create_task(ping_google())
        # ping = asyncio.wait_for(ping_google(), timeout=1.0)
    
        if await ping:
    
            ic("True - Сетевое соединение установлено")
            logger.info("True - Сетевое соединение установлено")
            await asyncio.sleep(ping_freq)
    
        else:
            ic("False - Сетевое соединение недоступно")
            logger.info("False - Сетевое соединение недоступно")
            await asyncio.sleep(ping_freq)
    
        reply = asyncio.create_task(mon_net_connection())
        await reply
    
    
    async def testing():
        n = 5
        while True:
            await asyncio.sleep(n)
            print(f'----{n} секунд прошло')
            n += 5
    
    
    async def all_monitoring():
        tasks = [
            start_monitoring(),
            mon_net_connection(),
            testing()
        ]
        await asyncio.gather(*tasks)
    
    
    asyncio.run(all_monitoring())
  • Как подружить непрерывно выполняющую функцию по мониторингу сети и Телеграм бота на aiogram?

    Tapokpy
    @Tapokpy Автор вопроса
    Сергей Горностаев,
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.create_task(all_monitoring())
        executor.start_polling(dp, on_startup=on_startup)

    Вот так только заработало. Огромное спасибо.
  • Как подружить непрерывно выполняющую функцию по мониторингу сети и Телеграм бота на aiogram?

    Tapokpy
    @Tapokpy Автор вопроса
    Наверно разобрался
    conn = await asyncio.open_connection('google.com', 443)
    , тормозит при потере соединения секунд на 40 иногда. Можно ли это исправить?
    И главный вопрос с которого все началось: Как запустить вместе с ботом?
    from aiogram import executor
    from loader import dp
    
    from utils.notify_admins import on_startup_notify
    from utils.set_bot_commands import set_default_commands
    import handlers
    
    async def on_startup(dispatcher):
        await set_default_commands(dispatcher)  # Устанавливаем дефолтные команды
        await on_startup_notify(dispatcher)  # Уведомляет админов про запуск
    
    
    if __name__ == '__main__':
        executor.start_polling(dp, on_startup=on_startup)
    как я только не пытался запустить, в итоге или бот работает или мониторинг.
  • Как подружить непрерывно выполняющую функцию по мониторингу сети и Телеграм бота на aiogram?

    Tapokpy
    @Tapokpy Автор вопроса
    Сергей Горностаев, уже немного едет крыша.
    import asyncio
    import logging
    
    from icecream import ic
    
    ic.configureOutput(includeContext=True)
    
    logger = logging.getLogger("name")  # Создаем логгер
    fileHandler = logging.FileHandler('logs.log')  # создаем хэндлер и формат для записи в файл
    fileFormat = logging.Formatter("[%(asctime)s]  %(message)s")
    fileHandler.setLevel(logging.WARNING)  # устанавливаем уровень хэндлера и добавляем к логгеру
    fileHandler.setFormatter(fileFormat)
    logger.addHandler(fileHandler)
    
    
    async def ping_google():
        try:
           conn = await asyncio.open_connection('google.com', 443)
            ic()
        except Exception as ex:
            logger.warning(ex)
            await asyncio.sleep(1)
            ic()
    
            return False
        else:
            await asyncio.sleep(1)
            ic()
            return True
    
    
    async def start_monitoring():
        ic("Мониторинг сетевого подключения начат.")
        logger.warning(f"\n Мониторинг сетевого подключения начат.")
    
    
    async def mon_net_connection(ping_freq=3):
        ping = asyncio.create_task(ping_google())
    
        if await ping:
            await asyncio.sleep(ping_freq)
            ic("True - Сетевое соединение установлено")
            logger.warning("True - Сетевое соединение установлено")
    
        else:
            ic("False - Сетевое соединение недоступно")
            logger.warning("False - Сетевое соединение недоступно")
            await asyncio.sleep(ping_freq)
    
        reply = asyncio.create_task(mon_net_connection())
        await reply
    
    
    
    async def testing(sec=5):
        while True:
            await asyncio.sleep(sec)
            print(f'---- 5 секунд прошло')
    
    
    async def main():
        tasks = [
            start_monitoring(),
            mon_net_connection(),
            testing()
        ]
    
        await asyncio.gather(*tasks)
    
    
    asyncio.run(main())

    Все работает когда запускается при наличии соединения, при отключении соединения тоже все работает, но при включении соединения функция зависает и получается await reply не запускает все заново.
    Спасибо пожалуйста, ибо кукуха уже начинает сильно свистеть.
    Большое спасибо.
  • Как подружить непрерывно выполняющую функцию по мониторингу сети и Телеграм бота на aiogram?

    Tapokpy
    @Tapokpy Автор вопроса
    Доброй, если с pingom разобрался:
    async def ping_google():
        try:
            conn = await asyncio.open_connection('google.com', 443)
        except Exception as ex:
            print(ex)
            return False
        else:
            return True
    ping = asyncio.run(ping_google())

    Никак не могу найти как правильно уйти от while=True, везде он используется в подобных моментах.
  • Динамическое создание переменных (InlineKeyboard), правильно ли?

    Tapokpy
    @Tapokpy Автор вопроса
    Влад Григорьев, вот вообще не понятно, можно поподробнее или пример.
  • Как определить ид группы телеграм?

    Дмитрий, вот шаблон бота с которого начинал изучать, там все это есть. У него кстати норм уроки.
    что бы бот заработал надо переименовать файл .env.dist, .dist убрать. в файле все написано.
  • Как сделать многоуровневое inline меню в aiogram?

    Voprosium, нуууу не так быстро) сегодня ночью надеюсь получится уже)
  • Как сделать многоуровневое inline меню в aiogram?

    Voprosium,
    import sqlite3
    from sqlite3 import Error
    import requests
    from bs4 import BeautifulSoup
    
    
    # РАБОЧИЙ ВАРИАНТ
    def create_connection(db_file):
        """
        create a database connection to the SQLite database
        :param db_file: database file
        :return: Connection object or None
        """
        connection = None
        try:
            connection = sqlite3.connect(db_file)
        except Error as e:
            print(e)
        return connection
    
    
    def execute(connection, query, param=None, many=False):
        """
        Create a new project into the projects table
        :param many: executemany()
        :param connection: connect object
        :param query: sql query to execute
        :param param: tuple of  values
        """
        cursor = connection.cursor()
        if param is None:
            cursor.execute(query)
        else:
            if many:
                cursor.executemany(query, param)
            else:
                cursor.execute(query, param)
        connection.commit()
    
    
    def parsing(url):
        """
        Parsing URL to get product name, price, link
        :param url: connect object
        """
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 '
                          'Safari/537.3'}
        response = requests.get(url, 'html.parser', headers=headers)
    
        soup = BeautifulSoup(response.text, features='html.parser')  # TODO: features='lxml'
        category_site = soup.find_all('span', class_="inline-title")
        all_items = soup.find_all('div', class_='porto-products wpb_content_element')
    
        result = []
        for n, i in enumerate(category_site):
            db_category = i.text
            items = all_items[n].find_all('h3')
            price = all_items[n].find_all('span', class_='woocommerce-Price-amount amount')
            link = all_items[n].find_all('a', class_='product-loop-title')
    
            for m, q in enumerate(items):
                db_item = q.text
                db_price = price[m].text.replace("руб.", "")
                db_url = link[m].get('href')
                db_list = (db_category, db_item, db_price, db_url)
                result.append(db_list)
        return result
    
    
    def run_parsing():
        target_url = 'https://pri****'
        database = "identifier.sqlite"
    
        create_query = "CREATE TABLE IF NOT EXISTS goods(category TEXT,item TEXT, price TEXT,url TEXT);"
        insert_query = "INSERT INTO goods(category, item, price, url) VALUES (?, ?, ?, ?) ;"
        conn = create_connection(database)
        with conn:
            execute(conn, create_query)
            r = parsing(target_url)
            # вставляем по одной строке за раз
            # for elem in r:
            #     execute(connection=conn, query=insert_query, param=elem)
    
            # вставляем весь список кортежей за раз
            execute(connection=conn, query=insert_query, param=r, many=True)
    
    # if __name__ == '__main__':
    #     run_parsing()

    вот парсер и в db, единственное что бы работало надо db создать и запустить. Долго помучился, и тут помогли. Но еще потом доделаю, что бы каждый раз база обнулялась, а то сделал запрос в бота кидаешь, он запускает парсинг и дальше дубль добавляет.
  • Как определить ид группы телеграм?

    Дмитрий,
    from aiogram import types
    from aiogram.dispatcher import FSMContext
    from loader import dp
    
    @dp.message_handler(state=None)
    async def bot_echo(message: types.Message):
        await message.answer(f"Инфа:\n"
                             f"{message.from_user}")

    Эхо бот мой тестовый, который отвечает сообщением с данными о юзере.