File size: 5,492 Bytes
80fb263
 
0eaed2f
 
80fb263
 
 
 
 
 
 
 
 
0eaed2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80fb263
 
0eaed2f
80fb263
 
48bc3a2
 
 
 
 
80fb263
48bc3a2
 
 
 
 
66c6476
 
 
 
 
 
0eaed2f
 
 
 
48bc3a2
0eaed2f
48bc3a2
3c69552
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66c6476
 
80fb263
 
66c6476
48bc3a2
66c6476
48bc3a2
 
 
 
 
 
3c69552
48bc3a2
66c6476
3c69552
66c6476
48bc3a2
 
0eaed2f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80fb263
 
48bc3a2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import gradio as gr
import requests
from urllib.parse import urlparse, urljoin
from bs4 import BeautifulSoup

def is_valid_url(url):
    """Проверяет, является ли строка валидным URL."""
    try:
        result = urlparse(url)
        return all([result.scheme, result.netloc])  # Проверяем наличие схемы и домена
    except:
        return False

def extract_additional_resources(url):
    """Извлекает ссылки на CSS, JS и изображения из HTML-кода."""
    try:
        response = requests.get(url)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, "html.parser")

        # Извлекаем ссылки на CSS
        css_links = [urljoin(url, link["href"]) for link in soup.find_all("link", rel="stylesheet") if "href" in link.attrs]

        # Извлекаем ссылки на JS
        js_links = [urljoin(url, script["src"]) for script in soup.find_all("script") if "src" in script.attrs]

        # Извлекаем ссылки на изображения
        img_links = [urljoin(url, img["src"]) for img in soup.find_all("img") if "src" in img.attrs]

        return css_links, js_links, img_links
    except Exception as e:
        return [], [], []

def convert_to_text(url):
    if not is_valid_url(url):
        return "Ошибка: Введите корректный URL.", "", None, [], [], []  # Возвращаем сообщение об ошибке и пустые данные

    try:
        # Устанавливаем заголовки, чтобы имитировать запрос от браузера
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
        }
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # Проверка на ошибки HTTP (например, 404, 500)

        # Возвращаем результаты
        status = f"Статус запроса: {response.status_code}"
        content_length = f"Размер содержимого: {len(response.text)} символов"
        results = f"{status}\n{content_length}"

        # Сохраняем текстовое содержимое в файл
        file_path = "downloaded_content.txt"
        with open(file_path, "w", encoding="utf-8") as file:
            file.write(response.text)

        # Извлекаем дополнительные ресурсы
        css_links, js_links, img_links = extract_additional_resources(url)

        return results, response.text, file_path, css_links, js_links, img_links
    except requests.exceptions.RequestException as e:
        return f"Ошибка: {e}", "", None, [], [], []  # Возвращаем сообщение об ошибке и пустые данные

# HTML и JavaScript для кнопки "Скопировать код"
copy_button_html = """
<script>
function copyCode() {
    const text = document.querySelector("#output-text textarea").value;
    navigator.clipboard.writeText(text).then(() => {
        alert("Текст скопирован в буфер обмена!");
    }).catch(() => {
        alert("Не удалось скопировать текст.");
    });
}
</script>
<button onclick="copyCode()">Скопировать код</button>
"""

# Подключаем CSS-файл
css = "app.css"

# Создаем интерфейс Gradio
with gr.Blocks(css=css) as demo:
    gr.Markdown("## Конвертер ссылки в текст")
    gr.Markdown("Введите ссылку на любой сайт, чтобы получить его текстовое содержимое и скачать его в виде .txt файла.")
    
    with gr.Row():
        url_input = gr.Textbox(label="Введите URL", placeholder="https://example.com")
    
    with gr.Row():
        results_output = gr.Textbox(label="Результаты запроса", interactive=False)
        text_output = gr.Textbox(label="Текстовое содержимое", interactive=True, elem_id="output-text")
    
    with gr.Row():
        gr.HTML(copy_button_html)  # Добавляем кнопку "Скопировать код"
        file_output = gr.File(label="Скачать файл", visible=False)  # Скрытый компонент для скачивания файла
    
    submit_button = gr.Button("Загрузить")
    submit_button.click(
        fn=convert_to_text,
        inputs=url_input,
        outputs=[results_output, text_output, file_output, gr.Textbox(label="CSS-файлы"), gr.Textbox(label="JS-файлы"), gr.Textbox(label="Изображения")]
    )

    # Добавляем Accordion для скрытия/показа дополнительных ресурсов
    with gr.Accordion("Показать/Скрыть дополнительные ресурсы", open=False):
        gr.Markdown("### CSS-файлы")
        css_output = gr.Textbox(label="CSS-файлы", interactive=False)
        
        gr.Markdown("### JS-файлы")
        js_output = gr.Textbox(label="JS-файлы", interactive=False)
        
        gr.Markdown("### Изображения")
        img_output = gr.Textbox(label="Изображения", interactive=False)

# Запускаем интерфейс
demo.launch()