Задать вопрос
  • Всем привет, как-то можно достать фото их архива вк?

    @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 комментария
  • Можно ли использовать виртуальную машину для отображения программы на втором мониторе вместо покупки второго ПК для отдельного по?

    hint000
    @hint000
    у админа три руки
    В принципе можно на виртуальной машине. Но в частности зависит от особенностей прикладного ПО.
    Можно предположить, что абоненты только прикладывают карточку к сканеру и получают информацию на своём мониторе. Тогда нужно пробросить сканер (как USB-устройство) внутрь виртуальной машины.

    А ещё успех зависит от персональных особенностей сотрудника, который будет работать за этим ПК. Ну вы знаете, одному человеку можно показать, как здесь всё устроено и он поймёт, а другому показывай хоть каждый день, и он всё равно загонит курсор мышки на второй монитор и (глядя на первый монитор) будет говорить "ой, у меня снова мышка не работает". Если рассчитывать на текучку кадров или на низкий уровень сотрудника, то проще за копейки купить отдельный старенький системный блок.
    Ответ написан
    1 комментарий
  • Свой VPN сервер - после месяца работы почему может не подключатся к ChatGPT?

    CityCat4
    @CityCat4 Куратор тега VPN
    Дома с переломом ноги
    Просмотрите все данные о провайдере, который дал Вам IP. Даже такая мелочь, как адрес абузы в описании AS, указывающий на российский домен - может привести к тому, что IP посчитается российским.
    Ответ написан
    Комментировать
  • Как перенести свободную память с sda3 на sda2?

    @rPman
    грузишься с livecd/liveusb любой linux и запускаешь gparted, в gui нормально все двигаешь и пермещеаешь
    Ответ написан
  • Как установить GoodbyeDPI на VPN сервер?

    @VadimBoev
    Такое проще и логичнее реализовать на роутере под openwrt используя byedpi (автор GoodByeDPI одобряет). Делал такое, работало отлично.
    Ответ написан
    4 комментария
  • Является ли опыт работы в гос. организации плохим знаком в резюме?

    @alexalexes
    Работодателя может напрячь, что вы долго работали в организации, где была низкая культура разработки.
    Что я имею ввиду. Работника берут на должность разработчика, а по факту у его обязанности "подай-принеси" - без участия в задачах изменения функций проекта. Или наоборот, обязанностей на одного человека больше, чем у группы разработчиков - ввиду нехватки низкооплачиваемых специалистов, оставшиеся специалисты берут обязанности уволенных - получаются человек-оркестр.
    Ввиду выше сказанного, даже если в организации есть команда разработчиков, то у них слабое распределение задач, так как отсутствует компетентный руководитель, либо не хватает звеньев руководителей от начальника отдела до рядового работника, кто бы мог распределять задачи на низком уровне исполнителей.

    Если вы устроитесь в гос. организацию, и увидите такие симптомы, то лучше ищите другую работу на перспективу. Если задержитесь на этом месте больше 2-3 лет, то привыкнуть к другому порядку работы вам будет сложно.
    Работодатель, где хорошая культура разработки, знает такой нюанс.
    Ответ написан
    1 комментарий
  • Как узнать ip видеокамер?

    @Drno
    advanced ip scaner

    либо приложение для поиска камер от каждого производителя, просканирует сеть и найдет
    у Хика это sadp tools, у Dahua - без понятия
    Ответ написан
    3 комментария
  • Что делать, если при покупке HDD на нем стоит пароль?

    @apppostol
    Ну блин, вам продали товар которым уже кто-то пользовался. Что делать? Сдавать обратно.
    Ответ написан
    Комментировать
  • Завернуть траффик с роутера на ПК через GDPI?

    ValdikSS
    @ValdikSS
    GoodbyeDPI не поддерживает маршрутизируемый трафик.
    Самое простое — настроить zapret на самом роутере, либо же установить виртуальную машину с линукс-роутером и настроить на ней.
    Ответ написан
    2 комментария
  • Существует ли VPN кабель?

    CityCat4
    @CityCat4 Куратор тега VPN
    Дома с переломом ноги
    Господа админы Тостера! Предлагаю учредить конкурс на звание "самый дебильный вопрос" :) и рассмотреть данного кандидата :)
    Фраза "В кабель втыкается провод из роутера..." достойна быть увековеченной в граните...
    Ответ написан
    8 комментариев
  • Существует ли VPN кабель?

    paran0id
    @paran0id
    Умный, но ленивый
    Маршрутизатор суть две дырки - сеть 1 и сеть 2. Берём какую-нибудь ARM-плату типа Orange Pi с двумя сетевыми интерфейсами, на ней настраиваем vpn-клиент, заворачивающий весь трафик из сети 1 в впн и через сеть 2 наружу. В порт 1 втыкаем наш телевизор, портом 2 подключаем в роутер. Можно засунуть в толстый шланг, получится кабель.
    Ответ написан
    1 комментарий
  • Анонимность при использовании WireGuard VPN, видит ли мои действия человек, давший конфиг?

    @KyJIep-79
    Можно использовать его конфиг для заворачивания в него бесплатного warp. Тогда будет доступ к заграничному warp серверу с его ip, а не к российскому. Тогда он ничего не сможет увидеть в этом трафике, кроме того, что он идёт на warp сервер.
    Ответ написан
    Комментировать
  • Альтернативы wireguard?

    NeiroNext
    @NeiroNext
    Самый простой способ это AmneziaVPN, он очень простой в настройке, по факту лишь данные входа ssh нужны и больше ничего. Также сейчас там как раз ещё X-Xray появился, но даже их стандартный вариант пока не детектился и когда OpenVPN не работал, Amnezia работал.
    Ответ написан
    Комментировать
  • Какую сетевую карту выбрать для RDP на 20 человек?

    @Drno
    обычной встройки на материнке в 99% случаев будет достаточно
    Ответ написан
    Комментировать