ツールとして、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']
            print(base_url)
        else:
            base_url = None

    for result in results:
        if not result.get('comments'):
            result['comments'] = {'data': []}
        if not "insights" in result:
            result["insights"] = [{"values": []}]

    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_',
        errors='ignore'
    )

    df['meta_timestamp'] = pd.to_datetime(df['meta_timestamp']).dt.strftime('%Y%m%d')

    return df

df = get_instagram_data()

df['meta_date_sn'] = df.groupby('meta_timestamp')['meta_timestamp'].cumcount() + 1
df["meta_date_id"] = df["meta_timestamp"].astype(str) + "_" + df["meta_date_sn"].astype(str)

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

if choice =='Content':
    selected_id = st.sidebar.selectbox('Select Post', df["meta_date_id"].unique())
    selected_data = df[df["meta_date_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')
    try:
        if meta_insights and len(meta_insights) > 0 and len(meta_insights[0]["values"]) > 0:
            impressions_value = meta_insights[0]["values"][0].get("value", 0)
            likes_follows_percentage = (float(selected_data['meta_like_count']) / float(impressions_value)) * 100
        else:
            likes_follows_percentage = 0
    except KeyError:
        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_date_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

'''

上記コードを実行するとエラーは表示されませんが、①以前としてUIに表示させたいコンテンツの画像がInstargramから取得できておらず、"Image not found"が表示されてしまう点と、②以前として、"Likes"脇に表示させたいインプレッション数からのLike率の表示がすべて"0.00%"となってしまっている点があります。また、③個別コンテンツのIDを"YYYYMMDD_1"という表示にしましたが、この"_1"が現在はコメントと紐づいてコメント数に応じて増加する状況ですが、同日に複数の投稿があった際に識別できるように用意した補助的なもので、同日の複数投稿がない場合には"_1"のみを用いるように改修希望です。