🌁

InstagramにPythonで単一の画像を投稿する方法

2024/01/14に公開

中々めんどくさかったので備忘録

APIとかの準備

コード

コンテナIDの取得

画像アップするとIDがかえってきます。

$ python get_id.py 
{'id': 'hogehoge'}
import requests
import json
import os

insta_business_id = os.getenv('insta_business_id')
access_token = os.getenv('access_token')

def make_contena_api():
    post_data = {
        'image_url': 'https://baytower.jp/wp/wp-content/uploads/2021/04/fas-lopikari-550x340.png',
        'caption': 'ロピア',
        'media_type': ''  # 画像だけの投稿なら空、動画だけの投稿なら値をREELS、ストーリーなら値をSTORIESにする
    }

    url = f'https://graph.facebook.com/v17.0/{insta_business_id}/media?'
    response = instagram_api(url, post_data)

    try:
        if response:
            data = response.json()
            print(data)
            return data
        else:
            print('Instagram APIのリクエストでエラーが発生しました。')
            return None
    except Exception as error:
        print('Instagram APIのレスポンスの解析中にエラーが発生しました:', error)
        return None


def instagram_api(url, post_data):
    try:
        headers = {
            'Authorization': 'Bearer ' + access_token,
            'Content-Type': 'application/json',
        }

        options = {
            'headers': headers,
            'data': json.dumps(post_data)
        }

        response = requests.post(url, **options)
        return response
    except Exception as error:
        print('Instagram APIのリクエスト中にエラーが発生しました:', error)
        return None


# make_contena_api関数の呼び出し
make_contena_api()

公開

さっきのIDを仕込みます

def content_publish_api():
    creation_id = 'さっきのIDはここに仕込む'
    post_data = {'creation_id': creation_id}
    url = f'https://graph.facebook.com/v17.0/{insta_business_id}/media_publish?'
    response = instagram_api(url, post_data)

    try:
        if response:
            data = response.json()
            print(data)
            return data
        else:
            print('Instagram APIのリクエストでエラーが発生しました。')
            return None
    except Exception as error:
        print('Instagram APIのレスポンスの解析中にエラーが発生しました:', error)
        return None


def instagram_api(url, post_data):
    try:
        headers = {
            'Authorization': 'Bearer ' + access_token,
            'Content-Type': 'application/json',
        }
        options = {
            'headers': headers,
            'json': post_data,
        }
        response = requests.post(url, **options)
        return response
    except Exception as error:
        print('Instagram APIのリクエスト中にエラーが発生しました:', error)
        return None

content_publish_api()

複数枚

別っぽくて力尽きたので、今度書きます。

Rate limit

調べた限り、やりすぎると凍結して異議申し立てが必要になるので気をつけた方がいいですね。

元ネタ

https://tabiato.co.jp/biz/blog/instagram-api-content-publishing/
node.jsだったのが嫌で、pythonに書き直しました。ありがとう。ありがとう。

多分

最新のエンドポイントはv18なのでそっち使った方がいい

Discussion