PythonとインスタグラムAPI を使って画像を自動投稿する方法

2024年9月14日

初めに

今回は、インスタ投稿APIについて解説していくね。

この記事では、インスタグラムAPIを用いて画像をプログラムで投稿する方法を解説致します。
インスタグラムAPIは、画像や動画の投稿、アカウント情報の取得など、様々な機能を提供しますが、使い方に少し癖があるため、戸惑う方もいるかもしれません。そこで、本記事では、API の基本的な使い方を、実際のpythonプログラムを用いて解説していきます。

インスタグラムAPIとは

インスタグラムAPIは、Meta社が提供するインスタグラムへのプログラムアクセス手段です。APIを通して、写真投稿、参照、アカウント情報取得など、様々な機能を利用できます。

Meta

インスタグラムAPIの種類

InstagramグラフAPI

アプリユーザーが自分のInstagramビジネスアカウントやクリエイターアカウントのデータにアクセスできるようにします。メディアの取得・公開、コメント管理、ハッシュタグ検索、アカウントデータ取得などが可能です。今回ご紹介する方法は、この「InstagramグラフAPI」の利用方法となります。

Instagram基本表示API

Instagram基本表示APIは、アプリユーザーが自分のInstagramアカウントの基本プロフィール情報、写真、動画を取得することを許可します。

Instagramメッセージ

Instagram用Messenger APIを利用することにより Instagramプロアカウントからアプリを通じてInstagramメッセージを管理できます。ユーザーとのメッセージ送受信に利用可能です。

インスタグラムAPIの利用準備

インスタグラムアカウント等の準備

インスタグラムAPIを利用するにはインスタグラムのビジネスアカウントなどの準備が必要です。
以下にインスタグラムAPIを利用するために必要なことを記載致します。

  • STEP1. Facebookアカウントを作成する
  • STEP2. インスタグラムアカウントを作成する
  • STEP3. インスタグラムをプロアカウントに設定する
  • STEP4. Facebookページを作成する
  • STEP5. Facebookページとインスタグラムアカウントを連携する
  • STEP6. Facebookアプリを作成する

詳しくは以下の記事を参照下さい。
インスタグラムAPI完全ガイド:アカウント連携からアプリ作成まで

インスタグラムAPIの実行ユーザIDおよびアクセストークンの準備

インスタグラムAPIの実行時にはインスタグラムのアカウントIDおよびアクセストークンが必要となります。
インスタグラムのアカウントIDおよび、アクセストークンの取得方法については、以下の記事を参照下さい。
InstagramAPIの始め方!Instagram Graph APIのセットアップ方法を解説

インスタグラムAPIの使い方

マニュアル

インスタグラムAPIのマニュアルは以下になります。
https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/content-publishing/

以下に分かりやすく使い方を解説しますが、マニュアルが一番確実ですので、困ったらマニュアルを参照下さい。

インスタグラムへの単一画像の投稿

インスタグラムへの単一の画像の投稿は、2ステップの操作で行います。

  1. /mediaエンドポイントを使って、画像をアップロードしアイテムコンテナを作成する
  2. /media_publishエンドポイントを使用してそのアイテムコンテナを公開する

単一画像投稿のPytonプログラム

  import sys
  import time
  import requests
  import json

  # インスタAPIコール共通関数
  # action : media or /media_publish
  # param : 投稿画像のURLなどのパラメタ
  # 戻り値:APIの実行結果
  def do_instagram_api(action, params):
    # API接続情報
    graph_domain = 'https://graph.facebook.com/' # APIのURLのドメイン
    api_version = 'v18.0' # APIバージョン
    instagram_account_id = 'xxxxxxxxxxx' # インスタグラムのアカウントID
    access_token = 'xxxxxxxxxxx' # インスタグラムのアクセストークン

    # APIのエンドポイントとパラメタの用意
    endpoint = f'{graph_domain}{api_version}/{instagram_account_id}/{action}?'
    params['access_token'] = access_token
    params['graph_domain'] = 'https://graph.facebook.com/'
    params['version'] = 'v18.0'

    # APIの実行(実行失敗した場合は5回までリトライする)
    for i in range(0, 5):
      res = requests.post(endpoint, params)

      # 正常終了した場合はAPIの実行結果を返却する
      if res.status_code == 200:
        return json.loads(res.content)
      # 異常終了した場合は10秒待機しリトライする
      else:
        print(f"インスタAPIの実行に失敗しました。10秒後に処理をリトライします。url:{endpoint}\nリクエスト:{params}\nレスポンス:{res.content}")
        time.sleep(10)
    print(f"インスタAPIの実行が5回終了したので処理を中断します。")
    sys.exit(1)

  # 画像をアップロードしアイテムコンテナを作成する
  # caption:投稿のキャプション
  # img_url:アップロードする画像のURL
  # 戻り値:アイテムコンテナのID
  # 注意)アップロードする画像はインターネットに公開されたサーバに格納する必要があります。
  def make_item_contena(caption, img_url):
    # 画像をアップロードする
    data = do_instagram_api('media', {
               'image_url': img_url,
               'caption': caption,
             })
    #アイテムコンテナのIDを返却する
    return data['id']

  # 画像を公開する
  # item_contena_id:公開画像のアイテムコンテナID
  def do_post_one(item_contena_id):
    do_instagram_api('media_publish', {
             'creation_id': item_contena_id
           })

  #
  # メイン処理
  #
  caption='#BronzFonz'
  image_url='https://www.example.com/images/bronz-fonz.jpg'

  # ステップ1/2: 画像をアップロードしアイテムコンテナを作成する
  item_contena_id = make_item_contena(caption, image_url)
  time.sleep(10) #インスタのDB登録が完了するのを待つため10秒待機

  # ステップ2/2: アイテムコンテナを公開する
  do_post_one(item_contena_id)

複数画像の投稿(カルーセル投稿)

複数の画像をまとめたものをカルーセルと呼びます。カルーセルには画像を10個まで格納できます。複数の画像をまとめたカルーセルの投稿は、以下の3ステップで行います。

  1. mediaエンドポイントを使って、カルーセルに表示される各画像のアイテムコンテナを個別に作成する
  2. /mediaエンドポイントを使って、これらのアイテムコンテナを格納したカルーセルコンテナを1つ作成する
  3. /media_publishエンドポイントを使って、カルーセルコンテナを公開する

カルーセル投稿のPytonプログラム

  import sys
  import time
  import requests
  import json

  # インスタAPIコール共通関数
  # action : media or /media_publish
  # param : 投稿画像のURLなどのパラメタ
  # 戻り値:APIの実行結果
  def do_instagram_api(action, params):
    # API接続情報
    graph_domain = 'https://graph.facebook.com/' # APIのURLのドメイン
    api_version = 'v18.0' # APIバージョン
    instagram_account_id = 'xxxxxxxxxxx' # インスタグラムのアカウントID
    access_token = 'xxxxxxxxxxx' # インスタグラムのアクセストークン

    # APIのエンドポイントとパラメタの用意
    endpoint = f'{graph_domain}{api_version}/{instagram_account_id}/{action}?'
    params['access_token'] = access_token
    params['graph_domain'] = 'https://graph.facebook.com/'
    params['version'] = 'v18.0'

    # APIの実行(実行失敗した場合は5回までリトライする)
    for i in range(0, 5):
      res = requests.post(endpoint, params)

      # 正常終了した場合はAPIの実行結果を返却する
      if res.status_code == 200:
        return json.loads(res.content)
      # 異常終了した場合は10秒待機しリトライする
      else:
        print(f"インスタAPIの実行に失敗しました。10秒後に処理をリトライします。url:{endpoint}\nリクエスト:{params}\nレスポンス:{res.content}")
        time.sleep(10)
    print(f"インスタAPIの実行が5回終了したので処理を中断します。")
    sys.exit(1)

  # 複数画像をアップロードしアイテムコンテナを作成する
  # img_url_list:アップロードする画像のURLのリスト
  # 戻り値:アイテムコンテナのIDの配列
  # 注意)アップロードする画像はインターネットに公開されたサーバに格納する必要があります。
  def make_items_contenas(img_url_list):
    contena_ids = []

    for img_url in img_url_list:
      # 画像をアップロードする
      # ※ is_carousel_itemはTrueを設定します。
      #    画像がカルーセル内に表示されることを示します。
      data = do_instagram_api('media', {
               'image_url': img_url,
               'is_carousel_item': True,
             })
      #アイテムコンテナのIDをリストに格納する
      contena_ids.append(data['id'])

    #アイテムコンテナのIDのリストを返却する
    return contena_ids

  # カルーセルコンテナを作成する
  # caption:投稿のキャプション
  # item_contena_ids:アップロードする画像のアイテムコンテナIDの配列
  # 戻り値:カルーセルコンテナのID
  def make_group_contena(caption, item_contena_ids):
    # カルーセルコンテナを作成する
    # media_type — CAROUSELを設定します。コンテナの対象がカルーセルであることを示します。
    # caption — 投稿のキャプション
    # children — カルーセルに表示する各画像アイテムコンテナIDの配列
    #            最大10個のアイテムコンテナIDを指定出来る
    data = do_instagram_api('media', {
             'media_type': 'CAROUSEL',
             'caption': caption,
             'children': json.dumps(item_contena_ids)
           })
    # カルーセルのコンテナIDを返却する
    return data['id']

  # カルーセルコンテナを公開する
  # goup_contena_id:公開するカルーセルのコンテナID
  def do_post_multi(group_contena_id):
    # カルーセルコンテナを公開する
    # media_type — CAROUSELを設定します。コンテナの対象がカルーセルであることを示します。
    # creation_id — 投稿するカルーセルのID
    do_instagram_api('media_publish', {
             'media_type': 'CAROUSEL',
             'creation_id': group_contena_id
           })

  #
  # メイン処理
  #
  caption='#BronzFonz'
  image_url_list=['https://www.example.com/images/bronz-fonz1.jpg',
       'https://www.example.com/images/bronz-fonz2.jpg',
       'https://www.example.com/images/bronz-fonz3.jpg',
     ]

  # ステップ1/3: 各画像をアップロードしアイテムコンテナを作成する
  item_contena_ids = make_items_contenas(image_url_list)
  time.sleep(10) #インスタのDB登録が完了するのを待つため10秒待機

  # ステップ2/3: カルーセルコンテナを作成する
  group_contena_id = make_group_contena(caption, item_contena_ids):
  time.sleep(10) #インスタのDB登録が完了するのを待つため10秒待機

  # ステップ3/3: カルーセルコンテナを公開する
  do_post_multi(group_contena_id)

カルーセル投稿の注意点

  • カルーセル投稿は、アカウントのレート制限において1件の投稿としてカウントされます。
  • カルーセルの宣伝はできません。
  • カルーセルの画像はすべてカルーセルの最初の画像から切り取られます。デフォルトのアスペクト比は1:1です。

放置AI少女イムちゃん

インスタAPIとAIで自動インスタ投稿機能を作ってみました。題して放置AI少女イムちゃんです。

放置AI少女イムちゃんは、海外ニュースをイラストで解説する自動投稿AIです。

アムイムチャンネル

放置AI少女イムちゃん特徴

  • 海外ニュースを自動で収集し、イラスト付きで解説します。
  • わかりやすく簡潔な文章で、誰でも理解しやすい内容です。
  • 定期的にインスタグラムに投稿を行います。

放置AI少女イムちゃんの構築技術

  • インスタグラム APIを使用して自動投稿を実現します。
  • 自然言語処理技術を用いて、ニュース記事からトークを生成します。
  • Pythonを用いてトークとイラストを合成します。

放置AI少女イムちゃんの利用シーン

  • 海外ニュースに興味があるけど、英語が苦手な人
  • 海外情勢を分かりやすく知りたい人
  • インスタグラムで情報収集したい人

ぜひ、イムちゃんのアカウントをフォローして、海外ニュースをイラストで楽しんでください。