{
  "schemaVersion": "1.0",
  "item": {
    "slug": "tiktok-crawling",
    "name": "TikTok Crawling (yt-dlp)",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/RomneyDa/tiktok-crawling",
    "canonicalUrl": "https://clawhub.ai/RomneyDa/tiktok-crawling",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/tiktok-crawling",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=tiktok-crawling",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/tiktok-crawling"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/tiktok-crawling",
    "agentPageUrl": "https://openagent3.xyz/skills/tiktok-crawling/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tiktok-crawling/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tiktok-crawling/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "TikTok Scraping with yt-dlp",
        "body": "yt-dlp is a CLI for downloading video/audio from TikTok and many other sites."
      },
      {
        "title": "Setup",
        "body": "# macOS\nbrew install yt-dlp ffmpeg\n\n# pip (any platform)\npip install yt-dlp\n# Also install ffmpeg separately for merging/post-processing"
      },
      {
        "title": "Single Video",
        "body": "yt-dlp \"https://www.tiktok.com/@handle/video/1234567890\""
      },
      {
        "title": "Entire Profile",
        "body": "yt-dlp \"https://www.tiktok.com/@handle\" \\\n  -P \"./tiktok/data\" \\\n  -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n  --write-info-json\n\nCreates:\n\ntiktok/data/\n  handle/\n    20260220-7331234567890/\n      video.mp4\n      video.info.json"
      },
      {
        "title": "Multiple Profiles",
        "body": "for handle in handle1 handle2 handle3; do\n  yt-dlp \"https://www.tiktok.com/@$handle\" \\\n    -P \"./tiktok/data\" \\\n    -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n    --write-info-json \\\n    --download-archive \"./tiktok/downloaded.txt\"\ndone"
      },
      {
        "title": "Search, Hashtags & Sounds",
        "body": "# Search by keyword\nyt-dlp \"tiktoksearch:cooking recipes\" --playlist-end 20\n\n# Hashtag page\nyt-dlp \"https://www.tiktok.com/tag/booktok\" --playlist-end 50\n\n# Videos using a specific sound\nyt-dlp \"https://www.tiktok.com/music/original-sound-1234567890\" --playlist-end 30"
      },
      {
        "title": "Format Selection",
        "body": "# List available formats\nyt-dlp -F \"https://www.tiktok.com/@handle/video/1234567890\"\n\n# Download specific format (e.g., best video without watermark if available)\nyt-dlp -f \"best\" \"https://www.tiktok.com/@handle/video/1234567890\""
      },
      {
        "title": "By Date",
        "body": "# On or after a date\n--dateafter 20260215\n\n# Before a date\n--datebefore 20260220\n\n# Exact date\n--date 20260215\n\n# Date range\n--dateafter 20260210 --datebefore 20260220\n\n# Relative dates (macOS / Linux)\n--dateafter \"$(date -u -v-7d +%Y%m%d)\"           # macOS: last 7 days\n--dateafter \"$(date -u -d '7 days ago' +%Y%m%d)\" # Linux: last 7 days"
      },
      {
        "title": "By Metrics & Content",
        "body": "# 100k+ views\n--match-filters \"view_count >= 100000\"\n\n# Duration between 30-60 seconds\n--match-filters \"duration >= 30 & duration <= 60\"\n\n# Title contains \"recipe\" (case-insensitive)\n--match-filters \"title ~= (?i)recipe\"\n\n# Combine: 50k+ views from Feb 2026\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  --match-filters \"view_count >= 50000\" \\\n  --dateafter 20260201"
      },
      {
        "title": "Preview What Would Download",
        "body": "yt-dlp \"https://www.tiktok.com/@handle\" \\\n  --simulate \\\n  --print \"%(upload_date)s | %(view_count)s views | %(title)s\""
      },
      {
        "title": "Export to JSON",
        "body": "# Single JSON array\nyt-dlp \"https://www.tiktok.com/@handle\" --simulate --dump-json > handle_videos.json\n\n# JSONL (one object per line, better for large datasets)\nyt-dlp \"https://www.tiktok.com/@handle\" --simulate -j > handle_videos.jsonl"
      },
      {
        "title": "Export to CSV",
        "body": "yt-dlp \"https://www.tiktok.com/@handle\" \\\n  --simulate \\\n  --print-to-file \"%(uploader)s,%(id)s,%(upload_date)s,%(view_count)s,%(like_count)s,%(webpage_url)s\" \\\n  \"./tiktok/analysis/metadata.csv\""
      },
      {
        "title": "Analyze with jq",
        "body": "# Top 10 videos by views from downloaded .info.json files\njq -s 'sort_by(.view_count) | reverse | .[:10] | .[] | {title, view_count, url: .webpage_url}' \\\n  tiktok/data/*/*.info.json\n\n# Total views across all videos\njq -s 'map(.view_count) | add' tiktok/data/*/*.info.json\n\n# Videos grouped by upload date\njq -s 'group_by(.upload_date) | map({date: .[0].upload_date, count: length})' \\\n  tiktok/data/*/*.info.json\n\nTip: For deeper analysis and visualization, load JSONL/CSV exports into Python with pandas. Useful for engagement scatter plots, posting frequency charts, or comparing metrics across creators."
      },
      {
        "title": "Archive (Skip Already Downloaded)",
        "body": "The --download-archive flag tracks downloaded videos, enabling incremental updates:\n\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  -P \"./tiktok/data\" \\\n  -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n  --write-info-json \\\n  --download-archive \"./tiktok/downloaded.txt\"\n\nRun the same command later—it skips videos already in downloaded.txt."
      },
      {
        "title": "Authentication (Private/Restricted Content)",
        "body": "# Use cookies from browser (recommended)\nyt-dlp --cookies-from-browser chrome \"https://www.tiktok.com/@handle\"\n\n# Or export cookies to a file first\nyt-dlp --cookies tiktok_cookies.txt \"https://www.tiktok.com/@handle\""
      },
      {
        "title": "Scheduled Scraping (Cron)",
        "body": "# crontab -e\n# Run daily at 2 AM, log output\n0 2 * * * cd /path/to/project && ./scripts/scrape-tiktok.sh >> ./tiktok/logs/cron.log 2>&1\n\nExample scripts/scrape-tiktok.sh:\n\n#!/bin/bash\nset -e\n\nHANDLES=\"handle1 handle2 handle3\"\nDATA_DIR=\"./tiktok/data\"\nARCHIVE=\"./tiktok/downloaded.txt\"\n\nfor handle in $HANDLES; do\n  echo \"[$(date)] Scraping @$handle\"\n  yt-dlp \"https://www.tiktok.com/@$handle\" \\\n    -P \"$DATA_DIR\" \\\n    -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n    --write-info-json \\\n    --download-archive \"$ARCHIVE\" \\\n    --cookies-from-browser chrome \\\n    --dateafter \"$(date -u -v-7d +%Y%m%d)\" \\\n    --sleep-interval 2 \\\n    --max-sleep-interval 5\ndone\necho \"[$(date)] Done\""
      },
      {
        "title": "Troubleshooting",
        "body": "ProblemSolutionEmpty results / no videos foundAdd --cookies-from-browser chrome — TikTok rate-limits anonymous requests403 Forbidden errorsRate limited. Wait 10-15 min, or use cookies/different IP\"Video unavailable\"Region-locked. Try --geo-bypass or a VPNWatermarked videosCheck -F for alternative formats; some may lack watermarkSlow downloadsAdd --concurrent-fragments 4 for faster downloadsProfile shows fewer videos than expectedTikTok API limits. Use --playlist-end N explicitly, try with cookies"
      },
      {
        "title": "Debug Mode",
        "body": "# Verbose output to diagnose issues\nyt-dlp -v \"https://www.tiktok.com/@handle\" 2>&1 | tee debug.log"
      },
      {
        "title": "Key Options",
        "body": "OptionDescription-o TEMPLATEOutput filename template-P PATHBase download directory--dateafter DATEVideos on/after date (YYYYMMDD)--datebefore DATEVideos on/before date--playlist-end NStop after N videos--match-filters EXPRFilter by metadata (views, duration, title)--write-info-jsonSave metadata JSON per video--download-archive FILETrack downloads, skip duplicates--simulate / -sDry run, no download-j / --dump-jsonOutput metadata as JSON--cookies-from-browser NAMEUse cookies from browser--sleep-interval SECWait between downloads (avoid rate limits)"
      },
      {
        "title": "Output Template Variables",
        "body": "VariableExample Output%(id)s7331234567890%(uploader)shandle%(upload_date)s20260215%(title).50sFirst 50 chars of title%(view_count)s1500000%(like_count)s250000%(ext)smp4\n\nFull template reference →"
      }
    ],
    "body": "TikTok Scraping with yt-dlp\n\nyt-dlp is a CLI for downloading video/audio from TikTok and many other sites.\n\nSetup\n# macOS\nbrew install yt-dlp ffmpeg\n\n# pip (any platform)\npip install yt-dlp\n# Also install ffmpeg separately for merging/post-processing\n\nDownload Patterns\nSingle Video\nyt-dlp \"https://www.tiktok.com/@handle/video/1234567890\"\n\nEntire Profile\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  -P \"./tiktok/data\" \\\n  -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n  --write-info-json\n\n\nCreates:\n\ntiktok/data/\n  handle/\n    20260220-7331234567890/\n      video.mp4\n      video.info.json\n\nMultiple Profiles\nfor handle in handle1 handle2 handle3; do\n  yt-dlp \"https://www.tiktok.com/@$handle\" \\\n    -P \"./tiktok/data\" \\\n    -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n    --write-info-json \\\n    --download-archive \"./tiktok/downloaded.txt\"\ndone\n\nSearch, Hashtags & Sounds\n# Search by keyword\nyt-dlp \"tiktoksearch:cooking recipes\" --playlist-end 20\n\n# Hashtag page\nyt-dlp \"https://www.tiktok.com/tag/booktok\" --playlist-end 50\n\n# Videos using a specific sound\nyt-dlp \"https://www.tiktok.com/music/original-sound-1234567890\" --playlist-end 30\n\nFormat Selection\n# List available formats\nyt-dlp -F \"https://www.tiktok.com/@handle/video/1234567890\"\n\n# Download specific format (e.g., best video without watermark if available)\nyt-dlp -f \"best\" \"https://www.tiktok.com/@handle/video/1234567890\"\n\nFiltering\nBy Date\n# On or after a date\n--dateafter 20260215\n\n# Before a date\n--datebefore 20260220\n\n# Exact date\n--date 20260215\n\n# Date range\n--dateafter 20260210 --datebefore 20260220\n\n# Relative dates (macOS / Linux)\n--dateafter \"$(date -u -v-7d +%Y%m%d)\"           # macOS: last 7 days\n--dateafter \"$(date -u -d '7 days ago' +%Y%m%d)\" # Linux: last 7 days\n\nBy Metrics & Content\n# 100k+ views\n--match-filters \"view_count >= 100000\"\n\n# Duration between 30-60 seconds\n--match-filters \"duration >= 30 & duration <= 60\"\n\n# Title contains \"recipe\" (case-insensitive)\n--match-filters \"title ~= (?i)recipe\"\n\n# Combine: 50k+ views from Feb 2026\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  --match-filters \"view_count >= 50000\" \\\n  --dateafter 20260201\n\nMetadata Only (No Download)\nPreview What Would Download\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  --simulate \\\n  --print \"%(upload_date)s | %(view_count)s views | %(title)s\"\n\nExport to JSON\n# Single JSON array\nyt-dlp \"https://www.tiktok.com/@handle\" --simulate --dump-json > handle_videos.json\n\n# JSONL (one object per line, better for large datasets)\nyt-dlp \"https://www.tiktok.com/@handle\" --simulate -j > handle_videos.jsonl\n\nExport to CSV\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  --simulate \\\n  --print-to-file \"%(uploader)s,%(id)s,%(upload_date)s,%(view_count)s,%(like_count)s,%(webpage_url)s\" \\\n  \"./tiktok/analysis/metadata.csv\"\n\nAnalyze with jq\n# Top 10 videos by views from downloaded .info.json files\njq -s 'sort_by(.view_count) | reverse | .[:10] | .[] | {title, view_count, url: .webpage_url}' \\\n  tiktok/data/*/*.info.json\n\n# Total views across all videos\njq -s 'map(.view_count) | add' tiktok/data/*/*.info.json\n\n# Videos grouped by upload date\njq -s 'group_by(.upload_date) | map({date: .[0].upload_date, count: length})' \\\n  tiktok/data/*/*.info.json\n\n\nTip: For deeper analysis and visualization, load JSONL/CSV exports into Python with pandas. Useful for engagement scatter plots, posting frequency charts, or comparing metrics across creators.\n\nOngoing Scraping\nArchive (Skip Already Downloaded)\n\nThe --download-archive flag tracks downloaded videos, enabling incremental updates:\n\nyt-dlp \"https://www.tiktok.com/@handle\" \\\n  -P \"./tiktok/data\" \\\n  -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n  --write-info-json \\\n  --download-archive \"./tiktok/downloaded.txt\"\n\n\nRun the same command later—it skips videos already in downloaded.txt.\n\nAuthentication (Private/Restricted Content)\n# Use cookies from browser (recommended)\nyt-dlp --cookies-from-browser chrome \"https://www.tiktok.com/@handle\"\n\n# Or export cookies to a file first\nyt-dlp --cookies tiktok_cookies.txt \"https://www.tiktok.com/@handle\"\n\nScheduled Scraping (Cron)\n# crontab -e\n# Run daily at 2 AM, log output\n0 2 * * * cd /path/to/project && ./scripts/scrape-tiktok.sh >> ./tiktok/logs/cron.log 2>&1\n\n\nExample scripts/scrape-tiktok.sh:\n\n#!/bin/bash\nset -e\n\nHANDLES=\"handle1 handle2 handle3\"\nDATA_DIR=\"./tiktok/data\"\nARCHIVE=\"./tiktok/downloaded.txt\"\n\nfor handle in $HANDLES; do\n  echo \"[$(date)] Scraping @$handle\"\n  yt-dlp \"https://www.tiktok.com/@$handle\" \\\n    -P \"$DATA_DIR\" \\\n    -o \"%(uploader)s/%(upload_date)s-%(id)s/video.%(ext)s\" \\\n    --write-info-json \\\n    --download-archive \"$ARCHIVE\" \\\n    --cookies-from-browser chrome \\\n    --dateafter \"$(date -u -v-7d +%Y%m%d)\" \\\n    --sleep-interval 2 \\\n    --max-sleep-interval 5\ndone\necho \"[$(date)] Done\"\n\nTroubleshooting\nProblem\tSolution\nEmpty results / no videos found\tAdd --cookies-from-browser chrome — TikTok rate-limits anonymous requests\n403 Forbidden errors\tRate limited. Wait 10-15 min, or use cookies/different IP\n\"Video unavailable\"\tRegion-locked. Try --geo-bypass or a VPN\nWatermarked videos\tCheck -F for alternative formats; some may lack watermark\nSlow downloads\tAdd --concurrent-fragments 4 for faster downloads\nProfile shows fewer videos than expected\tTikTok API limits. Use --playlist-end N explicitly, try with cookies\nDebug Mode\n# Verbose output to diagnose issues\nyt-dlp -v \"https://www.tiktok.com/@handle\" 2>&1 | tee debug.log\n\nReference\nKey Options\nOption\tDescription\n-o TEMPLATE\tOutput filename template\n-P PATH\tBase download directory\n--dateafter DATE\tVideos on/after date (YYYYMMDD)\n--datebefore DATE\tVideos on/before date\n--playlist-end N\tStop after N videos\n--match-filters EXPR\tFilter by metadata (views, duration, title)\n--write-info-json\tSave metadata JSON per video\n--download-archive FILE\tTrack downloads, skip duplicates\n--simulate / -s\tDry run, no download\n-j / --dump-json\tOutput metadata as JSON\n--cookies-from-browser NAME\tUse cookies from browser\n--sleep-interval SEC\tWait between downloads (avoid rate limits)\nOutput Template Variables\nVariable\tExample Output\n%(id)s\t7331234567890\n%(uploader)s\thandle\n%(upload_date)s\t20260215\n%(title).50s\tFirst 50 chars of title\n%(view_count)s\t1500000\n%(like_count)s\t250000\n%(ext)s\tmp4\n\nFull template reference →"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/RomneyDa/tiktok-crawling",
    "publisherUrl": "https://clawhub.ai/RomneyDa/tiktok-crawling",
    "owner": "RomneyDa",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/tiktok-crawling",
    "downloadUrl": "https://openagent3.xyz/downloads/tiktok-crawling",
    "agentUrl": "https://openagent3.xyz/skills/tiktok-crawling/agent",
    "manifestUrl": "https://openagent3.xyz/skills/tiktok-crawling/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/tiktok-crawling/agent.md"
  }
}