質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1960閲覧

pythonを使ってInstagramに複数の画像(動画)を投稿したい

aichi-tomida

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/10/02 10:48

前提

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']) としたりしてデバッグログを見たが判らず。

最後に

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

別パッケージで解決しました。

pip install instagrapi
からの 以下のコードで、あとは個人の環境にコードを一部直して
Windowsでもpydroid3でも実行できました。

python3

1from instagrapi import Client 2 3bot = Client() 4bot.login(Username, Password) 5 6album_path = [".../Image1.jpg", ".../Image2.jpg"] 7text = "Hello" 8 9bot.album_upload( 10 album_path, 11 caption = text 12)

投稿2022/10/12 21:23

aichi-tomida

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問