Что нового

Как получить прямую ссылку на видео-файл

mef-t

Осваивающий
Сообщения
306
Репутация
30
Доброго времени суток.

Возможно не по тематике форума, но все же прошу помочь.
Если отнес в неправильный раздел, просьба перенести.

На просторах интернета существуют различные сайты, показывающие видео через всевозможные плееры и сторонние сервисы.
К таким относится, например сайт seasonvar.ru.
Просьба подсказать, каким образом можно получить прямую ссылку к видео-файлу?
Для примера можно взять страницу The Walking Dead

Я предполагаю, что используется сторонний сервис, которому передаются определенные параметры.
Просьба помочь разобраться: какие параметры, куда и как передаются, откуда берутся, и как в результате можно получить прямую ссылку.

P.S. Интересуюсь со следующей целью. На работе стоит прокси, блокирующий флэш и адресные строки, содержащие некоторые сочетания символов (mp4, mp3, flv, и прочие форматы видео и аудио файлов). Я научился скачивать видео и аудио файлы по прямой ссылке, содержащей данные сочетания в расширении. Хочу автоматизировать получение прямой ссылки.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
mef-t [?]
Просьба подсказать, каким образом можно получить прямую ссылку к видео-файлу?

Если не предполагается пользоваться сниффером, то алгоритм примерно такой:

- восстанавливаете конечный код интернет страницы, который получается после того, как отработают все JS (тут надо копать в сторону DOM и хорошо владеть HTML и JS).
- ищите на странице код плеера и параметры, которые ему передаются. В параметрах обычно указывается либо ссылка на воспроизводимый файл, либо плейлист.

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

И еще : конечная ссылка обычно действительна только для данного IP и может быть привязана к кукам, рефереру, и может еще к каким полям tcp заголовка.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8
OffTopic:
Смотрю ты тоже не слабо углублялся в сферу построения веб-парсера :laugh:


Я раньше тоже искал подобное, но в результате понял, что самое надёжное - это прямой источник ссылок, т.е там где их не шифруют и выкладывают в открытом виде.
 

sebun

Знающий
Сообщения
81
Репутация
5
Поскольку вопрос по Автоиту, хочу вынести предложение. Я не силен в работе с потоковым видео, но почти всегда это видео кешируется. И файлы кеша, как правило, находятся в %temp%, то есть можно открыть страницу и, дождавшись полной загрузки ролика, забрать готовый файл. Это первый момент. Дешево и сердито. Код твоего фильма в той ссылке:
Код:
8DGe76RezTLTmBmH7U7bm3Ac7Z0j9B0hm3EopB9DpvgTm3pRO3GZpjQWpcHTpuMe16pV85hd4ACC
Это говорит либо о применении кодирования base64, так как код плеера генерируется автоматом, либо это всего лишь какой то хеш. Так что в твоем случае остается либо вариант, предложенный asdf8, либо мой. Проверь оба и посмотри, что получиться. Удачи!
 

asdf8

Скриптер
Сообщения
564
Репутация
152
OffTopic:

CreatoR [?]
Я раньше тоже искал подобное, но в результате понял, что самое надёжное - это прямой источник ссылок, т.е там где их не шифруют и выкладывают в открытом виде.

По правде говоря, там, где есть что посмотреть, не встречал ссылок в открытом виде.

Способ, который я описал довольно трудоемкий, из плюсов у него - это возможность определить правильное наименование для закачиваемых файлов и возможность за раз скачать все серии какого-нибудь сериала.
Сейчас, когда гугл потихоньку заваливает мелкомягких, и многие сайты забили на поддержку ie6, а соответственно и Shell.Explorer.2 - более оптимальным способом для получения прямых ссылок считаю все-таки сниффинг.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Вариант прямых ссылок и кэширования: мне не подходит.
Во-первых. Этот вариант мной изучен и освоен. (не так давно видел здесь тему, о том что этим языком можно на фрилансере найти работу. нашел и углубленно освоил, имея при этом хорошую мотивацию)
Во-вторых. Хочу перейти на следующий уровень и данная тема как раз к нему и относится.
В-третьих. В пером сообщении я писал "На работе стоит прокси, блокирующий флэш". Т.е. я не могу на работе запустить данный файл на просмотр, и мне как раз и надо получить прямую ссылку.


Добавлено:
Сообщение автоматически объединено:

Подскажите ресурсы, где можно получить информацию по данной теме: декодирования, расшифровывание, и подобное.


Добавлено:
Сообщение автоматически объединено:

Получил следующий код javaScript:
Код:
var rewindInit=0;
var arNumberCount=;
function rewindingByHash()
{
	if(rewindInit>)
		{return}
	var hash=window.location.hash;
	if(-!=hash.indexOf("rewind"))
	{
		var mark=hash.split("=")[];
		var ser=mark;
		var min=0;
		if(-!=mark.indexOf("minute"))
		{
			var arMark=mark.split("_");
			ser=arMark[0]+"_"+arMark[];
			min=arMark[]
		}
		var number=arNumberOf[ser];
		if(number!==undefined)
		{
			$(window).scrollTop($("#vpcenter").offset().top);
			if(arNumberCount>100)
			{
				var page=Math.ceil(number/100);
				number=number%100;
				if(0==rewindInit)
				{
					rewindInit+=;
					uppodSend("videoplayer719","start"+page);
					rewindingByHash();
					return
				}
			}
			rewindInit+=;
			uppodSend("videoplayer719","start"+number);
			if(0!=min)
			{
				function seekMin()
					{uppodSend("videoplayer719","seek:"+(min*))}
				setTimeout(seekMin,1000)
			}
		}
	}
}
function userHistoryLog()
{
	var fileName=uppodGet("videoplayer719","get[file]").split("/")[];
	var idSeason="4584";
	$.post("/userHistory.php",{"file_name":fileName,"id_season":idSeason},function(){})
}
function plStat()
{
	var name=uppodGet("videoplayer719","gettext").split(" серия")[0];
	var idSeason="4584";
	$.post("plStat.php",{"name":name,"id_season":idSeason},function(){})
}
var goodxD={"m":"video","st":"/uppod/st.noga.txt","pl":"8DGe76RezTLIpjEa9U0HpcpZ9BljpvgcO3hRpBlRpygTO3RH9BEa9yQWp32bp=Me16pV85hd4ACC","uid":"videoplayer719"};
var params={wmode:"window",allowFullScreen:"true",allowScriptAccess:"always",id:"videoplayer719"};
new swfobject.embedSWF("http://datalock.ru/f7849ce7f79cb9c060fba916f95fd8968/player.swf?microstime=135149521","videoplayer719","724","593",".0.0",false,goodxD,params);
Как я понимаю, мне предстоит разобраться в API сервиса "Eppod". Но там не так много параметров. И не один из них не возвращает мне прямую ссылку файла.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
mef-t [?]
Получил следующий код javaScript:

Судя по тому, что строка
Код:
8DGe76RezTLIpjEa9U0HpcpZ9BljpvgcO3hRpBlRpygTO3RH9BEa9yQWp32bp=Me16pV85hd4ACC
с двух разных ip оказалась одинаковой - плеер берет ссылку с не динамического адреса, и она зашифрована более серьезно, чем параметры плеера.

Очень неприятно выглядит эта строка :
Код:
http://datalock.ru/f7849ce7f79cb9c060fba916f95fd8968/player.swf?microstime=135149521
плеер берется с динамического адреса - такое встречается довольно редко и пока не потратишь некоторое количество усилий не понятно до чего могли додуматься авторы этого, в плане защиты.

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

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Немного но что-то кажется есть.


В какой то момент вызывается скрипт w5.js на строке 293 и срабатывает функция
Код:
function uppodPlayers() {
    for (var a, b = document.getElementsByTagName("object"), c = 0; c < b.length; c++)
        a = b[c].id, -1 < a.indexOf("player") & -1 == uppod_instances.indexOf(a) && (uppod_instances[c] = a, uppod_instances_id[a] = c)
}
которая запрашивает через GET http://seasonvar.ru/playls/b4fbd67d472787203a1ef7e3606606e48/7926/list.xml?rand=0.35298784729093313

В ответ приходит что то зашифрованное
sTfI4BFn4BRct=wXvDeu7UMd4v0it=wXwjEQV7kgdtBAV8jljINByaQu8=fctkfR7vacmvnHwjxuzU0jwuIumUFe7vfR4=wXwjzn9jmJ9j7apygcwuIumZRemSwXwZhVtkAX....


Тут не понятно что, в запросе главное это b4fbd67d472787203a1ef7e3606606e48

Дальше, срабатывает jquery.min.js на строке 2644
тут какой то кусок кода
Код:
h.send(c.hasContent && c.data || null), d = function(a, e) {
итд
который запрашивает через POST
URL:http://seasonvar.ru/userHistory.php
и внимание, тут самое интересное, в параметрах передается наша ссылка на файл
file_name:8f_the.walking.dead.s04e01.web-dl.720.rus.eng.novafilm.tv.a1.15.10.13.mp4
id_season:7926

И в конечном виде получается такая ссылка (ссылку генерирует похоже сам флэш плеер) у меня запрас на этот файл был только после нажатия Play:
Request URL:http://data07-cdn.datalock.ru/film/b4fbd67d472787203a1ef7e3606606e4/8f_the.walking.dead.s04e01.web-dl.720.rus.eng.novafilm.tv.a1.15.10.13.mp4
Request Method:GET

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



Добавлено:
Сообщение автоматически объединено:

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
У меня эта ссылка битая.
Проверил ещё раз, всё отлично качается.
Так же можно смотреть через WMP online.

P.S. CreatoR для чистоты эксперимента вставьте ссылку в IE , он всё качает и не пытается воспроизвести.


Добавлено:
Сообщение автоматически объединено:

inververs [?]
у меня запрас на этот файл был только после нажатия Play
Естественно :smile:

P.S. Такого плана вещи я стараюсь делать посредством WinHttp.WinHttpRequest.5.1.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
у меня в Лисе встроен плагин от download master. при переходе на указанный сайт над окном видео появляется панель для скачивания. и выдает вот такую ссылку http://data10-cdn.datalock.ru/v1/2287/ld.mp4
при вставке в браузер появляется отдельное окно с плеером. сам же мастер качает видео по этой ссылке
ссылка на ходячие мертвецы такая
http://data07-cdn.datalock.ru/film/bc8de03cd3d6d79cc6333636e6c5bf6e/8f_the.walking.dead.s04e01.web-dl.720.rus.eng.novafilm.tv.a1.15.10.13.mp4
вобщем, для каждого посетителя и для всякого раза ссылка будет своя
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
будут ли вызовы этих данных при отключенном флэш
Вызовов не будет, так как не будет нажата кнопка Play. Но!
Play можно инициировать отправкой соответствующего запроса.

Так же тут задействован сервис Upod.
Кнопка Play, по сути, отправляет запрос через API данного сервиса. Возможно, сайт использует команды не напрямую, а переработав API, или еще чего, но это не важно.
Как я понял, list.xml возвращает именно название файла, возможно включает полный путь, возможно с чем то еще. Таким образом, или на сайта, или на самом сервисе UPOD стоит кодирование.

Где можно почитать на тему получения алгоритма и ключа, зная кодированный и декодированный текст?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mef-t [?]
Как я понял, list.xml возвращает именно название файла, возможно включает полный путь, возможно с чем то еще.
Вы верно рассуждаете :smile:
Да, там есть прямая ссылка.
Данные в файле list.xml в формате JSON, к тому же они закодированы.

Где можно почитать на тему получения алгоритма
На нашем форуме ;D

Код:
#include<Encoding.au3>
#include<Array.au3>

; For seasonvar.ru only
$sJSON = _PlayListDecode('ссылка на list.xml')
If Not @error Then ConsoleWrite($sJSON)

Func _PlayListDecode($s_URL)
	
	$s_URL = BinaryToString(InetRead($s_URL))
	If @error Then Return SetError(1, 0, 0)

	$a_Encoded = StringSplit($s_URL, "", 2)
	$a_Codec_a = StringSplit("JpvnsR03Tmwu9xgaGLUXztb7H=", "", 2)
	$a_Codec_b = StringSplit("fNW5elVDyZIiMoQ1B826cd4YkC=", "", 2)
		
	For $i = 0 To UBound($a_Encoded)-1
		For $j = 0 To UBound($a_Codec_a)-1
			If $a_Encoded[$i] == $a_Codec_a[$j] Then
				$a_Encoded[$i] = $a_Codec_b[$j]
				ExitLoop 
			ElseIf $a_Encoded[$i] == $a_Codec_b[$j] Then
				$a_Encoded[$i] = $a_Codec_a[$j]
				ExitLoop
			EndIf
		Next
	Next
	
	$s_Result = BinaryToString(_Encoding_Base64Decode(_ArrayToString($a_Encoded,'')), 4)

	Return SetError(0, 0, $s_Result)
EndFunc;==>_PlayListDecode
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Браво! Невероятно. Garrett как вы смогли расшифровать? Методом проб? Расскажите.


Добавлено:
Сообщение автоматически объединено:

Гдето обрезается, допустим оригинальная ссылка такая
8f_the.walking.dead.s04e01.web-dl.720.rus.eng.novafilm.tv.a1.15.10.13
А на выходе he.walking.dead.s04e01.web-dl.720.rus.eng.novafilm.tv.a1.15.10.13.mp4

Обрезается 8f_t
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs [?]
Да, я знаю. Возможно, у них защита от любителей посещать их сайт не из браузера.
Могу сказать только то, что функция рабочая, так как если вы зайдёте из браузера, скопируете содержимое list.xml и подставите в функцию:
Код:
$a_Encoded = StringSplit("сюда", "", 2)

то ссылка будет целой.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Если открыть чисты (новый) браузер, или просто потереть кэш и куки, то при открытии данной страницы браузер так же вернет без "8f_t".
тут походу участвуют куки

При этом описанным ниже методов я получаю ошибку "The requested action with this object has failed."
Код:
$URL = 'http://seasonvar.ru/playls/b4fbd67d472787203a1ef7e3606606e48/7926/list.xml'
;~ $ProxyServer = 'ip:port'
;~ $ProxyUser = 'login'
;~ $ProxyPass = 'password'
$oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
;~ $oHTTP.SetProxy(2, $ProxyServer)
$oHTTP.Open('GET', $sUrl, False)
;~ $oHTTP.SetCredentials($ProxyUser, $ProxyPass, 0)
$oHTTP.Send('')
$oHTTP.WaitForResponse
$sHTML = $oHTTP.ResponseText
ConsoleWrite($sHTML & @CRLF)
Другими словами, передать куки как то не получилось.

Ну и последнее. ссылка все равно ведет на флешь-плеер. А не на файл :( Обидно.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mef-t [?]
тут походу участвуют куки
Однозначно. Если вы в запрос добавите cookie, то вернется, то, что нужно.

При этом описанным ниже методов я получаю ошибку "The requested action with this object has failed."
1. Потому что нужно использовать метод .ResponseBody
2. Нужно в метод .Open передать переменную $URL а не $sUrl

Другими словами, передать куки как то не получилось.
А вы их передавали? :blink:
ссылка все равно ведет на флешь-плеер
С чего вы взяли?


Добавлено:
Сообщение автоматически объединено:

Код:
#include<Encoding.au3>
#include<Array.au3>

Local $sURL = 'http://seasonvar.ru/playls/4c4d05b93639f7a2ac1b32f185d7a7928/7926/list.xml?rand=0.060564481653273106'
Local $sCookie = 'IIIIIIIIIIIIIIIII=WerTylv_tr; sva=lVe324PqsI24' ; не менять!!!

ConsoleWrite('------------------------------------ Запрос №1 ------------------------------------' & @CR)
Local  $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTTP.Open("GET", $sUrl, true)
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36")
$oHTTP.SetRequestHeader("Host", "seasonvar.ru")
$oHTTP.SetRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
$oHTTP.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4")
$oHTTP.SetRequestHeader("Cookie", $sCookie)
$oHTTP.SetRequestHeader("Connection", "Keep-Alive")
$oHTTP.SetRequestHeader("Referer", "http://seasonvar.ru/serial-7926-Hodyachie_mertvetcy-4-season.html")
$oHTTP.Send()
$oHTTP.WaitForResponse()
ConsoleWrite($oHTTP.GetAllResponseHeaders()& @CR)
$sHTML = $oHTTP.ResponseBody()
ConsoleWrite('------------------------------------ Запрос №1 ------------------------------------' & @CR)

ConsoleWrite(_PlayListDecode(BinaryToString($sHTML)))

Func _PlayListDecode($s_URL)
	
	$a_Encoded = StringSplit($s_URL, "", 2)
	$a_Codec_a = StringSplit("JpvnsR03Tmwu9xgaGLUXztb7H=", "", 2)
	$a_Codec_b = StringSplit("fNW5elVDyZIiMoQ1B826cd4YkC=", "", 2)
		
	For $i = 0 To UBound($a_Encoded)-1
		For $j = 0 To UBound($a_Codec_a)-1
			If $a_Encoded[$i] == $a_Codec_a[$j] Then
				$a_Encoded[$i] = $a_Codec_b[$j]
				ExitLoop 
			ElseIf $a_Encoded[$i] == $a_Codec_b[$j] Then
				$a_Encoded[$i] = $a_Codec_a[$j]
				ExitLoop
			EndIf
		Next
	Next
	
	$s_Result = BinaryToString(_Encoding_Base64Decode(_ArrayToString($a_Encoded,'')), 4)

	Return $s_Result
EndFunc;==>_PlayListDecode
 
Верх