← 返回 Skills 市场
psyduckler

Itinerary Carousel Post

作者 psyduckler · GitHub ↗ · v1.0.0
cross-platform ⚠ suspicious
774
总下载
0
收藏
0
当前安装
1
版本数
在 OpenClaw 中安装
/install itinerary-carousel-post
功能描述
Create and publish an Instagram carousel post from a tabiji.ai itinerary. Given an itinerary URL, finds Instagram-worthy photos for the destination + top att...
使用说明 (SKILL.md)

Create Instagram Carousel Post

End-to-end pipeline: itinerary URL → photo sourcing → text overlays → Instagram carousel publish.

Parameters

  • itinerary_url (required): tabiji.ai itinerary URL (e.g. https://tabiji.ai/i/thaw-dome/)
  • destination (required): City/region name (e.g. "Kuala Lumpur")
  • attractions (required): List of 5 attraction names + short descriptions
  • caption (optional): Custom caption. If omitted, generate one with destination name, attraction list, CTA to link in bio, and relevant hashtags.

Pipeline (3 chained sub-agents recommended)

Split into 3 sub-agents for reliability. Each writes outputs to /tmp/ig-carousel/.

Sub-agent 1: Photo Finding

Use the instagram-photo-find skill workflow for each subject (1 destination + 5 attractions = 6 total).

For each subject:

  1. web_search: site:instagram.com/p/ "{subject}" photo (10 results)
  2. Download top 5 candidates: curl -s -L -o /tmp/ig-carousel/raw-{slug}-{n}.jpg "https://www.instagram.com/p/{shortcode}/media/?size=l"
  3. Vision-score each with: "Rate 1-10 as hero destination photo for {subject}. Description + score only."
  4. Keep best per subject → /tmp/ig-carousel/{slug}-best.jpg

Output: 6 best images + JSON manifest at /tmp/ig-carousel/manifest.json:

[{"slug": "kuala-lumpur", "subject": "Kuala Lumpur", "score": 7, "path": "/tmp/ig-carousel/kuala-lumpur-best.jpg", "source": "instagram.com/p/XXX/"}]

Sub-agent 2: Text Overlays

Read manifest from sub-agent 1. Run overlay script for each image.

Slide 1 (cover) — clean style:

python3 skills/instagram-photo-text-overlay/scripts/overlay.py \
  --input /tmp/ig-carousel/{dest-slug}-best.jpg \
  --output /tmp/ig-carousel/slide-1.jpg \
  --title "{N} Day {DESTINATION} Itinerary Highlights" \
  --style clean --watermark "tabiji.ai"

Slides 2–6 — quote style per attraction with insider tip:

python3 skills/instagram-photo-text-overlay/scripts/overlay.py \
  --input /tmp/ig-carousel/{slug}-best.jpg \
  --output /tmp/ig-carousel/slide-{N}.jpg \
  --title "{ATTRACTION}" \
  --quote "{Specific insider tip about THIS attraction — must directly reference the place in the title, not a generic travel tip}" \
  --author "tabiji.ai" \
  --style quote --watermark "tabiji.ai"

Output: 6 overlay images at /tmp/ig-carousel/slide-{1-6}.jpg

Sub-agent 3: Publish to Instagram

  1. Host images publicly — copy slides to tabiji repo (img/instagram/), git push, use raw GitHub URLs (https://raw.githubusercontent.com/psyduckler/tabiji/main/img/instagram/slide-{N}.jpg). Wait ~30s after push for GitHub CDN.

  2. Create carousel item containers (one per slide):

curl -s -X POST "https://graph.facebook.com/v21.0/${IG_USER}/media" \
  -d "image_url=${PUBLIC_URL}" \
  -d "is_carousel_item=true" \
  -d "access_token=${IG_TOKEN}"
  1. Create carousel container with all children + caption:
curl -s -X POST "https://graph.facebook.com/v21.0/${IG_USER}/media" \
  --data-urlencode "caption=${CAPTION}" \
  -d "media_type=CAROUSEL" \
  -d "children=${CHILD_IDS}" \
  -d "access_token=${IG_TOKEN}"
  1. Publish:
curl -s -X POST "https://graph.facebook.com/v21.0/${IG_USER}/media_publish" \
  -d "creation_id=${CAROUSEL_ID}" \
  -d "access_token=${IG_TOKEN}"
  1. Get permalink (or verify publish on rate-limit error):

If media_publish returns a POST_ID, get the permalink directly:

curl -s "https://graph.facebook.com/v21.0/${POST_ID}?fields=permalink&access_token=${IG_TOKEN}"

If media_publish returns error 2207051 (rate limit / action blocked): Instagram sometimes processes the request despite returning an error. Always verify by checking the account's recent media before declaring failure:

curl -s "https://graph.facebook.com/v21.0/${IG_USER}/media?fields=id,timestamp,permalink&limit=1&access_token=${IG_TOKEN}"

If the most recent post timestamp is within the last few minutes, the publish likely succeeded — grab that permalink.

  1. Cleanup hosted images — after publish is confirmed, delete the images from the tabiji repo and push:
cd /path/to/tabiji/repo
git rm img/instagram/slide-*.jpg
git commit -m "cleanup: remove instagram carousel images after publish"
git push

Also clean up local temp files:

rm -rf /tmp/ig-carousel/

Output: Instagram post URL

Instagram API Auth

Keys from macOS Keychain:

  • instagram-access-token — Graph API token
  • instagram-account-id — IG user ID (17841449394591017)

Caption Template

🇲🇾 {N} Nights in {Destination} — {Itinerary Subtitle}

{One-line hook about the trip}

📍 Swipe through our top 5 picks:
1. {Attraction 1} — {one-line reason}
2. {Attraction 2} — {one-line reason}
3. {Attraction 3} — {one-line reason}
4. {Attraction 4} — {one-line reason}
5. {Attraction 5} — {one-line reason}

Full free itinerary with tips, prices & Reddit recs 👉 {ITINERARY_URL}

💬 {PROVOCATIVE_QUESTION — e.g. "Is 5 nights enough for {Destination} or do you need more?" or "What's the one thing most tourists get wrong about {Destination}?"}

#{destination_hashtag} #{country} #travelitinerary #foodietravel #southeastasia #asiatravel #travelguide #tabiji

Tips

  • Raw GitHub URLs work for IG image_url; tabiji.ai Cloudflare CDN may trigger format validation errors.
  • Add sleep 1 between container creation calls to avoid rate limits.
  • If a subject yields low photo scores (\x3C5), broaden search: try Unsplash/Flickr or more specific landmark names.
  • Islamic/cultural museums tend to have fewer quality IG photos — try searching the museum's official IG handle.
安全使用建议
This skill's workflow looks plausible for publishing Instagram carousels, but it assumes access to secrets and resources that are not declared: an Instagram Graph API token and account ID (stored in your macOS Keychain), write access to a specific GitHub repo (psyduckler/tabiji), and a local overlay script plus another skill for photo-finding. Before installing or running this skill, verify: (1) who authored the skill and whether it is intended to run in your environment; (2) you are comfortable granting access to your Instagram API token and any git credentials — prefer short-lived tokens or a dedicated account; (3) the referenced local scripts and repo exist and are safe; (4) run it in a sandboxed environment first (no access to your primary keychain or production repos). If you cannot confirm those points, do not provide real credentials or repo write access and consider rejecting the skill.
功能分析
Type: OpenClaw Skill Name: itinerary-carousel-post Version: 1.0.0 The `SKILL.md` file presents significant shell injection and prompt injection vulnerabilities. User-controlled parameters like `{DESTINATION}`, `{ATTRACTION}`, and `{subject}` are directly substituted into `bash` commands (e.g., `python3 skills/instagram-photo-text-overlay/scripts/overlay.py --title "{ATTRACTION}"`) and prompts for web search/vision scoring without apparent sanitization. This could allow an attacker to execute arbitrary commands on the agent's host or manipulate the agent's behavior. While the skill's use of `git push` and `curl` to Instagram APIs is aligned with its stated purpose, the lack of input sanitization for these powerful operations makes the skill highly risky.
能力评估
Purpose & Capability
The high-level purpose (sourcing photos, applying overlays, publishing a carousel) matches the steps in SKILL.md, but the instructions assume access to: a specific GitHub repo (psyduckler/tabiji), local overlay scripts at skills/instagram-photo-text-overlay/scripts/overlay.py, and an 'instagram-photo-find' skill workflow. None of these dependencies, paths, or credentials are declared in the skill metadata — this is disproportionate to the stated simple publish task and indicates hidden operational requirements.
Instruction Scope
Instructions tell the agent to: run web searches and curl to download Instagram images, read Instagram tokens from macOS Keychain, copy images into a repo and git push/delete files, call the Graph API with ${IG_TOKEN}/${IG_USER}, and clean up local files. The SKILL.md references secrets (instagram-access-token, instagram-account-id) and local repo paths that are not listed in requires.env or requires.config. It also references other local scripts and a separate skill. These are sensitive operations and the instructions reach outside a narrowly scoped 'publish' task (accessing keychain and pushing to repositories).
Install Mechanism
No install spec and no code files are included, which is low-risk from an installation perspective. However, the runtime assumes local Python overlay scripts and other skills that are not provided — meaning the agent will fail unless those external artifacts exist or it has network access to fetch them.
Credentials
The skill does not declare any required environment variables or credentials, yet the instructions require an Instagram Graph API access token and an account ID (and reference retrieving keys from macOS Keychain). It also requires push access to a GitHub repo (implying git credentials). Requesting account tokens and repository write access is sensitive and should be explicitly declared and minimized. The mismatch between declared and required credentials is a red flag.
Persistence & Privilege
The skill is not always-included and does not request elevated platform privileges. It does, however, instruct the agent to modify a remote repo (git push / git rm), which requires credentials and grants external persistence of images; that operational effect is significant but not encoded as a platform permission in the skill metadata.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install itinerary-carousel-post
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /itinerary-carousel-post 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
Initial release
元数据
Slug itinerary-carousel-post
版本 1.0.0
许可证
累计安装 0
当前安装数 0
历史版本数 1
常见问题

Itinerary Carousel Post 是什么?

Create and publish an Instagram carousel post from a tabiji.ai itinerary. Given an itinerary URL, finds Instagram-worthy photos for the destination + top att... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 774 次。

如何安装 Itinerary Carousel Post?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install itinerary-carousel-post」即可一键安装,无需额外配置。

Itinerary Carousel Post 是免费的吗?

是的,Itinerary Carousel Post 完全免费(开源免费),可自由下载、安装和使用。

Itinerary Carousel Post 支持哪些平台?

Itinerary Carousel Post 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Itinerary Carousel Post?

由 psyduckler(@psyduckler)开发并维护,当前版本 v1.0.0。

💬 留言讨论