import requests
import json
import datetime
import streamlit as st
from itertools import zip_longest
import os
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

def basic_info():
config = dict()
config[“access_token”] = st.secrets[“access_token”]
config[‘instagram_account_id’] = st.secrets.get(“instagram_account_id”, “”)
config[“version”] = ‘v16.0’
config[“graph_domain”] = ‘https://graph.facebook.com/’
config[“endpoint_base”] = config[“graph_domain”] + config[“version”] + ‘/’
return config

def InstaApiCall(url, params, request_type):
if request_type == ‘POST’:
req = requests.post(url, params)
else:
req = requests.get(url, params)
res = dict()
res[“url”] = url
res[“endpoint_params”] = params
res[“endpoint_params_pretty”] = json.dumps(params, indent=4)
res[“json_data”] = json.loads(req.content)
res[“json_data_pretty”] = json.dumps(res[“json_data”], indent=4)
return res

def getUserMedia(params, pagingUrl=‘’):
Params = dict()
Params[‘fields’] = ‘id,caption,media_type,media_url,permalink,thumbnail_url,timestamp,username,like_count,comments_count’
Params[‘access_token’] = params[‘access_token’]

if not params[‘endpoint_base’]:
return None

if pagingUrl == ‘’:
url = params[‘endpoint_base’] + params[‘instagram_account_id’] + ‘/media’
else:
url = pagingUrl

return InstaApiCall(url, Params, ‘GET’)

def getUser(params):
Params = dict()
Params[‘fields’] = ‘followers_count’
Params[‘access_token’] = params[‘access_token’]

if not params[‘endpoint_base’]:
return None

url = params[‘endpoint_base’] + params[‘instagram_account_id’]

return InstaApiCall(url, Params, ‘GET’)

def saveCount(count, filename):
with open(filename, ‘w’) as f:
json.dump(count, f, indent=4)

def getCount(filename):
try:
with open(filename, ‘r’) as f:
return json.load(f)
except (FileNotFoundError, json.decoder.JSONDecodeError):
return {}

def create_summary_graph(count):
date_list = []
follower_diff_list = []
like_count_diff_list = []
comment_count_diff_list = []

for date, data in count.items():
date_list.append(pd.to_datetime(date))
follower_diff = data.get(‘followers_count’, 0) - count.get(str(pd.to_datetime(date) - pd.Timedelta(days=1)).split(" “)[0], {}).get(‘followers_count’, data.get(‘followers_count’, 0))
like_count_diff = sum(post_data.get(‘like_count’, 0) - count.get(str(pd.to_datetime(date) - pd.Timedelta(days=1)).split(” “)[0], {}).get(post_id, {}).get(‘like_count’, post_data.get(‘like_count’, 0)) for post_id, post_data in data.items() if post_id != ‘followers_count’)
comment_count_diff = sum(post_data.get(‘comments_count’, 0) - count.get(str(pd.to_datetime(date) - pd.Timedelta(days=1)).split(” “)[0], {}).get(post_id, {}).get(‘comments_count’, post_data.get(‘comments_count’, 0)) for post_id, post_data in data.items() if post_id != ‘followers_count’)
follower_diff_list.append(follower_diff)
like_count_diff_list.append(like_count_diff)
comment_count_diff_list.append(comment_count_diff)

data = pd.DataFrame({‘Date’: date_list, ‘Follower Diff’: follower_diff_list, ‘Like Count Diff’: like_count_diff_list, ‘Comment Count Diff’: comment_count_diff_list})

sns.set_theme(style=“darkgrid”)
fig, ax1 = plt.subplots(figsize=(15, 4))

ax1.set_ylabel(‘Follower Diff & Like Count Diff’)
ax1.plot(data[‘Date’], data[‘Follower Diff’], label=‘Follower Diff’, color=‘skyblue’)
ax1.plot(data[‘Date’], data[‘Like Count Diff’], label=‘Like Count Diff’, color=‘orange’)
ax1.legend(loc=‘upper left’)
ax1.grid(False)

ax2 = ax1.twinx()
ax2.set_ylabel(‘Comment Count Diff’)
ax2.plot(data[‘Date’], data[‘Comment Count Diff’], label=‘Comment Count Diff’, color=‘green’)
ax2.legend(loc=‘upper right’)
ax2.grid(False)

plt.title(‘Summary Graph’)
st.pyplot(fig)

st.set_page_config(layout=“wide”)
params = basic_info()

count_filename = “count.json”

if not params[‘instagram_account_id’]:
st.write(‘.envファイルでinstagram_account_idを確認’)
else:
response = getUserMedia(params)
user_response = getUser(params)
if not response or not user_response:
st.write(‘.envファイルでaccess_tokenを確認’)
else:
posts = response[‘json_data’][‘data’][::-1]
user_data = user_response[‘json_data’]
followers_count = user_data.get(‘followers_count’, 0)

NUM_COLUMNS = 6
MAX_WIDTH = 1000
BOX_WIDTH = int(MAX_WIDTH / NUM_COLUMNS)
BOX_HEIGHT = 400


yesterday = (datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))) - datetime.timedelta(days=1)).strftime(‘%Y-%m-%d’)
follower_diff = followers_count - getCount(count_filename).get(yesterday, {}).get(‘followers_count’, followers_count)
st.markdown(f”<h4 style=‘font-size:1.2em;’>Follower: {followers_count} ({‘+’ if follower_diff >= 0 else ‘’}{follower_diff})</h4>“, unsafe_allow_html=True)

show_description = st.checkbox(“キャプションを表示”)
show_summary_graph = st.checkbox(“サマリーグラフを表示”)
show_post_graph = st.checkbox(“いいね/コメント数グラフを表示”)

count = getCount(count_filename)
today = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))).strftime(‘%Y-%m-%d’)

if today not in count:
count[today] = {}

count[today][‘followers_count’] = followers_count

if datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))).strftime(‘%H:%M’) == ‘23:59’:
count[yesterday] = count[today]

if show_summary_graph:
create_summary_graph(count)

posts.reverse()
post_groups = [list(filter(None, group)) for group in zip_longest(*[iter(posts)] * NUM_COLUMNS)]

for post_group in post_groups:
with st.container():
columns = st.columns(NUM_COLUMNS)
for i, post in enumerate(post_group):
with columns[i]:
st.image(post[‘media_url’], width=BOX_WIDTH, use_column_width=True)
st.write(f”{datetime.datetime.strptime(post[‘timestamp’], ‘%Y-%m-%dT%H:%M:%S%z’).astimezone(datetime.timezone(datetime.timedelta(hours=9))).strftime(‘%Y-%m-%d %H:%M:%S’)}“)
like_count_diff = post[‘like_count’] - count.get(yesterday, {}).get(post[‘id’], {}).get(‘like_count’, post[‘like_count’])
comment_count_diff = post[‘comments_count’] - count.get(yesterday, {}).get(post[‘id’], {}).get(‘comments_count’, post[‘comments_count’])
max_like_diff = max([count[date][key].get(‘like_count’, 0) - count[yesterday].get(key, {}).get(‘like_count’, count[date][key].get(‘like_count’, 0)) for date, data in count.items() for key in data.keys() if key != ‘followers_count’])
max_comment_diff = max([count[date][key].get(‘comments_count’, 0) - count[yesterday].get(key, {}).get(‘comments_count’, count[date][key].get(‘comments_count’, 0)) for date, data in count.items() for key in data.keys() if key != ‘followers_count’])
st.markdown(
f"👍: {post[‘like_count’]} <span style=‘{’’ if like_count_diff != max_like_diff or max_like_diff == 0 else ‘color:green;’}‘>({’+’ if like_count_diff >= 0 else ‘’}{like_count_diff})</span>”
f"\n💬: {post[‘comments_count’]} <span style=‘{’’ if comment_count_diff != max_comment_diff or max_comment_diff == 0 else ‘color:green;’}‘>({’+’ if comment_count_diff >= 0 else ‘’}{comment_count_diff})</span>“,
unsafe_allow_html=True)

caption = post[‘caption’]
if caption is not None:
caption = caption.strip()
if “[Description]” in caption:
caption = caption.split(”[Description]“)[1].lstrip()
if “[Tags]” in caption:
caption = caption.split(”[Tags]“)[0].rstrip()
caption = caption.replace(”#“, “”)
caption = caption.replace(”[model]“, “👗”)
caption = caption.replace(”[Equip]“, “📷”)
caption = caption.replace(”[Develop]“, “🖨”)
if show_description:
st.write(caption or “No caption provided”)
else:
st.write(caption[:0] if caption is not None and len(caption) > 50 else caption or “No caption provided”)
count[today][post[‘id’]] = {‘like_count’: post[‘like_count’], ‘comments_count’: post[‘comments_count’]}

if show_post_graph:
date_list = [pd.to_datetime(date) for date in count.keys()]

fig, ax1 = plt.subplots(figsize=(8, 2))

ax1.set_ylabel(‘Like Count Diff’)
ax1.plot(date_list, [data.get(post[‘id’], {}).get(‘like_count’, 0) - count.get(str(pd.to_datetime(date) - pd.Timedelta(days=1)).split(” “)[0], {}).get(post[‘id’], {}).get(‘like_count’, data.get(post[‘id’], {}).get(‘like_count’, 0)) for date, data in count.items()], label=‘Like Count Diff’, color=‘orange’)
ax1.legend(loc=‘upper left’)
ax1.grid(False)

ax2 = ax1.twinx()
ax2.set_ylabel(‘Comment Count Diff’)
ax2.plot(date_list, [data.get(post[‘id’], {}).get(‘comments_count’, 0) - count.get(str(pd.to_datetime(date) - pd.Timedelta(days=1)).split(” ")[0], {}).get(post[‘id’], {}).get(‘comments_count’, data.get(post[‘id’], {}).get(‘comments_count’, 0)) for date, data in count.items()], label=‘Comment Count Diff’, color=‘green’)
ax2.legend(loc=‘upper right’)
ax2.grid(False)

plt.title(‘Like/Comment Count Graph’)
st.pyplot(fig)

saveCount(count, count_filename)

'''

上記コードにPython用のインデントを付与して再表示してください