[PHP] Получение видео из Tik Tok без водяного знака

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
20-Июл-2020 22:31

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

===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_php, #_php, #_tiktok, #_watermark, #_php
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 19:50
Часовой пояс: UTC + 5