• Python Requests авторизация на сайте, как получить значения которые генирируются js?

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1. Разобрать алгоритм, по которому генерируется значение-ключ, и воссоздать его в питоне.
    Вариант 2. Использовать эмулятор браузера, который может выполнять JS, типа selenium. Тоже не идеально.
    Ответ написан
  • Как найти в файле тхт нужную строку и добавить к ней другую переменную?

    Vindicar
    @Vindicar
    RTFM!
    Открыть исходный файл (open()), и еще один временный файл.
    Потом в цикле читать строки (readline()) и бить их на части по пробелу (str.split()).
    Если первая часть строки не равна s, то записываем строку во второй файл как есть.
    Если первая часть строки равна s, то изменяешь части строки как тебе требуется, формируешь новую строку и записываешь во второй файл.
    Когда пройдёшь по всем строкам файла, закрой оба файла, и используй os.replace(), чтобы заменить первый (исходный) файл вторым (изменённым).

    Готовый код не проси, за этим на фриланс.
    Ответ написан
    3 комментария
  • Как мне выполнить sql запрос?

    Vindicar
    @Vindicar
    RTFM!
    У тебя криво спроектированы таблицы. Реши для начала, кто ведущий, а кто ведомый в отношении Post-Money.
    Ведомый хранит ссылку на своего ведущего, но не наоборот.
    Если у тебя и впрямь просто реализуется связь многие ко многим, то связная таблица должна хранить ссылки на связываемые, но не наоборот.
    Ответ написан
    Комментировать
  • Как можно управлять ЦАПом MCP4725 при помощи python?

    Vindicar
    @Vindicar
    RTFM!
    Навскидку: написать прошивку под Ардуино, которая будет преобразовывать команды, полученные с Serial интерфейса, в манипуляции ЦАП-ом. После этого в питон-скрипте используешь пакет pyserial, чтобы работать с Ардуино через виртуальный COM-порт, и отдавать команды написанной тобой прошивке.

    Кроме того, есть такая штука как MicroPython, которая позволяет использовать (очень) ограниченный вариант Питона для написания прошивок непосредственно.

    Я фз что тебе больше подойдёт, так как не знаю, какую задачу ты решаешь.
    Ответ написан
    Комментировать
  • Как передать параметр в декоратор в рантайме?

    Vindicar
    @Vindicar
    RTFM!
    Декорировать функцию после получения параметров. Не забывай, что
    @formatter(p1, p2)
    def csv_reader(filename, request):
        ...

    эквивалентно
    def csv_reader(filename, request):
        ...
    
    _temp = formatter(p1, p2)
    csv_reader = _temp(csv_reader)


    Альтернативно, пусть возвращаемая фукнкция имеет свойства:
    def formatter(parse_func):
        def output_func(*args):
            ...  # тут обращаемся к output_func.p1, например
    
        output_func.p1 = p1
        output_func.p2 = p2
        return output_func
    
    
    @formatter
    def csv_reader(filename, request):
        ...
    
    csv_reader.p1 = a1
    csv_reader.p2 = a2

    Вместо функции можно вообще вернуть callable object, т.е. объект класса с методом __call__(), и любыми нужными свойствами и методами.
    Ответ написан
    1 комментарий
  • Почему метод get.users, flieds = online, возвращает None?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй передать параметр по имени, .get(user_ids=user_id)
    Ответ написан
  • Почему код перестает работать при импорте?

    Vindicar
    @Vindicar
    RTFM!
    sqlite не поддерживает толком одновременную работу в нескольких потоках.

    1. У тебя парсер? Перепиши код на асинхронный, тебе не сдалось на самом деле использовать потоки. Они 90% времени будут спать и ждать сетевого ответа. Асинхронный код выполняется в одном потоке, так что таких проблем не будет.
    2. Создай отдельный поток, который будет заниматься только работой с базой, и общаться с остальными через какое-то api, например, кладём запрос, данные и какой-то id в очередь, потом читаем ответ из словаря. Но ты по факту будешь писать свой кривенький СУБД-сервер, так что...
    3. Вместо sqlite используй любую полноценную СУБД, которая умеет параллельные соединения. Postrge, mariadb, что угодно.
    Ответ написан
  • Как изменить вывод данных из промиса?

    Vindicar
    @Vindicar
    RTFM!
    data.forEach(function(rowData.name)
    Намекает, что стоит подучить язык, это вообще некорректный синтаксис.
    Начало у тебя правильное:
    data.forEach(function(rowData) { ... }
    в rowData будут попадать элементы массив data, т.е. { name: 'John', age: 25 }
    Тогда в теле (в теле! не в заголовке!) своей анонимной функции можешь обращаться к rowData.name.
    Скажем,
    data.forEach(function(rowData) { console.log(rowData.name); } );

    А вообще я бы не использовал forEach(), а использовал бы простой цикл for.
    for (let i = 0; i < data.length; i++)
    {
        console.log(data[i].name);
    }
    Ответ написан
  • Отличается ли мультипроцессинг от запуска нескольких программ?

    Vindicar
    @Vindicar
    RTFM!
    Простотой коммуникации между скриптами, в т.ч. распределения задач между ними.

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

    В первом случае всё придётся писать самому, что и плюс, и минус.
    Ответ написан
    Комментировать
  • Как ловить статус и от этого выводить результат?

    Vindicar
    @Vindicar
    RTFM!
    Вместо строки возвращай кортеж или словарь. Короче, структуру данных.
    from typing import NamedTuple
    
    class Result(NamedTuple):
        text: str  # текст запроса
        success: bool  # успешен ли запрос
        status: str  # статус
    
    async def check_text(text: str) -> Result:
        url = f'https://сайт.com/?query={text}'
    
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                if response.status != 200:
                    return Result(text=text, success=False, status='Не удалось определить результат')
                html = await response.text()
                soup = BeautifulSoup(html, 'html.parser')
                status_element = soup.find('div', class_='table-block')
                if not status_element:
                    return Result(text=text, success=False, status='Не удалось определить результат')
                status_text = status_element.get_text().strip()
                # тебе нужно будет решить, когда запрос был успешен (True), а когда нет (False)
                if "ok" in status_text:
                    return Result(text=text, success=True, status='Можно')
                elif "no" in status_text:
                    return Result(text=text, success=False, status='Данный вариант недоступен')
                elif "no1" in status_text:
                    return Result(text=text, success=True, status='Можно под заказ')
                else:
                    return Result(text=text, success=False, status='Неизвестно')

    Тогда можно будет анализировать результат просто:
    result = await check_text(text)
    if result.success:
        ...  # реагируем на успешный запрос
        logger.info('%s: %s', result.text, result.status)
    else:
        ...  # реагируем на неудачный запрос
        logger.info('%s: %s', result.text, result.status)
    Ответ написан
  • Не могу исправить проблему, бот не может отправить сообщение по нажатии кнопки?

    Vindicar
    @Vindicar
    RTFM!
    Ну твоя проблема уже тут:
    @bot.callback_query_handler(func=lambda call: True)

    Ты говоришь боту "вызывай эту функцию всякий раз, когда пользователь нажимает кнопку"(callback_query_handler), и добавляешь "неважно, какая кнопка была нажата" (func=lambda call: True).
    Поэтому у тебя callback() будет вызываться при нажатии ЛЮБОЙ кнопки.

    Если ты хочешь, чтобы при нажатии разных кнопок вызывались разные функции, тебе нужно разделить их с помощью параметра func. В нём ты передаёшь маленькую функцию-фильтр, которая отвечает на вопрос "может ли эта функция обработать это нажатие?". Бот перебирает зарегистрированные callback-обработчики, и вызывает первый, чей фильтр вернул True.

    Т.е. тебе нужно написать такие фильтры, которые смогут разделить нажатия отдельных кнопок.
    Простой способ это сделать - реализовать иерархию в callback_data, например так:
    # обрабатываем то, что начинается с 'city.'
    @bot.callback_query_handler(func=lambda call: call.data.startswith('city.'))
    def callback(call):
        city = call.data[len('city.'):]  # отрезаем префикс 'city.'
        if city == 'istanbul':
            bot.send_message(call.message.chat.id,'Вы выбрали город: Стамбул')
        elif city == 'moscow':
            bot.send_message(call.message.chat.id,'Вы выбрали город: Москва')
        else:
            bot.send_message(call.message.chat.id,'Я не знаю такого города')

    А до этого ты где-то в другом обработчике послал сообщение с клавиватурой вида
    keyboard = types.InlineKeyboardMarkup()
    # обрати внимание, callback_data всегда начинается с 'city.'
    keyboard.add(types.InlineKeyboardButton('Стамбул', callback_data='city.istanbul'))  
    keyboard.add(types.InlineKeyboardButton('Москва', callback_data='city.moscow'))

    Так ты можешь разделить обработчики для разных наборов кнопок.

    Еще советую почитать про FSM.
    Ответ написан
  • Почему происходит «Сайт XXX выполнил переадресацию слишком много раз» и как исправить ошибку «the STRING opcode argument must be quote»?

    Vindicar
    @Vindicar
    RTFM!
    ganstar565, внезапно, зависит от браузера. Например, гугл "firefox cookie storage format" даёт такой ответ:
    Cookies in Firefox are stored in an SQLite format database found in the file cookies.sqlite in the currently-active user profile directory (exact path is system-dependent).

    Иными словами, смотришь папку %APPDATA%\Mozilla\Firefox\Profiles, в ней каждый подкаталог - профиль браузера, часто один, но может быть несколько. Внутри подкаталога лежит файл cookies.sqlite.
    Путь можно сконструировать с помощью os.path.expandvars() (и модуля os.path в целом), файл открыть стандартным модулем sqlite3, а дальше смотри что внутри таблицы moz_cookies.
    Для остальных браузеров по аналогии - гугл, потом эксперименты.
    Ответ написан
    9 комментариев
  • Почему появляется ошибка «Процесс не может получить доступ к файлу»?

    Vindicar
    @Vindicar
    RTFM!
    with open(filename, 'rb') as file:
        media = MediaFileUpload(
            filename, chunksize=1024 * 1024,
            mimetype=message.document.mime_type, resumable=True)
        request = service.files().create(
            body=metadata, media_body=media)
        file.close()

    Обрати внимание, что MediaFileUpload не использует объект file.
    Поэтому абсолютно не принципиально, как и когда ты закрываешь файловый объект самостоятельно.
    Либо поищи способ отправить файл, используя уже заданный объект, либо читай как корректно закрыть MediaFileUpload. Можешь попробовать media.stream.close(), но я фз можно ли это делать, и если да то когда.
    Ответ написан
    Комментировать
  • Как передать вложенную структуру в функцию?

    Vindicar
    @Vindicar
    RTFM!
    Правильнее будет void func(const Test2& buff){} если ты не собираешься изменять структуру внутри функции. В этом случае будет передана не копия структуры, а ссылка на оригинал, что будет быстрее. Если собираешься изменять, и тебе нужно передать изменения "наружу" func(), убери const.
    Ответ написан
    1 комментарий
  • Как исправить ошибку чтения аргумента?

    Vindicar
    @Vindicar
    RTFM!
    __getattribute__() вызывается ДО проверки содержимого __dict__. В большинстве случаев нужен __getattr__().
    А вообще, что ты пытаешься сделать?
    Ответ написан
    3 комментария
  • Можно ли оптимизировать этот код?

    Vindicar
    @Vindicar
    RTFM!
    Можно, если сделать допущение, что текст кодируется посимвольно, а не группами из N символов.
    open_text = 'текст'  # открытый текст
    
    # letters - именно строка, одна позиция - один символ
    letters = ''.join(['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
           'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'])
    key = 5  # ключ к шифру - величина сдвига. Может быть >0 или <0
    # генерируем таблицы подстановки
    encrypt_table = str.maketrans(letters, letters[key:]+letters[:key])  # для шифрования
    decrypt_table = str.maketrans(letters, letters[-key:]+letters[:-key])  # для дешифрования
    
    cypher_text = open_text.translate(encrypt_table)
    restored_text = cypher_text.translate(decrypt_table)
    
    print(open_text)
    print(cypher_text)
    print(restored_text)
    Ответ написан
    Комментировать
  • Как получить url страницы и какие есть способы изменять html код через python?

    Vindicar
    @Vindicar
    RTFM!
    Ты упускаешь из виду, что современные страницы часто набиты скриптами, да и банальную необходимость авторизации на сайте. Иными словами, если ты через requests запросишь тот же URL, далеко не факт что ты получишь ту же самую страницу. Тут нужно само содержимое страницы вытаскивать. А оно может быть большое, так что лучше уж выбранный текст.
    Это проще всего сделать через браузерное расширение. Альтернатива - добавить окошко/иконку на панель задач/в трей, куда можно будет перетащить выделенный текст.
    Ответ написан
    Комментировать
  • Как нарисовать картинку имея координаты точек?

    Vindicar
    @Vindicar
    RTFM!
    Если хочется turtle, то она позволяет поднимать/опускать перо перед перемещением.
    Можно заполнить значениями массив numpy, а потом вывести с помощью matplotlib:
    import numpy
    import matplotlib.pyplot as plt
    
    with open('data.txt', 'rt') as src:
        src.readline()  # пропускаем заголовок
        points = numpy.array([
            [int(v) for v in row.split(';')] 
            for row in src
        ])
    width = points[:, 0].max()
    height = points[:, 1].max()
    image = numpy.array((height, width), dtype=numpy.uint8)
    for x, y, c in points:
        image[y, x] = c
    
    plt.imshow(image, cmap='gray')
    plt.show()

    Ну или как посоветовали выше, записать данные в SVG.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы файл python получил доступ к редактированию и созданию файлов на диске C?

    Vindicar
    @Vindicar
    RTFM!
    Не сохранять в Program Files. Для файлов с данными есть каталог пользователя, скажем, AppData/Roaming или AppData/Local.
    Ответ написан