Добрый день, всем любителям habr. В этой статье я хочу поделиться с Вами как можно получить видео с Tik Tok без водяного знака, с помощью такого языка как PHP.
В настоящее время Tik Tok набирает популярность и было бы не прилично не написать про него маленькую статейку, и так, меньше слов, больше дела.
Создадим класс под названием TikTok, он будет содержать три метода и одно свойство.
Методы:
Свойства:
Создадим конструктор для передачи url адреса.
Метод cUrl. Отправляем запрос на сервер и получаем ответ.
Метод redirectUrl
Метод getUrl.
Создадим объект на основе класса, передадим в него ссылку.
Все готово.
Примеры:
Весь код целиком
В настоящее время 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; } }
