[Из песочницы] Получение видео из Tik Tok без водяного знака

?v=1

Добрый день, всем любителям 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;
	}
}

© Habrahabr.ru