first commit
This commit is contained in:
141
vk_api/audio_url_decoder.py
Normal file
141
vk_api/audio_url_decoder.py
Normal file
@@ -0,0 +1,141 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from .exceptions import VkAudioUrlDecodeError
|
||||
|
||||
VK_STR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/="
|
||||
|
||||
|
||||
def splice(l, a, b, c):
|
||||
""" JS's Array.prototype.splice
|
||||
|
||||
var x = [1, 2, 3],
|
||||
y = x.splice(0, 2, 1337);
|
||||
|
||||
eq
|
||||
|
||||
x = [1, 2, 3]
|
||||
x, y = splice(x, 0, 2, 1337)
|
||||
"""
|
||||
|
||||
return l[:a] + [c] + l[a + b:], l[a:a + b]
|
||||
|
||||
|
||||
def decode_audio_url(string, user_id):
|
||||
vals = string.split("?extra=", 1)[1].split("#")
|
||||
|
||||
tstr = vk_o(vals[0])
|
||||
ops_list = vk_o(vals[1]).split('\x09')[::-1]
|
||||
|
||||
for op_data in ops_list:
|
||||
|
||||
split_op_data = op_data.split('\x0b')
|
||||
cmd = split_op_data[0]
|
||||
if len(split_op_data) > 1:
|
||||
arg = split_op_data[1]
|
||||
else:
|
||||
arg = None
|
||||
|
||||
if cmd == 'v':
|
||||
tstr = tstr[::-1]
|
||||
|
||||
elif cmd == 'r':
|
||||
tstr = vk_r(tstr, arg)
|
||||
|
||||
elif cmd == 'x':
|
||||
tstr = vk_xor(tstr, arg)
|
||||
elif cmd == 's':
|
||||
tstr = vk_s(tstr, arg)
|
||||
elif cmd == 'i':
|
||||
tstr = vk_i(tstr, arg, user_id)
|
||||
else:
|
||||
raise VkAudioUrlDecodeError(
|
||||
'Unknown decode cmd: "{}"; Please send bugreport'.format(cmd)
|
||||
)
|
||||
|
||||
return tstr
|
||||
|
||||
|
||||
def vk_o(string):
|
||||
result = []
|
||||
index2 = 0
|
||||
|
||||
for s in string:
|
||||
sym_index = VK_STR.find(s)
|
||||
|
||||
if sym_index != -1:
|
||||
if index2 % 4 != 0:
|
||||
i = (i << 6) + sym_index
|
||||
else:
|
||||
i = sym_index
|
||||
|
||||
if index2 % 4 != 0:
|
||||
index2 += 1
|
||||
shift = -2 * index2 & 6
|
||||
result += [chr(0xFF & (i >> shift))]
|
||||
else:
|
||||
index2 += 1
|
||||
|
||||
return ''.join(result)
|
||||
|
||||
|
||||
def vk_r(string, i):
|
||||
vk_str2 = VK_STR + VK_STR
|
||||
vk_str2_len = len(vk_str2)
|
||||
|
||||
result = []
|
||||
|
||||
for s in string:
|
||||
index = vk_str2.find(s)
|
||||
|
||||
if index != -1:
|
||||
offset = index - int(i)
|
||||
|
||||
if offset < 0:
|
||||
offset += vk_str2_len
|
||||
|
||||
result += [vk_str2[offset]]
|
||||
else:
|
||||
result += [s]
|
||||
|
||||
return ''.join(result)
|
||||
|
||||
|
||||
def vk_xor(string, i):
|
||||
xor_val = ord(i[0])
|
||||
|
||||
return ''.join(chr(ord(s) ^ xor_val) for s in string)
|
||||
|
||||
|
||||
def vk_s_child(t, e):
|
||||
i = len(t)
|
||||
|
||||
if not i:
|
||||
return []
|
||||
|
||||
o = []
|
||||
e = int(e)
|
||||
|
||||
for a in range(i - 1, -1, -1):
|
||||
e = (i * (a + 1) ^ e + a) % i
|
||||
o.append(e)
|
||||
|
||||
return o[::-1]
|
||||
|
||||
|
||||
def vk_s(t, e):
|
||||
i = len(t)
|
||||
|
||||
if not i:
|
||||
return t
|
||||
|
||||
o = vk_s_child(t, e)
|
||||
t = list(t)
|
||||
|
||||
for a in range(1, i):
|
||||
t, y = splice(t, o[i - 1 - a], 1, t[a])
|
||||
t[a] = y[0]
|
||||
|
||||
return ''.join(t)
|
||||
|
||||
|
||||
def vk_i(t, e, user_id):
|
||||
return vk_s(t, int(e) ^ user_id)
|
||||
Reference in New Issue
Block a user