Аналитический инструмент ScratchAPI: различия между версиями

Материал из Поле цифровой дидактики
Нет описания правки
 
(не показаны 2 промежуточные версии этого же участника)
Строка 39: Строка 39:
* '''Отчёт''' — данная вики‑страница, где приведён код запросов, примеры JSON и получившиеся диаграммы.
* '''Отчёт''' — данная вики‑страница, где приведён код запросов, примеры JSON и получившиеся диаграммы.


Диаграммы классов:
Структура данных профиля и статистики пользователя:


{{#mermaid:
{{#mermaid:
Строка 90: Строка 90:
}
}
</pre>
</pre>


=== Получение данных студии ===
=== Получение данных студии ===
Строка 98: Строка 100:
https://api.scratch.mit.edu/studios/ID/
https://api.scratch.mit.edu/studios/ID/
</code>
</code>
== Полный код проекта: Анализ Scratch API ==
<div style="background-color: #2d3748; color: #e2e8f0; padding: 20px; border-radius: 10px; margin: 20px 0; font-family: 'Courier New', monospace; font-size: 14px; overflow-x: auto;">
<source lang="python">
import requests
import json
# -------- 1. ЗАПРОСЫ К SCRATCH API --------
def get_user_data(username: str) -> dict | None:
    """Получает данные пользователя Scratch (открытое API)."""
    url = f"https://api.scratch.mit.edu/users/{username}/"
    try:
        r = requests.get(url, timeout=10)
        if r.status_code == 200:
            data = r.json()
            # чуть нормализуем под себя
            data["join_date"] = data.get("history", {}).get("joined", "")[:10]
            data["country"] = data.get("profile", {}).get("country", "")
            return data
        print("API error:", r.status_code)
        return None
    except Exception as e:
        print("Request error:", e)
        return None
def get_studio_data(studio_id: int) -> dict | None:
    """Получает данные студии Scratch."""
    url = f"https://api.scratch.mit.edu/studios/{studio_id}/"
    try:
        r = requests.get(url, timeout=10)
        if r.status_code == 200:
            return r.json()
        print("API error:", r.status_code)
        return None
    except Exception as e:
        print("Request error:", e)
        return None
# -------- 2. PLANTUML ДЛЯ ПОЛЬЗОВАТЕЛЯ --------
def generate_plantuml_user(user: dict) -> str:
    """
    Генерирует простой PlantUML под твой движок:
    только объявления class + note, без { } внутри.
    """
    username = user.get("username", "N/A")
    uid = user.get("id", "N/A")
    join_date = user.get("join_date", "N/A")
    country = user.get("country", "N/A")
    diagram = "@startuml\n"
    diagram += "class Profile\n"
    diagram += "class Stats\n"
    diagram += "Profile --> Stats\n"
    diagram += "note right of Profile\n"
    diagram += f"  username: {username}\n"
    diagram += f"  id: {uid}\n"
    diagram += f"  joined: {join_date}\n"
    diagram += f"  country: {country}\n"
    diagram += "end note\n"
    diagram += "note right of Stats\n"
    diagram += "  followers: 745K+  ' пример\n"
    diagram += "  projects: 250+    ' пример\n"
    diagram += "  views: 183M+      ' пример\n"
    diagram += "end note\n"
    diagram += "@enduml\n"
    return diagram
# -------- 3. PLANTUML ДЛЯ СТУДИИ --------
def generate_plantuml_studio(studio: dict) -> str:
    """Простая диаграмма для студии."""
    sid = studio.get("id", "N/A")
    title = studio.get("title", "N/A")
    projects = studio.get("stats", {}).get("projects", 0)
    followers = studio.get("stats", {}).get("followers", 0)
    diagram = "@startuml\n"
    diagram += "class Studio\n"
    diagram += "note right of Studio\n"
    diagram += f"  id: {sid}\n"
    diagram += f"  title: {title}\n"
    diagram += f"  projects: {projects}\n"
    diagram += f"  followers: {followers}\n"
    diagram += "end note\n"
    diagram += "@enduml\n"
    return diagram
# -------- 4. MAIN --------
if __name__ == "__main__":
    username = "griffpatch"
    studio_id = 107193
    print("== Запрос к Scratch API ==")
    user = get_user_data(username)
    studio = get_studio_data(studio_id)
    print("\n== Данные пользователя (raw JSON) ==")
    print(json.dumps(user, indent=2, ensure_ascii=False))
    print("\n== Данные студии (raw JSON) ==")
    print(json.dumps(studio, indent=2, ensure_ascii=False))
    # генерим PlantUML
    user_puml = generate_plantuml_user(user)
    studio_puml = generate_plantuml_studio(studio)
    # сохраняем в файлы
    with open("scratch_user_plantuml.txt", "w", encoding="utf-8") as f:
        f.write(user_puml)
    with open("scratch_studio_plantuml.txt", "w", encoding="utf-8") as f:
        f.write(studio_puml)
    print("\n== PlantUML для пользователя ==")
    print(user_puml)
    print("\n== PlantUML для студии ==")
    print(studio_puml)
    print("\nСкопируй содержимое *.txt в PlantUML / вики и получишь диаграммы.")
</source>
</div>
'''Как использовать:'''
# Запуск
python scratch_api_project.py
# Результат:
# 1. Два файла с PlantUML: scratch_user_plantuml.txt, scratch_studio_plantuml.txt
# 2. Вывод в консоль: JSON-данные + готовый PlantUML код
# 3. Скопируй PlantUML из файлов в https://www.plantuml.com/plantuml/uml/


Из ответа используются поля:
Из ответа используются поля:
Строка 112: Строка 247:
   "title": "name",
   "title": "name",
<pre>
<pre>
Исходный код и расширенные комментарии:
 
[[Файл:Отчет по проекту Бойко.pdf|мини]]
[[Категория:Работа с API]]

Текущая версия от 20:59, 27 марта 2026

Анализ сообщества Scratch через API

Карточка проекта

Название проекта
Анализ профиля участника и студии в социальной сети Scratch с помощью открытого API
Автор
Бойко Константин Константинович
Группа
АДЭУ-221
Дисциплина
Работа с API социальных сетей и визуализация данных
Статус проекта
Выполнен

Введение

Цель проекта — показать, как использовать открытое API социальной сети Scratch для исследования цифрового сообщества «сообщества кода». В рамках проекта с помощью запросов к https://api.scratch.mit.edu собираются данные об отдельном участнике (например, griffpatch) и одной студии, затем результаты визуализируются в виде UML‑диаграмм и используются для простого количественного анализа активности.

Цели проекта

  • Научиться формировать HTTP‑запросы к API социальной сети Scratch.
  • Собрать основные данные о пользователе: идентификатор, дата регистрации, страна, краткая биография.
  • Собрать данные о студии: название, количество проектов, подписчиков, комментариев.
  • Представить результаты в виде PlantUML‑диаграмм (структура профиля и студии).
  • Сделать краткий количественный анализ активности участника на основе открытых данных.

Структура проекта

Проект реализован на языке Python и состоит из следующих частей:

  • Основной скрипт — отправка запросов к Scratch API, вывод сырых JSON‑данных и генерация PlantUML‑кода.
  • Функции запроса — отдельные функции для получения данных пользователя и студии.
  • Функции визуализации — генерация текста диаграмм PlantUML для профиля и студии.
  • Отчёт — данная вики‑страница, где приведён код запросов, примеры JSON и получившиеся диаграммы.

Структура данных профиля и статистики пользователя:

Описание работы скрипта

Получение данных пользователя

Скрипт отправляет GET‑запрос по адресу:

https://api.scratch.mit.edu/users/USERNAME/

и сохраняет в переменные:

  • id — числовой идентификатор участника;
  • username — имя пользователя;
  • history.joined — дата регистрации (используется только дата, без времени);
  • profile.country — страна;
  • profile.bio — краткая биография.

Пример фрагмента JSON для пользователя griffpatch:

{
  "id": 1882674,
  "username": "griffpatch",
  "history": {
    "joined": "2012-10-24T12:59:31.000Z"
  },
  "profile": {
    "country": "United Kingdom",
    "bio": "Got hooked on coding when I was a kid..."
  }
}


Получение данных студии

Для студии используется запрос вида:

https://api.scratch.mit.edu/studios/ID/

Полный код проекта: Анализ Scratch API

import requests
import json

# -------- 1. ЗАПРОСЫ К SCRATCH API --------

def get_user_data(username: str) -> dict | None:
    """Получает данные пользователя Scratch (открытое API)."""
    url = f"https://api.scratch.mit.edu/users/{username}/"
    try:
        r = requests.get(url, timeout=10)
        if r.status_code == 200:
            data = r.json()
            # чуть нормализуем под себя
            data["join_date"] = data.get("history", {}).get("joined", "")[:10]
            data["country"] = data.get("profile", {}).get("country", "")
            return data
        print("API error:", r.status_code)
        return None
    except Exception as e:
        print("Request error:", e)
        return None

def get_studio_data(studio_id: int) -> dict | None:
    """Получает данные студии Scratch."""
    url = f"https://api.scratch.mit.edu/studios/{studio_id}/"
    try:
        r = requests.get(url, timeout=10)
        if r.status_code == 200:
            return r.json()
        print("API error:", r.status_code)
        return None
    except Exception as e:
        print("Request error:", e)
        return None

# -------- 2. PLANTUML ДЛЯ ПОЛЬЗОВАТЕЛЯ --------

def generate_plantuml_user(user: dict) -> str:
    """
    Генерирует простой PlantUML под твой движок:
    только объявления class + note, без { } внутри.
    """
    username = user.get("username", "N/A")
    uid = user.get("id", "N/A")
    join_date = user.get("join_date", "N/A")
    country = user.get("country", "N/A")

    diagram = "@startuml\n"
    diagram += "class Profile\n"
    diagram += "class Stats\n"
    diagram += "Profile --> Stats\n"
    diagram += "note right of Profile\n"
    diagram += f"  username: {username}\n"
    diagram += f"  id: {uid}\n"
    diagram += f"  joined: {join_date}\n"
    diagram += f"  country: {country}\n"
    diagram += "end note\n"
    diagram += "note right of Stats\n"
    diagram += "  followers: 745K+  ' пример\n"
    diagram += "  projects: 250+    ' пример\n"
    diagram += "  views: 183M+      ' пример\n"
    diagram += "end note\n"
    diagram += "@enduml\n"
    return diagram

# -------- 3. PLANTUML ДЛЯ СТУДИИ --------

def generate_plantuml_studio(studio: dict) -> str:
    """Простая диаграмма для студии."""
    sid = studio.get("id", "N/A")
    title = studio.get("title", "N/A")
    projects = studio.get("stats", {}).get("projects", 0)
    followers = studio.get("stats", {}).get("followers", 0)

    diagram = "@startuml\n"
    diagram += "class Studio\n"
    diagram += "note right of Studio\n"
    diagram += f"  id: {sid}\n"
    diagram += f"  title: {title}\n"
    diagram += f"  projects: {projects}\n"
    diagram += f"  followers: {followers}\n"
    diagram += "end note\n"
    diagram += "@enduml\n"
    return diagram

# -------- 4. MAIN --------

if __name__ == "__main__":
    username = "griffpatch"
    studio_id = 107193

    print("== Запрос к Scratch API ==")
    user = get_user_data(username)
    studio = get_studio_data(studio_id)

    print("\n== Данные пользователя (raw JSON) ==")
    print(json.dumps(user, indent=2, ensure_ascii=False))

    print("\n== Данные студии (raw JSON) ==")
    print(json.dumps(studio, indent=2, ensure_ascii=False))

    # генерим PlantUML
    user_puml = generate_plantuml_user(user)
    studio_puml = generate_plantuml_studio(studio)

    # сохраняем в файлы
    with open("scratch_user_plantuml.txt", "w", encoding="utf-8") as f:
        f.write(user_puml)
    with open("scratch_studio_plantuml.txt", "w", encoding="utf-8") as f:
        f.write(studio_puml)

    print("\n== PlantUML для пользователя ==")
    print(user_puml)
    print("\n== PlantUML для студии ==")
    print(studio_puml)
    print("\nСкопируй содержимое *.txt в PlantUML / вики и получишь диаграммы.")

Как использовать:

  1. Запуск

python scratch_api_project.py

  1. Результат:
  2. 1. Два файла с PlantUML: scratch_user_plantuml.txt, scratch_studio_plantuml.txt
  3. 2. Вывод в консоль: JSON-данные + готовый PlantUML код
  4. 3. Скопируй PlantUML из файлов в https://www.plantuml.com/plantuml/uml/

Из ответа используются поля:

  • id, title, description;
  • history.created, history.modified;
  • stats.projects, stats.followers, stats.comments.

Пример фрагмента JSON:

{
  "id": 107193,
  "title": "name",