Задать вопрос
  • Есть ли разница реализации доступности веб компонента внутри его Shadow DOM или на самом теге Custom Element?

    @alekssamos
    Программист любитель
    Не tabtindex, а tabindex. Возможно опечатка.

    Доступны будут все три варианта.
    Разницы для скринридеров нет.
    А вот для управления с клавиатуры есть.
    Если нажать пробел на кнопке без скринридера, №1 активируется, №2 и №3 - нет, нужно отдельно ещё onkeypress прописывать и делать click по нажатии пробела.

    И ещё, мне кажется, главное, где будет событие клика, если onclick и role/aria-* на одном элементе - хорошо, а если доступность на одном элементе, а событие слушает другой - может сработать, а может и нет. И
    ли сработает, но не на всех платформах / с глюками.

    А, да. И состояние в №2 и в №3 тоже нужно отслеживать. Тот же disable. В №1 варианте всё и так с ним понятно, а №2 и №3 вручную надо будет aria-disabled ставить и убирать.
    Ответ написан
  • Как выполнить любую функцию php и всегда получить true?

    @alekssamos
    Программист любитель
    Два восклицательных знака перед вызовом функции решают эту задачу.
    Ответ написан
  • Возможно ли админу на своём личном вебсайте чекать страницу переходящего из соцсети?

    @alekssamos
    Программист любитель
    VK, например, пускает через промежуточную страницу away php. Однажды при каком-то обновлении был баг, что реферер передавался полностью, но это через два дня закрыли.
    Остальные сети делают также, пускают переход через свои промежуточные страницы.

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

    @alekssamos
    Программист любитель
    Через API это делается. Смотри метод users.get
    Ответ написан
    Комментировать
  • Ошибка при использовании метода wall.post VK api. Как исправить?

    @alekssamos
    Программист любитель
    Код рабочий. Разве что user_id нигде не используется.
    Токен надо брать здесь: vkhost.github.io
    Нажмите настройки, выберите нужные права, в качестве приложения можно взять Kate.
    Ответ написан
  • Как выводить комментарии под постом от имени авторизованного пользователя в django?

    @alekssamos
    Программист любитель
    А что, если через models.ForeignKey(User) попробовать? Или проверять, авторизован ли пользователь и из объекта user как раз username и записывать?
    Ответ написан
  • Как TGstat получает целые пригласительные ссылки Telegram?

    @alekssamos
    Программист любитель
    Я где-то читал, что TGStat работает от юзерботов (обычные человеческиие аккаунты через номер телефона)
    А, вот здесь, в Телеметре
    https://help.telemetr.me/drugie-instrumenty-analit...
    Обратите внимание: на время проверки бот может добавлять дополнительных пользователей в администраторы канала с минимальными правами (и после окончания проверки - убирать его). Это техническая необходимость для получения нужной информации.
    Обработка запроса может занять от 5 минут до 2 часов в зависимости от размера канала (больше подписчиков - дольше).


    Попробуйте через тот же Pyrogram, но зайдите с номером телефона, вместо токена бота.
    Ответ написан
    1 комментарий
  • Есть что то проще чем php?

    @alekssamos
    Программист любитель
    Ответ написан
    Комментировать
  • Как сторонние сайты получают доступ к Instagram-аккаунтам?

    @alekssamos
    Программист любитель
    На гитхабе были библиотеки, которые эмулировали официальное Android приложение. Возможно через этот API.
    Ответ написан
    Комментировать
  • Как исправить ошибку 2003 при подключении к БД?

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

    @alekssamos
    Программист любитель
    Только по номеру телефона, определяя код региона. Но и здесь не всё так просто.
    Я три года учился в другом городе, купил там номер, вернулся в родной город, так и пользуюсь этим номером. А доступ к сайту я бы всё равно не получил.

    И даже если сделать авторизацию, скажем, через VK, да, это будет лучше, но не на много, некоторые пользователи город на странице не указывают...

    Геолокация телефона - легко, есть браузерное API для этого, только на компьютерах работать не будет, скорее всего, да и не каждый даст разрешение...
    Ответ написан
  • Вычисления datetime if()?

    @alekssamos
    Программист любитель
    $date = '2024-05-20 12:45:53';
    
    $sql = "SELECT * FROM your_table WHERE your_datetime_column < ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('s', $date);
    $stmt->execute();
    
    $result = $stmt->get_result();
    
    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            echo "id: " . $row["id"] . " - Дата: " . $row["your_datetime_column"] . "<br>";
        }
    } else {
        echo "Пусто";
    }
    Ответ написан
  • Проблема с реализацией функционала, для отслеживания изменения статуса пользователя в базе данных. Как корректно реализовать эту задачу?

    @alekssamos
    Программист любитель
    Коротко: bot.sendMessage(tg_id, "Статус изменен")
    И не вызывать никаких хендлеров.
    Ответ написан
    Комментировать
  • Как парсить telegram desktop с помощью pywinauto?

    @alekssamos
    Программист любитель
    А почему вВы выбрали такой путь, если можно это делать через API? Telethon / Pyrogram.
    Боюсь, что никак. Он даже для незрячих пользователей скринридеров недоступен, для средств автоматизации, возможно, тоже, если не учитывать OCR и поиск по цвету.
    Ответ написан
    1 комментарий
  • Как вытянуть с телеграма прямую ссылку на видео?

    @alekssamos
    Программист любитель
    К сожалению, никак. Даже если брать Bot API, то там лимит на размер файла в 50 МБ, видео будет намного больше.
    У Telegram основной API - не http, а MTProto, там нет ссылок.
    Ответ написан
  • Всем привет, как-то можно достать фото их архива вк?

    @alekssamos
    Программист любитель
    Привет. Да, можно. Я сейчас поделюсь кодом своей программы на python,
    но она для других целей делалась, человеку надо было в один txt файл по порядку текстовые сообщения написать. Ссылки на фотографии надо брать из атрибута href, а не из текста, который нам показывается. А скачивать через функцию
    from urllib.request import urlretrieve
    url = a.attr("href")
    filename=url.split("/")[-1].split("?")[0]
    urlretrieve(url, filename)

    На идею натолкнул, как можно сделать.
    UPD: отредактировал, теперь прога получает список ссылок в отдельный txt файл, их можно скачать через какой-нибудь aria2 -i links_to_files.txt -d attachments, либо дождаться, пока этот же скрипт всё и скачает (медленно).

    Код программы
    import os
    import os.path
    import re
    import sys
    from glob import glob
    from time import sleep
    from urllib.request import urlretrieve
    import urllib.error
    
    packages_to_install = "pyquery==2.0.0 tqdm==4.66.1"
    cmd_for_install = sys.executable + " -m pip install "
    for i in range(3):
        try:
            from pyquery import PyQuery as pq  # type: ignore
            from tqdm import trange, tqdm
            from tqdm.contrib.concurrent import thread_map
    
            break
        except ImportError:
            if os.system(cmd_for_install + packages_to_install) != 0:
                os.system(cmd_for_install + " --user " + packages_to_install)
    
    
    links_to_files: list = []
    
    
    class ArchiveNotFound(Exception):
        pass
    
    
    class patterns:
        RN = re.compile(r"[\r\n]{2,}")
        TIME = re.compile(r" в [\d]{1,2}:[\d]{1,2}:[\d]{1,2}")
        DELMSG = re.compile("Сообщение удалено[\n]?")
        EDITEDMSG = re.compile(r"\(ред\.\)")
        SLUG = re.compile(r"[^\w\s-]")
        ONLY_DIGITS = r"[\D]+"
    
    
    def get_user_aaction(prompt: str) -> str:
        action = ""
        while len(action) > 0:
            action = re.sub(patterns.ONLY_DIGITS, "", input(prompt)).strip()
        return action
    
    
    def isInt(value):
        try:
            int(value)
        except ValueError:
            return False
        return True
    
    
    def norm(value: str) -> str:
        for pattern in [patterns.RN, patterns.TIME, patterns.EDITEDMSG, patterns.DELMSG]:
            value = re.sub(pattern, "\n" if pattern == patterns.RN else "", value)
        return value.strip() + "\n\n"
    
    
    def slugify(value: str) -> str:
        value = re.sub(patterns.SLUG, "", value.lower())
        return re.sub(r"[-\s]+", "-", value).strip("-_")
    
    
    def get_dir_with_messages() -> str:
        cwd = os.getcwd()
        cwd2 = ""
        for a in sys.argv:
            if os.path.isdir(a):
                cwd = a
        cwd2 = os.path.join(cwd, "messages")
        if os.path.isdir(cwd2):
            cwd = cwd2
        if not os.path.isfile(os.path.join(cwd, "index-messages.html")):
            raise ArchiveNotFound("")
        return cwd
    
    
    def export_to_txt(files_with_messages: list, results_folder: str):
        with open(files_with_messages[-1], "r", encoding="CP1251") as fp:
            d = pq(fp.read())
        chat_title = d("div.ui_crumb:last").text().strip()
        txtfile = slugify(chat_title)
        txtfile = os.path.join(results_folder, txtfile + ".txt")
        with open(txtfile, "w", encoding="UTF-8") as txtfp:
            txtfp.write("\ufeff")
            for i in trange(len(files_with_messages), leave=None, delay=1.5, unit="pg"):
                f = files_with_messages[i]
                with open(f, "r", encoding="CP1251") as fp:
                    d = pq(fp.read())
                messages: list = list(d("div.item").items())
                messages.reverse()
                txtfp.writelines([norm(m.text()) for m in messages])
                attachments_links = d("a.attachment__link").items()
                for attachment_link in attachments_links:
                    links_to_files.append(attachment_link.attr("href"))
    
    
    def process_chat(path_to_chat: str, results_folder: str = "."):
        d = None
        files_with_messages: list = glob(
            os.path.join(path_to_chat, "messages*.html"), recursive=False
        )
        if not files_with_messages:
            return
        files_with_messages.sort(
            key=lambda x: int(os.path.basename(x).split("s")[-1][:-5]),
            reverse=True,
        )
        export_to_txt(files_with_messages, results_folder)
    
    
    def main():
        try:
            p = get_dir_with_messages()
        except ArchiveNotFound:
            print(
                """
                Неверно указан путь к папке с архивом.
                Измените рабочую директорию
                или передайте нужный путь в аргументе командной строки при вызове этой утилиты.
            """.strip()
            )
            sys.exit(1)
        chats = list(
            filter(
                lambda x: isInt(os.path.basename(x)),
                [
                    c
                    for c in glob(p + os.path.sep + "*", recursive=False)
                    if os.path.isdir(p)
                ],
            )
        )
        print("I'm starting to work. %d chats found." % (len(chats),))
        results_folder = os.path.join(p, "mre")
        if not os.path.isdir(results_folder):
            os.mkdir(results_folder)
        results = thread_map(
            lambda x: process_chat(x, results_folder),
            chats,
            leave=None,
            miniters=1,
            unit="chat",
        )
        del results
        with open("links_to_files.txt", "w", encoding="UTF-8") as fp:
            fp.write( "\n".join(links_to_files) )
        print("Скачиваю вложения...")
        attachments_dir = os.path.join(results_folder, "attachments")
        if not os.path.isdir(attachments_dir):
            os.mkdir(attachments_dir)
        for url in tqdm(links_to_files):
            filename = os.path.join(attachments_dir, url.split("/")[-1].split("?")[0])
            try:
                urlretrieve(url, filename)
            except urllib.error.HTTPError:
                print(f"Ошибка при скачивании {filename}")
        sleep(1)
        print(" ")
        print("Завершено! Текстовые файлы находятся по пути:\r\n", results_folder)
    
    
    if __name__ == "__main__":
        main()
    Ответ написан
    4 комментария
  • Какой обработчик в pyrogram использовать, чтобы ловить вход в группу(чат) user-бота?

    @alekssamos
    Программист любитель
    Тогда так пробуй:
    from pyrogram import filters
    @bot.on_message(filters.new_chat_members)
    async def bot_join(client, message: Message):
    Ответ написан
    Комментировать
  • Почему не получается подключиться к чату на pywebio?

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

    @alekssamos
    Программист любитель
    О, как раз. Разверните там Instance https://u.is/ .
    Ответ написан
  • Можно ли добавить картинку или иконку на кнопку VK API клавиатуры?

    @alekssamos
    Программист любитель
    Можно только эмодзи символы
    Ответ написан