В настоящее время нам определенно нужно подключение к Интернету для всего. Для гибкого доступа к Интернету у нас обычно дома есть маршрутизатор для распределения сети по другим сетям.

Однако иногда у маршрутизатора возникают проблемы, и решение заключается в перезагрузке маршрутизатора. Есть несколько способов сделать это

  1. Обычный способ перезапустить маршрутизатор — отключить кабель питания от маршрутизатора, подождать несколько секунд, а затем снова подключить.
  2. Маршрутизатор также предоставляет пользователю веб-панель управления для управления маршрутизатором, доступ к которому можно получить через подключение к шлюзу по умолчанию. таким образом можно реализовать автоматизацию.

Давайте посмотрим, как вручную перезагрузить маршрутизатор с помощью веб-панели управления. (я использую Huawei EG8245H5)

Из этих шагов можно узнать, что он состоит из нескольких шагов.

  1. Введите правильное имя пользователя и пароль.
  2. Нажмите кнопку входа (и дождитесь ответа).
  3. Щелкните значок кнопки сброса.
  4. Прокрутите вниз, пока не увидите кнопку перезагрузки.
  5. Нажмите кнопку перезагрузки.

Я думаю, поскольку платформа этих инструментов – веб-сайт, должна быть конечная точка, доступ к которой будет осуществляться при каждом нажатии кнопки. Таким образом, я могу видеть поведение веб-сайта и попытаться выяснить, какие конечные точки используются в каждом действии.

Шаг 1. Перехватите все действия, чтобы иметь возможность перезагрузить модем.

Мы можем использовать инструменты разработчика Chrome (потому что я использую Chrome) для перехвата всех сетей.

Во-первых, мы перехватим действие входа в систему.

У меня есть 3 конечные точки, которые срабатывают, когда я нажимаю на страницу входа.

  1. /asp/GetRandCount.asp для получения маркера, который будет использоваться в следующей конечной точке.
  2. /login.cgi обрабатывает вход. эта конечная точка отправляет имя пользователя, пароль, язык и x.X_HW_Token. это подтверждает наше имя пользователя и пароль. если имя пользователя и пароль, которые мы предоставили, верны, он будет перенаправлен на следующую конечную точку. эта конечная точка предоставит вам файл cookie, если имя пользователя и пароль верны. x.X_HW_Token — это токен из предыдущего ответа конечной точки. И значение пароля в кодировке base64.
  3. /index.asp главная страница веб-панели перенаправляется с конечной точки входа, если вы указали правильное имя пользователя и пароль. из этой конечной точки нам нужен правильный файл cookie из предыдущего ответа конечной точки, чтобы получить доступ к другой конечной точке в веб-панели.

Наконец, перехватите, что делает кнопка перезагрузки

На этом этапе я смотрю на кнопку перезапуска html и обнаруживаю, что эта кнопка запускает функцию javascript. вызвать ResetONT(это);

Имея эту информацию, я решил поискать функцию среди моих запущенных сетевых отладок. и я обнаружил, что этой функции нужен onttoken из элемента элемента html.

Итак, теперь я ищу элемент html с идентификатором onttoken. И я обнаружил, что этот элемент находится на странице /index.asp. с этой информацией мы знаем, что нам нужен экстрактор html, чтобы получить это значение из этого элемента ввода.

И из этой функции javascript я знаю, что функция будет отправлять эти данные в конечную точку.

В конечной точке перезапуска, полученной из функции javascript, находится /html/ssmp/accoutcfg/set.cgi, и конечной точке нужны параметры запроса и параметры формы данных. параметр данных формы - это токен, который был получен из элемента ввода html onttoken.

Теперь мы знаем все конечные точки, которые нам нужны для перезагрузки модема. и мы готовы написать скрипт на Python для работы со всеми конечными точками. потому что конечные точки, которые мы получили, нуждаются в файле cookie и заголовке данных. Я рекомендую вам посмотреть этот сайт под названием https://curlconverter.com/. Этот веб-сайт может сделать преобразованный завиток, который мы можем скопировать из браузера в указанный способ программирования языка, чтобы запросить API. Я покажу вам, как это сделать, на картинке ниже.

Шаг 2. Создание кода скрипта для выполнения запроса к конечной точке, которую мы получили ранее.

Установка пакетов для создания запросов и синтаксического анализатора HTML

Мы уже знаем, что нам нужно делать запросы к API и извлекать HTML из предыдущего процесса. Имя пакета — Запросы на отправку запросов к конечной точке, и он может предоставить запрос с его телом данных и заголовком, включая файлы cookie, которые нужны конечной точке. И пакет Beautifulsoup4 необходим для анализа html-данных из конечной точки ответа, которую мы вызываем из пакета запросов. Чтобы установить эти пакеты, нам нужен pip, установленный на нашей машине.

pip install requests beautifulsoup4

Создайте класс, чтобы предоставить методы для выполнения всех запросов

Мы собираемся создать класс с именем LoginPage, и внутри класса мы декалируем свойство заголовка из https://curlconverter.com, которое мы сгенерировали из конечной точки, которую мы запросим раньше.

class LoginPage:
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Connection': 'keep-alive',
        'Origin': 'http://192.168.18.1',
        'Referer': 'http://192.168.18.1/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    }

    def __init__(self) -> None:
        pass

Из процесса перехвата, который был сделан ранее. мы знаем, что первым шагом является вход в сеть, и нам нужен x.X_HW_Token из файла /asp/GetRandCount.asp.

Создайте метод для получения x.X_HW_Token

Давайте определим метод для вызова /asp/GetRandCount.asp и получения маркера от его ответа. и мы будем вызывать этот метод в методе __init__. Мы делаем метод get_hwtoken_loginpage со строкой возвращаемого типа подсказки для установки свойства hw_token_loginpage.

  def __init__(self) -> None:
      self.hw_token_loginpage = self.get_hwtoken_loginpage()

  def get_hwtoken_loginpage(self) -> str:
      req = requests.post("http://192.168.18.1/asp/GetRandCount.asp", headers=self.headers)
      req.encoding = req.apparent_encoding
      return req.text

Создайте метод отправки запроса в конечную точку входа

После получения токена мы сделаем запрос на вход и предоставим телу данные, необходимые на предыдущем этапе перехвата. мы создадим метод с именем login_request() в классе LoginPage, и его метод установит свойство cookie из ответного файла cookie, который мы получили от запроса на вход. и файл cookie будет использоваться во всех последующих запросах.

 def login_request(self) -> None:
      data = {
          'UserName': 'Epadmin',
          'PassWord': 'YWRtaW5FcA==',
          'Language': 'english',
          'x.X_HW_Token': self.hw_token_loginpage
      }

      r = requests.post('http://192.168.18.1/login.cgi', headers=self.headers, data=data, verify=False,allow_redirects=False)
      self.cookie = r.cookies

Создайте метод для получения токена на индексной странице

Теперь у нас есть файл cookie, и мы готовы получить onttoken на странице индекса, для доступа к которой требуется файл cookie. метод его запроса на страницу индекса, а возврат - строка html. и мы должны узнать onttoken из элемента ввода на его странице. нам понадобится BeautifulSoup для анализа html и извлечения данных, чтобы узнать значение onttoken. мы создаем метод с именем get_onttoken()

  def get_onttoken(self) -> None: 
      r = requests.get('http://192.168.18.1/index.asp', headers=self.headers,cookies=self.cookie, verify=False)
      soup = BeautifulSoup(r.text, "html.parser")
      self.onttoken = soup.find(id="onttoken").get("value")

Создайте способ перезапуска модема-маршрутизатора

После всего, что мы сделали раньше, наконец, мы можем создать метод, который может перезапустить наш модем-маршрутизатор, нажав на конечную точку перезапуска из веб-панели. мы должны добавить try catch в этот запрос, потому что, когда мы попадаем в конечную точку, соединение с нашей машиной немедленно прервется, потому что модем маршрутизатора перезагружается, и это может привести к ошибке нашего сценария исключения ConnectionError.

  def restart_router(self) -> None : 
      data = {
          'x.X_HW_Token': self.onttoken,
      }
      try:
          r = requests.post('http://192.168.18.1/html/ssmp/accoutcfg/set.cgi?x=InternetGatewayDevice.X_HW_DEBUG.SMP.DM.ResetBoard&RequestFile=html/ssmp/accoutcfg/ontmngt.asp',data=data, headers=self.headers,cookies=self.cookie, verify=False)
      except requests.exceptions.ConnectionError: 
          print("success restarting the router")
      except: 
          print("error")

Пришло время протестировать наш скрипт

После того, как мы сделали скрипт, давайте протестируем наш скрипт. из этого я протестировал сценарий. соединение с моей машиной немедленно прерывается, потому что модем маршрутизатора перезагружается.

я предоставлю этот полный исходный код в моем github
https://github.com/NikwaF/restart-wifi-huawei-EG8245H5

Благодарим вас за внимание, я буду рад вашим отзывам
[email protected], LinkedIn