PHPackages                             haianibrahim/tiktok-scraper-laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. haianibrahim/tiktok-scraper-laravel

ActiveLibrary[API Development](/categories/api)

haianibrahim/tiktok-scraper-laravel
===================================

Laravel package for TikTok video scraping with clean API integration for Laravel 12.x.x

03PHP

Since Sep 6Pushed 8mo agoCompare

[ Source](https://github.com/haianibrahim/tiktok-scraper-laravel)[ Packagist](https://packagist.org/packages/haianibrahim/tiktok-scraper-laravel)[ RSS](/packages/haianibrahim-tiktok-scraper-laravel/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Laravel TikTok Scraper
======================

[](#laravel-tiktok-scraper)

A Laravel package that provides an easy way to scrape TikTok video data directly into your Laravel application. This package implements the [haianibrahim/tiktok-scraper](https://github.com/haianibrahim/tiktok-scraper) with Laravel-specific features including caching, rate limiting, events, and comprehensive API endpoints.

Features
--------

[](#features)

- 🚀 **Laravel 12.x.x Compatible** - Built for the latest Laravel version
- 📦 **Easy Integration** - Simple service provider and facade
- 🔧 **Configurable** - Comprehensive configuration options
- 💾 **Caching Support** - Built-in caching with multiple drivers
- ⚡ **Rate Limiting** - Prevent API abuse with customizable rate limits
- 📊 **Statistics Tracking** - Monitor scraping performance and usage
- 🎯 **Event System** - Laravel events for scraping operations
- 🛡️ **Exception Handling** - Comprehensive error handling
- 🌐 **HTTP API** - Ready-to-use REST API endpoints
- 🧪 **Testing Support** - Full test suite included
- 📝 **Artisan Commands** - CLI tools for testing and management

Installation
------------

[](#installation)

Install the package via Composer:

```
composer require haianibrahim/tiktok-scraper-laravel
```

### Laravel Auto-Discovery

[](#laravel-auto-discovery)

The package uses Laravel's auto-discovery feature, so the service provider will be automatically registered.

### Publish Configuration

[](#publish-configuration)

Publish the configuration file:

```
php artisan vendor:publish --provider="Hki98\LaravelTikTokScraper\TikTokScraperServiceProvider" --tag="config"
```

### Run Migrations

[](#run-migrations)

Publish and run the database migrations for logging:

```
php artisan vendor:publish --provider="Hki98\LaravelTikTokScraper\TikTokScraperServiceProvider" --tag="migrations"
php artisan migrate
```

Configuration
-------------

[](#configuration)

The configuration file is published to `config/tiktok-scraper.php`. Key configuration options include:

```
return [
    // HTTP Client Configuration
    'http_client' => [
        'timeout' => env('TIKTOK_SCRAPER_TIMEOUT', 30),
        'connect_timeout' => env('TIKTOK_SCRAPER_CONNECT_TIMEOUT', 10),
        'user_agent' => env('TIKTOK_SCRAPER_USER_AGENT', 'Mozilla/5.0...'),
        'headers' => [
            'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language' => 'en-US,en;q=0.5',
            'Accept-Encoding' => 'gzip, deflate',
            'Connection' => 'keep-alive',
        ],
    ],

    // Caching Configuration
    'cache' => [
        'enabled' => env('TIKTOK_SCRAPER_CACHE_ENABLED', true),
        'store' => env('TIKTOK_SCRAPER_CACHE_STORE', null),
        'ttl' => env('TIKTOK_SCRAPER_CACHE_TTL', 3600),
        'prefix' => env('TIKTOK_SCRAPER_CACHE_PREFIX', 'tiktok_scraper'),
    ],

    // Rate Limiting Configuration
    'rate_limiting' => [
        'enabled' => env('TIKTOK_SCRAPER_RATE_LIMIT_ENABLED', true),
        'max_attempts' => env('TIKTOK_SCRAPER_RATE_LIMIT_MAX_ATTEMPTS', 60),
        'decay_minutes' => env('TIKTOK_SCRAPER_RATE_LIMIT_DECAY_MINUTES', 1),
    ],
];
```

Usage
-----

[](#usage)

### Using the Facade

[](#using-the-facade)

```
use Hki98\LaravelTikTokScraper\Facades\TikTokScraper;

// Scrape a single video
$videoDetails = TikTokScraper::scrape('https://www.tiktok.com/@username/video/1234567890');

echo $videoDetails->title;
echo $videoDetails->username;
echo $videoDetails->views;

// Scrape multiple videos
$videos = TikTokScraper::scrapeMultiple([
    'https://www.tiktok.com/@user1/video/1234567890',
    'https://www.tiktok.com/@user2/video/0987654321',
]);

// Validate URL
if (TikTokScraper::isValidTikTokUrl($url)) {
    $videoDetails = TikTokScraper::scrape($url);
}

// Cache management
TikTokScraper::clearCache();
TikTokScraper::clearUrlCache($url);
```

### Using Dependency Injection

[](#using-dependency-injection)

```
use Hki98\LaravelTikTokScraper\Contracts\TikTokScraperInterface;

class VideoController extends Controller
{
    public function __construct(
        private readonly TikTokScraperInterface $scraper
    ) {}

    public function scrape(Request $request)
    {
        $url = $request->input('url');

        try {
            $videoDetails = $this->scraper->scrape($url);
            return response()->json($videoDetails->toArray());
        } catch (TikTokScraperException $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }
}
```

### Video Details Object

[](#video-details-object)

The `VideoDetails` object contains comprehensive video information:

```
$videoDetails = TikTokScraper::scrape($url);

// Basic video information
echo $videoDetails->videoId;
echo $videoDetails->title;
echo $videoDetails->description;
echo $videoDetails->url;

// User information
echo $videoDetails->username;
echo $videoDetails->displayName;
echo $videoDetails->avatarUrl;

// Statistics
echo $videoDetails->views;
echo $videoDetails->likes;
echo $videoDetails->comments;
echo $videoDetails->shares;

// Media information
echo $videoDetails->videoUrl;
echo $videoDetails->coverUrl;
echo $videoDetails->duration;

// Music information
echo $videoDetails->musicTitle;
echo $videoDetails->musicAuthor;

// Calculated metrics
echo $videoDetails->getEngagementRate(); // Percentage
echo $videoDetails->getTotalEngagement(); // Total likes + comments + shares

// Convert to array/JSON
$array = $videoDetails->toArray();
$json = $videoDetails->toJson();
```

Artisan Commands
----------------

[](#artisan-commands)

### Test Scraper

[](#test-scraper)

Test the scraper functionality:

```
php artisan tiktok-scraper:test https://www.tiktok.com/@username/video/1234567890
```

### Bulk Scraping

[](#bulk-scraping)

Scrape multiple URLs from a file:

```
# From file with JSON output
php artisan tiktok-scraper:bulk urls.txt --output=results.json

# From file with CSV output
php artisan tiktok-scraper:bulk urls.txt --output=results.csv --format=csv
```

### View Statistics

[](#view-statistics)

View scraping statistics:

```
# Show stats
php artisan tiktok-scraper:stats

# Clear stats
php artisan tiktok-scraper:stats --clear
```

### Cache Management

[](#cache-management)

Manage the cache:

```
# Clear all cache
php artisan tiktok-scraper:clear-cache

# Clear specific cache
php artisan tiktok-scraper:clear-cache --url="https://www.tiktok.com/@username/video/1234567890"

# Clear with confirmation
php artisan tiktok-scraper:clear-cache --force
```

HTTP API Endpoints
------------------

[](#http-api-endpoints)

The package provides ready-to-use API endpoints:

### Scrape Single Video

[](#scrape-single-video)

```
POST /api/tiktok-scraper/scrape
Content-Type: application/json

{
    "url": "https://www.tiktok.com/@username/video/1234567890",
    "use_cache": true
}
```

### Bulk Scrape

[](#bulk-scrape)

```
POST /api/tiktok-scraper/bulk-scrape
Content-Type: application/json

{
    "urls": [
        "https://www.tiktok.com/@user1/video/1234567890",
        "https://www.tiktok.com/@user2/video/0987654321"
    ],
    "use_cache": true
}
```

### Validate URL

[](#validate-url)

```
POST /api/tiktok-scraper/validate
Content-Type: application/json

{
    "url": "https://www.tiktok.com/@username/video/1234567890"
}
```

### Get Statistics

[](#get-statistics)

```
GET /api/tiktok-scraper/stats
```

### Clear Cache

[](#clear-cache)

```
DELETE /api/tiktok-scraper/cache
```

### Health Check

[](#health-check)

```
GET /api/tiktok-scraper/health
```

Events
------

[](#events)

The package dispatches Laravel events for monitoring:

### VideoScraped Event

[](#videoscraped-event)

```
use Hki98\LaravelTikTokScraper\Events\VideoScraped;

// Listen for successful scrapes
Event::listen(VideoScraped::class, function (VideoScraped $event) {
    Log::info('Video scraped successfully', [
        'url' => $event->url,
        'video_id' => $event->videoDetails->videoId,
        'username' => $event->videoDetails->username,
    ]);
});
```

### ScrapingFailed Event

[](#scrapingfailed-event)

```
use Hki98\LaravelTikTokScraper\Events\ScrapingFailed;

Event::listen(ScrapingFailed::class, function (ScrapingFailed $event) {
    Log::error('Scraping failed', [
        'url' => $event->url,
        'error' => $event->exception->getMessage(),
    ]);
});
```

### RateLimitHit Event

[](#ratelimithit-event)

```
use Hki98\LaravelTikTokScraper\Events\RateLimitHit;

Event::listen(RateLimitHit::class, function (RateLimitHit $event) {
    Log::warning('Rate limit hit', [
        'url' => $event->url,
        'retry_after' => $event->retryAfter,
    ]);
});
```

Exception Handling
------------------

[](#exception-handling)

The package provides specific exceptions for different error scenarios:

```
use Hki98\LaravelTikTokScraper\Exceptions\{
    TikTokScraperException,
    InvalidUrlException,
    HttpException,
    ParseException,
    RateLimitException,
    CacheException
};

try {
    $videoDetails = TikTokScraper::scrape($url);
} catch (InvalidUrlException $e) {
    // Handle invalid URL
} catch (RateLimitException $e) {
    // Handle rate limiting
} catch (HttpException $e) {
    // Handle HTTP errors
} catch (ParseException $e) {
    // Handle parsing errors
} catch (TikTokScraperException $e) {
    // Handle general scraper errors
}
```

Testing
-------

[](#testing)

Run the package tests:

```
composer test
```

Run tests with coverage:

```
composer test-coverage
```

Requirements
------------

[](#requirements)

- PHP 8.2 or higher
- Laravel 11.0 or 12.0
- GuzzleHTTP 7.8 or higher

Contributing
------------

[](#contributing)

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

License
-------

[](#license)

This package is open-sourced software licensed under the [MIT license](LICENSE).

Support
-------

[](#support)

If you find this package helpful, please consider starring the repository.

For issues and feature requests, please use the [GitHub issue tracker](https://github.com/haianibrahim/laravel-tiktok-scraper/issues).

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

If you discover a security vulnerability, please send an e-mail via the contact information in the composer.json file. All security vulnerabilities will be promptly addressed.

Credits
-------

[](#credits)

- [Haian Ibrahim](https://github.com/haianibrahim)
- Based on the original [tiktok-scraper](https://github.com/haianibrahim/tiktok-scraper) package
- All Contributors

###  Health Score

17

—

LowBetter than 6% of packages

Maintenance43

Moderate activity, may be stable

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d8930ec06bf44bdb0a46c46b92dfcdb95e3c9aef77890729830b10f35775f2bc?d=identicon)[haianibrahim](/maintainers/haianibrahim)

---

Top Contributors

[![haianibrahim](https://avatars.githubusercontent.com/u/205984087?v=4)](https://github.com/haianibrahim "haianibrahim (5 commits)")

---

Tags

apilaravellaravel-packagescrapersocial-mediatiktokvideo

### Embed Badge

![Health badge](/badges/haianibrahim-tiktok-scraper-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/haianibrahim-tiktok-scraper-laravel/health.svg)](https://phpackages.com/packages/haianibrahim-tiktok-scraper-laravel)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M480](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M272](/packages/twilio-sdk)[knplabs/github-api

GitHub API v3 client

2.2k15.8M187](/packages/knplabs-github-api)[facebook/php-business-sdk

PHP SDK for Facebook Business

90121.9M34](/packages/facebook-php-business-sdk)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

73813.7M114](/packages/meilisearch-meilisearch-php)[google/gax

Google API Core for PHP

263103.1M454](/packages/google-gax)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
