agentsclimarketplace

Instagram videos

Skill puntorigen/avatar-skills/instagram-videos

Download all public videos/reels from an Instagram profile to a local folder, named with upload date-time (YYYY-MM-DD_HH-MM-SS.mp4). Uses Picnob via browser automation plus a Python download script. Use when the user asks to download Instagram videos, reels, or video content from a public profile, save IG videos locally, or batch-download profile reels with datetime filenames.From its SKILL.md

Install
npx -y skills add puntorigen/avatar-skills --skill instagram-videos

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

4.4 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

Instagram Videos Downloader

Download every public video/reel from an Instagram profile into a user-specified folder, named by upload datetime.

Do not use instaloader, yt-dlp, or gallery-dl on profile URLs first — they return 401 without a session cookie. Use Picnob.

Inputs

ParameterRequiredExample
Instagram handle or profile URLyesarnoldo_schaffner_bofill
Output directoryyeslolo/videos
Timezone for filenamesnoAmerica/Santiago (default)

Extract handle from URLs: instagram.com/{handle}/{handle}.

Workflow checklist

- [ ] Step 1: Verify profile is public
- [ ] Step 2: Scrape Picnob profile feed (browser)
- [ ] Step 3: Save posts JSON
- [ ] Step 4: Run download script
- [ ] Step 5: Report results

Step 1: Verify profile is public

Open https://www.instagram.com/{handle}/ in the browser. If it shows a login wall or "This Account is Private", stop — this skill is public profiles only.

Step 2: Scrape Picnob via browser MCP

Navigate to https://www.picnob.com/profile/{handle}/.

Run via browser_cdpRuntime.evaluate with awaitPromise: true:

(async () => {
  let lastCount = 0, stable = 0;
  for (let i = 0; i < 60; i++) {
    window.scrollTo(0, document.body.scrollHeight);
    await new Promise(r => setTimeout(r, 1500));
    const c = document.querySelectorAll('.post_box').length;
    if (c === lastCount) { if (++stable >= 3) break; } else { stable = 0; }
    lastCount = c;
  }
  const posts = [];
  document.querySelectorAll('.post_box').forEach((box, idx) => {
    const a = box.querySelector('a[href*="/post/"]');
    const m = a?.href?.match(/\/post\/([^/?#]+)/);
    const counts = Array.from(box.querySelectorAll('.num')).map(e => e.textContent.trim());
    posts.push({
      idx, pId: m?.[1],
      caption: box.querySelector('.sum')?.textContent?.trim() || '',
      time: box.querySelector('.time')?.textContent?.trim() || '',
      likes: counts[0], comments: counts[1],
      downloadUrl: box.querySelector('.downbtn')?.href,
      isVideo: !!box.querySelector('.icon_video, [class*=video]'),
      isSidecar: !!box.querySelector('.icon_album, [class*=sidecar], [class*=album]'),
      picnobHref: a?.href,
    });
  });
  return posts;
})()

Step 3: Save posts JSON

Save the result to {project}/posts-raw/meta/picnob_{handle}.json. Create posts-raw/ if needed; add to .gitignore if not already there.

Step 4: Download and rename

python3 ~/.cursor/skills/instagram-videos/scripts/download_profile_videos.py \
  --posts-json posts-raw/meta/picnob_{handle}.json \
  --output-dir {output_folder} \
  --timezone America/Santiago

The script:

  1. Filters videos (.mp4 in downloadUrl or isVideo: true)
  2. Downloads each file from Picnob CDN URLs
  3. Fetches exact uploadDate from each post's JSON-LD schema on Picnob
  4. Renames to YYYY-MM-DD_HH-MM-SS.mp4 in the chosen timezone
  5. Writes {output_folder}/videos_manifest.json

Video detection note: Picnob often omits the video icon on reels. Always treat posts with .mp4 in downloadUrl as videos — the script handles this.

Collisions: Two posts at the same second get _2, _3 suffixes.

Step 5: Report to user

Summarize: handle, output path, count downloaded, any errors, and list filenames sorted newest-first.


Anti-patterns

  1. Do not scrape faster than ~1 req/sec on Picnob post pages (date lookup).
  2. Do not commit posts-raw/ — scraping artifacts belong in .gitignore.
  3. Do not use Picnob pId as Instagram shortcode — it's an internal ID.
  4. Do not scrape private profiles.

Utility scripts

ScriptPurpose
scripts/download_profile_videos.pyDownload + datetime rename (main entry point)
scripts/scrape_picnob.jsReference for browser-side scrape logic

Additional resources

  • Real run example: examples.md
  • Full post/caption scraping (images, sidecars): use the instagram-scraper skill

What ships with it: 3 files

9.0 KB alongside SKILL.md, 2 of them executable

scripts/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.