bTV имат доста слабичка защита на стрийма. Нова поне ползват криптиране на стрийма с hls.key, което не е никакъв проблем за чупене, но пак е нещо. бТВ се защитават само с един динамично генериран адрес, който обаче е твърде достъпен, поне според мен. Сменят масива с адреси всеки ден, но факта, че присъства статично в ajax адрес, който може да се отвори и прочете от всеки, прави цялата защита смешна. За любителите на кепчъринга и за тираджиите прилагам скромно туториалче. Използваните инструменти са: Firefox, wget, jq, ffmpeg.
И по-лесния вариант за прихващане на видеото само с Firefox.
С тази техника може да се прихване почти всеки видео стрийм или да се свали видео файл. Когато видеото е криптирано, може да се записва стрийма, но по-инстересно е да се свалят всички файлове с високо качество и да се декриптират ръчно, като се ползва hls-ключ и оригиналните ts-файлове.
Ето и простичък PHP-код, който върши цялата работа по екстрактването на линка:
<?php
$wpage = file_get_contents("https://btvplus.bg/live/");
preg_match("@url: +'([^']*)@", $wpage, $m);
$config_page = file_get_contents("https://btvplus.bg".$m[1]);
$j = json_decode($config_page, true);
echo $j['info']['file'];
?>
Трябва да се отбележи, че bTV детектват, дали url-адреса се зарежда от чужбина и го ограничават (с http response code 301), но е много вероятно самия стрийм да не е ограничен. Не съм го пробвал. Хубавото е, че веднъж гепен адреса на стрийма, може да се гледа цял ден.
————————
И един бонус – сорс код за C#, който гепва стринга и го плейва с ffplay. За целта ffplay трябва да е в директорията с компилираното exe или в променливата Path на обкръжението на Win.
using System;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
using System.Diagnostics;
public class playBtv{
static void Main(string[] args){
string baseUrl = "https://btvplus.bg";
string url1 = baseUrl + "/live/";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
WebClient client = new WebClient();
string htmlCode1 = client.DownloadString(url1);
string pattern = "url:";
StringReader strReader = new StringReader(htmlCode1);
string aLine, url2 = null;
while(strReader.Peek() >= 0){
aLine = strReader.ReadLine().Trim();
if(aLine.Contains(pattern)){
Match match = Regex.Match(aLine, @"([^']*)'([^']*)");
url2 = baseUrl + match.Groups[2].Value;
break;
}
}
string htmlCode2 = client.DownloadString(url2);
Match match2 = Regex.Match(htmlCode2, "(file\":\")([^\"]*)");
string m3u8 = match2.Groups[2].Value.Replace("\\","");
Process.Start("ffplay", m3u8);
}
}
Компилира се с някой от наличните в Windows C# компилатори от .NET Frameworks. Примерно:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /target:exe btv_play.cs