mcpField
I
instagram-scraper

instagram-scraper

github.com/jeniokデータ・データベース03.4k 回インストール9 週間前に更新
リポジトリ

instagram-scraper について

Apify の Instagram Scraper で公開 Instagram データを取得するスキルです。安全な認証方法を確認したうえで、プロフィール、投稿、リール、ストーリー、コメント、検索結果を条件付きで取得できます。

主な機能

  1. 01プロフィール情報と統計の取得
  2. 02投稿・リール・ストーリーの取得
  3. 03コメントとメンションの収集
  4. 04キーワードや種別で検索
  5. 05件数と日付による絞り込み
  6. 06トークン漏えいを防ぐ認証手順

活用シーン

  1. 01公開アカウントのプロフィール指標を確認
  2. 02指定URLから投稿やリールを収集
  3. 03分析用にコメントやメンションを取得
  4. 04件数を制限してInstagram上のコンテンツを検索

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeniok/skills --skill instagram-scraper

インストール後、Claude Code で/instagram-scraperを入力して読み込まれたか確認します。

詳細

Instagramスクレイパー

ApifyのInstagram Scraperを通じて、Instagramの公開データを取得します。Instagramへのログイン、Cookie、Metaアプリの審査は不要です。

Actorapify/instagram-scraper
認証Authorization: Bearer $APIFY_TOKEN、またはログイン済みのApify CLI — セットアップを参照
料金Apifyによる従量課金で、1,000件あたり$2.30から
無料枠月額$5分のクレジット ≈ 2,000件以上、クレジットカード不要

セットアップ — データを取得する前に実行してください

必ず最初にこの事前チェックを実行してください。 成功するまではデータ取得を試みないでください。

if [ -n "$APIFY_TOKEN" ]; then
  echo "AUTH_OK curl"
elif command -v apify >/dev/null 2>&1 && apify info >/dev/null 2>&1; then
  echo "AUTH_OK cli: apify"
elif { [ -f "$HOME/.apify/auth.json" ] || [ -f "$USERPROFILE/.apify/auth.json" ]; } \
     && npx --yes apify-cli@latest info >/dev/null 2>&1; then
  echo "AUTH_OK cli: npx --yes apify-cli@latest"
else
  echo "AUTH_MISSING"
fi

チェックは、コストが低いものから順に実行されます。npxへのフォールバックには約4秒かかるため、Apifyの設定ディレクトリに以前のログインがある場合にのみ実行されます。初めて利用するユーザーは、セッションが見つかる見込みのないパッケージのダウンロードを待つことなく、すぐにAUTH_MISSINGになります。

$HOMEと$USERPROFILEの両方を確認するのには理由があります。 Windowsでは、これらが異なる場所を指すことがあります。サンドボックスや一部のCIイメージでは$HOMEが別の場所に割り当てられる一方、Apify CLIは引き続き$USERPROFILE\.apifyに書き込みます。そこで$HOMEだけを確認すると、問題なくログインしているユーザーにもAUTH_MISSINGが報告され、そのユーザーはすでに持っているアカウントへの登録を促されてしまいます。認証済みのはずのマシンでAUTH_MISSINGが表示された場合は、結果を信頼する前に両方のパスを確認してください。

2つのAUTH_OKモードは互換性がありません。どの形式で呼び出すべきかは事前チェックで確認できます。

  • AUTH_OK curl — 環境変数にトークンがあります。このスキルのHTTP呼び出しは、記載どおりに使用できます。
  • AUTH_OK cli: <prefix> — Apify CLIにセッションがあり、トークンはディスクから読み取れません。~/.apify/auth.jsonにあるのはアカウントのメタデータのみです(ユーザー名、プラン、プロキシグループなど。tokenフィールドはありません)。現在のCLIバージョンでは、トークンはOSのシークレットバックエンドに保存されています。このファイルからトークンを取り出そうとしないでください。無効なAuthorization: Bearerヘッダーは401を返し、失効したトークンとまったく同じように見えます。代わりにapify callを使用し、事前チェックでcli:の後に表示されたもの(apify、またはCLIがPATHにない場合はnpx --yes apify-cli@latest)を先頭に付けて実行してください。
事前チェックでAUTH_OK cliが表示された場合

このスキルで使うペイロードはすべてそのまま使用できます。ファイルに書き込み、curlの代わりにapify callへ渡してください。

cat > /tmp/ig-input.json <<'EOF'
{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"details","resultsLimit":1}
EOF

apify call apify/instagram-scraper --input-file /tmp/ig-input.json --output-dataset --silent
  • Actor IDは必ず明示してください。 IDを指定しない場合、apify callはローカルの.actor/actor.jsonで定義されたActorを実行します。Actorのリポジトリ内では、意図せず別の処理が実行されてしまいます。
  • インラインの-i '{...}'よりも--input-fileを優先してください。 インラインJSONはシェルを介して正しく渡す必要があり、PowerShellやcmd.exeでは引用符が意図せず変更されます。ファイルならその心配はありません。--input-file -を使うと標準入力を読み込みます。
  • --output-datasetはデータセットを標準出力に出力します。 これはrun-sync-get-dataset-itemsが返すものと同じ配列なので、以下の「出力」セクションに記載されたすべてのフィールドが同じです。--silentを指定すると、実行ログが標準出力に出力されないため、出力をJSONとして解析できます。
  • apify callは実行が完了するまで待機するため、以下の非同期ポーリングのパターンが必要なのはcurlを使う場合だけです。長時間のジョブに上限を設定するには、--timeout <seconds>を追加してください。
  • 実行料金は、CLIでログイン中のアカウントに請求されます。apify infoでアカウントを確認できます。アカウントを複数持っている可能性がある場合は、ユーザーに表示するとよいでしょう。
プリフライトで AUTH_MISSING と表示された場合

ユーザーのブラウザーで Apify のサインアップページを開き、その後トークンを求めます。以下をそのまま実行してください。プラットフォームに応じて適切なコマンドが選ばれ、ブラウザーがない場合(CI、SSH、コンテナー)は URL の表示に切り替わります。

URL="https://console.apify.com/sign-up?fpr=z8j1nz"
# xdg-open is checked before open: on some Linux distros `open` is openvt, not a browser.
if command -v xdg-open >/dev/null 2>&1; then xdg-open "$URL"
elif command -v open >/dev/null 2>&1; then open "$URL"
elif command -v powershell.exe >/dev/null 2>&1; then powershell.exe -NoProfile -Command "Start-Process '$URL'"
elif command -v cmd.exe >/dev/null 2>&1; then cmd.exe /c start "" "$URL"
else echo "Open this URL in a browser: $URL"
fi

その後、何が起きているのかをユーザーに伝えます。ただし、返事を待たないでください。

ブラウザーで Apify のサインアップページを開きました。Instagram のデータは Apify 経由で取得します。Apify は無料で始められ、毎月 5 ドル分のクレジットが付与されます。クレジットカードは不要で、約 2,000 件の結果を取得できます。

そこでサインアップしてください(すでにアカウントをお持ちの場合はログインしてください)。認証の手順もこれから開きます。承認すると、このマシンが接続された状態になり、次回からはこの操作を行う必要がありません。

サインアップリンクは紹介リンクです。

すぐにログインを実行します。サインアップが完了したかどうかをユーザーに確認してから実行してはいけません。このコマンドで Apify の認証ページが開き、そこからサインアップもできるうえ、ユーザーが完了するまで処理がブロックされます。コマンド自体が待機するため、完了を検知する必要も、無駄なやり取りもありません。

timeout 300 npx --yes apify-cli@latest login -m console
  • -m console は必須です。 引数なしで apify login を実行すると、最初にログイン方法を尋ねるプロンプトが表示され、エージェントが回答できない stdin で永久に停止します。-m console を指定すると、ブラウザーフローが直接始まります。
  • timeout 300 を指定して、サインアップが放置されてもセッションが停止しないようにします。終了コード 124 はタイムアウトを意味します。ユーザーが離席したため、黙って再試行するのではなく、続行するかどうかを尋ねてください。
  • 成功すると、次のメッセージが表示されます。「Success: You are logged in to Apify as <username>. Your token is stored in your OS keyring.」 以後、すべてのセッションでプリフライトの結果は AUTH_OK cli となります。トークンを貼り付けたり、保存したり、トランスクリプトに漏らしたりする必要はありません。

その後、プリフライトを再実行してください。動作したかどうかを判断する方法はこれです。メッセージでも、ブラウザーの操作が問題なく完了したという推測でもありません。

プリフライトの表示意味対応
AUTH_OK cli: <prefix>ログイン済みで、状態が保持されていますリクエストを続行します
AUTH_MISSINGログインが完了していませんそのまま伝え、再試行するかどうかを尋ねます — 繰り返し実行してはいけません

プリフライトの CLI 分岐で実行されるのは apify info だけです。セッションが存在すれば終了コード 0、存在しなければゼロ以外で終了します。これは先ほど AUTH_MISSING を出したものと同じ確認なので、再実行は既に想定していたことを言い直すのではなく、実際の状態を確認することになります。

成功したように見えても、実際には失敗しているケースが 2 つあります。どちらも把握しておく価値があります。ユーザーが認証タブを承認せずに閉じた場合(タイムアウト時に終了コード 124 になります)と、サインアップはしたものの承認手順まで進まなかった場合です。どちらの場合もサインアップ自体は成功している可能性がありますが、このマシンはまだ接続されていません。だからこそ、信頼すべきなのはサインアップではなくプリフライトです。

サインアップのタブを開き、その後にログインを実行する順序を守ってください。 紹介情報が記録されるのはサインアップページです。その後の認証手順は、既存のアカウントにこのマシンを接続するだけです。逆の順序で開くと、紹介情報が正しく記録されません。

ユーザーにトークンを決して尋ねないでください

会話の中で Apify API トークンを要求、受け取り、または扱わないでください。 上記のブラウザーログインがあるのは、秘密情報がエージェントに届かないようにするためです。CLI が Apify から直接トークンを受け取り、OS のキーリングに書き込みます。このスキルが読み取るのは、その処理の結果(apify info の終了コード)だけであり、トークンの値を読み取ることはありません。

ユーザーが求められていないのにトークンを提示した場合は、受け取りを断り、以下の2つの安全な方法のいずれかを案内してください。 セッションに貼り付けられた情報は、会話の記録、スクロールバック、会話を記録するあらゆるログに残る、有効な認証情報です。

ヘッドレス環境 — CI、SSH、コンテナーなど、OAuth の認証フローでブラウザーを開けない環境。エージェントを起動する前に、ユーザー自身がエージェントの外部で認証情報を設定します。

# the user runs this in their own shell / CI secret store — not via the agent
export APIFY_TOKEN="…"

その後、プリフライトで AUTH_OK curl と報告され、値が会話を経由することなく、すべてが機能します。

または、CLI 独自のプロンプトを使用します。この方法では、会話ではなく stdin からトークンを読み取ります。

npx --yes apify-cli@latest login -m manual

login -t <token> は使用しないでください。秘密情報をコマンドライン引数として渡すと、マシン上の他のすべてのプロセスからプロセス一覧で見えるほか、シェルの履歴にも残ります。また、検証前に保存済みセッションを消去するため、入力ミスや古い値によって、正常に機能していたセッションからログアウトされてしまいます。

トークンが正当に環境変数として存在する場合は、必ず $APIFY_TOKEN として参照し、シェルに展開させてください。このスキルのすべての例と同じ方法です。コマンド、ログ行、メッセージにトークンの実際の値を埋め込まないでください。


データの取得

1回の同期呼び出しで、アイテムが直接返されます。約60秒以内に完了する処理に適しています。これは AUTH_OK curl の形式です — AUTH_OK cli の場合は、同じ -d のペイロードをファイルに入れ、上記のように apify call で実行してください。

curl -s -X POST \
  "https://api.apify.com/v2/acts/apify~instagram-scraper/run-sync-get-dataset-items?timeout=120" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "User-Agent: instagram-scraper-skill" \
  -d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"details","resultsLimit":1}'

User-Agent ヘッダーは、このスキルから開始された実行をログで識別するためだけのものです。個人データは含まれておらず、削除してもかまいません。

resultsType の選択
値返される内容
detailsプロフィールのメタデータ:フォロワー数、フォロー数、自己紹介、投稿数、プロフィール画像。最も低コスト — プロフィールごとに1件の結果です。
posts投稿のフィード
reelsリールのみ
stories現在公開中のストーリーズ
comments投稿 URL に対するコメント
mentionsアカウントに言及している投稿

ユーザーがプロフィールの数値だけを必要としている場合は、常に details を選択してください。その質問に posts を使用すると、メリットがないままコストが最大100倍になります。

入力リファレンス
フィールド型デフォルト備考
directUrls配列—プロフィール、投稿、リール、ハッシュタグ、場所、音声の URL — URL の処理方法は以下を参照
resultsType文字列posts上の表を参照
resultsLimit整数100URL ごとの件数。コストに影響するため、必ず設定してください。
onlyPostsNewerThan文字列—YYYY-MM-DD、ISO 形式、または 1 day / 2 months。UTC
search文字列—directUrls の代わりに指定するキーワード
searchType文字列hashtaghashtag、profile、place、user
searchLimit整数10検索ごとに見つけるアイテムの最大数
addParentDataブール値false各アイテムに、そのアイテムを取得したクエリを付加します

ほかにも使用可能なフィールドが4つありますが、公開されている入力スキーマには記載されていません。 Actor の README に記載され、動作確認済みです。自由に使用してください。

フィールド型適用対象備考
addProfileStatisticsブール値detailsstatistics オブジェクト(約60フィールド)を追加します — account_type(1 は Personal、2 は Business、3 は Creator)、media_count、total_clips_count、category、city_name、連絡先フィールドが含まれます。非公開プロフィールでも機能します
skipPinnedPostsブール値posts固定された投稿を除外します
isNewestCommentsブール値comments新しい順に並べます。有料プランのみ — 無料プランではデフォルトの順序になります
includeNestedCommentsブール値comments返信を含めます。有料プランのみ。 返信はそれぞれ別の結果となるため、合計件数が resultsLimit を超えます
URL の処理

directUrls は見た目より柔軟に扱えます。以下はすべて受け付けられます。

  • プロフィール ID はプロフィール URL が使える場所ならどこでも使えます — 数字のみの ID でも問題ありません
  • instagram.com/_u/natgeo/profilecard/ — _u と profilecard は取り除かれます
  • instagram.com/stories/username/ — ユーザー名に変換されます
  • instagram.com/share/BAC6cDeb_- — 正規の投稿 URL に解決されます
  • instagram.com/explore/locations/7538318/ — ID のみで有効です。スラッグは不要です

サポート対象外: posts、reels、mentions または details の URL 形式の数値投稿 ID(instagram.com/p/3369450800358839406/)。 代わりに shortCode 形式を使用してください。この形式は comments では 使用できます。

URL の種類によって出力スキーマが決まります。 ハッシュタグ、場所、音声、探索の URL は 別のコンテンツモードと組み合わせても、それぞれ独自のメタデータを返します。そのため、場所の URL に resultsType: "details" を指定すると、プロフィール詳細ではなく場所の詳細が返されます。

注意が必要な制約
  • 1 回の実行につきコンテンツタイプは 1 つです。 1 回の呼び出しで投稿とコメントの両方を 取得する方法はありません。2 回実行してください。
  • 検索より URL が優先されます。 directUrls と search は併用できません。両方が 指定されている場合、URL が優先され、検索は無視されます。
  • ハッシュタグはプレーンテキストで指定します — #travel ではなく travel を使います。
  • 複数の検索語は 1 つの文字列にカンマ区切りで指定します:「"travel, fitness"」。
  • 無料プランでは、投稿ごとにコメントを約 1 ページ分(約 15 件)取得できます。 有料プランには この上限はありません。これをエラーとして報告しないでください。制限の内容を伝えてください。
よくあるタスク

Actor が公開するすべての機能と、それぞれのペイロードです。-d '...' の部分を上記の curl に置き換えてください。

複数アカウントのプロフィール統計 — 最も低コストの呼び出し:

-d '{"directUrls":["https://www.instagram.com/nasa/","https://www.instagram.com/natgeo/"],"resultsType":"details","resultsLimit":1}'

プロフィールの過去 30 日間の最近の投稿:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"posts","resultsLimit":30,"onlyPostsNewerThan":"1 month"}'

プロフィールのリール:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"reels","resultsLimit":20}'

プロフィールの現在のストーリーズ — ストーリーズが公開中の場合のみ結果が返され、有料プランが 必要になることもよくあります:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"stories","resultsLimit":20}'

アカウントに言及している投稿 — ブランドのモニタリング:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"mentions","resultsLimit":50}'

1 件の投稿に対するコメント:

-d '{"directUrls":["https://www.instagram.com/p/SHORTCODE/"],"resultsType":"comments","resultsLimit":50}'

ハッシュタグが付いた投稿:

-d '{"search":"wildlifephotography","searchType":"hashtag","searchLimit":50,"resultsType":"posts","resultsLimit":50}'

キーワードでアカウントを検索 — user はアカウントレコードを返します:

-d '{"search":"climate photographer","searchType":"user","searchLimit":20,"resultsType":"details"}'

名前でプロフィールを検索 — profile はプロフィールページを対象に照合します:

-d '{"search":"national geographic","searchType":"profile","searchLimit":20,"resultsType":"details"}'

場所からの投稿:

-d '{"search":"Yosemite National Park","searchType":"place","searchLimit":20,"resultsType":"posts","resultsLimit":50}'

特定の場所またはハッシュタグの URL からの投稿 — 検索する代わりに URL を直接 渡します:

-d '{"directUrls":["https://www.instagram.com/explore/tags/wildlife/"],"resultsType":"posts","resultsLimit":50}'

各投稿の検索クエリを追跡 — 1 回の実行で複数のハッシュタグや プロフィールをスクレイピングする場合、addParentData を使うと各アイテムにソースが付与されるため、 後から結果をグループ化できます:

-d '{"search":"wildlife","searchType":"hashtag","searchLimit":30,"resultsType":"posts","resultsLimit":30,"addParentData":true}'

プロフィールの詳細統計 — アカウントの種類、投稿とリールの件数、カテゴリ、都市、 公開されている連絡先情報。非公開プロフィールでも動作します:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"details","resultsLimit":1,"addProfileStatistics":true}'

固定投稿を除外した最近の投稿:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"posts","resultsLimit":30,"skipPinnedPosts":true}'

固定投稿のみ — 同じ 2 つの値を逆にします:

-d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"posts","skipPinnedPosts":false,"onlyPostsNewerThan":"0 minutes"}'

新しいコメントを先に表示し、返信も含める — どちらも有料プラン限定です:

-d '{"directUrls":["https://www.instagram.com/p/SHORTCODE/"],"resultsType":"comments","resultsLimit":50,"isNewestComments":true,"includeNestedComments":true}'

出力

**コンテンツの種類ごとに異なるスキーマが生成され、1 回の実行で組み合わせることはできません。**以下のサンプルは有用なフィールドを抜粋したものです。渡す URL の種類によって構造が変わる場合があります(別のモードでも、場所の URL なら場所データが返されます)。

投稿/カルーセル(resultsType: "posts")— 23 フィールド:

{
  "inputUrl": "https://www.instagram.com/p/DZxvMgyH8yR/",
  "id": "3923124318436838545",
  "type": "Image",
  "shortCode": "DZxvMgyH8yR",
  "caption": "In the Democratic Republic of the Congo…",
  "hashtags": [], "mentions": ["carstenpeter"],
  "url": "https://www.instagram.com/p/DZxvMgyH8yR/",
  "likesCount": 34512, "commentsCount": 210,
  "timestamp": "2026-06-22T17:24:20.000Z",
  "displayUrl": "https://…", "images": [], "childPosts": [],
  "dimensionsWidth": 1080, "dimensionsHeight": 1350, "alt": "…",
  "ownerUsername": "natgeo", "ownerFullName": "National Geographic", "ownerId": "787132",
  "firstComment": "…", "latestComments": [], "isCommentsDisabled": false
}

リール(resultsType: "reels")— 31 フィールド。投稿のフィールドに動画が加わります:

{
  "…all post fields…": "…",
  "videoUrl": "https://…", "videoDuration": 28.28,
  "videoViewCount": 120433, "videoPlayCount": 98221,
  "audioUrl": "https://…", "musicInfo": {}, "productType": "clips",
  "isPinned": false
}

コメント(resultsType: "comments"):

{
  "postUrl": "https://www.instagram.com/p/DZ5T2XPllXv/",
  "commentUrl": "https://www.instagram.com/p/DZ5T2XPllXv/c/18093536360613690",
  "id": "18093536360613690",
  "text": "We love you NASA 💙🌎🌊",
  "ownerUsername": "mavideniz5521__", "ownerProfilePicUrl": "https://…",
  "timestamp": "2026-06-22T17:24:20.000Z",
  "likesCount": 4, "repliesCount": null, "replies": null,
  "owner": { "username": "…" }
}

repliesCount と replies が設定されるのは、includeNestedComments: true の場合のみです(有料)。

プロフィール詳細(resultsType: "details")— 22 フィールド。ライブ環境で確認済み:

{
  "inputUrl": "https://www.instagram.com/nasa/",
  "id": "528817151", "username": "nasa", "url": "https://www.instagram.com/nasa/",
  "fullName": "NASA", "biography": "Making the seemingly impossible, possible. ✨",
  "externalUrl": "https://www.nasa.gov/", "externalUrls": [],
  "followersCount": 104423132, "followsCount": 92, "postsCount": 4888,
  "verified": true, "private": false,
  "isBusinessAccount": true, "businessCategoryName": "Government Agencies",
  "joinedRecently": false, "fbid": "17841401474538262",
  "profilePicUrl": "https://…", "profilePicUrlHD": "https://…",
  "highlightReelCount": 5, "igtvVideoCount": 171,
  "latestPosts": [], "relatedProfiles": []
}

**details には、追加料金なしで latestPosts(最大 12 件)と relatedProfiles(最大 48 件)がすでに含まれています。**プロフィールの数値と最近の投稿の両方をユーザーが確認したい場合、details を 1 回呼び出すだけで済みます。通常、posts を別途呼び出す必要はありません。

addProfileStatistics: true を指定すると、statistics オブジェクト(約 60 フィールド)が追加されます:account_type(1 は Personal、2 は Business、3 は Creator)、media_count、total_clips_count、category、city_name、address_street、zip、bio_links、mutual_followers_count。

メンション(resultsType: "mentions")— 21 フィールド。投稿形式のフィールドに taggedUsers、music、carouselImages、carouselImageCount が加わります。

場所の詳細(場所の URL)— 16 フィールド:

{
  "inputUrl": "https://www.instagram.com/explore/locations/7538318/",
  "name": "Copenhagen, Denmark", "location_id": "7538318", "slug": "copenhagen",
  "lat": 55.6761, "lng": 12.5683,
  "location_address": "…", "location_city": "…", "location_zip": "…",
  "phone": "…", "category": "…", "price_range": "…",
  "media_count": 1284322, "ig_business": "…", "posts": [], "hours": {}
}

ハッシュタグの詳細(ハッシュタグの URL)— 15 フィールド。SEO 向けの追加情報を含みます: name、postsCount、url、id、posts、postsPerDay、difficulty、related、 frequent、average、rare、relatedFrequent、relatedAverage、relatedRare。

検索結果には searchTerm と searchSource が含まれるため、どのクエリから各行が生成されたかを確認できます:

  • ハッシュタグ検索 — 6 フィールド:searchTerm、searchSource、name、postsCount、url、id
  • 場所検索 — 17 フィールド:場所の詳細形式に searchTerm/searchSource が加わります
  • プロフィール検索 — 13 フィールド:投稿形式で、ownerUsername、ownerFullName、taggedUsers を含みます
画像はファイルではなく URL です

画像と動画の各フィールドは、Instagram の CDN へのリンクです。ダウンロードは行われず、**リンクには署名が付与されており、数時間後に有効期限が切れます。**メディアそのものが必要な場合は、ユーザー自身の通信環境で速やかに取得してください。

1 分を超える実行

大規模なジョブでは、同期接続を維持するのではなく、非同期で開始してポーリングしてください:

RUN=$(curl -s -X POST "https://api.apify.com/v2/acts/apify~instagram-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"directUrls":["https://www.instagram.com/nasa/"],"resultsType":"posts","resultsLimit":1000}' \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['id'])")

curl -s "https://api.apify.com/v2/actor-runs/$RUN?waitForFinish=60" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['status'])"

curl -s "https://api.apify.com/v2/actor-runs/$RUN/dataset/items?format=json" \
  -H "Authorization: Bearer $APIFY_TOKEN"

status が SUCCEEDED になるまでポーリングしてから、項目を取得します。FAILED または ABORTED の場合は停止して報告してください。ユーザーが料金を支払っているジョブを、黙って再試行してはいけません。


エラー

ステータス意味対処方法
401トークンがない、間違っている、または取り消されている上記の Setup の事前確認を再実行してください。呼び出しを再試行してはいけません。CLI にログイン済みなのに curl 経由で 401 が発生した場合、トークンは捏造されたものです。apify call に切り替えてください。
402/insufficient credit月間クレジットを使い切ったユーザーに伝えてください。月次リセットを待つか、https://apify.com/pricing?fpr=z8j1nz でアップグレードできます(紹介リンク)。再試行してはいけません。
404Actor ID または run ID が無効URL でスラッシュではなくチルダを使った apify~instagram-scraper が指定されていることを確認してください。
408/タイムアウト同期呼び出しが制限時間を超えた上記の非同期パターンに切り替えてください。
空の配列非公開、削除済み、または実際に空正直に報告してください。請求の問題だと決めつけてはいけません。
apify call がゼロ以外の終了コードを返す実行が失敗したか、CLI セッションが失われたCLI は理由と実行 URL を表示します。再試行するのではなく、その内容を確認してください。apify info も失敗する場合はセッションの有効期限が切れています。Setup を再実行してください。

空の結果も正当な回答です。非公開アカウント、削除された投稿、投稿の少ないハッシュタグでは、正当に何も返されないことがあります。

不具合として扱わず、正確に報告すべきデータの特性
  • likesCount: -1 は、クリエイターが「いいね!」数を非表示にしていることを意味します。Instagram では公開されません。「クリエイターによって非表示」と伝えてください。ゼロやエラーとして報告してはいけません。
  • 非公開プロフィールからは、通常、何も返されません。例外が 1 つあります。非公開アカウントが投稿のコラボレーターとしてタグ付けされていて、共同投稿者のいずれかが公開アカウントの場合、Instagram はその投稿を公開として扱うため、結果に表示されます。
  • 指標はアプリの表示と異なることがあります。 Instagram はログアウト状態の訪問者に若干異なる数値を表示し、大きな数値は常に変動しています。多少の差異は想定内です。
  • 結果数は保証されません。 固定の上限はなく、Instagram が公開している情報が返されます。どの程度の情報が得られるはずかを確認するには、シークレットウィンドウで URL を開いてください。

コスト管理

ユーザーは結果ごとに料金を支払っています。実際のお金として扱ってください。

  • 必ず resultsLimit を設定してください。 デフォルトは URL あたり 100 件です。デフォルトのまま 5 つの URL を呼び出すと、ユーザーが 25 件を想定していた場合でも、500 件分の料金が発生します。
  • フォロワー数、プロフィール文、投稿数に関する質問には、resultsType: "details" を使用してください。 プロフィールごとに 1 件の結果が返されます。
  • まずは少数で始めてください。 範囲が定まっていない場合は、上限を設けて最初の実行を行い、結果をユーザーに見せてから、拡大する前に確認してください。
  • 大量実行を始める前に、費用を伝えてください。 1,000 件あたり $2.30 の場合、5,000 件のジョブは約 $11.50 です。
  • 401 または 402 の後に同じ呼び出しを繰り返してはいけません。試行ごとに課金される可能性があり、どの試行も成功しません。

コメント