• Как мне проверить, что монеты на разных биржах одинаковые?

    Buchachalo
    @Buchachalo
    Межбиржевой арбитраж. Штука интересная.
    Можно потратить некоторое количество денег и провалидировать все монеты между биржами тупо пересылая минимальное количество с адреса на адрес. Потеряешь на fee чуть чуть. Этот процесс можно автоматизировать.
    Ну нужно учесть что сети вывода и ввода (и вообще возможность такая) на каждой бирже разная. У кого то есть только ввод без вывода. У кого то есть только сеть эфириума, она по моему очень дорогая и долгая. Там подводных камней миллион.
    По названию токена только не сравнивай, есть куча монет с одним и тем же названием но по факту смарт-контракты разные.
    Ответ написан
    Комментировать
  • Как сделать чтобы после выполнения команды, значения анулировались?

    Buchachalo
    @Buchachalo
    @bot.message_handler(commands=['selection'])
    def bujet(message):
        is_age = False
        if not is_age:
            bot.send_message(message.chat.id, "Ваш бюджет:")
            age = 0;
            @bot.message_handler(content_types=['text'])
            def selection(message):   
                try:
                    age = int(message.text) #проверяем, что возраст введен корректно
                    bot.send_message(message.from_user.id, age)
                    is_age = True
                except Exception:
                    bot.send_message(message.from_user.id, 'Цифрами, пожалуйста')


    Вот прям если в лоб.
    Будет просто молчать. Но через else можно и вывести подсказку вида "Возраст уже введен". Хотя такое себе, так как пользователь может и ошибиться при вводе
    Ответ написан
    Комментировать
  • Почему find не находит значения в БД?

    Buchachalo
    @Buchachalo
    Может быть ему не нравится формат id? Или тип id?
    И как то странно выглядит формат userfrac = factions.find_one({'serverid': int(i)})
    factions это коллекция серверов? И вы там ищите id? Почему тогда {'serverid': int(i)} а не int(i)?
    Не силен в монге, но выглядит странно.
    Ответ написан
    Комментировать
  • Как правильно организовать подключение к множеству серверов по websocket?

    Buchachalo
    @Buchachalo Автор вопроса
    "Ну вот и всё! Неплохая получилась история. Интересная, весёлая, порой, немного грустная, а главное-поучительная! Она научила быть смелыми и не бояться вызовов, которые готовит нам жизнь. Помогала нам добиваться поставленных целей, несмотря ни на что. Но самое главное что у это истории счастливый конец!"


    Как обычно в воспаленном мозгу инженера рождаются странные мысли об оверинженеренге!!! Нужно придумать какого менеджера сокетов, или ФАБРИКУ сокетов! Или поднимать для каждого драйвера свой докер-образ. И все это было сделано, и все это работало, но оставалось чувство что делается все не правильно. Все как обычно проще) Нужно было 2 бокала белого рислинга что бы наступило прозрение...

    async def foo_srv2(dvs: list):
        url = '********************'
        
        async def create_ws(url: str, dvs: list):
            async with websockets.connect(url) as ws:
                await ws.send(f'{{"op": "subscribe", "args": {dvs}}}')
                async for message in ws:
                    message = json.loads(message)
                    print(message)
    
        futures = list()
        for i in range(0, len(dvs), 10):
            slice_dvs = dvs[i:i + 10]
            futures.append(asyncio.create_task(create_ws(slice_dvs)))
        await asyncio.gather(*futures, return_exceptions=True)

    Все просто и все прекрасно полетело. Не гарантирую что это единственно правильный подход, но все отлично поднялось и бегает. Отмасштабировал до прослушивания 44 серверов, прилетают пакеты каждые 10 миллисекунд в среднем, количество пакетов не считал, но там не мало. Все отлично работает и не жужжит)
    Всем спасибо за внимание!
    Ответ написан
    Комментировать
  • Почему Python не очищает процессы после выполнения?

    Buchachalo
    @Buchachalo
    А в коде я не заметил процессов. Вы хотите параллельные вычисления? В данном случаи все вычисления последовательны.
    Ответ написан
    Комментировать
  • Как сделать адаптивные кнопки в TelegrammBot?

    Buchachalo
    @Buchachalo
    Ну как минимум не использовать инлайн клавиатуру.
    Ответ написан
    Комментировать
  • Как сделать отправление сообщений через потоки?

    Buchachalo
    @Buchachalo
    Тут стоит конечно использовать синхронный клиент для телеги. Так как исполнение ты все равно запускаешь в каждом потоке свое, то профита от асинхронного клиента не получить в данном случаи. И обязательно правильно закрывай поток, не бросай его на произвол судьбы.
    Ответ написан
    Комментировать
  • Нужно искать по названиям вещей и выдавать дополнительную информацию, как сделать это проще?

    Buchachalo
    @Buchachalo
    Уже все придумали друг!
    Подрубаешь себе OpenAI, в запрос клиента первым словом втыкаешь "смарфон" и вуаля:
    "смартфон А3" (написано на русском)

    "Я могу рассказать о смартфоне Samsung Galaxy A3. Это устройство с диагональю экрана 4,7 дюйма и HD-разрешением 1280x720 пикселей. Внутри установлен процессор Exynos 7578, 2 ГБ ОЗУ и 16 ГБ встроенной памяти, которую можно расширить до 256 ГБ с помощью microSD-карты. Камера основная 13 Мп, фронтальная 5 Мп. Аккумулятор имеет емкость 2300 мАч. Также устройство поддерживает две SIM-карты и работает на операционной системе Android."
    Ответ написан
    Комментировать
  • FastAPi build приложения?

    Buchachalo
    @Buchachalo
    Есть же хороший паттерн для этого.
    Dockerfile
    FROM python:3.10-alpine
    WORKDIR /app
    
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    
    COPY ./src/requirements.txt .
    RUN pip install --no-cache-dir -r /app/requirements.txt
    
    COPY ./src .

    Тут упаковываете в образ свой проект.

    И в docker-compose собираете требуемые сервисы. Nginx, Postgre, Redis и т.д.
    docker-compose
    version: '3'
    services:
      db:
        image: postgres:15-alpine
        volumes:
          - postgres_data:/var/lib/postgresql/data/
        expose:
          - 5432
        environment:
          - POSTGRES_USER=${POSTGRES_USER}
          - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
          - POSTGRES_DB=${POSTGRES_DB}
    
      api:
        build:
          context: .
        command: uvicorn main:app --host 0.0.0.0
        ports:
          - 8080:8000
        environment:
          - DATABASE_DSN=${DATABASE_DSN}
        restart: always
        depends_on:
          - db
    
    volumes:
      postgres_data:


    И что бы руками каждый раз инфраструктуру не разворачивать пользуемся Github Actions, при взаимодействии с репозиторием он может прогнать тесты, собрать новый образ, залить все на прод сервер и развернуть.
    Ответ написан
    Комментировать
  • Как с помощью Aiogram запросить у юзера настоящее месположение?

    Buchachalo
    @Buchachalo
    JaxWill запросить через стандартную геопозицию. Но пользователь может передвинуть точку и фейкануть. К сожалению через телегу не реализовать. Можно через нативное приложение.
    Ответ написан
  • Как добавить пользователя в канал или группу, имея его user_id?

    Buchachalo
    @Buchachalo
    Можно через инлайн режим. Но осторожнее с количеством добавлений. Телеграм можем посчитать вас спамером.
    Ответ написан
    Комментировать
  • Как работать с подобным списком json на python?

    Buchachalo
    @Buchachalo
    _dict = {"Oleg":{"act":0,"total":0},"Vitya":{"act":2,"total":4}}
    result = [_.get('act') for _ in _dict.values()]
    
    # [0, 2]


    Выше парни все верно написали, но с точки зрения утилизации ресурсов не верно. Если я верно понимаю то алгоритм что в первом что во втором случаи O(n), мой будет O(1)
    Ответ написан
    Комментировать
  • Как искать подстроку в callback данных?

    Buchachalo
    @Buchachalo
    Тут вариантов масса. И еще зависит от версии aigramm которой пользуешься.

    Для 3 версии есть переработанная CDF
    https://docs.aiogram.dev/ru/latest/dispatcher/filt...

    Для 2+ версии aigramm, можно по старым схемам:
    task_cb = CallbackData("task_menu", "task_type", "task_num")
    
    # array = [{name: 'task_name_1', type: 'c', num: 123456}]
    
    def task_keyboard(array):
        markup = InlineKeyboardMarkup(row_width=2)
        for task in array:
            markup.insert(InlineKeyboardButton(text=task.get('name'),
                                               callback_data=task_cb.new(task_type=task.get("type"),
                                                                           task_num= task.get("num"))))
        return markup
    
    # Ловим колбэк
    @dp.callback_query_handler(task_cb.filter())
    async def show_task(callback: types.CallbackQuery, callback_data: dict):
        type = callback_data.get("task_type")
        num = callback_data.get("task_num")


    Ну либо лови колбэк как ты и описал и парси как обычный str.
    type = callback[:1]
    num= callback[1:]
    Ответ написан
    Комментировать
  • По нажатию inline кнопки удалить все сообщения в переписке с ботом?

    Buchachalo
    @Buchachalo
    Можно взять любую NoSQL базу, полегче которая. И хранить там словари с id сообщений. {"12345":[123,456,789,..]}.
    Тык по инлайну, и в цикле перебрал все id. Только не спамь команду, api телеги может тебя наругать за частые обращения.
    Ответ написан
    Комментировать
  • Как передать информацию в телеграм бот в ссылке на него?

    Buchachalo
    @Buchachalo
    Тут обсуждали
    https://qna.habr.com/q/1135496
    Ответ написан
    Комментировать
  • Как добавить кнопки в бота, через телеграм в Aiogram?

    Buchachalo
    @Buchachalo
    Да все возможно.
    Реализовать генератор кнопок.
    Записать в БД url своих ресурсов. В том числе и возможность добавления в БД url через бота.
    В генератор кнопок стравливать все записи из своей БД.
    Заранее предусмотреть пагинацию на кнопках, так как url у тебя будет не мало со временем.
    Ответ написан
    Комментировать
  • Как создать фильтр в aiogram?

    Buchachalo
    @Buchachalo
    str = str.lower()
    if "гол" in str:
        ....

    Ну если прям в лоб.
    Если принципиально только сначала строки то можно дополнить.
    Ответ написан
    Комментировать
  • Как вывести данные с postgresql в телеграм бота на postgresql?

    Buchachalo
    @Buchachalo
    Круто бы получить хотя бы трейслог ошибки
    Ответ написан
    Комментировать
  • Как при редактировании сообщения прикрепить к нему клавиатурную кнопку?

    Buchachalo
    @Buchachalo
    А если удалить прошлое и создать новое сообщение уже с кнопкой?
    Ответ написан
    Комментировать
  • Программа должна парсить товары OZON и отсылать в телеграмм бота. Почему этого не происходит?

    Buchachalo
    @Buchachalo
    Автор, а подскажи, зачем ты пользуешься асинхронным фреймворком, но самые тяжелые io выполняешь синхронно?
    Потому что только на нем умеешь писать бота?
    Ответ написан
    Комментировать