前提
facebookやInstagramの開発者に必要な環境設定、トークンは作成済み
(手順のミスは無いとは言えませんのでもしあれば指摘ください)
実現したいこと
ハッシュタグ入力の省力化の為、ハッシュタグ部分は固定文言化し、
PC/スマホのpythonから、画像(or動画)投稿が出来るようにしたい。
既に出来ている事
単一ファイルでの画像/動画での投稿の正常確認はしている。
※Windowsでの実行、pydroid3(Androidでpythonを動かすアプリ)での実行の2パターン
発生している問題
複数のファイルを一括投稿する場合のコーディングがわからない。
params['media_type']を 'CAROUSEL_ALBUM'にすることは判っている。
該当のソースコード
config_Instagram_Graph_API.py
python
1# Instagram Graph API の configファイル 2 3# 【要修正】の所は各個人の情報に合わせる事 4# 今回、グラフAPIエクスプローラ POST→ v15.0とした 5 6def basic_info(): 7 # 初期 8 config = dict() 9 # 【要修正】アクセストークン 10 config["access_token"] = 'XXXXX' 11 # 【要修正】アプリID 12 config["app_id"] = 'XXXXX' 13 # 【要修正】アプリシークレット 14 config["app_secret"] = 'XXXXX' 15 # 【要修正】インスタグラムビジネスアカウントID 16 config['instagram_account_id'] = "XXXXX" 17 # 【要修正】グラフバージョン 18 config["version"] = 'v15.0' 19 # 【修正不要】graphドメイン 20 config["graph_domain"] = 'https://graph.facebook.com/' 21 # 【修正不要】エンドポイント 22 config["endpoint_base"] = config["graph_domain"]+config["version"] + '/' 23 # 出力 24 return config 25
python
1# -*- coding: utf-8 -*- 2 3import datetime 4import json 5import time 6from pprint import pprint 7 8import requests 9 10import config_Instagram_Graph_API # config_Instagram_Graph_API.pyの読み込み 11 12# APIリクエスト用の関数 13def InstaApiCall(url, params, request_type): 14 15 # リクエスト 16 if request_type == 'POST' : 17 # POST 18 req = requests.post(url,params) 19 else : 20 # GET 21 req = requests.get(url,params) 22 23 # レスポンス 24 res = dict() 25 res["url"] = url 26 res["endpoint_params"] = params 27 res["endpoint_params_pretty"] = json.dumps(params, indent=4) 28 res["json_data"] = json.loads(req.content) 29 res["json_data_pretty"] = json.dumps(res["json_data"], indent=4) 30 31 # 出力 32 return res 33 34# メディア作成 35def createMedia(params) : 36 """ 37 ****************************************************************************************************** 38 【画像・動画コンテンツ作成】 39 https://graph.facebook.com/v5.0/{ig-user-id}/media?image_url={image-url}&caption={caption}&access_token={access-token} 40 https://graph.facebook.com/v5.0/{ig-user-id}/media?video_url={video-url}&caption={caption}&access_token={access-token} 41 ****************************************************************************************************** 42 """ 43 # エンドポイントURL 44 url = params['endpoint_base'] + params['instagram_account_id'] + '/media' 45 # エンドポイント用パラメータ 46 Params = dict() 47 Params['caption'] = params['caption'] # 投稿文 48 Params['access_token'] = params['access_token'] # アクセストークン 49 # メディアの区分け 50 if 'IMAGE' == params['media_type'] : 51 # 画像:メディアURLを画像URLに指定 52 Params['image_url'] = params['media_url'] # 画像URL 53 else : 54 # 動画:メディアURLを動画URLに指定 55 Params['media_type'] = params['media_type'] # メディアタイプ 56 Params['video_url'] = params['media_url'] # ビデオURL 57 58 print(' ------------------------------------------------------', url, Params ,sep='\t') 59 # 出力 60 return InstaApiCall(url, Params, 'POST') 61 62 63# メディアID別ステータス管理 64def getMediaStatus(mediaObjectId, params) : 65 """ 66 ****************************************************************************************************** 67 【APIエンドポイント】 68 https://graph.facebook.com/v5.0/{ig-container-id}?fields=status_code 69 ****************************************************************************************************** 70 """ 71 # エンドポイントURL 72 url = params['endpoint_base'] + '/' + mediaObjectId 73 # パラメータ 74 Params = dict() 75 Params['fields'] = 'status_code' # フィールド 76 Params['access_token'] = params['access_token'] # アクセストークン 77 # 出力 78 return InstaApiCall(url, Params, 'GET') 79 80# メディア投稿 81def publishMedia(mediaObjectId, params): 82 """ 83 ****************************************************************************************************** 84 【APIエンドポイント】 85 https://graph.facebook.com/v5.0/{ig-user-id}/media_publish?creation_id={creation-id}&access_token={access-token} 86 ****************************************************************************************************** 87 """ 88 # エンドポイントURL 89 url = params['endpoint_base'] + params['instagram_account_id'] + '/media_publish' 90 # エンドポイント送付用パラメータ 91 Params = dict() 92 Params['creation_id'] = mediaObjectId # メディアID 93 Params['access_token'] = params['access_token'] # アクセストークン 94 # 出力 95 return InstaApiCall(url, Params, 'POST') 96 97# ユーザの公開レート制限・使用率を取得 98def getContentPublishingLimit( params ) : 99 """ 100 ****************************************************************************************************** 101 https://graph.facebook.com/v5.0/{ig-user-id}/content_publishing_limit?fields=config,quota_usage 102 ****************************************************************************************************** 103 """ 104 # エンドポイントURL 105 url = params['endpoint_base'] + params['instagram_account_id'] + '/content_publishing_limit' # endpoint url 106 # エンドポイント送付用のパラメータ 107 Params = dict() 108 Params['fields'] = 'config,quota_usage' # フィールド 109 Params['access_token'] = params['access_token'] # アクセストークン 110 111 return InstaApiCall(url, Params, 'GET') 112 113 114# 画像投稿 115def instagram_upload_image(media_url, media_caption): 116 # パラメータ 117 params = config_Instagram_Graph_API.basic_info() 118 # ★ 'IMAGE' 並びに 'VIDEO'の動作確認は取れた CAROUSEL_ALBUM は悩み中 119 params['media_type'] = 'IMAGE' # メディアType 'IMAGE' or 'VIDEO' もしくは以下 120 # params['media_type'] = 'VIDEO' # メディアType 'IMAGE' or 'VIDEO' もしくは以下 121 # params['media_type'] = 'CAROUSEL_ALBUM' # 画像のみ2枚以上、動画のみ2つ以上、画像+動画、動画+画像はいずれもCAROUSEL_ALBUMになる 122 params['media_url'] = media_url # メディアURL 123 params['caption'] = media_caption 124 125 # ※ APIでメディア作成&ID発行 126 imageMediaId = createMedia(params)['json_data']['id'] 127 128 # メディアアップロード 129 StatusCode = 'IN_PROGRESS'; 130 while StatusCode != 'FINISHED' : 131 # メディアステータス取得 132 StatusCode = getMediaStatus(imageMediaId,params)['json_data']['status_code'] 133 # 待ち時間 134 time.sleep(2) 135 136 # Instagramにメディア公開 137 publishImageResponse = publishMedia(imageMediaId,params) 138 # 出力 139 print("Instagram投稿完了") 140 return publishImageResponse['json_data_pretty'] 141 142if __name__ == "__main__": 143 # 投稿内容 ※ローカル不可 144 # 画像単独 ★ params['media_type'] = 'IMAGE' をコメントアウト 145 media_url = 'https://example.com/img/DSCN7564.JPG' # 画像 146 # 動画単独 ★ params['media_type'] = 'VIDEO' をコメントアウト 147 # media_url = 'https://example.com/img/20220909150022.mp4' # 動画 148 149 # 複数の場合、 ★はparams['media_type'] = 'CAROUSEL_ALBUM' にする以外にどうすればよいか? 150 # ↓は暫定でリストにしているが、リストが正しいかどうかも不明 151 # media_url = ['https://example.com/img/DSCN7564.JPG','https://example.com/img/IMG20210724153545_kai.jpg'] 152 153 media_caption = '本日○○に来ています #公園 #park # 写真好きな人とつながりたい' # 投稿文 154 155 # 関数実行 156 instagram_upload_image(media_url, media_caption) 157
参考サイト
https://di-acc2.com/system/rpa/19288/
https://di-acc2.com/system/rpa/19280/
https://di-acc2.com/marketing/sns-tech/18499/
https://developers.facebook.com/docs/instagram-basic-display-api/reference/media?locale=ja_JP
試したこと
※ APIでメディア作成&ID発行
の次あたりの実装がキーと思ったため、
print( createMedia(params)['json_data']) としたりしてデバッグログを見たが判らず。
最後に
以上、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。