Помощь в создании подкастов

Интернет-телевидение, интернет-радио, подкасты, IPTV
linkey
Posts: 110
Joined: Mon Oct 10, 2011 5:45 pm

Re: Помощь в создании подкастов

Post by linkey »

И еще вопрос можно ли в скрипте проверить автоматом правильно создалась ли ссылка, т.е. если такой файл на сервере?
samsung UE32D5000
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: Помощь в создании подкастов

Post by WendyH »

linkey wrote:Подскажите, как в скрипте запустить файл с диска?
Это С++ скрипт, но переделать под Pascal или JacaScript, думаю, не составит труда:

Code: Select all

{
  Variant objShell, objStdOut, objWshScriptExec; char strOutput;

  try {objShell = CreateOleObject('WScript.Shell');} except {}
  if (VarType(objShell)!=varDispatch) {
    HmsLogMessage(1, 'Не могу создать ActiveXObject WScript.Shell');
    return;
  }
  objShell.Run('Calc.exe');

  objWshScriptExec = objShell.Exec("ipconfig");
  objStdOut = objWshScriptExec.StdOut;
  strOutput = objStdOut.ReadAll();
  strOutput = ReplaceStr(strOutput, '\n', '<br>');
  strOutput = HmsHtmlToText(strOutput, 866);
  ShowMessage(strOutput);
}
slawa321 wrote:а вот ехе -думаю это уже можно вируса делать
Влёгкую. Особенно у тех, кто запускает HMS в режиме сервиса. Поэтому люди - не качайте скриптов где попало. )
linkey wrote:можно ли изменить заголовок медиаресурса, в скрипте получения ссылки.
Можно, какие проблемы? заголовок всего, до чего рука дотянется. )
PodcastItem[mpiTitle] = 'Привет. Это я, ссылка';
PodcastItem.ItemParent[mpiTitle] = 'Привет. Это родитель того, чью ссылку мы обрабатываем';
Только "загрузки свойств фалов" (срабатывания скрипта) нужно обновить отображение на экране - F5, и название подкаста или каталога ссылки будет таким, каким мы его изменили.
linkey wrote:Кто нибудь пробовал пользоваться "скрипт формирует несколько ссылок". Объясните плиз на простом примере как это сделать. Подкаст ютуб просмотрел, скачал даже пару подкастов с буржуйского wms, но так что то и не понял.
Вот этого незнаю.. Действительно, подкаст youtube Евгения формирует несколько ссылок, при выборе проигрывания фильма, разного доступного качества. Но как влияет эта галочка на это, не разбирался.
linkey wrote:можно ли в скрипте проверить автоматом правильно создалась ли ссылка, т.е. если такой файл на сервере?
Эээ.. супер универсального ответа, наверно нет, потому как наличие файла и его доступность иногда трудно проверить, пока его действительно не начнёшь "качать". Потому как часто ссылки на файлы, на самом деле ссылки на скрипты с передачей параметров, а те уже могут начать отдачу потока или перенаправить... Но как вариант, можно сделать запрос, методом HEAD, и посмотреть заголовки в ответах. Где-то у меня функия раньше валялась, я использовал, для получения redirect ссылки. Примерно так:

Code: Select all

  Variant xmlHttp=null; char sLocation='', s; int nTimeOut, TimeStart;

  try {xmlHttp = CreateOleObject('WinHttp.WinHttpRequest.5.1');} except {}
  if (VarType(xmlHttp)!=varDispatch) {HmsLogMessage(1, 'Невозможно создать ActiveXObject WinHttp.WinHttpRequest.5.1'); return '';}
  xmlHttp.Open('HEAD', sLink, true);
  xmlHttp.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0');
  xmlHttp.SetRequestHeader('Referer', gsUrlBase);
  xmlHttp.Send();
  xmlHttp.WaitForResponse();
  sLocation=xmlHttp.GetResponseHeader('Location');
  s=xmlHttp.GetAllResponseHeaders();
Вот там можно получить и Content-Lenght или какой-нибудь другой заголовок, который может быть показателем, на нужный файл это сслыка, или вообще ответ 404 или перенаправление не туда куда надо (часто такое делают, перенаправляют в другое место).
После подсказки с Rutracker.org Женей, понял что подобную функцию можно сделать более "родным" способом. Что-то типа того:

Code: Select all

  char sHeader='', sCookie='', sContentLenght=''; 
  HmsSendRequestEx('login.rutracker.org', '/forum/login.php', 'HEAD', 
                   'application/x-www-form-urlencoded', sReferer,
                   'login_username='+mpPodcastAuthorizationUserName + 
                   '&login_password='+mpPodcastAuthorizationPassword+'&login=%C2%F5%EE%E4', 
                   80, INTERNET_FLAG_NO_AUTO_REDIRECT + INTERNET_FLAG_NO_COOKIES, sHeader);
  HmsRegExMatch('Set-Cookie: (.*?);', sHeader, sCookie, 1, PCRE_SINGLELINE));
  HmsRegExMatch(Content-Lenght: (.*)\n', sHeader, sContentLenght, 1, PCRE_SINGLELINE));
Т.е. мы делаем запрос, не получая контента, а только заголовки от сервера. А там уже поанализировать их. Например взять куки или Location - ссылку перенаправления. Это иногда пригоджается.
HmsRegExMatch(Location: (.*)\n', sHeader, sRedirectLink, 1, PCRE_SINGLELINE));
После этого в sRedirectLink будет ссылка перенаправления, если она там есть конечно.

Не то, что я самый умный, просто вижу вопросы без ответов, может чем помогу. Сам нуждаюсь частенько в помощи. Так что чем больше общения на эту тему, тем больше информации. Кто знает ещё что - колитесь.
SONY KDL-32CX520
linkey
Posts: 110
Joined: Mon Oct 10, 2011 5:45 pm

Re: Помощь в создании подкастов

Post by linkey »

WendyH wrote: ...
Спасибо попробую
samsung UE32D5000
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: Помощь в создании подкастов

Post by WendyH »

Уж больно нравиться мне название темы, поэтому буду выкладывать информацию по созданию подкастов сюда.

Если вы встретили на сайте флеш плеер uppod.swf
Если вы видите, что ссылки на файл видео или плейлиста зашифрованы, или есть ссылка на другой текстовый файл, который зашифрован во flashvars.
Например как на степашка.ком:
<param name="flashvars" value="comment=Stream-video&st=http://www.stepashka.com/engine/classes ... bfpTQawArr" />
То можно попытаться это дело расшифровать.
Вообще, во всех случаях изучения получения ссылки - формула примерно одна:
- Сниффером (например Wireshark) слушаем http и смотрим какие запросы идут и ответы приходят
- Скачиваем флеш плеер, декомпилируем (например Flash Decompiler Trillix) и изучаем как оно всё там происходит.

В случае с uppod, есть несколько советов, возможно очень облегчающих получение реальной ссылки.
Если с плеером uppod ссылки закодированы, значит хозяева ресурса его купили и платная версия этого плеера собирается с возможностью шифрования ссылок. Шифровка ссылок у каждого клиента, купившего плеер, своя. Поэтому придётся смотреть внутрь плеера, который используется на ресурсе.
Но на самом деле, если повезёт и ничего дополнительно не используется для шифрования и защиты контента, там всё просто.
1) Скачиваем uppod.swf
2) Декомпилим
3) Ищем в файле скрипта ActionScript плеера значения двух массивов с именами codec_a и codec_b
Например в плеере степашки это будут строки типа:
client.codec_a = new Array("G", "d", "R", "0", "M", "Y", "4", "v", "6", "u", "t", "i", "f", "c", "s", "l", "B", "5", "n", "2", "V", "Z", "J", "m", "L", "=");
client.codec_b = new Array("1", "w", "Q", "o", "9", "U", "a", "N", "x", "D", "X", "7", "z", "H", "y", "3", "e", "g", "T", "W", "b", "8", "k", "I", "p", "r");
В плеере http://st.keyset.kz/pl/pl.swf
client.codec_a = ["m", "T", "u", "p", "L", "n", "M", "6", "Q", "i", "w", "7", "t", "X", "s", "0", "l", "a", "k", "v", "G", "B", "D", "2", "R", "="];
client.codec_b = ["9", "c", "W", "Z", "I", "H", "J", "e", "V", "o", "y", "z", "d", "N", "b", "4", "U", "Y", "x", "g", "5", "8", "3", "1", "f", "F"];

Это - таблицы замен символов. Они, по-умолчанию, тупо кодируют текст в Base64 и меняют символы по этим таблицам. Поэтому можно попытатся расшифровать ссылку или текст следующим скриптом (С++ script):

Code: Select all

// -----------------------------------------------------------------------------
// Расшифровка закодированного текста плеера uppod
char DecodeUppodText(char sData) {
  variant char1, char2; int i;
  variant Client_codec_a = ["G", "d", "R", "0", "M", "Y", "4", "v", "6", "u", "t", "i", "f", "c", "s", "l", "B", "5", "n", "2", "V", "Z", "J", "m", "L", "="];
  variant Client_codec_b = ["1", "w", "Q", "o", "9", "U", "a", "N", "x", "D", "X", "7", "z", "H", "y", "3", "e", "g", "T", "W", "b", "8", "k", "I", "p", "r"];

  sData = ReplaceStr(sData, "\n", "");
  for (i=0; i<Length(Client_codec_a); i++) {
    char1 = Client_codec_b[i];
    char2 = Client_codec_a[i];
    sData = ReplaceStr(sData, char1, "___");
    sData = ReplaceStr(sData, char2, char1);
    sData = ReplaceStr(sData, "___", char2);
  }
  sData = HmsUtf8Decode(HmsBase64Decode(sData));
  return sData;
}
Это функция взята из моего модкаста Stepaska.com. Переделать её под другие языки скриптов не самое сложное дело.

В случае с keyset.kz - ссылки были зашифрованы в текстовом файле, который возвращался по запросу с ид фильма. В случае со степашкой.ком - зашифрована прямая ссылка на файл плейлиста или видео. Т.е. варианты что именно шифровать могут быть разные. Но как расшифровать, скорее всего вариант, который тут описан. И это сообщение - небольшая наводка.

В uppod плеере, если кто будет копаться, функции шифровки/дешифровки находятся в классе Is. Вход проверки дешифровки - функция _foo. Хотя, названия функций и класса очень похожи на обфусцированные, поэтому от версии к версии плеера, возможно, будут отличаться.

Вот и всё что хотел сказать. Может кому пригодится. Всё тупо, на самом деле. Спасибо slawa321 за проделанную первоначальную работу и предоставленую информацию.
SONY KDL-32CX520
PavelN65
Posts: 67
Joined: Wed Feb 15, 2012 11:23 am

Re: Помощь в создании подкастов

Post by PavelN65 »

Доброго времени суток!!!!
Вопрос, а можно ли в скрипте получить информацию о файле, такую как в MediaInfo или как при выполнении команды "Загрузить свойства файла"?
Samsung UE32D5500RW, Assistant AP-110, Fly IQ4404 Spark
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: Помощь в создании подкастов

Post by WendyH »

Я тут немного про другое хочу написать, но заодно и отвечу на предыдущее сообщение.
PavelN65 wrote:Вопрос, а можно ли в скрипте получить информацию о файле, такую как в MediaInfo или как при выполнении команды "Загрузить свойства файла"?
Я вот попробовал, но с ходу тоже не смог разобраться с HmsMediaInfoCreate и HmsMediaInfoGet... Ничего не получилось. Можно у Евгения поинтересоваться, если сильно нужно.

А теперь продолжение темы про uppod флеш плеер.

Мне тут tarzann5 интересную ссылку на плеер дал, где нет значений Client.codec_a и Client.codec_b.
http://allserials.tv/sites/all/librarie ... /uppod.swf

Мне показалось интересным и действительно, обычный плеер uppod, только нигде нет присвоения значений этим двум переменным. Но информация на сайте ресурса кодируется. Внимательно поглядев на всю туже функцию _foo класса Is (шифровка/дешифровка в плеере), там видно ещё пару проверок и дешифровка вполне себе работает и без этих заданных переменных. Просто если их нет, то таблицы замен берутся немного не так и сдругого места.
И вместо ответа ему в личку я решил написать статью для всех, сюда. Дополнить информацию по этому плееру.

В общем суть. Если вы увидели использование флеш плеера uppod с закодированными ссылками на ресурсе, заглянули в плеер и не нашли значений codec_a и codec_b, то..
То нужно найти другое значение, hash. Это может быть строчка типа вида:

internal var hash:String="0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";

Если такую строчку нашли, то процедура декодирования будет немного другой, но по суте тойже.
Вот пример функции декодирования на C++ script:

Code: Select all

// -----------------------------------------------------------------------------
// Расшифровка закодированного текста плеера uppod
char DecodeUppodText2(char sData) {
  variant char1, char2, hash, tab_a, tab_b; int i;

  hash = "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";

  // Проверяем, может не нужно раскодировать (json или ссылка)
  if ((Pos("{", sData)>0) || (LeftCopy(sData, 4)=="http")) return HmsUtf8Decode(sData);

  sData = DecodeUppod_tr(sData, "r", "A");
  
  hash = ReplaceStr(hash, 'ih', '\n');
  if (RightCopy(sData, 1)=='!') {
    sData = LeftCopy(sData, Length(sData)-1);
    tab_a = ExtractWord(4, hash, '\n');
    tab_b = ExtractWord(3, hash, '\n');
  } else {
    tab_a = ExtractWord(2, hash, '\n');
    tab_b = ExtractWord(1, hash, '\n');
  }

  sData = ReplaceStr(sData, "\n", "");
  for (i=1; i<=Length(tab_a); i++) {
    char1 = Copy(tab_b, i, 1);
    char2 = Copy(tab_a, i, 1);
    sData = ReplaceStr(sData, char1, "___");
    sData = ReplaceStr(sData, char2, char1);
    sData = ReplaceStr(sData, "___", char2);
  }
  sData = HmsUtf8Decode(HmsBase64Decode(sData));
  sData = ReplaceStr(sData, "hthp:", "http:");
  return sData;
}
string DecodeUppod_tr(string sData, string ch1, string ch2) {
  string s = ""; int i, loc3, nLen;

  if ((Copy(sData, Length(sData)-1, 1)==ch1) && (Copy(sData, 3, 1)==ch2)) {
    nLen = Length(sData);
    for (i=nLen; i>0; i--) s += Copy(sData, i, 1);
    loc3 = Int(StrToIntDef(Copy(s, nLen-1, 2), 0)/2);
    s = Copy(s, 3, nLen-5); i = loc3;
    if (loc3 < Length(s)) {
      while (i < Length(s)) {
        s = LeftCopy(s, i) + Copy(s, i+2, 99999);
        i+= loc3;
      }
    }
    sData = s + "!";
  }
  return sData;
}
На Pascal Script данную функцию переделать предлагаю самим.

Такие дела. Всё очень просто.
Я посмотрел другие плеера, даже где есть значения codec_a и codec_b, везде есть это значение hash. Это строка из четырёх частей, разделённая символами "ih", где первые две части это таблицы замен закодированного теста, а вторые две части тоже талицы замен (как codec_a и codec_b) только используются в случае, если закодированные данные кончаются на знак "!", при этом если этот знак есть, то он откидывается при декодировании. Это словами то, что выше написано кодом.
Вдруг кому пригодится.
SONY KDL-32CX520
PavelN65
Posts: 67
Joined: Wed Feb 15, 2012 11:23 am

Re: Помощь в создании подкастов

Post by PavelN65 »

WendyH Спасибо за полезные подсказки!!!!
Samsung UE32D5500RW, Assistant AP-110, Fly IQ4404 Spark
linkey
Posts: 110
Joined: Mon Oct 10, 2011 5:45 pm

Re: Помощь в создании подкастов

Post by linkey »

Попал на сайт который дает ссылки на многие ресурсы. Хотел сам осилить, но не смог. Не знаю то ли маловато знаний то ли времени. Вообщем прошу помощи! Сайт http://ru.savefrom.net/[code]SaveFrom.net делает скачивание из интернета простым и удобным. С нашей помощью можно бесплатно скачать аудио, видео и другие файлы с различных сайтов и социальных сетей: rapidshare.com, youtube.com, depositfiles.com, vkontakte.ru и других.[/code]
Добрался до скрипта savefrom.php который выдает шифрованную ссылку

Code: Select all

<html><body><script type="text/javascript">        (function(){
          window.u62=function(a,b,c){return a.replace(c,b);};
          try
          {
            eval(unescape("var%20x%3D%271f%28%22%5C%5C%5C%5CC%5C%
.............................................................
return;
          }
          catch(err){}
        })();</script></body></html>
попытался расшифровать но не смог! Простите ума не хватает.:)
samsung UE32D5000
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: Помощь в создании подкастов

Post by WendyH »

linkey wrote:...попытался расшифровать но не смог!
Нука-нука, интересно!
Можно рабочий пример, который выдаёт такой код html? А то тут из куска непонятно что там и как.

P.S.: Понял. Отставить. Уже разбираюсь.
SONY KDL-32CX520
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

Re: Помощь в создании подкастов

Post by WendyH »

linkey wrote:Попал на сайт который дает ссылки на многие ресурсы. Хотел сам осилить, но не смог. Не знаю то ли маловато знаний то ли времени. Вообщем прошу помощи!
В общем, многочасовой детектив по раскодированию их суперстарательно зашифрованного ответа был завершен, но удовлетворение было получено только от действа, чем от результата.. Ибо изначально я знал, что ветвь развития этого направления ведёт под откос.. Я вот про что. Чтобы яваскриптовые функции использовать, возвращяемые от сайта, нужно делать Eval. А делать Eval содержимого от чужого сайта - эта прямая дорожка к тому чтобы скатиться... Ну, в общем, нельзя. НЕЛЬЗЯ. Конечно можно. Но нельзя. Это плохой тон. Очень. Можно конечно замарочится и сделать свой парсер, который Eval делает не напрямую тупо. Такие есть, но это сложно.

Но чисто для тестирования я слелал. Куча недостатков: получение ссылок медленное. Не 100%. Например, в некоторых случаях получаем ответ, раскодируем, там получаем опять ссылку на iframe, делаем новый запрос, раскодируем... Как с rutube - очень медленно.
Иногда вообще у меня получение ссылок не срабатывало. Правда сегодня у них новость появилась "У нас возникли технические проблемы, работаем над их устранением.
16.11.2012". Может и с этим связяно. И вообще, я всё не проверял. Скорее всего там есть моменты, которые стоит ещё обрабатывать отдельно.

В общем, для простого любопытства и раз просили - вот, пример тест этого ресурса. Скрипт находится в "скрипте чтения списка списка ресурсов". Типа добавляем подкаст со ссылкой - и при обновлении он создаёт ссылки на варианты качества.

Ещё прикол в том, что ссылки с youtube он даёт не прямые, я вам скажу. А копии этих файлов со своего ресурса (что за фигня? они youtube скопировать решили?). В общем, если интресно, можете покапаться.

Ракодировка свожится к Eval данных, потом вырезанию участка кода, который может помешать, корректировке кода, и опяь Eval и так, пока не получаем конечный ответ. Переписал всё на Pascal Script, для вашего удобства. Но внимательный заметит, что я изначально всё делал на C++.
SONY KDL-32CX520
Post Reply