rss-bridge/bridges/TikTokBridge.php

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

106 lines
2.9 KiB
PHP
Raw Normal View History

2022-06-19 04:59:39 +03:00
<?php
2022-06-19 04:59:39 +03:00
class TikTokBridge extends BridgeAbstract
{
const NAME = 'TikTok Bridge';
const URI = 'https://www.tiktok.com';
const DESCRIPTION = 'Returns posts';
const MAINTAINER = 'VerifiedJoseph';
const PARAMETERS = [
'By user' => [
'username' => [
'name' => 'Username',
'type' => 'text',
'required' => true,
'exampleValue' => '@tiktok',
]
2022-06-19 04:59:39 +03:00
]];
2022-06-19 04:59:39 +03:00
const TEST_DETECT_PARAMETERS = [
'https://www.tiktok.com/@tiktok' => [
'context' => 'By user', 'username' => '@tiktok'
]
2022-06-19 04:59:39 +03:00
];
2022-06-19 04:59:39 +03:00
const CACHE_TIMEOUT = 900; // 15 minutes
2022-06-19 04:59:39 +03:00
public function collectData()
{
$html = getSimpleHTMLDOMCached('https://www.tiktok.com/embed/' . $this->processUsername());
$author = $html->find('span[data-e2e=creator-profile-userInfo-TUXText]', 0)->plaintext ?? self::NAME;
$videos = $html->find('div[data-e2e=common-videoList-VideoContainer]');
foreach ($videos as $video) {
$item = [];
// Omit query string (remove tracking parameters)
$a = $video->find('a', 0);
$href = $a->href;
$parsedUrl = parse_url($href);
$url = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . '/' . ltrim($parsedUrl['path'], '/');
$image = $video->find('video', 0)->poster;
$views = $video->find('div[data-e2e=common-Video-Count]', 0)->plaintext;
$enclosures = [$image];
$item['uri'] = $url;
$item['title'] = 'Video';
$item['author'] = '@' . $author;
$item['enclosures'] = $enclosures;
2022-06-19 04:59:39 +03:00
$item['content'] = <<<EOD
<a href="{$url}"><img src="{$image}"/></a>
<p>{$views} views<p><br/>
2022-06-19 04:59:39 +03:00
EOD;
$this->items[] = $item;
}
}
2022-06-19 04:59:39 +03:00
public function getURI()
{
switch ($this->queriedContext) {
case 'By user':
return self::URI . '/' . $this->processUsername();
default:
return parent::getURI();
}
}
2022-06-19 04:59:39 +03:00
public function getName()
{
switch ($this->queriedContext) {
case 'By user':
return $this->processUsername() . ' - TikTok';
2022-06-19 04:59:39 +03:00
default:
return parent::getName();
}
}
2022-06-19 04:59:39 +03:00
private function processUsername()
{
$username = trim($this->getInput('username'));
if (preg_match('#^https?://www\.tiktok\.com/@(.*)$#', $username, $m)) {
return '@' . $m[1];
}
if (substr($username, 0, 1) !== '@') {
return '@' . $username;
2022-06-19 04:59:39 +03:00
}
return $username;
}
public function detectParameters($url)
{
if (preg_match('/tiktok\.com\/(@[\w]+)/', $url, $matches) > 0) {
return [
'context' => 'By user',
'username' => $matches[1]
];
}
return null;
2022-06-19 04:59:39 +03:00
}
}