Skip to content

Instantly share code, notes, and snippets.

@ancientGlider
Last active April 8, 2024 02:40
Show Gist options
  • Star 23 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save ancientGlider/e72cdaa2daf0af5f8d80f53fea4666be to your computer and use it in GitHub Desktop.
Save ancientGlider/e72cdaa2daf0af5f8d80f53fea4666be to your computer and use it in GitHub Desktop.
Authentication for Keenetic routers for work with CLI via REST API (Python)
# -*- coding: utf-8 -*-
"""
Данные с адресом, логином, паролем хранятся в конфигурационном файле следующего вида:
[Router]
ip_addr = 192.168.1.1:8080
login = admin
passw = anyPassword
"""
CONFIG_FILE_NAME = "keenetic.conf" # имя конфигурационного файла
import configparser
import requests
import hashlib
cookies_current = None
session = requests.session() # заводим сессию глобально чтобы отрабатывались куки
def keen_auth(login, passw): # авторизация на роутере
response = keen_request(ip_addr, "auth")
if response.status_code == 401:
md5 = login + ":" + response.headers["X-NDM-Realm"] + ":" + passw
md5 = hashlib.md5(md5.encode('utf-8'))
sha = response.headers["X-NDM-Challenge"] + md5.hexdigest()
sha = hashlib.sha256(sha.encode('utf-8'))
response = keen_request(ip_addr, "auth", {"login": login, "password": sha.hexdigest()})
if response.status_code == 200:
return True
elif response.status_code == 200:
return True
else:
return False
def keen_request(ip_addr, query, post = None): # отправка запросов на роутер
global session
# конструируем url
url = "http://" + ip_addr + "/" + query
# если есть данные для запроса POST, делаем POST, иначе GET
if post:
return session.post(url, json=post)
else:
return session.get(url)
config = configparser.ConfigParser() # создаём объекта парсера
config.read(CONFIG_FILE_NAME) # читаем конфиг
ip_addr = config["Router"]["ip_addr"]
login = config["Router"]["login"]
passw = config["Router"]["passw"]
# тестируем
if keen_auth(login, passw):
response = keen_request(ip_addr, 'rci/show/interface/WifiMaster0');
print(response.text)
@notabene00
Copy link

Огромное спасибо!
Приобрел Keenetic Giga недавно, обнаружил, что для него нет device_tracker компонента для Home Assistant. До этого был Xiaomi MiR3G на padavan, использовал компонент asuswrt. Сейчас придется писать свое.
И пример аутентификации был очень кстати.
Снимок экрана 2021-02-25 в 15 23 38

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment