import subprocess
import time
import re
import xml.etree.ElementTree as ET
import pyperclip
import requests
import socket

from requests.adapters import HTTPAdapter
from urllib3.util import Retry

# Настройки ADB и Telegram бота
ADB_PATH = r"C:\\Users\\B-ZONE\\Desktop\\platform-tools\\adb.exe"  # Полный путь к adb.exe
bot_token = "ВАШ_НОВЫЙ_TELEGRAM_BOT_TOKEN"    # Токен вашего бота
chat_id = "-4272426177"                       # ID вашей группы

# API настройки
API_URL = "https://manage.stormapi.su/api/other_approve_register"
API_TOKEN = "ВАШ_НОВЫЙ_API_ТОКЕН"  # Замените на свой токен

package_name = 'com.autel.maxlink'

def run_adb_command(command):
    """Выполняет ADB команду и возвращает вывод."""
    try:
        result = subprocess.run([ADB_PATH] + command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        print(f"Ошибка при выполнении команды adb {' '.join(command)}: {e.stderr}")
        return None

def get_ui_dump():
    """Получает дамп UI-иерархии и сохраняет его в файл для анализа."""
    # Выполняем дамп UI
    run_adb_command(['shell', 'uiautomator', 'dump', '/sdcard/ui_dump.xml'])
    # Изменяем права доступа к файлу, чтобы его можно было прочитать
    run_adb_command(['shell', 'chmod', '666', '/sdcard/ui_dump.xml'])
    # Читаем содержимое дампа
    ui_dump = run_adb_command(['shell', 'cat', '/sdcard/ui_dump.xml'])
    if ui_dump:
        with open('ui_dump.xml', 'w', encoding='utf-8') as f:
            f.write(ui_dump)
        print("UI-дамп сохранён в файл 'ui_dump.xml'. Проверьте его содержимое.")
    return ui_dump

def parse_device_id(ui_dump):
    """Извлекает Device ID из дампа UI-иерархии."""
    try:
        root = ET.fromstring(ui_dump)
    except ET.ParseError as e:
        print(f"Ошибка при парсинге UI-дампа: {e}")
        return None

    device_id = None
    # Рекурсивный поиск всех элементов
    for node in root.iter('node'):
        text = node.attrib.get('text', '')
        # Шаблоны для разных локализаций
        patterns = [
            r'Device id:\s*([A-Za-z0-9]+)',          # Английский
            r'ID устройства:\s*([A-Za-z0-9]+)',      # Русский
            r'Идентификатор устройства:\s*([A-Za-z0-9]+)'  # Другие варианты
        ]
        for pattern in patterns:
            match = re.match(pattern, text)
            if match:
                device_id = match.group(1)
                print(f"Найден Device id: {device_id}")
                return device_id
    return device_id

def create_session_with_retries():
    """Создаёт сессию с повторными попытками запросов."""
    session = requests.Session()
    retry = Retry(
        total=5,
        backoff_factor=1,
        status_forcelist=[429, 500, 502, 503, 504],
        allowed_methods=["HEAD", "GET", "OPTIONS", "POST"]
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('https://', adapter)
    session.mount('http://', adapter)
    return session

session = create_session_with_retries()

def send_message_via_bot(message):
    """Отправляет сообщение в Telegram группу через бота."""
    url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
    payload = {
        'chat_id': chat_id,
        'text': message
    }
    try:
        # Принудительно использовать IPv4
        response = session.post(url, data=payload, verify=True, allow_redirects=True, timeout=10)
        response.raise_for_status()  # Возбудит исключение для плохих ответов
        result = response.json()
        if result.get("ok"):
            print("Сообщение успешно отправлено ботом.")
        else:
            print(f"Ошибка при отправке сообщения: {result}")
    except requests.exceptions.RequestException as err:
        print(f"Ошибка при отправке сообщения через бот: {err}")

def send_device_id_to_api(device_id):
    """Отправляет Device ID напрямую на API-эндпоинт."""
    headers = {
        "token": API_TOKEN
    }
    data = {
        "deviceId": device_id
    }
    try:
        # Принудительно использовать IPv4
        response = session.post(API_URL, headers=headers, data=data, verify=True, allow_redirects=True, timeout=10)
        response.raise_for_status()
        result = response.json()
        print(f"Ответ от API: {result}")
    except requests.exceptions.RequestException as err:
        print(f"Ошибка при отправке Device ID на API: {err}")

def main():
    print("Запуск приложения...")
    # Запускаем приложение на устройстве
    run_adb_command(['shell', 'monkey', '-p', package_name, '-c', 'android.intent.category.LAUNCHER', '1'])
    time.sleep(10)  # Ожидание загрузки приложения

    print("Получение дампа UI-иерархии...")
    ui_dump = get_ui_dump()
    if not ui_dump:
        print("Не удалось получить дамп UI.")
        return

    print("Поиск Device id...")
    device_id = parse_device_id(ui_dump)
    if not device_id:
        print("Не удалось найти Device id.")
        return

    # Копирование в буфер обмена компьютера (опционально)
    pyperclip.copy(device_id)
    print("Device id скопирован в буфер обмена компьютера.")

    # Отправка Device id в Telegram группу через бота
    message = f"{device_id}"
    send_message_via_bot(message)

    # Дополнительно: Отправка Device id напрямую на API
    send_device_id_to_api(device_id)

if __name__ == "__main__":
    main()
такая ошибка 
Запуск приложения...
Получение дампа UI-иерархии...
UI-дамп сохранён в файл 'ui_dump.xml'. Проверьте его содержимое.
Поиск Device id...
Найден Device id: c4dce426ca7d7cbc
Device id скопирован в буфер обмена компьютера.
Ошибка при отправке сообщения через бот: 404 Client Error: Not Found for url: https://api.telegram.org/bot%D0%92%D0%90%D0%A8_%D0%9D%D0%9E%D0%92%D0%AB%D0%99_TELEGRAM_BOT_TOKEN/sendMessage
Traceback (most recent call last):
  File "c:\Users\B-ZONE\Desktop\activationGlaz.py", line 154, in <module>
    main()
  File "c:\Users\B-ZONE\Desktop\activationGlaz.py", line 151, in main
    send_device_id_to_api(device_id)
  File "c:\Users\B-ZONE\Desktop\activationGlaz.py", line 117, in send_device_id_to_api
    response = session.post(API_URL, headers=headers, data=data, verify=True, allow_redirects=True, timeout=10)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Program Files\Python312\Lib\site-packages\requests\sessions.py", line 637, in post
    return self.request("POST", url, data=data, json=json, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Program Files\Python312\Lib\site-packages\requests\sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Program Files\Python312\Lib\site-packages\requests\sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Program Files\Python312\Lib\site-packages\requests\adapters.py", line 667, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "c:\Program Files\Python312\Lib\site-packages\urllib3\connectionpool.py", line 789, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "c:\Program Files\Python312\Lib\site-packages\urllib3\connectionpool.py", line 495, in _make_request
    conn.request(
  File "c:\Program Files\Python312\Lib\site-packages\urllib3\connection.py", line 440, in request
    self.putheader(header, value)
  File "c:\Program Files\Python312\Lib\site-packages\urllib3\connection.py", line 354, in putheader
    super().putheader(header, *values)
  File "c:\Program Files\Python312\Lib\http\client.py", line 1309, in putheader
    values[i] = one_value.encode('latin-1')
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)