Тема: Получение ссылки с datalock.ru
Т.к. уже не первый раз натыкаюсь на deja-vu, когда вижу закодированный код с datalock.ru и после поиска уже готового решения очередной раз не найдя, решил выложить решение для HMS сдесь, чтобы можно было найти по поиску.
Функция раскодирования безобразия:
//////////////////////////////////////////////////////////////////////////////
int base36Decode(string input) {
int res = 0; string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";
int len = Length(input);
for (int i=0; i<len; i++) {
res += (Pos(input[len-i], CharList)-1) * Int(Exp(Ln(36) * i));
}
return res;
}
//////////////////////////////////////////////////////////////////////////////
// Функция дешифровки javascript кода с сайта datalock.ru
string decodeDatalock(string y, string t, string u, string p) {
int i = 0;
int n = 0;
int d = 0;
string a1 = "";
string a2 = "";
while (true) {
if (i < 5) a2 += y[i+1];
else if (i < Length(y)) a1 += y[i+1]; i++;
if (n < 5) a2 += t[n+1];
else if (n < Length(t)) a1 += t[n+1]; n++;
if (d < 5) a2 += u[d+1];
else if (d < Length(u)) a1 += u[d+1]; d++;
if (Length(y) + Length(t) + Length(u) <= Length(a1) + Length(a2)) break;
}
n = 0;
string sResult = "";
for (i = 0; i < Length(a1); i += 2) {
int shift = -1;
if (Ord(a2[n+1]) % 2) shift = 1;
sResult += chr(base36Decode(Copy(a1, i+1, 2)) - shift);
n++;
if (n >= Length(a2)) n = 0;
}
return sResult;
}
Поиск самого безобразия и использование вышеприведённого кода:
///////////////////////////////////////////////////////////////////////////////
// Создание ссылок на серии с сайта datalock.ru
void CreateFromDatalockPlaylist(string sLink) {
string sHtml, sData, s1, s2, s3, s4, sName; THmsScriptMediaItem Item;
if (LeftCopy(sLink, 2)=='//') sLink = 'http:'+Trim(sLink);
sHtml = HmsDownloadURL(sLink, 'Referer: '+mpFilePath);
// Поиск и расшифровка блока кода
sData = sHtml;
while (HmsRegExMatch3(".*eval\\(function\\(\\w,\\w,\\w,\\w\\).*?}\\('(.*?)','(.*?)','(.*?','.*?)'", sData, s1, s2, s3)) {
HmsRegExMatch2("^(.*?)','(.*)", s3, s3, s4);
sData = decodeDatalock(s1, s2, s3, s4);
}
// Если после всей расшифровки в этих данных нет ссылки на плейлист - ошибка
if (!HmsRegExMatch('(datalock.ru/playlist[^"]+)', sData, sLink)) {
Item = HmsCreateMediaItem('err', PodcastItem.ItemID);
Item[mpiTitle] = 'Ошибка расшифровки данных с datalock.ru';
return;
}
// Загружаем плейлист
sLink = 'http://'+Trim(sLink);
sData = HmsDownloadURL(sLink, 'Referer: '+mpFilePath);
TStrings LIST = TStringList.Create();
TJsonObject JSON = TJsonObject.Create();
try {
JSON.LoadFromString(sData);
TJsonArray JARRAY = JSON.AsArray; if (JARRAY == nil) return;
for (int i = 0; i < JARRAY.Length; i++) {
TJsonObject VIDEO = JARRAY[i];
sName = VIDEO.S['title'];
sLink = VIDEO.S['file' ];
sName = ReplaceStr(ReplaceStr(HmsHtmlToText(sName), '\n', ' '), '\r', '');
sLink = HmsBase64Decode(ReplaceStr(ReplaceStr(sLink, '//Z3JpZA==', ''), '#2', ''));
// Т.к. там ссылок может быть несколько, засовываем это всё в список, а оттуда берём последнюю ссылку
LIST.Text = ReplaceStr(ReplaceStr(ReplaceStr(sLink, ',', '\n'), ' and ', '\n'), ' or ', '\n');
sLink = LIST[LIST.Count-1];
Item = HmsCreateMediaItem(sLink, PodcastItem.ItemID);
Item[mpiTitle] = sName;
}
} finally { JSON.Free; LIST.Free; }
sHtml = '';
}
В функцию CreateFromDatalockPlaylist можно передавать ссылки вида http://datalock.ru/player/12377
Просто увековечил этот код для того, чтобы если что - найти, когда опять встретится.