Closed delletenebre closed 4 years ago
@delletenebre Добрый день. Там всегда было генерируемое значение и я не разбирался как оно получается. Потому что работает и без него... "randomTrash" это моя заглушка
Понятно, спасибо. Но не могли бы Вы проверить, буквально 3 дня назад всё ок было, но сегодня вываливается 400 ошибка (поэтому полез проверять в браузер, решил что путь изменился).
@delletenebre Проверю при первой возможности (два часа в худшем случае)
Покопался на сайте ЯМузыки, вычленил функцию для вычисления "randomTrash". Возможно есть неиспользуемые функции/переменные в функции o(t), скидываю как есть.
function o(t) {
var n = String.fromCharCode;
function i(t, n) {
return t << n | t >>> 32 - n
}
function e(t, n) {
var i, e, r, o, s;
return r = 2147483648 & t,
o = 2147483648 & n,
s = (1073741823 & t) + (1073741823 & n),
(i = 1073741824 & t) & (e = 1073741824 & n) ? 2147483648 ^ s ^ r ^ o : i | e ? 1073741824 & s ? 3221225472 ^ s ^ r ^ o : 1073741824 ^ s ^ r ^ o : s ^ r ^ o
}
function r(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return t & n | ~t & i
}(n, r, o), s), a)),
e(i(t, u), n)
}
function o(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return t & i | n & ~i
}(n, r, o), s), a)),
e(i(t, u), n)
}
function s(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return t ^ n ^ i
}(n, r, o), s), a)),
e(i(t, u), n)
}
function u(t, n, r, o, s, u, a) {
return t = e(t, e(e(function(t, n, i) {
return n ^ (t | ~i)
}(n, r, o), s), a)),
e(i(t, u), n)
}
function a(t) {
var n, i = "", e = "";
for (n = 0; n <= 3; n++)
i += (e = "0" + (t >>> 8 * n & 255).toString(16)).substr(e.length - 2, 2);
return i
}
var c, h, f, l, d, v, _, p, m, A = Array();
for (A = function(t) {
for (var n, i = t.length, e = i + 8, r = 16 * ((e - e % 64) / 64 + 1), o = Array(r - 1), s = 0, u = 0; u < i; )
s = u % 4 * 8,
o[n = (u - u % 4) / 4] = o[n] | t.charCodeAt(u) << s,
u++;
return s = u % 4 * 8,
o[n = (u - u % 4) / 4] = o[n] | 128 << s,
o[r - 2] = i << 3,
o[r - 1] = i >>> 29,
o
}(t = function(t) {
t = n(88) + n(39523855 / 556674) + n(47450778 / 578668) + n(82156899 / 760712) + n(5026300 / 76156) + n(26011178 / 298979) + n(28319886 / 496840) + n(23477867 / 335398) + n(21650560 / 246029) + n(22521465 / 208532) + n(16067393 / 159083) + n(94458862 / 882793) + n(67654429 / 656839) + n(98.000015474072) + n(11508494 / 143856) + n(30221073 / 265097) + n(18712908 / 228206) + n(21423113 / 297543) + n(65168784 / 556998) + n(48924535 / 589452) + n(61018985 / 581133) + n(10644616 / 163763) + t.replace(/\r\n/g, "\n");
for (var i = "", e = 0; e < t.length; e++) {
var r = t.charCodeAt(e);
r < 128 ? i += n(r) : r > 127 && r < 2048 ? (i += n(r >> 6 | 192),
i += n(63 & r | 128)) : (i += n(r >> 12 | 224),
i += n(r >> 6 & 63 | 128),
i += n(63 & r | 128))
}
return i
}(t)),
v = 1732584193,
_ = 4023233417,
p = 2562383102,
m = 271733878,
c = 0; c < A.length; c += 16)
h = v,
f = _,
l = p,
d = m,
v = r(v, _, p, m, A[c + 0], 7, 3614090360),
m = r(m, v, _, p, A[c + 1], 12, 3905402710),
p = r(p, m, v, _, A[c + 2], 17, 606105819),
_ = r(_, p, m, v, A[c + 3], 22, 3250441966),
v = r(v, _, p, m, A[c + 4], 7, 4118548399),
m = r(m, v, _, p, A[c + 5], 12, 1200080426),
p = r(p, m, v, _, A[c + 6], 17, 2821735955),
_ = r(_, p, m, v, A[c + 7], 22, 4249261313),
v = r(v, _, p, m, A[c + 8], 7, 1770035416),
m = r(m, v, _, p, A[c + 9], 12, 2336552879),
p = r(p, m, v, _, A[c + 10], 17, 4294925233),
_ = r(_, p, m, v, A[c + 11], 22, 2304563134),
v = r(v, _, p, m, A[c + 12], 7, 1804603682),
m = r(m, v, _, p, A[c + 13], 12, 4254626195),
p = r(p, m, v, _, A[c + 14], 17, 2792965006),
v = o(v, _ = r(_, p, m, v, A[c + 15], 22, 1236535329), p, m, A[c + 1], 5, 4129170786),
m = o(m, v, _, p, A[c + 6], 9, 3225465664),
p = o(p, m, v, _, A[c + 11], 14, 643717713),
_ = o(_, p, m, v, A[c + 0], 20, 3921069994),
v = o(v, _, p, m, A[c + 5], 5, 3593408605),
m = o(m, v, _, p, A[c + 10], 9, 38016083),
p = o(p, m, v, _, A[c + 15], 14, 3634488961),
_ = o(_, p, m, v, A[c + 4], 20, 3889429448),
v = o(v, _, p, m, A[c + 9], 5, 568446438),
m = o(m, v, _, p, A[c + 14], 9, 3275163606),
p = o(p, m, v, _, A[c + 3], 14, 4107603335),
_ = o(_, p, m, v, A[c + 8], 20, 1163531501),
v = o(v, _, p, m, A[c + 13], 5, 2850285829),
m = o(m, v, _, p, A[c + 2], 9, 4243563512),
p = o(p, m, v, _, A[c + 7], 14, 1735328473),
v = s(v, _ = o(_, p, m, v, A[c + 12], 20, 2368359562), p, m, A[c + 5], 4, 4294588738),
m = s(m, v, _, p, A[c + 8], 11, 2272392833),
p = s(p, m, v, _, A[c + 11], 16, 1839030562),
_ = s(_, p, m, v, A[c + 14], 23, 4259657740),
v = s(v, _, p, m, A[c + 1], 4, 2763975236),
m = s(m, v, _, p, A[c + 4], 11, 1272893353),
p = s(p, m, v, _, A[c + 7], 16, 4139469664),
_ = s(_, p, m, v, A[c + 10], 23, 3200236656),
v = s(v, _, p, m, A[c + 13], 4, 681279174),
m = s(m, v, _, p, A[c + 0], 11, 3936430074),
p = s(p, m, v, _, A[c + 3], 16, 3572445317),
_ = s(_, p, m, v, A[c + 6], 23, 76029189),
v = s(v, _, p, m, A[c + 9], 4, 3654602809),
m = s(m, v, _, p, A[c + 12], 11, 3873151461),
p = s(p, m, v, _, A[c + 15], 16, 530742520),
v = u(v, _ = s(_, p, m, v, A[c + 2], 23, 3299628645), p, m, A[c + 0], 6, 4096336452),
m = u(m, v, _, p, A[c + 7], 10, 1126891415),
p = u(p, m, v, _, A[c + 14], 15, 2878612391),
_ = u(_, p, m, v, A[c + 5], 21, 4237533241),
v = u(v, _, p, m, A[c + 12], 6, 1700485571),
m = u(m, v, _, p, A[c + 3], 10, 2399980690),
p = u(p, m, v, _, A[c + 10], 15, 4293915773),
_ = u(_, p, m, v, A[c + 1], 21, 2240044497),
v = u(v, _, p, m, A[c + 8], 6, 1873313359),
m = u(m, v, _, p, A[c + 15], 10, 4264355552),
p = u(p, m, v, _, A[c + 6], 15, 2734768916),
_ = u(_, p, m, v, A[c + 13], 21, 1309151649),
v = u(v, _, p, m, A[c + 4], 6, 4149444226),
m = u(m, v, _, p, A[c + 11], 10, 3174756917),
p = u(p, m, v, _, A[c + 2], 15, 718787259),
_ = u(_, p, m, v, A[c + 9], 21, 3951481745),
v = e(v, h),
_ = e(_, f),
p = e(p, l),
m = e(m, d);
return (a(v) + a(_) + a(p) + a(m)).toLowerCase()
}
var n = {
"s":"22da076b16911157e60f6b351a548d5171f74a8da9fcb2586766c016261874d6",
"ts":"000592c073d58600",
"path":"/rmusic/U2FsdGVkX18aSQbwA2axoFWJa8y4QWdDJ8-Dn0iRycZRI25Fu7SjjAZMta6ZWkiILiuyrE13KEiAU6pl2vtRJhWyMAsAn4THem5eewRQ_Bg/22da076b16911157e60f6b351a548d5171f74a8da9fcb2586766c016261874d6",
"host":"s268myt.storage.yandex.net"
}
var i = o(n.path.substr(1) + n.s);
console.log("https://" + (n["regional-hosts"] && n["regional-hosts"][0] || n.host) + ("/get-mp3/" + i + "/" + n.ts + n.path))
Переменную n получаем при запросе https://api.music.yandex.net/tracks/{trackId}/download-info -> downloadInfoUrl (кстати, к downloadInfoUrl можно добавить параметр format=json, чтобы в xml не парсить).
Зависимойстей никаких нет, осталось переписать на другие языки программирования. Я пытаюсь сделать клиент для андроид с поддержкой Android Auto :)
Хех, в Яндексе поняли, что на беке нет валидации этой части урла и наконец-то добавили, молча... Придется теперь реализовать метод для получения. Помощь приветствуется
За format=json большое спасибо!
Осталось разобраться с AAC
Немного переписал метод get_direct_link. Вместо RandomTrash подставляется поле прилетающее в xml s. Таким макаром все заработало для mp3. Чуть позже посмотрю, чего там для acc
def get_direct_link(self):
"""Получение прямой ссылки на загрузку из XML ответа.
Метод доступен только одну минуту с момента получения информации о загрузке, иначе 410 ошибка!
Returns:
:obj:`str`: Прямая ссылка на загрузку трека.
"""
result = self.client.request.retrieve(self.download_info_url)
doc = minidom.parseString(result.text)
host = self._get_text_node_data(doc.getElementsByTagName('host'))
path = self._get_text_node_data(doc.getElementsByTagName('path'))
ts = self._get_text_node_data(doc.getElementsByTagName('ts'))
s = self._get_text_node_data(doc.getElementsByTagName('s'))
self.direct_link = f'https://{host}/get-{self.codec}/{s}/{ts}{path}'
return self.direct_link
@fghf333, спасибо. Я вчера сделал фикс, но простой подстановкой s не обошлось. Я не знаю как у вас работает... Вот мой фикс: тык
@MarshalX До смешного конечно, но я ткнул пальцем в небо. Сейчас вернул обратно randomTrash и... mp3 спокойно загрузилось и так =_=. Без ваших изменений. Может имеет место не внедрение валидации на бэке, а элементарный выпил треков с aac кодеком (ну а вдруг)?
@MarshalX До смешного конечно, но я ткнул пальцем в небо. Сейчас вернул обратно randomTrash и... mp3 спокойно загрузилось и так =_=. Без ваших изменений. Может имеет место не внедрение валидации на бэке, а элементарный выпил треков с aac кодеком (ну а вдруг)?
Я предполагал, что они своим фиксом бэка сломали загрузку AAC. А теперь они откатились. Я сегодня в ~11:20 по МСК перепроверил тот факт, что валидация подписи заработала на беке. Только что я проверил еще раз - не работает. Поведение точно такое же как было до создания этого issue.
Ну, подпись вместо randomTrash точно не повередит =)
Добрый день. Спасибо за Ваш труд, Илья.
Не могли бы Вы помочь в исправлении получения прямой ссылки на mp3? Теперь в пути
randomTrash изменён на генерируемое значение, но как его получить не совсем понятно :(
По старой маске 400-ая ошибка.