facebook-page

Facebook Page manager: post, schedule, reply, get insights & more. Requires: powershell/pwsh. Reads ~/.config/fb-page/credentials.json (FB_PAGE_TOKEN, FB_PAGE_ID). FB_APP_SECRET for one-time setup only — delete afterward. Long-lived token; rotate periodically and immediately if host is compromised. Grant minimal permissions only. No data forwarded to third parties; all calls go to graph.facebook.com only.

Safety Notice

This listing is from the official public ClawHub registry. Review SKILL.md and referenced scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "facebook-page" with this command: npx skills add seph1709/facebook-page

facebook-page — Universal Meta Graph API Skill

Constructs and executes Meta Graph API calls inline based on what the user wants. No scripts needed.

API version: v25.0 Base URL: https://graph.facebook.com/v25.0


STEP 1 — Load Credentials

Credentials are stored in ~/.config/fb-page/credentials.json.

$cfg    = Get-Content "$HOME/.config/fb-page/credentials.json" -Raw | ConvertFrom-Json
$token  = $cfg.FB_PAGE_TOKEN
$pageId = $cfg.FB_PAGE_ID

If the file doesn't exist, guide setup. Required fields:

FieldPurpose
FB_PAGE_TOKENNever-expiring Page access token — used for all API calls
FB_PAGE_IDNumeric Facebook Page ID
FB_APP_IDMeta App ID — only needed during token exchange
FB_APP_SECRETMeta App Secret — only needed during token exchange

One-time token exchange setup:

# Provide: $appId, $appSecret, $shortToken (from Graph API Explorer), $pageId
# 1. Exchange for long-lived user token
$r1 = Invoke-RestMethod "https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id=$appId&client_secret=$appSecret&fb_exchange_token=$shortToken"
# 2. Get never-expiring Page token
$r2 = Invoke-RestMethod "https://graph.facebook.com/v25.0/$pageId?fields=access_token&access_token=$($r1.access_token)"
$pageToken = $r2.access_token
# 3. Save — only these four fields, nothing else
@{
    FB_PAGE_ID    = $pageId
    FB_PAGE_TOKEN = $pageToken
    FB_APP_ID     = $appId
    FB_APP_SECRET = $appSecret
} | ConvertTo-Json | Set-Content "$HOME/.config/fb-page/credentials.json" -Encoding UTF8

Restrict file permissions immediately after saving:

# Windows
icacls "$HOME/.config/fb-page/credentials.json" /inheritance:r /grant:r "$($env:USERNAME):(R,W)"
# macOS / Linux
# chmod 600 ~/.config/fb-page/credentials.json

⚠️ Never commit this file to version control. It contains long-lived secrets. This skill makes no external calls other than to graph.facebook.com. No data is forwarded to third parties.


STEP 2 — Figure Out the API Call

Common Endpoints

What user wantsMethodEndpoint
Post textPOST/$pageId/feed — body: message
Post with imagePOST/$pageId/photos — multipart: source + message
Post with videoPOST/$pageId/videos — multipart: source + description
Post with linkPOST/$pageId/feed — body: message + link
Delete a postDELETE/{post-id}
Schedule a postPOST/$pageId/feed — body: message + published=false + scheduled_publish_time (unix timestamp)
Get recent postsGET/$pageId/published_posts?fields=id,message,created_time&limit=10
Get page infoGET/$pageId?fields=name,fan_count,followers_count,about
Like a postPOST/{post-id}/likes
Get commentsGET/{post-id}/comments?fields=message,from,created_time
Reply to commentPOST/{comment-id}/comments — body: message
Hide commentPOST/{comment-id} — body: is_hidden=true
Delete commentDELETE/{comment-id}
Get page insightsGET/$pageId/insights?metric=page_fans,page_impressions&period=day
Get post insightsGET/{post-id}/insights?metric=post_impressions,post_reactions_by_type_total
List eventsGET/$pageId/events?fields=name,start_time,description
Create eventPOST/$pageId/events — body: name, start_time, description
List albumsGET/$pageId/albums?fields=name,count
Get page rolesGET/$pageId/roles
Publish draft postPOST/{post-id} — body: is_published=true

API Call Patterns

GET:

$result = Invoke-RestMethod -Uri "https://graph.facebook.com/v25.0/ENDPOINT?access_token=$token" -ErrorAction Stop

POST (form body):

$result = Invoke-RestMethod -Uri "https://graph.facebook.com/v25.0/ENDPOINT" -Method POST `
    -Body @{ field1="value1"; field2="value2"; access_token=$token } -ErrorAction Stop

DELETE:

$result = Invoke-RestMethod -Uri "https://graph.facebook.com/v25.0/{id}?access_token=$token" -Method DELETE -ErrorAction Stop

Multipart (image/video upload):

$boundary  = [System.Guid]::NewGuid().ToString()
$fileBytes = [System.IO.File]::ReadAllBytes($filePath)
$fileName  = [System.IO.Path]::GetFileName($filePath)
$stream    = New-Object System.IO.MemoryStream
$writer    = New-Object System.IO.StreamWriter($stream)
$writer.Write("--$boundary`r`nContent-Disposition: form-data; name=`"message`"`r`n`r`n$message`r`n")
$writer.Write("--$boundary`r`nContent-Disposition: form-data; name=`"access_token`"`r`n`r`n$token`r`n")
$writer.Write("--$boundary`r`nContent-Disposition: form-data; name=`"source`"; filename=`"$fileName`"`r`nContent-Type: image/jpeg`r`n`r`n")
$writer.Flush(); $stream.Write($fileBytes, 0, $fileBytes.Length)
$writer.Write("`r`n--$boundary--`r`n"); $writer.Flush()
$result = Invoke-RestMethod -Uri "https://graph.facebook.com/v25.0/$pageId/photos" -Method POST `
    -ContentType "multipart/form-data; boundary=$boundary" -Body $stream.ToArray() -ErrorAction Stop

Scheduled post — convert local time to Unix timestamp:

$runAt    = [datetime]"2026-03-15 09:00"
$unixTime = [int][double]::Parse(($runAt.ToUniversalTime() - [datetime]"1970-01-01").TotalSeconds)
$result   = Invoke-RestMethod -Uri "https://graph.facebook.com/v25.0/$pageId/feed" -Method POST `
    -Body @{ message="text"; published="false"; scheduled_publish_time=$unixTime; access_token=$token } -ErrorAction Stop

STEP 3 — Handle Errors

try {
    # ... API call ...
} catch {
    $err     = $_.ErrorDetails.Message | ConvertFrom-Json -ErrorAction SilentlyContinue
    $code    = $err.error.code
    $subcode = $err.error.error_subcode
    $msg     = $err.error.message
}
CodeSubcodeMeaningFix
100—Invalid parameterCheck the parameter values
102—Session expiredRe-run setup to get a new token
190460Token expiredRe-run setup with a new short-lived token
190467Invalid tokenRe-run setup
200—Permission deniedAdd the permission listed in error.message to your app
10—Permission denied (page)Add pages_read_engagement or pages_manage_posts
230—Requires re-authRe-run setup
368—Temporarily blockedWait and retry; page may be rate-limited

Permissions Reference

PermissionRequired for
pages_manage_postsCreate, delete, schedule posts
pages_read_engagementRead posts, likes, comments, insights
pages_show_listList pages you manage
pages_manage_metadataUpdate page settings
pages_manage_engagementModerate comments, reply to reviews
pages_read_user_contentRead visitor posts and comments
pages_manage_adsManage ad campaigns on the page
pages_manage_instant_articlesManage Instant Articles

If a permission is missing:

  1. Go to Meta for Developers
  2. Select your app → Permissions and Features
  3. Add the required permission
  4. Regenerate token via Graph API Explorer
  5. Re-run setup with the new token

AGENT RULES

  • Always load credentials first. If missing or incomplete, guide setup.
  • Only use FB_PAGE_TOKEN and FB_PAGE_ID for API calls. FB_APP_ID and FB_APP_SECRET are for token exchange only.
  • Never write extra fields to the credentials file (no owner IDs, conv IDs, or third-party keys).
  • Remove FB_APP_SECRET from credentials.json after token exchange — it is not needed for API calls.
  • Least-privilege: only request the permissions your use case needs. Do not request pages_manage_ads or pages_manage_instant_articles unless explicitly needed.
  • Rotate FB_PAGE_TOKEN periodically via Graph API Explorer, and immediately if the host is ever compromised.
  • All API calls go to graph.facebook.com only. No external forwarding, no third-party services.
  • Construct API calls inline from user intent — don't look for script files.
  • On any error: parse error.code + error.error_subcode, map to the table above, tell the user exactly what to do.
  • If a permission is missing: name it, link to Meta for Developers, say to re-run setup.

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

Gws Gmail Read

Gmail: Read a message and extract its body or headers.

Registry SourceRecently Updated
General

MikroTik API

Manages MikroTik routers via the RouterOS API (port 8728/8729). Use when the user wants to configure, monitor, or troubleshoot a MikroTik router — including...

Registry SourceRecently Updated
General

Evolution Watcher

自动监控并对比已安装插件版本,生成升级报告,支持星型记忆架构的智能进化决策。

Registry SourceRecently Updated
General

Thesaurus

Look up synonyms, antonyms, and related words with history and export. Use when finding alternatives, checking usage, running drills, analyzing frequency.

Registry SourceRecently Updated