diff --git a/.env.example b/.env.example index 2e81b81..60a168d 100644 --- a/.env.example +++ b/.env.example @@ -1,12 +1,9 @@ # APP_URL="http://localhost:8000" # Full url path, PLEASE REPLACE TO YOUR OWN ONE -# LATTE_CACHE=/tmp/proxitok_api # Path for Latte cache, leave commented for ./cache/latte -# API CONFIG -# USE_TEST_ENDPOINTS=1 # Discomment for usage of t.tiktok.com -# SIGNER_URL="https://tiktok-sign.herokuapp.com/signature" # External signing service +# LATTE_CACHE=/tmp/proxitok_api # Path for Latte cache, leave commented for ./cache/latte # API_CACHE=redis # Cache engine for TikTok Api, (more info on README) -# Redis cache, used on Helpers\CacheEngines\RedisCache +# Redis cache, used on Helpers\CacheEngines\RedisCache (CHOOSE ONE) # REDIS_HOST=localhost # Host or path to unix socket # REDIS_PORT=6379 # Set to -1 to use unix socket # REDIS_PASSWORD=example # Leave commented for no password diff --git a/README.md b/README.md index 3cacf49..5bc31e9 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ location /proxitok/.env { * i18n ## Credits -* [TikScraper](https://github.com/pablouser1/TikScraperPHP) +* [TikTok-API-PHP](https://github.com/ssovit/TikTok-API-PHP) (Currently using my personal fork) * [Latte](https://github.com/nette/latte) * [bramus/router](https://github.com/bramus/router) * [PHP dotenv](https://github.com/vlucas/phpdotenv) diff --git a/app/Cache/JSONCache.php b/app/Cache/JSONCache.php index f113433..7b16c60 100644 --- a/app/Cache/JSONCache.php +++ b/app/Cache/JSONCache.php @@ -1,31 +1,33 @@ cache_path = Misc::env('API_CACHE_JSON', __DIR__ . '/../../cache/api'); + if (isset($_ENV['API_CACHE_JSON']) && !empty($_ENV['API_CACHE_JSON'])) { + $this->cache_path = $_ENV['API_CACHE_JSON']; + } } - - public function get(string $cache_key): ?object { + public function get(string $cache_key): object|false { $filename = $this->cache_path . '/' . $cache_key . '.json'; if (is_file($filename)) { + $time = time(); $json_string = file_get_contents($filename); $element = json_decode($json_string); - return $element; + if ($time < $element->expires) { + return $element->data; + } + // Remove file if expired + unlink($filename); } - return null; + return false; } - public function exists(string $cache_key): bool { - $filename = $this->cache_path . '/' . $cache_key . '.json'; - return is_file($filename); - } - - public function set(string $cache_key, string $data, $timeout = 3600) { - file_put_contents($this->cache_path . '/' . $cache_key . '.json', $data); + public function set(string $cache_key, mixed $data, $timeout = 3600) { + file_put_contents($this->cache_path . '/' . $cache_key . '.json', json_encode([ + 'data' => $data, + 'expires' => time() + $timeout + ])); } } diff --git a/app/Cache/RedisCache.php b/app/Cache/RedisCache.php index 82063a0..55a6dca 100644 --- a/app/Cache/RedisCache.php +++ b/app/Cache/RedisCache.php @@ -27,11 +27,7 @@ class RedisCache { return null; } - public function exists(string $cache_key): bool { - return $this->client->exists($cache_key); - } - - public function set(string $cache_key, string $data, $timeout = 3600) { - $this->client->set($cache_key, $data, $timeout); + public function set(string $cache_key, array $data, $timeout = 3600) { + $this->client->set($cache_key, json_encode($data), $timeout); } } diff --git a/app/Controllers/DiscoverController.php b/app/Controllers/DiscoverController.php index dbd6e70..ea564e2 100644 --- a/app/Controllers/DiscoverController.php +++ b/app/Controllers/DiscoverController.php @@ -3,7 +3,7 @@ namespace App\Controllers; use App\Helpers\ErrorHandler; use App\Helpers\Misc; -use App\Models\DiscoverTemplate; +use App\Models\FeedTemplate; class DiscoverController { static public function get() { @@ -11,7 +11,7 @@ class DiscoverController { $feed = $api->getDiscover(); if ($feed->meta->success) { $latte = Misc::latte(); - $latte->render(Misc::getView('discover'), new DiscoverTemplate($feed)); + $latte->render(Misc::getView('discover'), new FeedTemplate('Discover', $feed)); } else { ErrorHandler::show($feed->meta); } diff --git a/app/Controllers/ProxyController.php b/app/Controllers/ProxyController.php index 9b6d417..cf0ec77 100644 --- a/app/Controllers/ProxyController.php +++ b/app/Controllers/ProxyController.php @@ -40,24 +40,25 @@ class ProxyController { static public function stream() { if (isset($_GET['download'])) { - $downloader = new \TikScraper\Download(); $watermark = isset($_GET['watermark']); if ($watermark) { self::checkUrl(); $filename = self::getFileName(); + $downloader = new \Sovit\TikTok\Download(); $downloader->url($_GET['url'], $filename, true); } else { if (!isset($_GET['id'])) { die('You need to send an ID!'); } $filename = self::getFileName(); + $downloader = new \Sovit\TikTok\Download(); $downloader->url($_GET['id'], $filename, false); } } else { self::checkUrl(); $url = $_GET['url']; - $streamer = new \TikScraper\Stream(); - $streamer->url($url); + $streamer = new \Sovit\TikTok\Stream(); + $streamer->stream($url); } } } diff --git a/app/Controllers/TagController.php b/app/Controllers/TagController.php index 077b628..5ed8c26 100644 --- a/app/Controllers/TagController.php +++ b/app/Controllers/TagController.php @@ -10,7 +10,7 @@ class TagController { static public function get(string $name) { $cursor = Misc::getCursor(); $api = Misc::api(); - $feed = $api->getHashtagFeed($name, $cursor); + $feed = $api->getChallengeFeed($name, $cursor); if ($feed->meta->success) { $latte = Misc::latte(); $latte->render(Misc::getView('tag'), new FeedTemplate('Tag', $feed)); @@ -21,9 +21,9 @@ class TagController { static public function rss(string $name) { $api = Misc::api(); - $feed = $api->getHashtagFeed($name); + $feed = $api->getChallengeFeed($name); if ($feed->meta->success) { - $feed = RSS::build("/tag/{$name}", "{$name} Tag", $feed->info->detail->desc, $feed->items); + $feed = RSS::build("/tag/{$name}", "{$name} Tag", $feed->info->detail->challenge->desc, $feed->items); // Setup headers RSS::setHeaders('tag.rss'); echo $feed; diff --git a/app/Controllers/TrendingController.php b/app/Controllers/TrendingController.php index 0558488..2d1cffe 100644 --- a/app/Controllers/TrendingController.php +++ b/app/Controllers/TrendingController.php @@ -8,10 +8,9 @@ use App\Helpers\RSS; class TrendingController { static public function get() { - $cursor = Misc::getTtwid(); - $page = $_GET['page'] ?? 0; + $cursor = Misc::getCursor(); $api = Misc::api(); - $feed = $api->getTrending($cursor, $page); + $feed = $api->getTrendingFeed($cursor); if ($feed->meta->success) { $latte = Misc::latte(); $latte->render(Misc::getView('trending'), new FeedTemplate('Trending', $feed)); @@ -22,7 +21,7 @@ class TrendingController { static public function rss() { $api = Misc::api(); - $feed = $api->getTrending(); + $feed = $api->getTrendingFeed(); if ($feed->meta->success) { $feed = RSS::build('/trending', 'Trending', 'Tiktok trending', $feed->items); // Setup headers diff --git a/app/Controllers/UserController.php b/app/Controllers/UserController.php index 343eb2f..91398a9 100644 --- a/app/Controllers/UserController.php +++ b/app/Controllers/UserController.php @@ -12,12 +12,12 @@ class UserController { $api = Misc::api(); $feed = $api->getUserFeed($username, $cursor); if ($feed->meta->success) { - if ($feed->info->detail->privateAccount) { + if ($feed->info->detail->user->privateAccount) { http_response_code(400); echo 'Private account detected! Not supported'; } $latte = Misc::latte(); - $latte->render(Misc::getView('user'), new FeedTemplate($feed->info->detail->nickname, $feed)); + $latte->render(Misc::getView('user'), new FeedTemplate($feed->info->detail->user->nickname, $feed)); } else { ErrorHandler::show($feed->meta); } @@ -27,7 +27,7 @@ class UserController { $api = Misc::api(); $feed = $api->getUserFeed($username); if ($feed->meta->success) { - $feed = RSS::build('/@'.$username, $feed->info->detail->nickname, $feed->info->detail->signature, $feed->items); + $feed = RSS::build('/@'.$username, $feed->info->detail->user->nickname, $feed->info->detail->user->signature, $feed->items); // Setup headers RSS::setHeaders('user.rss'); echo $feed; diff --git a/app/Controllers/VideoController.php b/app/Controllers/VideoController.php index 3e1285a..ae1a6a6 100644 --- a/app/Controllers/VideoController.php +++ b/app/Controllers/VideoController.php @@ -3,7 +3,7 @@ namespace App\Controllers; use App\Helpers\ErrorHandler; use App\Helpers\Misc; -use App\Models\FeedTemplate; +use App\Models\ItemTemplate; class VideoController { static public function get(string $video_id) { @@ -11,7 +11,7 @@ class VideoController { $item = $api->getVideoByID($video_id); if ($item->meta->success) { $latte = Misc::latte(); - $latte->render(Misc::getView('video'), new FeedTemplate($item->info->detail->nickname, $item)); + $latte->render(Misc::getView('video'), new ItemTemplate($item->info->detail->user->nickname, $item)); } else { ErrorHandler::show($item->meta); } diff --git a/app/Helpers/Misc.php b/app/Helpers/Misc.php index 7734bfc..4bceddf 100644 --- a/app/Helpers/Misc.php +++ b/app/Helpers/Misc.php @@ -9,16 +9,12 @@ class Misc { return isset($_GET['cursor']) && is_numeric($_GET['cursor']) ? (int) $_GET['cursor'] : 0; } - static public function getTtwid(): string { - return $_GET['cursor'] ?? ''; - } - static public function url(string $endpoint = '') { return self::env('APP_URL', '') . $endpoint; } static public function env(string $key, string $default_value): string { - return $_ENV[$key] ?? $default_value; + return isset($_ENV[$key]) && !empty($_ENV[$key]) ? $_ENV[$key] : $default_value; } /** @@ -31,11 +27,8 @@ class Misc { /** * Setup of TikTok Api wrapper */ - static public function api(): \TikScraper\Api { - $options = [ - 'remote_signer' => self::env('SIGNER_URL', 'http://localhost:8080/signature'), - 'use_test_endpoints' => self::env('USE_TEST_ENDPOINTS', false) - ]; + static public function api(): \Sovit\TikTok\Api { + $options = []; $cacheEngine = false; // Proxy config foreach(Cookies::PROXY as $proxy_element) { @@ -62,13 +55,13 @@ class Misc { } else { $host = $_ENV['REDIS_HOST']; $port = (int) $_ENV['REDIS_PORT']; - $password = $_ENV['REDIS_PASSWORD'] ?? null; + $password = isset($_ENV['REDIS_PASSWORD']) ? $_ENV['REDIS_PASSWORD'] : null; } $cacheEngine = new RedisCache($host, $port, $password); break; } } - $api = new \TikScraper\Api($options, $cacheEngine); + $api = new \Sovit\TikTok\Api($options, $cacheEngine); return $api; } diff --git a/app/Helpers/RSS.php b/app/Helpers/RSS.php index ee6495c..510aa2d 100644 --- a/app/Helpers/RSS.php +++ b/app/Helpers/RSS.php @@ -2,7 +2,7 @@ namespace App\Helpers; use \FeedWriter\RSS2; -use TikScraper\Download; +use \Sovit\TikTok\Download; class RSS { static public function build(string $endpoint, string $title, string $description, array $items): string { diff --git a/app/Models/DiscoverTemplate.php b/app/Models/DiscoverTemplate.php deleted file mode 100644 index a240830..0000000 --- a/app/Models/DiscoverTemplate.php +++ /dev/null @@ -1,16 +0,0 @@ -feed = $feed; - } -} diff --git a/app/Models/FeedTemplate.php b/app/Models/FeedTemplate.php index a26e490..836fc29 100644 --- a/app/Models/FeedTemplate.php +++ b/app/Models/FeedTemplate.php @@ -1,15 +1,13 @@ feed = $feed; } diff --git a/app/Models/ItemTemplate.php b/app/Models/ItemTemplate.php new file mode 100644 index 0000000..b4b749d --- /dev/null +++ b/app/Models/ItemTemplate.php @@ -0,0 +1,14 @@ +item = $item; + } +} diff --git a/components/feed.latte b/components/feed.latte index 60e29c2..d78e4da 100644 --- a/components/feed.latte +++ b/components/feed.latte @@ -17,7 +17,7 @@ {/foreach} -