🌁
InstagramにPythonで単一の画像を投稿する方法
中々めんどくさかったので備忘録
APIとかの準備
-
アクセストークンとビジネスアカウントIDの準備が必要で、死ぬほどめんどくさいです。
- このページを参考にやりました
- https://tkstock.site/2023/03/08/【2023年版】instagram-graph-apiのアクセストークンを取得する方/
- とってきたのを環境変数に入れました
-
あとアップしたい画像とか動画は事前に誰でもアクセスできるURLとして存在していないとダメみたいです
- Twitterの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
調べた限り、やりすぎると凍結して異議申し立てが必要になるので気をつけた方がいいですね。
元ネタ
node.jsだったのが嫌で、pythonに書き直しました。ありがとう。ありがとう。
多分
最新のエンドポイントはv18なのでそっち使った方がいい
Discussion