Ответы пользователя по тегу Python
  • Как исправить ошибку 2003 при подключении к БД?

    @alekssamos
    Программист любитель
    Немного не по теме, но SQLite использовать лучше. Или обычный http API.
    Вы же не хотите, чтобы хакер извлёк логин и пароль для подключения к базе и делал с ней, а то и с сервером, всё, что ему захочется? Такие уязвимости уже были, на Хабре читал. Также зашили в код приложения данные для подключения к mysql базе и да, их перехватили и всё взломали.
    Ответ написан
    Комментировать
  • Почему не получается подключиться к чату на pywebio?

    @alekssamos
    Программист любитель
    Запусти это на сервере,
    а не на домашнем компе.
    Ответ написан
  • Как запустить программу, чтобы она была самостоятельным процессом?

    @alekssamos
    Программист любитель
    import subprocess
    subprocess.call(["cmd.exe", "/c", "start", "notepad.exe"])
    Ответ написан
  • Как вывести конкретное значение из класса в python?

    @alekssamos
    Программист любитель
    *отсюда*
    import json
    from urllib.request import urlopen, Request
    
    
    class Coincap():
        """parser module for the coincap API"""
    
    
        @staticmethod
        def format_float(f, i=3):
            return float(("%."+str(i)+"f") % float(f))
    
        def get_info(self, convert_numbers=True):
            """Get the currency table from the api.coincap.io/v2/assets
    
            Returns:
                     tuple: (headers 1d list, content 2d list with rows and cols)
            """
    
            url = "https://api.coincap.io/v2/assets"
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0",
                "Accept": "application/json, text/javascript, */*; q=0.01",
                "Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
                "X-Requested-With": "XMLHttpRequest",
            }
    
            opener = Request(url, headers = headers)
            resp = urlopen(opener)        
            content = resp.read().decode("UTF-8")
            j = json.loads(content)
            data_items = j["data"]
            ret_headers = (
                "Name",
                "Ticker",
                "Price",
                "Capitalization",
                "Change percent in 24 h",
                "Value 24 h",
                "Value",
                "Change 24 h",
                "Change 7 d",
            )
            # attention, I have not found any changes in this API in seven days
            ret_content = []
            tmp_data = []
            for ditem in data_items:
                tmp_data.append(ditem["name"])
                tmp_data.append(ditem["symbol"])
                priceUsd = self.format_float(ditem["priceUsd"])
                tmp_data.append(priceUsd if convert_numbers else str(priceUsd) + " $")
                tmp_data.append(
                    self.format_float(ditem["marketCapUsd"], 1)
                    if convert_numbers
                    else str(self.format_float(ditem["marketCapUsd"], 1)) + " $"
                )
                tmp_data.append(
                    self.format_float(ditem["volumeUsd24Hr"])
                    if convert_numbers
                    else str(self.format_float(ditem["volumeUsd24Hr"])) + " $"
                )
                tmp_data.append(
                    self.format_float(ditem["supply"])
                    if convert_numbers
                    else str(self.format_float(ditem["supply"]))
                )
                tmp_data.append(
                    self.format_float(ditem["changePercent24Hr"], 2)
                    if convert_numbers
                    else str(self.format_float(ditem["changePercent24Hr"], 2)) + "%"
                )
                tmp_data.append(0.0 if convert_numbers else "0.0")
                ret_content.append(tmp_data)
                tmp_data = []
            return (ret_headers, tuple(ret_content))
    
    
    if __name__ == "__main__":
        cc = Coincap()
        headers, content = cc.get_info()
        btc = content[0]
        print(btc[1], btc[2])
    Ответ написан
  • Не шарю в асинхронности и очереди в python, что читать, смотреть?

    @alekssamos
    Программист любитель
    В этом коде задачи будут добавляться в очередь без ожидания и выполняться по одной.
    import logging
    import asyncio
    
    q = asyncio.Queue()
    
    
    async def a_difficult_task(some_arg):
        print(f"task {some_arg} started")
        await asyncio.sleep(120)
        print(f"task {some_arg} ended")
    
    
    async def worker():
        while True:
            try:
                some_arg = await q.get()
                await a_difficult_task(some_arg=some_arg)
            except (KeyboardInterrupt, SystemExit, SystemError):
                break
            except Exception:
                logging.exception("...")
            finally:
                q.task_done()
    
    
    async def main():
        asyncio.create_task(worker())
        print("Adding tasks to queue")
        for x in range(1, 7):
            await q.put( x )
        print("Tasks added to queue")
        while True:
            await asyncio.sleep(1)
    
    
    if __name__ == "__main__":
        asyncio.run(main())
    Ответ написан
    Комментировать
  • Как сохранить полное форматирование текста при его копировании?

    @alekssamos
    Программист любитель
    А почему не копировать методом message.copy? Это как переслать без автора. В защищённых каналах, кажется, тоже должно работать.
    Ответ написан
    Комментировать
  • Как сделать, чтобы с каждым нажатием кнопки бот отнимал от 100 один, то есть писал: 99 98 97 96 95...?

    @alekssamos
    Программист любитель
    Так-с, а если хранить счётчик прямо в кнопке, в callback data? Мне кажется, будет отлично!
    Не проверял, возможно не работает,
    просто как идея.
    import telebot
    from telebot import types 
    
    a = 100
    
    bot = telebot.TeleBot('токен ')
    
    def make_buttons(a):
        markup = types.InlineKeyboardMarkup()
        markup.row_width = 1
        markup.add(types.InlineKeyboardButton(text="click", callback_data="cb_minus_"+str(a)))
        return markup
    
    @bot.message_handler(commands=['start'])
    def start(message):
        bot.send_message(
            message.chat.id,
            text="Привет, {0.first_name}! жми кнопки)))".format(message.from_user),
            reply_markup=make_buttons(a)
        )
    
    @bot.callback_query_handler(func=lambda call: print(call.data))
    @bot.callback_query_handler(func=lambda call: call.data.startswith('cb_'))
    def callback_query(call):
        print(call.data)
        _, op, digit = call.data.split("_")
        digit=int(digit)
        if op=="minus":
            digit-=1
        bot.edit_message_reply_markup(
            call.message.chat.id,
            call.message.id,
            make_buttons(digit)
        )
        bot.answer_callback_query(call.id, str(digit), show_alert=True)
    
    
    bot.polling(none_stop=True)
    Ответ написан
    1 комментарий
  • Как в коде устроена работа print?

    @alekssamos
    Программист любитель
    Нет, переменным задали значение в начале, на первых строках.
    А так как условия не выполнились, значения переменных тоже не поменялось,
    этот блок кода не выполнялся.
    То есть всё правильно.
    Может, вы хотели сделать что-то такое?
    a = 4
    b = -22
    c = 1
    
    a = a if a < 0 else 0
    b = b if b < 0 else 0
    c = c if c < 0 else 0
    
    print(a + b + c)
    Ответ написан
  • Почему не скачивается модуль intents?

    @alekssamos
    Программист любитель
    pip install "cython<3.0.0" wheel
    pip install "pyyaml==5.4.1" --no-build-isolation


    И затем попробовать ещё раз. Или найти intents более старой версии и указать эту версию через ==.
    Например, pip install "intents==0.2.0"
    Хотя, он и так выпущен в 2021 году.
    Ответ написан
    Комментировать
  • ТГ бот как лучше сделать отправку фото/файла?

    @alekssamos
    Программист любитель
    В интернете нашёл такое решение. Через selenium и браузер Chrome. Думаю, основываясь на этом, можно переделать под этот случай.
    Я даже нашёл скрипт для автоматической установки драйвера
    https://pypi.org/project/chromedriver-autoinstaller/
    # pip install selenium
    
    import os
    from pathlib import Path
    from platform import system
    from urllib.parse import urlparse
    
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    
    options = Options()
    options.add_argument("--headless")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    options.add_argument("--disable-blink-features=AutomationControlled")
    
    exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
        os.path.join(os.getcwd(), 'driver', 'chromedriver')
    
    driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))
    
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        'source': '''
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
            delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
      '''
    })
    
    
    def screen_sait(url) -> None:
        path = str(urlparse(url).hostname).replace(Path(str(urlparse(url).hostname)).suffix, ".png")
        driver.get(url)
        s = lambda x: driver.execute_script('return document.body.parentNode.scroll' + x)
        driver.set_window_size(s('Width'), s('Height'))
        driver.find_element(By.TAG_NAME, 'body').screenshot(path)
        driver.close()
        driver.quit()
    
    
    screen_sait('https://codeby.net/')
    Ответ написан
    Комментировать
  • Как правильно асинхронно парсить телеграмм канал?

    @alekssamos
    Программист любитель
    async def get_channel_id(client, link):  # получение ID канала
        m = await client.get_messages(link, limit=1)
        channel_id = m[0].peer_id.channel_id
        return str(channel_id)
    Ответ написан
  • Почему не видно голос microsoft pavel?

    @alekssamos
    Программист любитель
    Скачайте архив *pavel.windows10.zip* и в зависимости от разрядности Windows примените файл реестра оттуда.
    Ответ написан
  • Почему не работает проверка на аргументы в vkbottle?

    @alekssamos
    Программист любитель
    Попробуй проверку поменять: просто if not mention:
    Ответ написан
  • Как понять есть ли доступ к телеграм чату через pyrogram?

    @alekssamos
    Программист любитель
    from pyrogram import errors
    from pyrogram.enums import ChatAction
    async def can_write(chat_id:int)->bool:
        try:
            await app.send_chat_action(chat_id, enums.ChatAction.TYPING)
            return True
        except errors.RPCError:
            return False
    Ответ написан
  • Один connect при старте или connect-fetch-close при необходимости?

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

    @alekssamos
    Программист любитель
    import requests
    s=requests.session()
    s.headers={"X-Requested-With": "XMLHttpRequest"}
    joke_text = s.post("https://randstuff.ru/joke/generate/").json()["joke"]["text"]
    print(joke_text)
    Ответ написан
    Комментировать
  • Как работает annotated-types в пределах Pydantic?

    @alekssamos
    Программист любитель
    А зачем? Можно же сделать ттак:
    class Person(BaseModel):
        age: conint(ge=30)
        class Config:
            validate_assignment = True
            validate_all = True

    А вот пример со своим валидатором (это я обрабатывал checkboxes с формы):
    class FormModel(BaseModel):
        first: Optional[bool] = False
        second: Optional[bool] = False
        third: Optional[bool] = False
        something_there: str = "qwexdfg"
    
        class Config:
            validate_assignment = True
    
        @validator("first", "second", "third")
        def set_bool(cls, val):
            return False if val is None else val
    
        @validator("something_there")
        def set_str(cls, val):
            return "x" in val

    Чтобы None тоже приравнивалось к False.
    И от себя вот сейчас одну переменную добавил, принять строку, только если есть буква "x"
    Ответ написан
    Комментировать
  • Бот не запасается, что делать?

    @alekssamos
    Программист любитель
    Положи ffmpeg.exe рядом со скриптом.
    Ответ написан
    Комментировать
  • Telegraph - не работает getViews, что делать?

    @alekssamos
    Программист любитель
    Во-первых, всё работает.
    Во-вторых, вот рабочая ссылка
    https://api.telegra.ph/getViews/testfhiasehilf-07-...
    В-третьих, это обычный JSON, Нужен только requests и ничего больше.
    >>> import requests
    >>> views:int = requests.get("https://api.telegra.ph/getViews/testfhiasehilf-07-21?year=2023&month=7").json()["result"]["views"]
    >>> print(views)
    7
    >>>

    В-четвёртых, то, что после знака вопроса, это получить количество просмотров за конкретную определённую дату.
    Читаем *это*
    Так что если вы хотите получить просмотры за весь период, а не только за один месяц, то ссылка будет такая
    https://api.telegra.ph/getViews/testfhiasehilf-07-21

    а код такой
    >>> import requests
    >>> views:int = requests.get("https://api.telegra.ph/getViews/testfhiasehilf-07-21").json()["result"]["views"]
    >>> print(views)
    7
    >>>
    Ответ написан
    1 комментарий
  • Ошибка при использовании библиотеки pysqlite3?

    @alekssamos
    Программист любитель
    sqlite3 должна быть встроена в python без установки.

    Но ошибка может возникнуть, если есть проблемы с библиотеками sqlite в самой операционной системе.
    Ответ написан
    Комментировать