Получение видео из 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; 	} } 

ссылка на оригинал статьи https://habr.com/ru/post/511796/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *