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

Интернет-телевидение, интернет-радио, подкасты, IPTV
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post by WendyH »

linkey wrote:Помогите пожалуйста пройти авторизацию на lostfilm.tv
Приехал такой вчера, думаю, а почему никто не подскажет, чё там сложного может быть? И сам как запарился... Сегодня на работе осенило - проверил, и действительно, вроде сработало. Долго догадывался до "INTERNET_FLAG_NO_AUTO_REDIRECT".
В общем что у меня получилось.
Для начала, в моём случае, в скрипте в самом вверху глобальные:

Code: Select all

const
  INTERNET_FLAG_NO_AUTO_REDIRECT = $00200000; 
var
  gsHeaders: String;
Потом сразу хочу дать пояснения. Тут привожу две функции. Вторая: "LoginToLostfilm()" - предназначена для, как раз, авторизации и формирования cookies в переменной gsHeaders, чтобы последующие запросы выполнять с передачей этих http заголовков (значения логина и пароля, как обычно, берутся из настроек подкаста на вкладке "Подключение").
А первая функция: "LoadUrl(...)" как раз нужна такая подправленная, с "INTERNET_FLAG_NO_AUTO_REDIRECT" и последующим, если необходимо, запросом по "Location" (перенаправления).
Вот функции:
[+] pascal script

Code: Select all

// --------------------------- функция загрузки страницы с поддержкой gzip ----
// ======       ===============================================================
function LoadUrl(sLink: string; sMethod: string = 'GET'; sHeaders: string = ''): string;
var
  sHtml, sUrlServer, sRequestPage, sPostData, sAnswHeaders, sValue: string;
begin
  Result:=''; if not HmsRegExMatch('^http://(.*)', sLink, sUrlServer) then Exit;
  sRequestPage:='/'; sPostData:=''; sAnswHeaders:=''; 
  HmsRegExMatch2('^(.*?)(/.*)', sUrlServer, sUrlServer, sRequestPage);
  if sMethod = 'POST' then HmsRegExMatch2('(.*?)\?(.*)', sRequestPage, sRequestPage, sPostData);
  sHtml := HmsSendRequestEx(sUrlServer, sRequestPage, sMethod,
                            'application/x-www-form-urlencoded',
                            sHeaders, sPostData, 80, INTERNET_FLAG_NO_AUTO_REDIRECT, sAnswHeaders, true);
  if HmsRegExMatch('Location: (.*?)\r', sAnswHeaders, sRequestPage) then begin
    HmsRegExMatch2('^http://(.*?)(/.*)', sRequestPage, sUrlServer, sRequestPage);
    sHtml := HmsSendRequestEx(sUrlServer, sRequestPage, sMethod,
                            'application/x-www-form-urlencoded',
                            sHeaders, sPostData, 80, 0, sAnswHeaders, true);
  end;
  sHtml := HmsRemoveLineBreaks(HmsUtf8Decode(sHtml));
  Result := sHtml;
end;
// ------------------------------------------------------- Вход в lostfilm ----
// =======               ======================================================
procedure LoginToLostfilm();
var
  sHtml, sMail, sPass, sUrlServer, sRequestPage, sData, sAnswHeaders, sRefBogiRu: string;
  re: TRegExpr;
begin
  gsHeaders := 'http://www.lostfilm.tv/'#10#13;
  gsHeaders := gsHeaders+'Accept-Encoding: gzip, deflate'#10#13;
  gsHeaders := gsHeaders+'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0'#10#13;
  gsHeaders := gsHeaders+'Cache-Control: no-cache'#10#13;
  gsHeaders := gsHeaders+'Connection: Keep-Alive'#10#13;

  sRequestPage := 'login.php?referer=http%3A%2F%2Fwww.lostfilm.tv%2F';
  sMail := HmsHttpEncode(HmsUtf8Encode(mpPodcastAuthorizationUserName)); // Логин
  sPass := HmsHttpEncode(HmsUtf8Encode(mpPodcastAuthorizationPassword)); // Пароль
  sData := 'login='+sMail+'&password='+sPass+'&module=1&target=http%3A%2F%2Flostfilm.tv%2F&repage=user&act=login';
  sHtml := HmsSendRequestEx('login.bogi.ru', sRequestPage, 'POST', 
                            'application/x-www-form-urlencoded;', gsHeaders, 
                             sData, 80, 0, sAnswHeaders, true);
  if not HmsRegExMatch('<form[^>]+action="(.*?)"', sHtml, sRequestPage) then begin
    HmsLogMessage(1, mpTitle+': Не прошла авторизация на lostfilm.tv. Неправильный логин/пароль?');
    Exit  
  end;
  // В полученной странице содержится форма отправки данных - формируем запрос
  sData := '';
  re := TRegExpr.Create('<input[^>]+name="(.*?)"[^>]+value="(.*?)"', PCRE_SINGLELINE);
  try
    if re.Search(sHtml) then repeat begin
      sData := sData + '&' + re.Match(1) + '=' + HmsHttpEncode(re.Match(2)); 
    end until not re.SearchAgain;
  finally
    re.Free;
  end;
  HmsRegExMatch2('^http://(.*)(/.*)', sRequestPage, sUrlServer, sRequestPage);
  // sRefBogiRu - для подмены в gsHeaders поля referer 
  sRefBogiRu := 'http://login.bogi.ru/login.php?referer=http%3A%2F%2Fwww.lostfilm.tv%2F';
  gsHeaders := ReplaceStr(gsHeaders, 'http://www.lostfilm.tv/', sRefBogiRu);

  sHtml := HmsSendRequestEx(sUrlServer, sRequestPage, 'POST', 
                            'application/x-www-form-urlencoded;', gsHeaders, 
                             sData, 80, INTERNET_FLAG_NO_AUTO_REDIRECT, sAnswHeaders, true);
  sData := ''; // Устанавливаем все куки
  re := TRegExpr.Create('Set-Cookie:(.*?)\r', PCRE_SINGLELINE);
  try
    if re.Search(sAnswHeaders) then repeat begin 
      sData := sData + re.Match + '; '; 
    end until not re.SearchAgain;
  finally
    re.Free;
  end;
  gsHeaders := gsHeaders + 'Cookies: ' + sData + #10#13; 
  // Возвращаем значение referer наместо
  gsHeaders := ReplaceStr(gsHeaders, sRefBogiRu, mpFilePath);
end;
И использование получится примерно такое. В начале исполнения скрипта (я так понимаю скрипта получения ссылки) делаем вызов:

Code: Select all

  LoginToLostfilm();
А потом, когда у нас после этого есть готовая gsHeaders делаем вызовы с передачей этой переменной с заголовками:

Code: Select all

  sHtml := LoadURL('http://www.lostfilm.tv/rdr.php?c=174&s=1&e=13', 'GET', gsHeaders);
Где 'http://www.lostfilm.tv/rdr.php?c=174&s=1&e=13' - такого вида должны быть ссылки на серии. А в полученном ответе уже по каким-то там своим критериям берёте ссылку. Там обычно их несколько, с разным качеством/озвучкой, вида

Code: Select all

http://tracktor.in/td.php?s=irKqs4W%2BfI6N3KJg29IeYSitXyehEYH9E3DLKVz9WWkur59dtlDcCyp6F3lMXUnm8QddpV6y025RvXY6XOkgJuc%2BozQP0425iKrvR5mzwYANLrSVMEGNxVQ8Qct4Sj%2Fg
Которая уже, по-мойму, просто временная ссылка на торрент файл и, вроде, можно уже скачивать без наших gsHeaders (по крайней мере эту ссылку получилось вставить в браузер без кук и скачать торрент файл).
Вот.
SONY KDL-32CX520
linkey
Posts: 110
Joined: Mon Oct 10, 2011 5:45 pm

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

Post by linkey »

WendyH wrote: В общем что у меня получилось.
Спасибо большое.
samsung UE32D5000
Eugene
Posts: 2805
Joined: Tue Sep 16, 2008 7:30 pm

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

Post by Eugene »

Возможно полезная информация: разработчики медиа-платформ рекомендуют использовать Charles - Web Debugging Proxy Application http://www.charlesproxy.com/
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post by WendyH »

Хочу поделиться опытом, как я исследовал получение ссылок на bigcinema.tv и ex-fs.net. После просьбы tarzann5 о помощи в разборе получения ссылок этих ресурсов, через долгое время, я наконец взялся и начал исследовать эти сайты. Начал делать тестовые подкасты, в итоге вообще сделал полноценные под себя.

Так вот. На обоих ресурсах для плеера uppod используются кодированные ссылки. Но дело в том, что в закодированные данные также добавляется и "мусорные" байты. В итоге, если раскодировать как обычно, со взятыми из их плеера uppod данными для дешифровки - получить можно "битые" раскодированные ссылки или вообще кашу.
Где и когда эти мусорные данные добавляются я так и не нашёл. Однако использовал другой метод вычисления.

Пробуем раскодировать ссылки и если они частично получаются битыми или просто выглядят как-будто правильно, но не работают - значит, скорее всего в шифровку добавили "мусор".

Пробуя получать ссылки, пытаемся понять какого вида они должны быть. В моём случае они были вида:
http://bigcinema.tv/pl/uhr_g-BOy2MjWwxX ... txt/582314
но не работали. Точнее надо отдать должное авторам bigcinema в запутывании - по этой ссылке отдавался закодированный плейлист, но не рабочий.

Пишем функцию кодирования ссылки - переписываем свою "DecodeUppodText" наоборот
- таблицы замещения меняем местами,
- HmsUtf8Decode(HmsBase64Decode(sData)) в конце функции убираем и ставим в начало HmsBase64Encode(HmsUtf8Encode(sData).

Слушаем через Charles запросы с сайта и видим реальную ссылку, например:
http:// b.bigcinema.tv /title/uhr_g-BOy2MjWwxXJZA2uiwxMzg3NTI3MjQw/582314/s01e01.flv
Видим, что средняя переменная часть похожи, но немного отличаются. Проверяем тем, что берём эту часть и заменяем в нашей раскодированной немного неправильной ссылке - раскодируем оттуда данные и получаем рабочий плейлист.
Значит на самом деле, раскодированная ссылка с сайта, должна иметь вид не
http:// bigcinema.tv /pl/uhr_g-BOy2MjWwxXJZA2uMNM©wxMzg3NTI3MjQw/txt/582314, как мы получили изначально, а
http:// bigcinema.tv /pl/uhr_g-BOy2MjWwxXJZA2uiwxMzg3NTI3MjQw/txt/582314
Зашифровываем эту настоящую ссылку и получаем кодированную, какая она "должна" быть на сайте
Сравниваем ссылку с сайта и нами кодированную реальную ссылку.
RWaQBfmU4GNxkGJxto9buS3Q6TV8tCVnRWNDklnCi5ZliHx765huSyxce19JiZGx65hJMoBIiyaNeQnqv7BU6WhQ4IvLejepJAEE - с сайта
RWaQBfmU4GNxkGJxto9buS3Q6TV8tCVnRWNDklnCi5ZliHx765huSyxce19 x65hJMoBIiyaNeQnqv7BU6WhQ4IvLejepJAEE - закодированная нами.
Я поставил пробелы там, где идёт отличие. И видим, что на сайте лишние символы "JiZG". Повторяем эту процедуру ещё для разных ссылок, и видим, что "лишние" символы всегда одни и те же, но в разных местах.
Просто в коде получения ссылки пишем вырезку "мусорных" символов перед раскодировкой и всё.

С ex-fs.net всё было намного сложнее. Я переписал функцию декодирования текста плеера uppod - добавил туда недостающую (видимо ранее не пригождалась) функцию "tr". Она есть во всех плеерах uppod и является стандартной.
Я отредактировал этот пост, добавил в функцию DecodeUppodText2 строчку вида
sData = DecodeUppod_tr(sData, "r", "A");
и внизу функцию "DecodeUppod_tr". Эта универсальная функция должна работать для всех, у кого в плеере uppod нет данных client_codec_a и client_codec_b, но есть hash.
Может кому пригодится и сэкономит время.
SONY KDL-32CX520
WendyH
Posts: 393
Joined: Fri Apr 13, 2012 7:59 pm

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

Post by WendyH »

Также в подкасте bigcinema.tv испробовал давнюю идею получения длительности видео непосредственно из файла flv.
Если на ресурсе нет указания длительности фильмов или серий и при этом используются только видео в формате flv, то можно использовать следующую функцию (код C++ script):
[+] GetFlvDuration

Code: Select all

// ----------------------------- Получение длительности видео из файла flv ----
char GetFlvDuration(char sLink) {
  char s, sHeaders='', sServ, sTime='01:40:00.000'; int nLastBlockSize, n1, n2, n3;

  // Преобразуем ссылку в часть сервер / объект загрузки
  if (!HmsRegExMatch2('//(.*?)(/.*)', sLink, sServ, sLink)) return sTime;

  // Проверяем, flv ли это файл и поддерживается ли Range (докачка)
  HmsSendRequestEx(sServ, sLink, 'HEAD', '', sHeaders, '', 80, 0, sHeaders, true);
  if (!HmsRegExMatch('Content-Type: video/x-flv.*?Accept-Ranges: bytes', sHeaders, '', 1, PCRE_SINGLELINE)) return sTime;

  // Берём последние 4 байта flv файла - это размер последнего блока
  sHeaders = 'http://'+sServ+'/\r\nRange: bytes=-4\r\n';
  s = HmsSendRequestEx(sServ, sLink, 'GET', '', sHeaders, '', 80, 0, sHeaders, true);
  if (Length(s) != 4) return sTime;
  nLastBlockSize = Ord(Copy(s, 3, 1)) * 256 + Ord(Copy(s, 4, 1));

  // Берём весь последний блок flv
  sHeaders = 'http://bigcinema.tv/\r\nRange: bytes=-'+IntToStr(nLastBlockSize)+'\r\n';
  s = HmsSendRequestEx(sServ, sLink, 'GET', '', sHeaders, '', 80, 0, sHeaders, true);
  // Первые три с половиной байта (тут беру только целых три) - это длительность в миллисикундах
  n1 = Ord(Copy(s, 1, 1)) * 256 * 256;
  n2 = Ord(Copy(s, 2, 1)) * 256;
  n3 = Ord(Copy(s, 3, 1));
  sTime = HmsTimeFormat(Int((n1+n2+n3)/1000))+'.000';
  return sTime;
}
(уж очень я не люблю видео с неуказанным временем длительности, неудобно пользоваться промоткой)
Вдруг идея где пригодится.

А ещё советую всем в функции HmsDownloadURL третий параметр выставлять в true. Ускоряет загрузку Очень.
SONY KDL-32CX520
Eugene
Posts: 2805
Joined: Tue Sep 16, 2008 7:30 pm

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

Post by Eugene »

Возможно будет полезно: программа позволяет использовать различные типы (видео, музыка, фото) медиа-ресурсов в одной папке, для этого можно использовать свойство

Code: Select all

mpiUPnpClass = 38;
Значения свойства:
Видео: 'object.item.videoItem'
Музыка: 'object.item.audioItem'
Фото: 'object.item.imageItem'
Post Reply