ツールとして、InstagramのプロアカウントとFacebook APIやInstagram グラフAPIとPython3を用いる事ができる状況において、①自分がInstagramで投稿したコンテンツを任意でアップロードせずとも、分析対象のコンテンツ画像をInstagramから自動でダウンロードして表示するようにしたうえで、当該コンテンツに対する"いいね"数やフォロー数に加えてそれぞれインプレッションからの割合のパーセント表示と、コメントしたメンバーのIDとアイコンを表示する機能を1ペインで表示し、②各コンテンツのインプレッションやエンゲージメントなど取得できうる限りのアナリティクス情報のデータを取得して横断的に分析できるように、StreamlitとStreamlitShareとブラウザを利用してインタラクティブなグラフやチャート等で2ペイン目で表示できるようにし、③表示するグラフデータの要素を変更する場合にはコードを改変せずともブラウザのUI上でクリックして要素をインタラクティブに選択変更できるようにし、④アプリケーションが開く際に毎回IDやAPI利用に関する情報入力が不要なように事前に必要な情報はコードに埋め込んであるコードを下記のように作成しました。

'''


import streamlit as st
import pandas as pd
import requests
import json
import plotly.express as px
from PIL import Image
from io import BytesIO

# 環境変数または事前に入力された情報からアクセストークンとアカウントIDを設定
access_token =""
account_id =""

def get_instagram_data():
    base_url = f'https://graph.facebook.com/v11.0/{account_id}/media'
    params = {
        'fields': 'id,media_type,media_url,thumbnail_url,permalink,caption,timestamp,like_count,comments_count,comments{username,profile_picture_url,text},insights.metric(impressions,engagement)',
        'access_token': access_token
    }

    results = []

    while base_url:
        response = requests.get(base_url, params=params)
        data = json.loads(response.text)

        results.extend(data['data'])

        if 'paging' in data and 'next' in data['paging']:
            base_url = data['paging']['next']
        else:
            base_url = None

    for result in results:
        # If 'comments' does not exist in result, add an empty 'data' list to it
        if not result.get('comments'):
            result['comments'] = {'data': []}

    df = pd.json_normalize(
        results,
        record_path=['comments', 'data'],
        meta=[
            'id', 'media_type', 'media_url', 'thumbnail_url',
            'permalink', 'caption', 'timestamp', 'like_count',
            'comments_count', 'insights'
        ],
        meta_prefix='meta_',  # Add a prefix to the metadata to avoid conflicts
        errors='ignore' # Ignore errors and use NaN for thumbnail images that do not exist
    )

    return df

df = get_instagram_data()

menu = ['Content', 'Analytics']
choice = st.sidebar.radio('Menu', menu)

if choice == 'Content':
    selected_id = st.sidebar.selectbox('Select Post', df['meta_id'].unique())
    selected_data = df[df['meta_id'] == selected_id].iloc[0]
    image_url = selected_data['meta_media_url'] if selected_data['meta_media_type'] == 'IMAGE' else selected_data['meta_thumbnail_url']
    
    if pd.notna(image_url):
        image_response = requests.get(image_url)
        image = Image.open(BytesIO(image_response.content))
        st.image(image, use_column_width=True)
    else:
        st.write('Image not found')

    meta_insights = selected_data.get('meta_insights')
    if meta_insights and len(meta_insights) > 0 and 'values' in meta_insights[0]:
        likes_follows_percentage = (float(selected_data['meta_like_count']) / float(meta_insights[0]['values'][0]['value'])) * 100
    else:
        likes_follows_percentage = 0

    st.write(f'Likes: {selected_data["meta_like_count"]} ({likes_follows_percentage:.2f}%)')
    st.write(f'Comments: {selected_data["meta_comments_count"]}')

    comments_df = df[df['meta_id'] == selected_id]
    st.write(comments_df[['username', 'text']])
    
elif choice == 'Analytics':
    # インプレッションやエンゲージメントなどのデータを使って、インタラクティブなグラフやチャートを作成する方法
    # 以下はサンプルコードで、実際のデータ構造に合わせて適宜修正してください。
    categories = ['Impressions', 'Engagement']
    selected_category = st.selectbox('Select metric', categories)

    if selected_category == 'Impressions':
        # インプレッションデータを使ったグラフの作成
        pass
    elif selected_category == 'Engagement':
        # エンゲージメントデータを使ったグラフの作成
        pass

'''

コードを実行すると、下記のエラーが表示されます。エラーへの対処を組み込んで、行頭のインデントを含みコード全体を表示してください。

'''
KeyError Traceback (most recent call last)
Cell In[28], line 70
67 st.write(‘Image not found’)
69 meta_insights = selected_data.get(‘meta_insights’)
—> 70 if meta_insights and len(meta_insights) > 0 and ‘values’ in meta_insights[0]:
71 likes_follows_percentage = (float(selected_data[‘meta_like_count’]) / float(meta_insights[0][‘values’][0][‘value’])) * 100
72 else:

KeyError: 0
'''