|
import gradio as gr |
|
import re |
|
import logging |
|
from typing import Tuple, Optional |
|
|
|
logging.basicConfig(level=logging.INFO) |
|
logger = logging.getLogger(__name__) |
|
|
|
def extract_comment_data(comment_text: str) -> Tuple[Optional[str], Optional[str], int, int]: |
|
"""Извлекает данные из комментария""" |
|
try: |
|
|
|
if 'отметок "Нравится"' in comment_text: |
|
return None, None, 0, 0 |
|
|
|
|
|
username_match = re.search(r"Фото профиля ([^\n]+)", comment_text) |
|
if not username_match: |
|
return None, None, 0, 0 |
|
|
|
username = username_match.group(1).strip() |
|
|
|
|
|
lines = comment_text.split('\n') |
|
comment = "" |
|
for i, line in enumerate(lines): |
|
if username in line and i + 1 < len(lines): |
|
comment = lines[i + 1].strip() |
|
|
|
comment = re.sub(r'\d+\s*(?:ч\.|нед\.)\s*$', '', comment) |
|
comment = re.sub(r'"Нравится":\s*\d+\s*Ответить\s*$', '', comment) |
|
break |
|
|
|
|
|
likes_match = re.search(r'"Нравится":\s*(\d+)', comment_text) |
|
likes = int(likes_match.group(1)) if likes_match else 0 |
|
|
|
|
|
time_match = re.search(r'(\d+)\s*(?:ч\.|нед\.)', comment_text) |
|
time = int(time_match.group(1)) if time_match else 0 |
|
|
|
return username, comment.strip(), likes, time |
|
|
|
except Exception as e: |
|
logger.error(f"Error extracting data: {e}") |
|
return None, None, 0, 0 |
|
|
|
def analyze_post(content_type: str, link: str, post_likes: int, |
|
post_date: str, description: str, comment_count: int, |
|
all_comments: str) -> Tuple[str, str, str, str, str]: |
|
"""Анализирует пост и комментарии""" |
|
try: |
|
|
|
blocks = re.split(r'(?=Фото профиля)', all_comments) |
|
blocks = [b.strip() for b in blocks if b.strip()] |
|
|
|
comments_data = [] |
|
|
|
|
|
for block in blocks: |
|
username, comment, likes, time = extract_comment_data(block) |
|
if username and comment: |
|
comments_data.append({ |
|
'username': username, |
|
'comment': comment, |
|
'likes': likes, |
|
'time': time |
|
}) |
|
|
|
|
|
usernames = "\n".join(item['username'] for item in comments_data) |
|
comments = "\n".join(item['comment'] for item in comments_data) |
|
likes = "\n".join(str(item['likes']) for item in comments_data) |
|
total_likes = sum(item['likes'] for item in comments_data) |
|
|
|
analytics = f""" |
|
📊 Анализ комментариев: |
|
Всего комментариев: {len(comments_data)} |
|
Уникальных пользователей: {len(set(item['username'] for item in comments_data))} |
|
Общее количество лайков: {total_likes} |
|
""" |
|
|
|
return analytics, usernames, comments, likes, str(total_likes) |
|
|
|
except Exception as e: |
|
logger.error(f"Analysis error: {e}") |
|
return str(e), "", "", "", "0" |
|
|
|
|
|
iface = gr.Interface( |
|
fn=analyze_post, |
|
inputs=[ |
|
gr.Radio(choices=["Photo", "Video"], label="Content Type", value="Photo"), |
|
gr.Textbox(label="Link to Post"), |
|
gr.Number(label="Likes", value=0), |
|
gr.Textbox(label="Post Date"), |
|
gr.Textbox(label="Description", lines=3), |
|
gr.Number(label="Comment Count", value=0), |
|
gr.Textbox(label="Comments", lines=10) |
|
], |
|
outputs=[ |
|
gr.Textbox(label="Analytics Summary", lines=10), |
|
gr.Textbox(label="Usernames"), |
|
gr.Textbox(label="Comments"), |
|
gr.Textbox(label="Likes Chronology"), |
|
gr.Textbox(label="Total Likes on Comments") |
|
], |
|
title="Instagram Comment Analyzer", |
|
description="Анализатор комментариев Instagram" |
|
) |
|
|
|
if __name__ == "__main__": |
|
iface.launch() |