Skip to content

Instantly share code, notes, and snippets.

@ancientGlider
Last active March 24, 2025 17:07
Show Gist options
  • 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)
@Amfiaros
Copy link

Amfiaros commented Feb 5, 2025

@alekssamos

А я себе статические маршруты настроил, теперь у меня Youtube идёт в VPN, а остальное напрямую..

Увы, домены по типу rr2---sn-oan31-5a5e.googlevideo.com периодически меняются. Потому приходится собирать велосипеды из костылей.

pc. Хмм, надо помониторить, вдруг и правда пул ip просто переименовывают...

@AntonBelgorod
Copy link

Переписал тоже самое на PHP

<?php

class KeeneticAPI
{
    private string $ip_addr;
    private string $login;
    private string $passw;
    private CurlHandle $session;
    private string $cookieJar;

    public function __construct(string $ip_addr, string $login, string $passw)
    {
        $this->ip_addr = $ip_addr;
        $this->login = $login;
        $this->passw = $passw;

        // Инициализация cURL сессии и файла для хранения cookie
        $this->cookieJar = tempnam(sys_get_temp_dir(), 'cookies_');
        $this->session = curl_init();
        $this->aut

Привет! Скажи куда вписывать свои данные от роутера. Спасибо

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