Ответы пользователя по тегу Python
  • Как передать dataframe в JSON и обратно?

    @OlegPyatakov
    pyatakov.com
    Ответ написан
    Комментировать
  • Есть ли смысл проверять наличие пользователя в базе когда снаружи неизвестен секретный ключ?

    @OlegPyatakov
    pyatakov.com
    В этом есть смысл на случай:
    • Пользователь был удален из БД после генерации токена
    • Дальше в коде с объектов user будет работа
    • Взломали сервис генерации токена. Конечно, такая проверка мало поможет, но это может быть звоночком
    Ответ написан
    Комментировать
  • Как отсортировать словарь?

    @OlegPyatakov
    pyatakov.com
    Тот словарь, который получился изначально, кажется, не очень подходит под задачу.
    Можно сделать список пересечений цветов и дальше итеративно отфильтровывать этот список, находя цвета, над которыми нет пересечений.

    # Массив туплов формата (нижний цвет, верхний цвет)
    crossovers = [('red', 'blue'), ('red', 'green'), ('green', 'blue'), ('green', 'yellow')]
    
    colors_to_sort =[]
    for crossover in crossovers:
        colors_to_sort.append(crossover[0])
        colors_to_sort.append(crossover[1])
    colors_to_sort = list(set(colors_to_sort))
    
    colors_top_bottom = []
    
    def is_top_color(color, crossovers):
        if not list(filter(lambda x: x[0] == color ,crossovers)):
            return True
        else:
            return False
    
    while len(colors_to_sort) > 0:
        found_top_color = False
        for color in colors_to_sort[:]:
            if is_top_color(color, crossovers):
                found_top_color = True
                colors_top_bottom.append(color)
                colors_to_sort.remove(color)
                crossovers = list(filter(lambda x: x[1] != color, crossovers))
    
        if not found_top_color:
            print('Невозможное наложение прямоугольников')
            break
    
    print(colors_top_bottom)
    Ответ написан
    Комментировать
  • Почему не работает proxi?

    @OlegPyatakov
    pyatakov.com
    Сейчас, чтобы законнектить Телеграм бота через прокси, нужно выполнить два условия:

    • Используемый Socks прокси должен поддерживать SSL. Далеко не каждый прокси в интернете его поддерживает - нужно проверять. Указанный в вашем конфиге - не поддерживает или делает это как-то необычно.
    • Боту нужно передавать дополнительно параметры для библиотеки коннекта, чтобы та игнорировала ошибки сертификатов. В вашем случае, нужны параметры для Urllib3.


    Попробуйте вот так. Я только что проверил - мой бот с таким конфигом нормально коннектится и посылает сообщение с картинкой.

    REQUEST_KWARGS={
        'proxy_url': 'socks4://171.103.9.22:4145/',
        # Optional, if you need authentication:
        'urllib3_proxy_kwargs': {
            'assert_hostname': 'False',
            'cert_reqs': 'CERT_NONE'
            # 'username': 'user',
            # 'password': 'password'
        }
    }
    Ответ написан
    Комментировать
  • Как заставить python-telegram-bot работать с прокси?

    @OlegPyatakov
    pyatakov.com
    Сейчас, чтобы законнектить Телеграм бота через прокси, нужно выполнить два условия:

    • Используемый Socks прокси должен поддерживать SSL. Далеко не каждый прокси в интернете его поддерживает - нужно проверять. Указанный в вашем конфиге - не поддерживает или делает это как-то необычно.
    • Боту нужно передавать дополнительно параметры для библиотеки коннекта, чтобы та игнорировала ошибки сертификатов. В вашем случае, нужны параметры для Urllib3.


    Попробуйте вот так. Я только что проверил - мой бот с таким конфигом нормально коннектится и посылает сообщение с картинкой.

    REQUEST_KWARGS={
        'proxy_url': 'socks4://171.103.9.22:4145/',
        # Optional, if you need authentication:
        'urllib3_proxy_kwargs': {
            'assert_hostname': 'False',
            'cert_reqs': 'CERT_NONE'
            # 'username': 'user',
            # 'password': 'password'
        }
    }
    Ответ написан
    3 комментария
  • Почему python не отдает 31 января?

    @OlegPyatakov
    pyatakov.com
    Вот эта конструкция в коде
    range(int((end_date - start_date).days))
    превращается в вашем случае в
    range(30)
    и выдает тридцать чисел:
    0, 1, 2, 3 ...., 28, 29

    Если по-человечески, то 31.01.2019 минус 01.01.2019 будет тридцать суток разницы.
    Ответ написан
    1 комментарий
  • Возможно ли перенести бот с бесплатной платформы на свою?

    @OlegPyatakov
    pyatakov.com
    Почти всегда перенести бота в формате "экспорт-импорт" нельзя.
    Понадобится написать с нуля бота, который будет выполнять функционал бота из конструктора.

    Посмотрел на ManyBot:
    • Хорошо, что они используют ваш токен, то есть вы сможете заменить платформу, не меняя имени бота.
    • Не увидел, есть ли у них экспорт базы пользователей или какая-то другая возможность ее собрать. Если нет, то не сможете узнать, кто был подписан на бота до переноса.
    Ответ написан
    1 комментарий
  • Pythonanywhere не подключается к прокси, что делать?

    @OlegPyatakov
    pyatakov.com
    Бесплатные аккаунты на Pythonanywhere могут делать исходящие соединения только по сайтам из белого списка:
    https://www.pythonanywhere.com/whitelist/.

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

    @OlegPyatakov
    pyatakov.com
    Проблема в том, что SSL сертификат сервера или прокси не проходит проверку библиотеки, которая отвечает за сетевое подключение, так как сертификат - самоподписанный.

    Самое простое решение (хотя и не оптимальное) - отключить проверку сертификата. Как это сделать в конкретно вашей библиотеке для Telegram, надо искать в документации.
    Ответ написан
    Комментировать
  • Как можно экспортировать данные из MySQL?

    @OlegPyatakov
    pyatakov.com
    Есть много вариантов (в зависимости от целей):
    • Если использовать GUI утилиты для SQL базы, то там есть возможность экспортировать в csv/Excel (например, так точно в Heidi SQL)
    • В самом Excel можно установить коннектор к MySQL и импортировать данные запросом
    • В Python можно сделать запрос на данные и потом записать в csv через стандартную библиотеку языка
    Ответ написан
    2 комментария
  • Язык программирования для работы с Excel?

    @OlegPyatakov
    pyatakov.com
    В качестве альтернативы можно рассмотреть вызов VBA макросов из внешних к обрабатываемому файлу источников:
    • Любая запущенная программа из MS Office. Например, у меня есть опыт создания внутрикорпоративного сервиса на Outlook. Т.е. можно использовать почту как внутренний интерфейс.
    • Вызывать VBA макросы из Command Line/Powershell. Такой вариант позволяет на Windows связать web-бэкенд на Python с бизнес-логикой на VBA.
    Ответ написан
    Комментировать
  • Проблема с Sumble Text 3 с любым кодом?

    @OlegPyatakov
    pyatakov.com
    Предположительно, судя по скриншоту, путь к Python не добавлен в системный Path Windows.
    Надо проверить или добавить.
    Ответ написан
    Комментировать
  • Как ускорить большое количество get запросов?

    @OlegPyatakov
    pyatakov.com
    Основная потеря времени - ожидание ответов от удаленных серверов.

    Варианты, что делать для ускорения:
    1. Работать в несколько потоков
    2. Работать в несколько процессов
    3. Работать через асинхронные запросы
    Ответ написан
    Комментировать
  • На какой платформе лучше держать telegram бота на python?

    @OlegPyatakov
    pyatakov.com
    PaaS (Heroku, IBM, PythonAnywhere) решения проще использовать, есть бесплатные тарифы, но, как правило, есть свои ограничения, плюс надо изучать специфику платформ.

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

    @OlegPyatakov
    pyatakov.com
    Как один из вариантов: Sikuli
    Ответ написан
    Комментировать
  • Почему это так работает?

    @OlegPyatakov
    pyatakov.com
    Во-первых, global deque - это не про многопоточность, а про видимость переменных.

    Во-вторых, ошибка на самом деле есть в этой части кода:
    if r not in deque:
          deque.append(r);

    Потенциальная ошибка может появиться во в этом месте, если будет гонка между потоками. Если добавить в этом месте минимальный time.sleep (или другую "затратную" по времени операцию), то все сразу начинает ломаться. Сходу не готов сказать, почему без time.sleep в немодифицированном случае не происходит ошибки (вероятно связано с работой рантайма и GIL). Тем не менее то, что поток не уйдет в сон в этом месте, не гарантируется рантаймом и закладываться на это нельзя.

    Чтобы увидеть ошибку, немного я немного модифицировал скрипт: добавил sleep и увеличил количество потоков). У меня в таком виде получается, что добавляется 170 чисел против 101 уникальных.
    import threading;
    import random;
    import collections;
    
    from time import sleep
    
    NUM_THREADS = 50;
    COUNT_FOR_EACH_THREAD = 10;
    threads = [];
    deque = collections.deque();
    
    
    def threadProc():
      for i in range(0, COUNT_FOR_EACH_THREAD):
        r = random.randint(0, 100);
        if r not in deque:
          sleep(0.01)
          deque.append(r);
    
    
    for i in range(0, NUM_THREADS):
      thread = threading.Thread(target = threadProc);
      threads.append(thread);
      thread.start();
      
    for i in range(0, NUM_THREADS):
      threads[i].join();
    
    print(deque);
    print(len(deque))
    print(len(set(deque)))


    PS. В Python нет смысла оканчивать строки ";".
    Ответ написан
    1 комментарий
  • Платный сервер для Telegram Bot?

    @OlegPyatakov
    pyatakov.com
    Совсем дешево, а точнее бесплатно, можно разместить на многих PaaS сервисах: Heroku, Bluemix, OpenShift и т.д.
    В блоге делал их сравнение.
    Ответ написан
    2 комментария
  • Какой сервис использовать для хранения и доступа к файлу словаря python в проекте на heroku?

    @OlegPyatakov
    pyatakov.com
    Вариант 1. Использовать БД. На Heroku есть, вроде, free tier для БД. Можно использовать внешнюю, например, бесплатный уровень в mlab.com.
    Вариант 2. Использовать Яндекс.Диск (или аналог) с доступом по WebDav.
    Ответ написан
    2 комментария
  • Возможно ли мониторить канал телеграма ботом?

    @OlegPyatakov
    pyatakov.com
    Вариант 1. Использовать Telegram Bot API. Самый простой вариант. Есть много туториалов и готовых библиотек. Критический минус - бот через Bot API не будет видеть сообщения от других ботов в этом канале (например, когда автор канала пользуется ботом для постинга).

    Вариант 2. Имитировать клиент Telegram. Готовые библиотеки/клиенты тоже есть, но намного менее распространены. Туториалов намного меньше.

    Вариант 3. Найти вебсервис, который мониторит каналы Telegram, например, для целей выдачи фида (т.е. тот кто уже реализовал вариант №2), и брать данные с него через web-парсинг или api(если есть).
    Ответ написан
    Комментировать
  • Какую модель выбрать для удобного "жизненного цикла" кода?

    @OlegPyatakov
    pyatakov.com
    Не знаю термина, подходящего для описания набора ресурсов, программ, сервисов и связей между ними.

    Это в целом называется Continuous Integration (CI)

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

    В части Sublime это решается через настройку какого-нибудь скрипта, который отрабатывает при каждом сохранении проекта. Плагины для таких настроек есть.
    Ищу классическое(или общее-вне зависимости от того, какой paas выберу), простое, или красивое решение.

    Каждый PaaS, как правило, имеет свой набор инструментов для развертывания приложения. Максимально универсальное решение будет у себя в IDE настроить push в репозиторий, а в PaaS - интеграцию, чтобы он из этого репозитория забирал код и обновлял сервис. Это поддерживают многие сервисы.
    Самое простое решение для непрофессионала будет следующим. После того, как разберетесь с конкретным PaaS, забить необходимые команды для развертывания приложения в этом конкретном PaaS в 1-простенький скрипт (bat-файл или макрос в Sublime/IDE) и запускать этот скрипт.
    Ответ написан
    Комментировать