Есть скрипт:

import sys
import requests
import re
import os
import json
from PyQt6.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit, QPushButton, QCheckBox,
                             QListWidget, QVBoxLayout, QHBoxLayout, QSystemTrayIcon, QMenu, QMessageBox, QMenuBar, QRadioButton, QButtonGroup, QDialog)
from PyQt6.QtGui import QIcon, QAction, QDesktopServices
from PyQt6.QtCore import Qt, QEvent, QUrl

PROXY_FILE = 'D:\\ip_info\\settings\\proxies.json'
SETTINGS_FILE = 'D:\\ip_info\\settings\\settings.json'
ICON_PATH = 'D:\\ip_info\\icons\\app_ip.ico'

def get_ip_and_isp(proxy_data=None, use_proxy=False, service_url='https://ipinfo.io/json'):
    try:
        proxies = None
        if use_proxy and proxy_data:
            protocol = proxy_data.get('protocol', 'socks5')
            server_port = proxy_data['server_port']
            username = proxy_data.get('username')
            password = proxy_data.get('password')
            proxy_url = f"{protocol}://{server_port}"
            if username and password:
                proxy_url = f"{protocol}://{username}:{password}@{server_port}"
            proxies = {
                'http': proxy_url,
                'https': proxy_url,
            }
        response = requests.get(service_url, proxies=proxies)
        data = response.json()
        ip = data.get('ip', 'N/A')
        org = data.get('org', 'N/A')

        # Извлечение имени провайдера без AS-номера
        if org.startswith('AS'):
            isp = ' '.join(org.split(' ')[1:])
        else:
            isp = org

        # Удаление юридических форм (с учётом регистра и возможных кавычек)
        legal_forms = ['PJSC', 'LLC', 'JSC', 'OJSC', 'АО', 'ОАО', 'ЗАО', 'ООО', 'ПАО']
        pattern = r'\b(' + '|'.join(legal_forms) + r')\b'
        isp = re.sub(pattern, '', isp, flags=re.IGNORECASE).strip()

        # Удаление лишних символов, таких как кавычки или специальные символы
        isp = isp.replace('"', '').replace('«', '').replace('»', '').strip()

        # Удаление лишних пробелов
        isp = ' '.join(isp.split())

        return ip, isp
    except Exception as e:
        return 'Ошибка', 'Ошибка'

class MyApp(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setWindowTitle('JustWoofIP')
        self.setStyleSheet("background-color: #1e1e1e; color: white;")

        # Установка иконки
        if os.path.exists(ICON_PATH):
            self.icon = QIcon(ICON_PATH)
            self.setWindowIcon(self.icon)
        else:
            self.icon = QIcon()

        layout = QVBoxLayout()

        # Поле для IP
        hbox1 = QHBoxLayout()
        ip_label = QLabel("Мой IP:")
        self.ip_text = QLineEdit()
        self.ip_text.setReadOnly(True)
        self.ip_text.setStyleSheet("background-color: #323232; color: white;")
        hbox1.addWidget(ip_label)
        hbox1.addWidget(self.ip_text)

        # Поле для ISP
        hbox2 = QHBoxLayout()
        isp_label = QLabel("Мой ISP:")
        self.isp_text = QLineEdit()
        self.isp_text.setReadOnly(True)
        self.isp_text.setStyleSheet("background-color: #323232; color: white;")
        hbox2.addWidget(isp_label)
        hbox2.addWidget(self.isp_text)

        # Флажок "Использовать прокси"
        self.use_proxy_checkbox = QCheckBox("Использовать прокси")
        self.use_proxy_checkbox.setChecked(False)  # По умолчанию прокси не используется

        # Выбор сохранённого прокси
        hbox3 = QHBoxLayout()
        saved_proxy_label = QLabel("Сохранённые прокси:")
        self.saved_proxy_choice = QListWidget()
        self.saved_proxy_choice.setStyleSheet("background-color: #323232; color: white;")
        hbox3.addWidget(saved_proxy_label)
        hbox3.addWidget(self.saved_proxy_choice)

        # Кнопки управления сохранёнными прокси
        hbox3_buttons = QHBoxLayout()
        self.delete_proxy_button = QPushButton("Удалить выбранный прокси")
        self.delete_proxy_button.setStyleSheet("background-color: #323232; color: white;")
        self.delete_proxy_button.clicked.connect(self.on_delete_proxy)
        hbox3_buttons.addWidget(self.delete_proxy_button)

        # Поле для ввода нового прокси
        hbox4 = QHBoxLayout()
        new_proxy_label = QLabel("Добавить прокси:")
        self.new_proxy_text = QLineEdit()
        self.new_proxy_text.setStyleSheet("background-color: #323232; color: white;")
        hbox4.addWidget(new_proxy_label)
        hbox4.addWidget(self.new_proxy_text)

        # Кнопка для добавления нового прокси
        hbox4_buttons = QHBoxLayout()
        self.add_proxy_button = QPushButton("Сохранить прокси")
        self.add_proxy_button.setStyleSheet("background-color: #323232; color: white;")
        self.add_proxy_button.clicked.connect(self.on_add_proxy)
        hbox4_buttons.addWidget(self.add_proxy_button)

        # Переключатель для выбора сервиса
        hbox5 = QHBoxLayout()
        service_label = QLabel("Выбор сервиса:")
        self.service_group = QButtonGroup()
        self.ipinfo_radio = QRadioButton("ipinfo.io")
        self.ipapi_radio = QRadioButton("ipapi.co")
        self.service_group.addButton(self.ipinfo_radio)
        self.service_group.addButton(self.ipapi_radio)
        self.ipinfo_radio.setChecked(True)  # По умолчанию выбран ipinfo.io
        hbox5.addWidget(service_label)
        hbox5.addWidget(self.ipinfo_radio)
        hbox5.addWidget(self.ipapi_radio)

        # Кнопка "Получить IP и ISP"
        self.get_button = QPushButton("Получить IP и ISP")
        self.get_button.setStyleSheet("background-color: #323232; color: white;")
        self.get_button.clicked.connect(self.on_get_button)
        self.get_button.enterEvent = self.on_button_hover
        self.get_button.leaveEvent = self.on_button_leave

        layout.addLayout(hbox1)
        layout.addLayout(hbox2)
        layout.addWidget(self.use_proxy_checkbox)
        layout.addLayout(hbox3)
        layout.addLayout(hbox3_buttons)
        layout.addLayout(hbox4)
        layout.addLayout(hbox4_buttons)
        layout.addLayout(hbox5)
        layout.addWidget(self.get_button)

        self.setLayout(layout)

        # Загрузка сохранённых прокси и настроек
        self.load_saved_proxies()
        self.load_settings()

        # Создание TaskBarIcon
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.icon)
        self.tray_icon.setToolTip('JustWoofIP')
        self.tray_icon.activated.connect(self.on_tray_icon_activated)
        self.create_tray_menu()
        self.tray_icon.show()

        # Создание меню "Файл", "Настройки" и "Справка"
        self.create_menu()

    def create_menu(self):
        menubar = QMenuBar(self)

        # Меню "Файл"
        file_menu = menubar.addMenu('Файл')
        exit_action = QAction('Выход', self)
        exit_action.triggered.connect(self.on_menu_exit)
        file_menu.addAction(exit_action)

        # Меню "Настройки"
        settings_menu = menubar.addMenu('Настройки')
        minimize_to_tray_action = QAction('Сворачивать в трей при закрытии', self, checkable=True)
        minimize_to_tray_action.setChecked(self.minimize_to_tray)
        minimize_to_tray_action.triggered.connect(self.on_minimize_to_tray_toggled)
        settings_menu.addAction(minimize_to_tray_action)

        # Меню "Справка"
        help_menu = menubar.addMenu('Справка')
        about_action = QAction('О программе', self)
        about_action.triggered.connect(self.show_about_dialog)
        help_menu.addAction(about_action)

        # Установка стилей для меню
        menubar.setStyleSheet("""
            QMenuBar {
                background-color: #323232;
                color: white;
            }
            QMenuBar::item:selected {
                background-color: #464646;
            }
            QMenu {
                background-color: #323232;
                color: white;
            }
            QMenu::item:selected {
                background-color: #464646;
            }
            QMenu::item:pressed {
                background-color: #5a5a5a;
            }
        """)

        layout = self.layout()
        layout.setMenuBar(menubar)

        # Создание диалогового окна "О программе"
        self.about_dialog = QMessageBox(self)
        self.about_dialog.setWindowTitle('О программе')
        self.about_dialog.setText('JustWoofIP\n\n'
                                 'Версия: 1.0.0-20241101\n'
                                 'Сайт: https://chat.mistral.ai')
        self.about_dialog.setStandardButtons(QMessageBox.StandardButton.Close)
        self.about_dialog.setDefaultButton(QMessageBox.StandardButton.Close)
        self.about_dialog.setWindowModality(Qt.WindowModality.ApplicationModal)
        self.about_dialog.button(QMessageBox.StandardButton.Close).clicked.connect(self.about_dialog.close)
        self.about_dialog.installEventFilter(self)

    def create_tray_menu(self):
        menu = QMenu()
        show_action = QAction("Показать", self)
        exit_action = QAction("Выход", self)
        show_action.triggered.connect(self.on_tray_show)
        exit_action.triggered.connect(self.on_tray_exit)
        menu.addAction(show_action)
        menu.addAction(exit_action)
        self.tray_icon.setContextMenu(menu)

    def on_tray_icon_activated(self, reason):
        if reason == QSystemTrayIcon.ActivationReason.Trigger:
            self.on_tray_show()

    def on_tray_show(self):
        self.showNormal()
        self.activateWindow()

    def on_tray_exit(self):
        self.tray_icon.hide()
        self.close()

    def on_menu_exit(self):
        self.tray_icon.hide()
        self.close()

    def on_minimize_to_tray_toggled(self, checked):
        self.minimize_to_tray = checked

    def closeEvent(self, event):
        self.save_settings()
        if self.minimize_to_tray:
            self.hide()
            event.ignore()
        else:
            self.tray_icon.hide()
            event.accept()

    def load_saved_proxies(self):
        self.saved_proxies = []
        if os.path.exists(PROXY_FILE):
            with open(PROXY_FILE, 'r', encoding='utf-8') as f:
                self.saved_proxies = json.load(f)
                self.update_saved_proxy_list()

    def save_proxies(self):
        with open(PROXY_FILE, 'w', encoding='utf-8') as f:
            json.dump(self.saved_proxies, f, ensure_ascii=False, indent=4)

    def update_saved_proxy_list(self):
        self.saved_proxy_choice.clear()
        for proxy in self.saved_proxies:
            display_text = f"{proxy['protocol']}://{proxy['server_port']}"
            if proxy.get('username') and proxy.get('password'):
                display_text += f" ({proxy['username']}:{proxy['password']})"
            self.saved_proxy_choice.addItem(display_text)

    def load_settings(self):
        if os.path.exists(SETTINGS_FILE):
            with open(SETTINGS_FILE, 'r', encoding='utf-8') as f:
                settings = json.load(f)
                use_proxy = settings.get('use_proxy', False)
                minimize_to_tray = settings.get('minimize_to_tray', False)
                selected_proxy_index = settings.get('selected_proxy_index', -1)
                selected_service = settings.get('selected_service', 'ipinfo.io')

                self.use_proxy_checkbox.setChecked(use_proxy)
                self.minimize_to_tray = minimize_to_tray
                if 0 <= selected_proxy_index < len(self.saved_proxies):
                    self.saved_proxy_choice.setCurrentRow(selected_proxy_index)
                if selected_service == 'ipinfo.io':
                    self.ipinfo_radio.setChecked(True)
                else:
                    self.ipapi_radio.setChecked(True)
        else:
            # Если файл настроек не существует, устанавливаем значения по умолчанию
            self.use_proxy_checkbox.setChecked(False)
            self.minimize_to_tray = False
            self.ipinfo_radio.setChecked(True)

    def save_settings(self):
        settings = {
            'use_proxy': self.use_proxy_checkbox.isChecked(),
            'minimize_to_tray': self.minimize_to_tray,
            'selected_proxy_index': self.saved_proxy_choice.currentRow(),
            'selected_service': 'ipinfo.io' if self.ipinfo_radio.isChecked() else 'ipapi.co'
        }
        with open(SETTINGS_FILE, 'w', encoding='utf-8') as f:
            json.dump(settings, f, ensure_ascii=False, indent=4)

    def on_get_button(self):
        use_proxy = self.use_proxy_checkbox.isChecked()
        selected_index = self.saved_proxy_choice.currentRow()
        if use_proxy and selected_index != -1:
            proxy_data = self.saved_proxies[selected_index]
        else:
            proxy_data = None
        service_url = 'https://ipinfo.io/json' if self.ipinfo_radio.isChecked() else 'https://ipapi.co/json/'
        ip, isp = get_ip_and_isp(proxy_data, use_proxy, service_url)
        self.ip_text.setText(ip)
        self.isp_text.setText(isp)

    def on_add_proxy(self):
        proxy_input = self.new_proxy_text.text().strip()
        if proxy_input:
            # Ожидаемый формат: protocol://server:port (username:password)
            parts = proxy_input.split()
            if len(parts) == 1 or len(parts) == 2:
                proxy_url = parts[0]
                auth = parts[1] if len(parts) == 2 else ''
                if '://' in proxy_url:
                    protocol, server_port = proxy_url.split('://', 1)
                else:
                    protocol = 'socks5'  # По умолчанию
                    server_port = proxy_url

                proxy_data = {'protocol': protocol, 'server_port': server_port}
                if auth:
                    if ':' in auth:
                        username, password = auth.split(':', 1)
                        proxy_data['username'] = username
                        proxy_data['password'] = password
                    else:
                        proxy_data['username'] = auth
                        proxy_data['password'] = ''

                # Добавляем прокси в список и сохраняем
                self.saved_proxies.append(proxy_data)
                self.save_proxies()
                self.update_saved_proxy_list()
                self.new_proxy_text.clear()
            else:
                QMessageBox.critical(self, "Ошибка", "Некорректный формат ввода прокси.")
        else:
            QMessageBox.critical(self, "Ошибка", "Поле для ввода прокси пустое.")

    def on_delete_proxy(self):
        selected_index = self.saved_proxy_choice.currentRow()
        if selected_index != -1:
            del self.saved_proxies[selected_index]
            self.save_proxies()
            self.update_saved_proxy_list()
        else:
            QMessageBox.critical(self, "Ошибка", "Не выбран прокси для удаления.")

    def on_button_hover(self, event):
        self.get_button.setStyleSheet("background-color: #464646; color: white;")

    def on_button_leave(self, event):
        self.get_button.setStyleSheet("background-color: #323232; color: white;")

    def show_about_dialog(self):
        self.about_dialog.exec()

    def eventFilter(self, obj, event):
        if obj == self.about_dialog and event.type() == QEvent.Type.WindowDeactivate:
            self.about_dialog.close()
        elif obj == self.about_dialog and event.type() == QEvent.Type.MouseButtonPress:
            url = QUrl("https://chat.mistral.ai")
            QDesktopServices.openUrl(url)
        return super().eventFilter(obj, event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    ex.show()
    sys.exit(app.exec())

В окне "О программе" если нажать левой кнопкой мыши происходит переход на сайт https://chat.mistral.ai/. Удали такую возможность. Сделай переход на сайт по тексту в этом окне "https://chat.mistral.ai". Постарайся сделать так, чтобы данный текст подчёркивался при наведении на него курсора мыши, а изначально был бы неподчёркнутым, но жирным шрифтом.