1

Тема: Получение ссылки с 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

Просто увековечил этот код для того, чтобы если что - найти, когда опять встретится.

Sony Bravia KDL-32CX523
Спасибо сказали: михаил, smsbox3, Dr.Dru3

2

Re: Получение ссылки с datalock.ru

WendyH пишет:

решение для HMS

Еще бы для php перевести. То же попадается на пути этот datalock.

3

Re: Получение ссылки с datalock.ru

WendyH
еслт не затруднит, то можно вариант на lua?
только функцию  дешифровки js