EduVK: различия между версиями
Нет описания правки |
Нет описания правки |
||
| (не показано 6 промежуточных версий 2 участников) | |||
| Строка 1: | Строка 1: | ||
= VK EDU = | |||
<p><b>Автор:</b> Башашкин Алексей</p> | |||
<p><b>Группа:</b> АДЭУ-221</p> | |||
<p><b>Дисциплина:</b> Работа с API социальных сетей и облачных сервисов</p> | |||
<p><b>Статус проекта:</b> Выполнен</p> | |||
== Цель == | == Цель == | ||
Разработать веб-приложение для поиска, фильтрации и отображения образовательного контента из социальной сети VK с возможностью сохранения и удобного просмотра полезных материалов. | Разработать веб-приложение для поиска, фильтрации и отображения образовательного контента из социальной сети VK с возможностью сохранения и удобного просмотра полезных материалов. | ||
| Строка 7: | Строка 13: | ||
* разработать механизм фильтрации и обработки текстового контента | * разработать механизм фильтрации и обработки текстового контента | ||
* реализовать веб-интерфейс для отображения результатов | * реализовать веб-интерфейс для отображения результатов | ||
== VK API == | |||
'''VK API''' - это программный интерфейс социальной сети VK, который предоставляет разработчикам доступ к данным и функциям платформы. С его помощью можно получать информацию о пользователях, сообществах и публикациях, работать с лентой новостей, комментариями и лайками, а также выполнять поиск контента по заданным параметрам. API поддерживает HTTP-запросы и возвращает данные в формате JSON, что делает его удобным для интеграции с веб-приложениями. | |||
Методы представляют собой условные команды, которые соответствуют той или иной операции с базой данных — получению информации, записи или удалению. Например: | |||
* '''users.get''' — метод для получения информации о пользователе. | |||
* '''video.add''' — метод для добавления видео в список видео. | |||
* '''messages.delete''' — метод для удаления сообщений. | |||
Для работы некоторых методов нужны права доступа к данным пользователя. Виды доступов: | |||
* Базовые — фамилия и имя, фото профиля, пол и дата рождения, а также почта по запросу. | |||
* Расширенные — номер телефона | |||
== Описание приложения == | == Описание приложения == | ||
| Строка 13: | Строка 33: | ||
Пользователь вводит поисковый запрос (например, “Python” или “SQL”), после чего система: | Пользователь вводит поисковый запрос (например, “Python” или “SQL”), после чего система: | ||
# Отправляет запрос к VK API | |||
#* получает посты из выбранных образовательных сообществ | |||
#*выполняет глобальный поиск по социальной сети | |||
# Выполняет обработку данных: | |||
#* удаляет пустые и нерелевантные записи | |||
#* сокращает текст постов | |||
#* формирует ссылки на оригинальные публикации | |||
#* преобразует дату в удобный формат | |||
# Сортирует посты по популярности (количеству лайков) | |||
# Отображает пользователю: | |||
#* результаты поиска | |||
#* блок “популярные посты” | |||
#* сохранённые пользователем записи | |||
Пользователь может: | Пользователь может: | ||
* перейти к оригинальному посту | * перейти к оригинальному посту | ||
| Строка 61: | Строка 81: | ||
}} | }} | ||
[[Файл:Eduvk.png| | == Интерфейс == | ||
[[Файл:Eduvk.png|никакой|Интерфейс]] | |||
== Код проекта == | |||
<syntaxhighlight lang="python"> | |||
from flask import Flask, render_template, request, session, redirect, url_for | |||
import requests | |||
from datetime import datetime | |||
app = Flask(__name__) | |||
app.secret_key = "super_secret_key" | |||
ACCESS_TOKEN = "access_token" | |||
API_VERSION = "5.131" | |||
# фильтрация групп | |||
GROUP_IDS = [ | |||
-54530371, | |||
-88815732, | |||
-60465354, | |||
-167073223, | |||
-200069708, | |||
-149279146 | |||
] | |||
# ограничение количества символов в посте | |||
def clean_text(text): | |||
text = text.strip().replace("\n", " ") | |||
if len(text) > 250: | |||
text = text[:250] + "..." | |||
return text | |||
def format_date(timestamp): | |||
dt = datetime.fromtimestamp(timestamp) | |||
return dt.strftime("%d.%m.%Y %H:%M") | |||
# получение ссылки на пост | |||
def make_link(item): | |||
owner_id = item.get("owner_id") | |||
post_id = item.get("id") | |||
if not owner_id or not post_id: | |||
return None | |||
return f"https://vk.com/wall{owner_id}_{post_id}" | |||
# получение постов | |||
def fetch_posts(query=None): | |||
posts = [] | |||
# 🔹 из групп | |||
for group_id in GROUP_IDS: | |||
url = "https://api.vk.com/method/wall.get" | |||
params = { | |||
"owner_id": group_id, | |||
"count": 10, | |||
"access_token": ACCESS_TOKEN, | |||
"v": API_VERSION | |||
} | |||
response = requests.get(url, params=params) | |||
data = response.json() | |||
if "response" not in data: | |||
continue | |||
for item in data["response"]["items"]: | |||
text = item.get("text", "") | |||
if not text: | |||
continue | |||
if query and query.lower() not in text.lower(): | |||
continue | |||
link = make_link(item) | |||
if not link: | |||
continue | |||
posts.append({ | |||
"text": clean_text(text), | |||
"likes": item["likes"]["count"], | |||
"date": format_date(item["date"]), | |||
"link": link | |||
}) | |||
# глобальный поиск | |||
if query: | |||
url = "https://api.vk.com/method/newsfeed.search" | |||
params = { | |||
"q": query, | |||
"count": 20, | |||
"access_token": ACCESS_TOKEN, | |||
"v": API_VERSION | |||
} | |||
response = requests.get(url, params=params) | |||
data = response.json() | |||
if "response" in data: | |||
for item in data["response"]["items"]: | |||
text = item.get("text", "") | |||
if not text: | |||
continue | |||
link = make_link(item) | |||
if not link: | |||
continue | |||
posts.append({ | |||
"text": clean_text(text), | |||
"likes": item["likes"]["count"], | |||
"date": format_date(item["date"]), | |||
"link": link | |||
}) | |||
# удаление дубликатов | |||
unique_posts = {p["link"]: p for p in posts}.values() | |||
# сортировка постов по лайкам | |||
posts = sorted(unique_posts, key=lambda x: x["likes"], reverse=True) | |||
return posts[:15] | |||
@app.route("/", methods=["GET", "POST"]) | |||
def index(): | |||
posts = [] | |||
popular_posts = [] | |||
query = "" | |||
if request.method == "POST": | |||
query = request.form["query"] | |||
posts = fetch_posts(query) | |||
# популярные | |||
all_posts = fetch_posts("python") | |||
popular_posts = sorted(all_posts, key=lambda x: x["likes"], reverse=True)[:5] | |||
saved_posts = session.get("saved", []) | |||
return render_template( | |||
"index.html", | |||
posts=posts, | |||
popular_posts=popular_posts, | |||
saved_posts=saved_posts, | |||
query=query | |||
) | |||
@app.route("/save") | |||
def save_post(): | |||
link = request.args.get("link") | |||
text = request.args.get("text") | |||
likes = request.args.get("likes") | |||
if "saved" not in session: | |||
session["saved"] = [] | |||
session["saved"].append({ | |||
"link": link, | |||
"text": text, | |||
"likes": likes | |||
}) | |||
session.modified = True | |||
return redirect(url_for("index")) | |||
if __name__ == "__main__": | |||
app.run(debug=True) | |||
</syntaxhighlight> | |||
== Вывод == | == Вывод == | ||
Текущая версия от 10:42, 27 марта 2026
VK EDU
Автор: Башашкин Алексей
Группа: АДЭУ-221
Дисциплина: Работа с API социальных сетей и облачных сервисов
Статус проекта: Выполнен
Цель
Разработать веб-приложение для поиска, фильтрации и отображения образовательного контента из социальной сети VK с возможностью сохранения и удобного просмотра полезных материалов.
Задачи
- изучить возможности VK API
- реализовать получение данных из API (посты из сообществ и глобальный поиск)
- разработать механизм фильтрации и обработки текстового контента
- реализовать веб-интерфейс для отображения результатов
VK API
VK API - это программный интерфейс социальной сети VK, который предоставляет разработчикам доступ к данным и функциям платформы. С его помощью можно получать информацию о пользователях, сообществах и публикациях, работать с лентой новостей, комментариями и лайками, а также выполнять поиск контента по заданным параметрам. API поддерживает HTTP-запросы и возвращает данные в формате JSON, что делает его удобным для интеграции с веб-приложениями.
Методы представляют собой условные команды, которые соответствуют той или иной операции с базой данных — получению информации, записи или удалению. Например:
- users.get — метод для получения информации о пользователе.
- video.add — метод для добавления видео в список видео.
- messages.delete — метод для удаления сообщений.
Для работы некоторых методов нужны права доступа к данным пользователя. Виды доступов:
- Базовые — фамилия и имя, фото профиля, пол и дата рождения, а также почта по запросу.
- Расширенные — номер телефона
Описание приложения
Приложение работает как “умный агрегатор” образовательного контента.
Пользователь вводит поисковый запрос (например, “Python” или “SQL”), после чего система:
- Отправляет запрос к VK API
- получает посты из выбранных образовательных сообществ
- выполняет глобальный поиск по социальной сети
- Выполняет обработку данных:
- удаляет пустые и нерелевантные записи
- сокращает текст постов
- формирует ссылки на оригинальные публикации
- преобразует дату в удобный формат
- Сортирует посты по популярности (количеству лайков)
- Отображает пользователю:
- результаты поиска
- блок “популярные посты”
- сохранённые пользователем записи
Пользователь может:
- перейти к оригинальному посту
- сохранить интересный материал
Структура проекта
Интерфейс
Код проекта
from flask import Flask, render_template, request, session, redirect, url_for
import requests
from datetime import datetime
app = Flask(__name__)
app.secret_key = "super_secret_key"
ACCESS_TOKEN = "access_token"
API_VERSION = "5.131"
# фильтрация групп
GROUP_IDS = [
-54530371,
-88815732,
-60465354,
-167073223,
-200069708,
-149279146
]
# ограничение количества символов в посте
def clean_text(text):
text = text.strip().replace("\n", " ")
if len(text) > 250:
text = text[:250] + "..."
return text
def format_date(timestamp):
dt = datetime.fromtimestamp(timestamp)
return dt.strftime("%d.%m.%Y %H:%M")
# получение ссылки на пост
def make_link(item):
owner_id = item.get("owner_id")
post_id = item.get("id")
if not owner_id or not post_id:
return None
return f"https://vk.com/wall{owner_id}_{post_id}"
# получение постов
def fetch_posts(query=None):
posts = []
# 🔹 из групп
for group_id in GROUP_IDS:
url = "https://api.vk.com/method/wall.get"
params = {
"owner_id": group_id,
"count": 10,
"access_token": ACCESS_TOKEN,
"v": API_VERSION
}
response = requests.get(url, params=params)
data = response.json()
if "response" not in data:
continue
for item in data["response"]["items"]:
text = item.get("text", "")
if not text:
continue
if query and query.lower() not in text.lower():
continue
link = make_link(item)
if not link:
continue
posts.append({
"text": clean_text(text),
"likes": item["likes"]["count"],
"date": format_date(item["date"]),
"link": link
})
# глобальный поиск
if query:
url = "https://api.vk.com/method/newsfeed.search"
params = {
"q": query,
"count": 20,
"access_token": ACCESS_TOKEN,
"v": API_VERSION
}
response = requests.get(url, params=params)
data = response.json()
if "response" in data:
for item in data["response"]["items"]:
text = item.get("text", "")
if not text:
continue
link = make_link(item)
if not link:
continue
posts.append({
"text": clean_text(text),
"likes": item["likes"]["count"],
"date": format_date(item["date"]),
"link": link
})
# удаление дубликатов
unique_posts = {p["link"]: p for p in posts}.values()
# сортировка постов по лайкам
posts = sorted(unique_posts, key=lambda x: x["likes"], reverse=True)
return posts[:15]
@app.route("/", methods=["GET", "POST"])
def index():
posts = []
popular_posts = []
query = ""
if request.method == "POST":
query = request.form["query"]
posts = fetch_posts(query)
# популярные
all_posts = fetch_posts("python")
popular_posts = sorted(all_posts, key=lambda x: x["likes"], reverse=True)[:5]
saved_posts = session.get("saved", [])
return render_template(
"index.html",
posts=posts,
popular_posts=popular_posts,
saved_posts=saved_posts,
query=query
)
@app.route("/save")
def save_post():
link = request.args.get("link")
text = request.args.get("text")
likes = request.args.get("likes")
if "saved" not in session:
session["saved"] = []
session["saved"].append({
"link": link,
"text": text,
"likes": likes
})
session.modified = True
return redirect(url_for("index"))
if __name__ == "__main__":
app.run(debug=True)
Вывод
В ходе выполнения проекта было разработано веб-приложение, демонстрирующее работу с внешним API и обработку данных в реальном времени.
- использование API социальной сети позволяет получать актуальный контент без необходимости хранения данных локально
- фильтрация и обработка информации существенно повышают её полезность для пользователя
- даже простые механизмы сортировки (например, по лайкам) позволяют выделять более качественный контент
- добавление пользовательских функций (сохранение постов, тёмная тема) улучшает удобство использования приложения
- веб-технологии (Flask, HTML, CSS, JavaScript) позволяют быстро реализовать функциональный интерфейс

