commit
079b90d9fd
6 changed files with 1403 additions and 0 deletions
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
Простой проект управления роутерами `TP-Link` серии `WRxxxN` с помощью `python requests`. |
||||
|
||||
Реализован код для генерации `auth`-токена из пары логин-пароль (адаптирован из js-кода веб-интерфейса роутера), login/logout. |
@ -0,0 +1,201 @@
@@ -0,0 +1,201 @@
|
||||
import base64 |
||||
import ctypes |
||||
import urllib.parse |
||||
|
||||
|
||||
def _32bit(number): |
||||
return ctypes.c_int(number).value |
||||
|
||||
|
||||
def _zero_fill_right_shift(val, n): |
||||
val = _32bit(val) |
||||
n = _32bit(n) |
||||
return _32bit(val >> n) if val >= 0 else _32bit((val + 0x100000000) >> n) |
||||
|
||||
|
||||
def hex_md5(a): |
||||
return binl2hex(core_md5(str2binl(a), len(a) * 8)) |
||||
|
||||
|
||||
def core_md5(p, k): |
||||
p = p + [0] * 1000 |
||||
p[k >> 5] |= 128 << ((k) % 32) |
||||
p[(_zero_fill_right_shift(k + 64, 9) << 4) + 14] = k |
||||
plen = ((_zero_fill_right_shift(k + 64, 9) << 4) + 14) + 1 |
||||
o = 1732584193 |
||||
n = -271733879 |
||||
m = -1732584194 |
||||
l = 271733878 |
||||
for g in range(0, plen, 16): |
||||
j = o |
||||
h = n |
||||
f = m |
||||
e = l |
||||
o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936) |
||||
l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586) |
||||
m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819) |
||||
n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330) |
||||
o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897) |
||||
l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426) |
||||
m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341) |
||||
n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983) |
||||
o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416) |
||||
l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417) |
||||
m = md5_ff(m, l, o, n, p[g + 10], 17, -42063) |
||||
n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162) |
||||
o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682) |
||||
l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101) |
||||
m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290) |
||||
n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329) |
||||
o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510) |
||||
l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632) |
||||
m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713) |
||||
n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302) |
||||
o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691) |
||||
l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083) |
||||
m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335) |
||||
n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848) |
||||
o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438) |
||||
l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690) |
||||
m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961) |
||||
n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501) |
||||
o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467) |
||||
l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784) |
||||
m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473) |
||||
n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734) |
||||
o = md5_hh(o, n, m, l, p[g + 5], 4, -378558) |
||||
l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463) |
||||
m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562) |
||||
n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556) |
||||
o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060) |
||||
l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353) |
||||
m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632) |
||||
n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640) |
||||
o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174) |
||||
l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222) |
||||
m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979) |
||||
n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189) |
||||
o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487) |
||||
l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835) |
||||
m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520) |
||||
n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651) |
||||
o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844) |
||||
l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415) |
||||
m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905) |
||||
n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055) |
||||
o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571) |
||||
l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606) |
||||
m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523) |
||||
n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799) |
||||
o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359) |
||||
l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744) |
||||
m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380) |
||||
n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649) |
||||
o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070) |
||||
l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379) |
||||
m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259) |
||||
n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551) |
||||
o = safe_add(o, j) |
||||
n = safe_add(n, h) |
||||
m = safe_add(m, f) |
||||
l = safe_add(l, e) |
||||
|
||||
return [o, n, m, l] |
||||
|
||||
|
||||
def md5_cmn(h, e, d, c, g, f): |
||||
h = _32bit(h) |
||||
e = _32bit(e) |
||||
d = _32bit(d) |
||||
c = _32bit(c) |
||||
g = _32bit(g) |
||||
f = _32bit(f) |
||||
return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) |
||||
|
||||
|
||||
def md5_ff(g, f, k, j, e, i, h): |
||||
g = _32bit(g) |
||||
f = _32bit(f) |
||||
k = _32bit(k) |
||||
j = _32bit(j) |
||||
e = _32bit(e) |
||||
i = _32bit(i) |
||||
h = _32bit(h) |
||||
return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) |
||||
|
||||
|
||||
def md5_gg(g, f, k, j, e, i, h): |
||||
g = _32bit(g) |
||||
f = _32bit(f) |
||||
k = _32bit(k) |
||||
j = _32bit(j) |
||||
e = _32bit(e) |
||||
i = _32bit(i) |
||||
h = _32bit(h) |
||||
return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) |
||||
|
||||
|
||||
def md5_hh(g, f, k, j, e, i, h): |
||||
g = _32bit(g) |
||||
f = _32bit(f) |
||||
k = _32bit(k) |
||||
j = _32bit(j) |
||||
e = _32bit(e) |
||||
i = _32bit(i) |
||||
h = _32bit(h) |
||||
return md5_cmn(f ^ k ^ j, g, f, e, i, h) |
||||
|
||||
|
||||
def md5_ii(g, f, k, j, e, i, h): |
||||
g = _32bit(g) |
||||
f = _32bit(f) |
||||
k = _32bit(k) |
||||
j = _32bit(j) |
||||
e = _32bit(e) |
||||
i = _32bit(i) |
||||
h = _32bit(h) |
||||
return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) |
||||
|
||||
|
||||
def safe_add(a, d): |
||||
a = _32bit(a) |
||||
d = _32bit(d) |
||||
c = _32bit(_32bit(a & 65535) + _32bit(d & 65535)) |
||||
b = _32bit(_32bit(a >> 16) + _32bit(d >> 16) + _32bit(c >> 16)) |
||||
return _32bit(_32bit(b << 16) | _32bit(c & 65535)) |
||||
|
||||
|
||||
def bit_rol(a, b): |
||||
return _32bit(_32bit(a << b) | _32bit(_zero_fill_right_shift(a, 32 - b))) |
||||
|
||||
|
||||
def str2binl(d): |
||||
c = [None] * 1000 |
||||
a = (1 << 8) - 1 |
||||
for b in range(0, len(d) * 8, 8): |
||||
if c[b >> 5] == None: |
||||
c[b >> 5] = 0 |
||||
c[b >> 5] |= (ord(d[int(b / 8)]) & a) << (b % 32) |
||||
return [s for s in c if s != None] |
||||
|
||||
|
||||
def binl2hex(c): |
||||
b = "0123456789abcdef" |
||||
d = "" |
||||
for a in range(0, len(c) * 4): |
||||
d += ( |
||||
b[int(((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15))] |
||||
+ b[int(((c[a >> 2] >> ((a % 4) * 8)) & 15))] |
||||
) |
||||
return d |
||||
|
||||
|
||||
def Base64Encoding(s): |
||||
return base64.b64encode(s.encode("UTF-8")).decode("UTF-8") |
||||
|
||||
|
||||
def get_cookie(username, password): |
||||
password = hex_md5(password) |
||||
auth = "Basic " + Base64Encoding(username + ":" + password) |
||||
cookie = "Authorization=" + urllib.parse.quote(auth) |
||||
return cookie |
@ -0,0 +1,182 @@
@@ -0,0 +1,182 @@
|
||||
function hex_md5(a) { |
||||
return binl2hex(core_md5(str2binl(a), a.length * 8)) |
||||
} |
||||
|
||||
function core_md5(p, k) { |
||||
p[k >> 5] |= 128 << ((k) % 32); |
||||
p[(((k + 64) >>> 9) << 4) + 14] = k; |
||||
var o = 1732584193; |
||||
var n = -271733879; |
||||
var m = -1732584194; |
||||
var l = 271733878; |
||||
for (var g = 0; g < p.length; g += 16) { |
||||
var j = o; |
||||
var h = n; |
||||
var f = m; |
||||
var e = l; |
||||
o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936); |
||||
l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586); |
||||
m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819); |
||||
n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330); |
||||
o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897); |
||||
l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426); |
||||
m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341); |
||||
n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983); |
||||
o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416); |
||||
l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417); |
||||
m = md5_ff(m, l, o, n, p[g + 10], 17, -42063); |
||||
n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162); |
||||
o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682); |
||||
l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101); |
||||
m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290); |
||||
n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329); |
||||
o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510); |
||||
l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632); |
||||
m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713); |
||||
n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302); |
||||
o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691); |
||||
l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083); |
||||
m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335); |
||||
n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848); |
||||
o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438); |
||||
l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690); |
||||
m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961); |
||||
n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501); |
||||
o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467); |
||||
l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784); |
||||
m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473); |
||||
n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734); |
||||
o = md5_hh(o, n, m, l, p[g + 5], 4, -378558); |
||||
l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463); |
||||
m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562); |
||||
n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556); |
||||
o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060); |
||||
l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353); |
||||
m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632); |
||||
n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640); |
||||
o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174); |
||||
l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222); |
||||
m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979); |
||||
n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189); |
||||
o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487); |
||||
l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835); |
||||
m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520); |
||||
n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651); |
||||
o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844); |
||||
l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415); |
||||
m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905); |
||||
n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055); |
||||
o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571); |
||||
l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606); |
||||
m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523); |
||||
n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799); |
||||
o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359); |
||||
l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744); |
||||
m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380); |
||||
n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649); |
||||
o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070); |
||||
l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379); |
||||
m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259); |
||||
n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551); |
||||
o = safe_add(o, j); |
||||
n = safe_add(n, h); |
||||
m = safe_add(m, f); |
||||
l = safe_add(l, e) |
||||
} |
||||
return Array(o, n, m, l) |
||||
} |
||||
|
||||
function md5_cmn(h, e, d, c, g, f) { |
||||
console.log(c, safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)) |
||||
return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d) |
||||
} |
||||
|
||||
function md5_ff(g, f, k, j, e, i, h) { |
||||
return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h) |
||||
} |
||||
|
||||
function md5_gg(g, f, k, j, e, i, h) { |
||||
return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h) |
||||
} |
||||
|
||||
function md5_hh(g, f, k, j, e, i, h) { |
||||
return md5_cmn(f ^ k ^ j, g, f, e, i, h) |
||||
} |
||||
|
||||
function md5_ii(g, f, k, j, e, i, h) { |
||||
return md5_cmn(k ^ (f | (~j)), g, f, e, i, h) |
||||
} |
||||
|
||||
function safe_add(a, d) { |
||||
var c = (a & 65535) + (d & 65535); |
||||
var b = (a >> 16) + (d >> 16) + (c >> 16); |
||||
return (b << 16) | (c & 65535) |
||||
} |
||||
|
||||
function bit_rol(a, b) { |
||||
return (a << b) | (a >>> (32 - b)) |
||||
} |
||||
|
||||
function str2binl(d) { |
||||
var c = Array(); |
||||
var a = (1 << 8) - 1; |
||||
for (var b = 0; b < d.length * 8; b += 8) { |
||||
c[b >> 5] |= (d.charCodeAt(b / 8) & a) << (b % 32) |
||||
} |
||||
return c |
||||
} |
||||
|
||||
function binl2hex(c) { |
||||
var b = "0123456789abcdef"; |
||||
var d = ""; |
||||
for (var a = 0; a < c.length * 4; a++) { |
||||
d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15) |
||||
} |
||||
return d |
||||
} |
||||
|
||||
function Base64Encoding(d) { |
||||
var b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
||||
var a = ""; |
||||
var l, j, g, k, h, f, e; |
||||
var c = 0; |
||||
while (c < d.length) { |
||||
l = d.charCodeAt(c++); |
||||
j = d.charCodeAt(c++); |
||||
g = d.charCodeAt(c++); |
||||
k = l >> 2; |
||||
h = ((l & 3) << 4) | (j >> 4); |
||||
f = ((j & 15) << 2) | (g >> 6); |
||||
e = g & 63; |
||||
if (isNaN(j)) { |
||||
f = e = 64 |
||||
} else { |
||||
if (isNaN(g)) { |
||||
e = 64 |
||||
} |
||||
} |
||||
a = a + b.charAt(k) + b.charAt(h) + b.charAt(f) + b.charAt(e) |
||||
} |
||||
return a |
||||
} |
||||
|
||||
function utf8_encode(b) { |
||||
b = b.replace(/\r\n/g, "\n"); |
||||
var a = ""; |
||||
for (var e = 0; e < b.length; e++) { |
||||
var d = b.charCodeAt(e); |
||||
if (d < 128) { |
||||
a += String.fromCharCode(d) |
||||
} else { |
||||
if ((d > 127) && (d < 2048)) { |
||||
a += String.fromCharCode((d >> 6) | 192); |
||||
a += String.fromCharCode((d & 63) | 128) |
||||
} else { |
||||
a += String.fromCharCode((d >> 12) | 224); |
||||
a += String.fromCharCode(((d >> 6) & 63) | 128); |
||||
a += String.fromCharCode((d & 63) | 128) |
||||
} |
||||
} |
||||
} |
||||
return a |
||||
}; |
@ -0,0 +1,77 @@
@@ -0,0 +1,77 @@
|
||||
import time |
||||
import logging |
||||
import requests |
||||
from cookie_tplink_wr_series import get_cookie |
||||
from my_secrets import my_secrets |
||||
|
||||
logging.basicConfig(encoding="utf-8", level=logging.INFO) # filename="example.log" |
||||
|
||||
|
||||
class TPLink(object): |
||||
def __init__(self, ip="192.168.0.1", login="", password=""): |
||||
self.ip = f"http://{ip}" |
||||
self.auth_cookie = get_cookie(login, password) |
||||
self.session_id = "" |
||||
|
||||
def login(self): |
||||
have_new_sid = False |
||||
for _ in range(3): |
||||
req = requests.get( |
||||
f"{self.ip}/userRpm/LoginRpm.htm?Save=Save", |
||||
headers={"Referer": f"{self.ip}/", "Cookie": self.auth_cookie}, |
||||
) |
||||
|
||||
if req.status_code != 200: |
||||
logging.warning( |
||||
f"Failed login with token '{self.auth_cookie}' (request code != 200)" |
||||
) |
||||
continue |
||||
|
||||
params = req.text.split("/") |
||||
if len(params) >= 3: |
||||
if len(params[3]) == 16: |
||||
self.session_id = params[3] |
||||
have_new_sid = True |
||||
logging.info(f"Successfully login to session {self.session_id}") |
||||
break |
||||
|
||||
time.sleep(0.1) |
||||
|
||||
if not have_new_sid: |
||||
self.session_id = "" |
||||
logging.warning( |
||||
f"Failed login with token '{self.auth_cookie}' (can't get session id)" |
||||
) |
||||
|
||||
def logout(self): |
||||
have_logout = False |
||||
for _ in range(3): |
||||
req = requests.get( |
||||
f"{self.ip}/{self.session_id}/userRpm/LogoutRpm.htm", |
||||
headers={ |
||||
"Referer": f"{self.ip}/{self.session_id}/userRpm/MenuRpm.htm", |
||||
"Cookie": self.auth_cookie, |
||||
}, |
||||
) |
||||
|
||||
if req.status_code != 200: |
||||
logging.warning( |
||||
f"Failed logout from session '{self.session_id}' (request code != 200)" |
||||
) |
||||
continue |
||||
else: |
||||
have_logout = True |
||||
break |
||||
|
||||
time.sleep(1) |
||||
|
||||
if not have_logout: |
||||
self.session_id = "" |
||||
logging.warning(f"Failed logout") |
||||
else: |
||||
logging.info(f"Successfully logout from session {self.session_id}") |
||||
|
||||
|
||||
router = TPLink(login=my_secrets.login, password=my_secrets.password) |
||||
router.login() |
||||
router.logout() |
Loading…
Reference in new issue