[Из песочницы] Получение видео из Tik Tok без водяного знака
Добрый день, всем любителям habr. В этой статье я хочу поделиться с Вами как можно получить видео с Tik Tok без водяного знака, с помощью такого языка как PHP.
В настоящее время Tik Tok набирает популярность и было бы не прилично не написать про него маленькую статейку, и так, меньше слов, больше дела.
Создадим класс под названием TikTok, он будет содержать три метода и одно свойство.
Методы:
- cUrl (curl запрос)
- redirectUrl (получить ссылку после redirect)
- getUrl (получить ссылку на видео)
Свойства:
- public $url;
Создадим конструктор для передачи url адреса.
public function __construct (string $url) {
$this->url = $url;
}
Метод cUrl. Отправляем запрос на сервер и получаем ответ.
private function cUrl (string $url) :? string {
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/79.0.3945.130 Safari/537.36';
$curl = curl_init($url);
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_USERAGENT => $user_agent,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($curl);
if ($response === FALSE) {
curl_close($curl);
return NULL;
}
$httpCode = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpCode !== 200)
return NULL;
return $response;
}
Метод redirectUrl
private function redirectUrl (string $url) :? string {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$headers = get_headers($url, 1);
return $headers['Location'] ?? NULL;
}
Метод getUrl.
public function getUrl () :? string {
// Получаем код страницы.
$responseHtml = $this->cUrl($this->url);
// Находим ссылку на видео.
if (!preg_match('/contentUrl\\":\\"(.*?)\\",\\"embedUrl/ui', $responseHtml, $mInterUrl))
throw new \Exception('Ссылка не найдена!');
// Отправляем запрос и в ответе получаем видео в виде bytecode
if (!$respByteVideo = $this->cUrl($mInterUrl[1]))
throw new \Exception('Запрос не обработался!');
// Чтобы регулярное выражение начало искать, нужно перевести в формат utf-8.
$strByteVideo = mb_convert_encoding($respByteVideo, 'UTF-8', 'auto');
// Ищем специальный id видео, чтобы на его основе построить запрос.
if (!preg_match('/vid:(.*?)%/sui', $strByteVideo, $mVideoId))
throw new \Exception('id video не было найдено!');
// Уберём лишние символы.
$url = str_replace("\0", '', $mVideoId[1]);
// Строим ссылку для получения видео без водяного знака.
$url = "https://api.tiktokv.com/aweme/v1/playwm/?video_id=$url";
// Так как эта redirect на другую ссылку к видео, то пытаемся получить конечную ссылку после redirect
return $this->redirectUrl($url);
}
Создадим объект на основе класса, передадим в него ссылку.
$TikTok = new TikTok('https://www.tiktok.com/@sonyakisa8/video/6828487583694163205?lang=ru');
echo $TikTok->getUrl();
Все готово.
Примеры:
Весь код целиком
class TikTok {
/**
* @var string
*/
public $url;
public function __construct (string $url) {
$this->url = $url;
}
/**
* @return null|string
* @throws Exception
*/
public function getUrl () :? string {
// Получаем код страницы
$responseHtml = $this->cUrl($this->url);
// Находим ссылку на видео
if (!preg_match('/contentUrl\\":\\"(.*?)\\",\\"embedUrl/ui', $responseHtml, $mInterUrl))
throw new \Exception('Ссылка не найдена!');
// Отправляем запрос и в ответе получаем видео ввиде bytecode
if (!$respByteVideo = $this->cUrl($mInterUrl[1]))
throw new \Exception('Запрос не обработался!');
// Чтобы регулярное выражение начало искать, нужно перевести в формат utf-8
$strByteVideo = mb_convert_encoding($respByteVideo, 'UTF-8', 'auto');
// Ищем специальный id видео, чтобы на его основе построить запрос
if (!preg_match('/vid:(.*?)%/sui', $strByteVideo, $mVideoId))
throw new \Exception('id video не было найдено!');
// Уберём лишние символы
$url = str_replace("\0", '', $mVideoId[1]);
// Строим ссылку на получения видео без водяного знака
$url = "https://api.tiktokv.com/aweme/v1/playwm/?video_id=$url";
// Так как эта redirect на другую ссылку к видео, то пытаемся получить ее после redirect
return $this->redirectUrl($url);
}
/**
* Получение url адреса после redirect
*
* @param string $url
* @return null|string
*/
private function redirectUrl (string $url) :? string {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$headers = get_headers($url, 1);
return $headers['Location'] ?? NULL;
}
/**
* @param string $url
* @return null|string
*/
private function cUrl (string $url) :? string {
$user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36';
$curl = curl_init($url);
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_USERAGENT => $user_agent,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($curl);
if ($response === FALSE) {
curl_close($curl);
return NULL;
}
$httpCode = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpCode !== 200)
return NULL;
return $response;
}
}