apka do blokowania stron z podpowiedzi chata GPT

0

Hej. Poprosiłem Chat GPT o napisanie prostej apki, która będzie mi blokować katalog stron, na które nie chcę zaglądać żeby się nie rozpraszać. Dostałem takie coś:

import time
import os

# Ścieżka do pliku hosts (może się różnić w zależności od systemu operacyjnego)
HOSTS_PATH = r"/etc/hosts"  # Dla systemów Linux i macOS
# HOSTS_PATH = r"C:\Windows\System32\drivers\etc\hosts"  # Dla Windows

REDIRECT_IP = "127.0.0.1"  # IP, na który będą przekierowywane zablokowane strony
BLOCKED_SITES_FILE = "blocked_sites.txt"  # Plik z listą zablokowanych stron

def load_blocked_sites():
    """Wczytuje listę stron do zablokowania z pliku."""
    try:
        with open(BLOCKED_SITES_FILE, "r") as file:
            sites = [line.strip() for line in file if line.strip()]
            return sites
    except FileNotFoundError:
        print(f"Plik {BLOCKED_SITES_FILE} nie istnieje. Utwórz plik z listą stron do zablokowania.")
        return []

def block_sites():
    """Blokuje strony, dodając je do pliku hosts."""
    blocked_sites = load_blocked_sites()
    
    if not blocked_sites:
        print("Brak stron do zablokowania.")
        return
    
    # Odczytaj aktualną zawartość pliku hosts
    with open(HOSTS_PATH, "r+") as hosts_file:
        content = hosts_file.read()
        for site in blocked_sites:
            if f"{REDIRECT_IP} {site}" not in content:
                hosts_file.write(f"{REDIRECT_IP} {site}\n")
                hosts_file.write(f"{REDIRECT_IP} www.{site}\n")  # Dodatkowo blokuje wersję www
                print(f"Zablokowano: {site} i www.{site}")
            else:
                print(f"Strona {site} jest już zablokowana.")
    
    print("Wybrane strony zostały zablokowane.")


    print("Wybrane strony zostały zablokowane.")

def unblock_sites():
    """Odblokowuje strony, usuwając je z pliku hosts."""
    blocked_sites = load_blocked_sites()
    
    if not blocked_sites:
        print("Brak stron do odblokowania.")
        return
    
    # Przeczytaj i przefiltruj zawartość pliku hosts
    with open(HOSTS_PATH, "r") as hosts_file:
        lines = hosts_file.readlines()
    
    with open(HOSTS_PATH, "w") as hosts_file:
        for line in lines:
            if not any(f"{REDIRECT_IP} {site}" in line for site in blocked_sites):
                hosts_file.write(line)
    
    print("Wybrane strony zostały odblokowane.")

def main():
    """Główna funkcja umożliwiająca blokowanie i odblokowanie stron."""
    while True:
        choice = input("Wybierz opcję: (1) Blokuj strony, (2) Odblokuj strony, (3) Wyjście: ")
        if choice == "1":
            block_sites()
        elif choice == "2":
            unblock_sites()
        elif choice == "3":
            print("Zamykanie aplikacji.")
            break
        else:
            print("Nieprawidłowy wybór. Spróbuj ponownie.")

if __name__ == "__main__":
    main()

No i oczywiście plik blocked_sites.txt. No i tutaj mam większy niż to, że nie działa. Otóż na początku miałem wrzucony youtube na listę zablokowanych i teraz niezależnie czy wrzucę na listę zablokowanych stron yt, czy z niej usunę, czy program jest włączony, czy wyłączony czy w opcjach programu wybiorę zablokuj, czy odblokuj to efekt jest dokładnie taki sam. Strona jest zablokowana. Z innymi stronami też jest dziwnie. Korzystam z Linux mint. GPT podpowiedział mi żebym zrobił: sudo systemctl restart nscd ale nawet nie miałem zainstalowanego tego ncsd . No ale dla pewności zainstalowałem, wykonałem polecenie restart i jest po staremu. Cały system oczywiście też restartowałem i też nie pomogło. Po fakcie przypomniało mi się, że na Mint był całkiem przyjemny program Domain blocker, no ale póki co muszę dojść do tego, jak ten bałagan ogarnąć.

0

Nie wiem jak Ci pomóc rozwiązać ten problem, ale jak już się uporasz z odblokowaniem to radzę zainstalować rozszerzenie do przeglądarki - takich pluginów jest masa w sklepach dla chromium czy ff.

0

Jak korzystasz z Linuxa to nie wiem jak tam jest, ale na Windows plik hosts czasami jest zabezpieczony przed modyfikacją i rozwiązaniem (działającym u mnie) jest edycja go w trybie awaryjnym. To czy program jest uruchomiony czy nie to nie ma znaczenia, ponieważ po jednym uruchomieniu trwale rejestruje on blokowane strony i potem są blokowane przez system nawet gdy sam program zakończy działanie. Rozumiesz w ogóle jak działa to blokowanie?

0
  1. Najpierw zobacz, czy nie ma w katalogu /etc pliku typu hosts.old, hosts.saved czy czegoś w ten deseń. Jeśli jest, usuń plik hosts i zmień nazwę pliku z dopiskiem na hosts.
  2. Jeśli powyższe nic nie da, napisz, jak dokładnie uruchamiasz skrypt, by odblokować strony.
0

Przegrepowałeś, czy to jutube jest jeszcze gdzieś zapisane?

1

Poprawiony skrypt, bez dodatkowego pliku, operuje bezpośrednio na “/etc/hosts”.

#!/usr/bin/python

import re

# Ścieżka do pliku hosts (może się różnić w zależności od systemu operacyjnego)
HOSTS_PATH = r"/etc/hosts"  # Dla systemów Linux i macOS
# HOSTS_PATH = r"C:\Windows\System32\drivers\etc\hosts"  # Dla Windows

REDIRECT_IP = "127.0.0.1"  # IP, na który będą przekierowywane zablokowane strony

def load_hosts_file():
    """Wczytuje listę stron do zablokowania z pliku."""
    try:
        with open( HOSTS_PATH, "r" ) as file:
            return file.readlines()
    except FileNotFoundError:
        print( f"Plik {HOSTS_PATH} nie istnieje." )
        return []

def input_site():
    site_re = re.compile( r"^\s*(?:www\.)?((?:[0-9a-z](?:[_0-9a-z-]*[0-9a-z])?\.)+[0-9a-z]+)\s*$" )
    site = None
    while not site:
        try:
            site = input( "Podaj domenę:" )
        except EOFError:
            print()
            site = None
            break
        m = site_re.match(site)
        if m:
            site = m.group(1)
        else:
            print( "Nieprawidłowy host." )
            site = None
    return site

def block_site():
    """Blokuje stronę, dodając ją do pliku hosts."""
    site = input_site()
    if not site:
        return
    hosts_lines = load_hosts_file()
    found = False
    for line in hosts_lines:
        hash_i = line.find( "#" )
        if hash_i != -1:
            line = line[ :hash_i ]
        redir = line.split()
        if len(redir) > 1:
            for host in redir[1:]:
                if host == site or host == f"www.{site}":
                    if redir[0] == REDIRECT_IP:
                        print( f"Strona {site} lub www.{site} jest już zablokowana." )
                    else:
                        print( f"Strona {site} lub www.{site} jest już przekierowana do {redir[0]}." )
                    found = True
                    break
            if found:
                break
        elif len(redir):
            print( f"Nieprawidłowy wpis w pliku: {line}.")
    if not found:
        line = f"{REDIRECT_IP} {site} www.{site}\n"
        print( f"Zablokowano: {site} i www.{site}." )
        with open( HOSTS_PATH, "a" ) as hosts_file:
            hosts_file.write(line)

def unblock_site():
    """Odblokowuje stronę, usuwając ją z pliku hosts."""
    site = input_site()
    if not site:
        return
    hosts_lines = load_hosts_file()
    hosts_lines_left = []
    for line in hosts_lines:
        hash_i = line.find( "#" )
        line_ = line[ :hash_i ] if hash_i != -1 else line
        redir = line_.split()
        if len(redir) > 1:
            if redir[0] == REDIRECT_IP:
                hosts_left = []
                found = False
                for host in redir[1:]:
                    if host != site and host != f"www.{site}":
                        hosts_left += [ host ]
                    else:
                        found = True
                if found:
                    print( f"Odblokowano: {site} i/lub www.{site}." )
                if len( hosts_left ):
                    line_ = redir[0] +" "+ " ".join( hosts_left )
                    if hash_i != -1:
                        line_ += line[ hash_i: ]
                    else:
                        line_ += "\n"
                    hosts_lines_left += [ line_ ]
            else:
                hosts_lines_left += [ line ]
        elif len(redir):
            print( f"Nieprawidłowy wpis w pliku: {line}.")
        else:
            hosts_lines_left += [ line ]
    with open( HOSTS_PATH, "w" ) as hosts_file:
        hosts_file.write( "".join( hosts_lines_left ))

def main():
    """Główna funkcja umożliwiająca blokowanie i odblokowanie stron."""
    while True:
        choice = input( "Wybierz opcję: (1) Blokuj stronę, (2) Odblokuj stronę, (3) Wyjście: " )
        if choice == "1":
            block_site()
        elif choice == "2":
            unblock_site()
        elif choice == "3":
            print("Zamykanie aplikacji.")
            break
        else:
            print("Nieprawidłowy wybór. Spróbuj ponownie.")

if __name__ == "__main__":
    main()

Polecam wcześniej przejrzeć plik “/etc/hosts” i wyrzucić wszystkie linie poza “localhost” i komentarzami liniowymi rozpoczynającymi się znakiem #.
Oczywiście plik trzeba uruchamiać albo przez sudo, albo po zalogowaniu się na “root”.
No i jeśli przeglądarka ‘www’ nie używa standardowego wyciągania adresów DNS (np. ‘proxy’, ‛DNS over HTTPS’), to blokowanie nie będzie działać.

1

Dlatego poleganie tylko na GPT jest problematyczne. Nie wiesz co robi ten skrypt i dlaczego, więc kiedy coś nie działa, nie wiesz jak to naprawić i działasz na ślepo. A GPT potrafi popełniać błędy i trzeba po nim poprawiać.

Koledzy wyżej dali ci gotowca, więc ja spróbuję zaszczepić w tobie dobre nawyki i naprowadzić cię na samodzielne naprawianie takich problemów w przyszłości.

Czy próbowałeś przeczytać ten kod Pythonowy który GPT ci dał i zrozumieć co się tam dzieje? Czy próbowałeś zweryfikować, że każda funkcja (w szczególnościblock_sites() i unblock_sites()) w tym skrypcie robi to, co powinna?

Widzisz, że ten skrypt modyfikuje plik /etc/hosts. Czy próbowałeś dowiedzieć się co to za plik i dlaczego skrypt próbuje go modyfikować w ten sposób?

Widzisz. że def block_sites() dodaje pewne linijki do tego pliku, a def unblock_sites() czyta go i zostawia w nim tylko pewne linijki (domyślasz się, że powinno pozbyć się wszystkich tych linijek, które dodało block_sites). Ale czy na pewno zostały usunięte wszystkie linijki dodane wcześniej przez block_sites? Próbowałeś zerknąć w plik /etc/hosts po próbie blokady i potem po próbie odblokowania?

Podpowiedź (co do jednego błędu, choć może nie jedynego problemu):

blokada dodaje:

hosts_file.write(f"{REDIRECT_IP} {site}\n")
hosts_file.write(f"{REDIRECT_IP} www.{site}\n")  # Dodatkowo blokuje wersję www

a odblokowanie ma:

if not any(f"{REDIRECT_IP} {site}" in line for site in blocked_sites
0

@dalbajob Tak, wiem że uruchamianie tego bez namysłu co tam się w ogóle dzieje było kiepskim pomysłem i bardzo źle, że nie wykminiłem, że wystarczy edytować plik etc/hosts. W każdym razie dzięki wszystkim za pomoc. 🙂

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.