Skip to main content

socialkit (s-socialkit)

Общий слой домена соцсетей — то, что одинаково у Telegram, VK, Instagram, TikTok, Threads, YouTube, Rutube, Дзена, vc.ru, ok.ru, Boosty, Reddit, Pinterest и MAX. Аналог aichatkit для ИИ-чатов.

Зачем

Соцсети работают так же, как ИИ-чаты: навык объявляет способности видами, а оркестратор зовёт вид, а не сервис. Тогда веер («найти конкурентов во всех соцсетях») получается сам собой — спросили всех, кто объявил вид, — а новая соцсеть подключается установкой пакета, без правки ядра.

До этого единицей подключения была ВСЯ СЕТЬ: маршрут веера лежал таблицей CROSSPOST_ROUTES, перечень сетей — закрытым NetworkId на шестнадцать значений, а способность выяснялась двумя десятками булевых флагов уже ПОСЛЕ загрузки адаптера.

Состав 0.0.1

Модуль Что даёт
capabilities контракт видов: перечень, таблица вид→метод, правило имени точки входа <сервис>_<вид>, поля ответа, машинная проверка однородности вызова
entities сущности домена: материал, комментарий, показатели, цель публикации, автор, файл, страницы выборок. Приехали из ядра bublictr
liveness живость входа — ТОНКИЙ реэкспорт corekit.diagnosis.access (три исхода, правило живёт в основании)
content_types кто каким ВИДОМ какие ТИПЫ материала умеет: язык объявления, чтение из метаданных (без импорта навыков), вопрос «кто умеет карусель»
trail СЛЕД вызова вида: четыре ступени ВОКРУГ вызова одной строкой @traced (механизм — corekit.trail), общий идентификатор прохода, рекурсивная вычистка секретов, приёмник в локальный *.jsonl

Типы материала

video (горизонтальное long-form) · reel (короткое вертикальное) · post · story · carousel · article · poll.

Порог тот же, что у видов: тип заводится, когда его умеют трое и больше (пересчитано по тринадцати навыкам соцсетей). Поэтому здесь нет трансляции — её умеет один Rutube; нет и «аудио» — звук приезжает вложением в пост, а это MediaKind.

Навык объявляет соответствие вид→типы ТОЧКАМИ ВХОДА группы socialkit.content_types, где значение — сам перечень строкой:

[project.entry-points."socialkit.content_types"]
instagram_publish = "post:image, carousel:image+video, reel:video, story:image+video"

Так перечень читается из метаданных, не импортировав ни одного навыка. После двоеточия — чем тип бывает наполнен: карусель у Instagram и альбома Telegram принимает внутрь ролик, у VK — только фотографии, и эта разница объявлена словами, а не подразумевается.

Виды

Ядро (веерится): publish · content · media · comments · feed · metrics · search · profile · session · export.

Второй эшелон (объявлен, волну не блокирует): engagement · schedule · members · messages · collection · events.

Порог объявления — повторяемость намерения (умеют трое и больше), а не похожесть кода. Уникальное (market ВКонтакте, star revenue Телеграма, протокол MAX) остаётся своей командой навыка: вид с одним носителем — это переименованный сервис.

Правила контракта

  • вид и метод зовутся ОДНИМ словом — помнить соответствие не приходится;
  • имя сервиса живёт ТОЛЬКО в координате точки входа <сервис>_<вид>;
  • вызов однороден: ctx есть у любого вида и везде со значением по умолчанию. У чатов это разъехалось, и наивный вызов падал TypeError на первом же сервисе. Проверяется машиной: socialkit.uniformity_problems(навык);
  • сырой ответ сервиса всегда лежит в raw;
  • «не знаю» говорится прямо: None, а не ноль и не выдуманный вердикт.

Чего в ките нет и не будет

Транспорта (netkit), браузера, минта и хранилища сессий (librarykit), пула аккаунтов (accountpoolkit), троттлинга и реестра адресов (adapterkit), веера (это оркестратор). Кит про ЗНАНИЕ домена, а не второй фреймворк.

Установка

pip install s-socialkit

Использование

from socialkit import CAPABILITY_METHOD, CORE_KINDS, capability_id, uniformity_problems
from socialkit import ContentItem, ContentType, Visibility

# навык объявляет точку входа
capability_id("vk", "publish")            # → "vk_publish"

# оркестратор зовёт вид, не зная имени сервиса
метод = getattr(навык, CAPABILITY_METHOD["publish"])
метод(ContentItem(service="vk", type=ContentType.POST, visibility=Visibility.PUBLIC))

# навык проверяет себя сам: объявленное обязано быть позываемым
assert uniformity_problems(навык) == []

Спросить по ТИПУ материала — ничего не загружая и не зная имён сетей:

from socialkit import ContentType, MediaKind, who_can

who_can(ContentType.CAROUSEL)                              # → ('instagram_publish', ...)
who_can(ContentType.CAROUSEL, media=MediaKind.VIDEO_FILE)  # карусель с роликом внутри
who_can(ContentType.REEL, kind="content")                  # кто ПЕРЕЧИСЛЯЕТ вертикальные

Оставить след вызова — одной строкой, не зная про основание:

from socialkit import SESSION, set_sink, to_jsonl, traced

set_sink(to_jsonl("~/.sessions/trail.jsonl"))   # локально; наружу — тот же файл

class VkSession:
    service, kind = "vk", SESSION

    @traced                       # четыре ступени вокруг вызова, а не в теле
    async def session(self, ctx=None, **_):
        ...

Одна запись прохода (intentaccessexchangeoutcome) выглядит так:

{"stage": "outcome", "trace_id": "e2f1…", "service": "vk", "kind": "session",
 "verdict": "refused", "why": "вход отвергнут", "evidence": "форма входа в ответе"}

trace_id приезжает из ExecutionContext, поэтому сценарий из десяти видов в разных сетях читается одним grep по идентификатору. Секреты в записи не попадают никогда — ни доводом, ни вложенным заголовком.

Разработка

python -m pytest -q     # 90 тестов
python -m ruff check .

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

s_socialkit-0.0.5.tar.gz (115.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

s_socialkit-0.0.5-py3-none-any.whl (64.0 kB view details)

Uploaded Python 3

File details

Details for the file s_socialkit-0.0.5.tar.gz.

File metadata

  • Download URL: s_socialkit-0.0.5.tar.gz
  • Upload date:
  • Size: 115.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for s_socialkit-0.0.5.tar.gz
Algorithm Hash digest
SHA256 540b397cd6324a39f49cb603abedb7e0524f74b92e05fe42c0e92200af11684f
MD5 ad1ffea50d097de3dc71ee130ee1ec47
BLAKE2b-256 c8549008bdcd87f86fa31f1c7e8f8f39a7447c8335632e2fdf96fd1aa52a2cb4

See more details on using hashes here.

File details

Details for the file s_socialkit-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: s_socialkit-0.0.5-py3-none-any.whl
  • Upload date:
  • Size: 64.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for s_socialkit-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 abf1bb2b4073858fbaf39feffe0eaab467821e7a9dcea9950c1cf25563264896
MD5 a23eb09f1cefc503ffabb975e9e7755f
BLAKE2b-256 f8f01a3cec3a87e98d61d34cbe3c2eaef8efff54606f65ebe103924b4e482ef7

See more details on using hashes here.

Release history Release notifications | RSS feed

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

This release

0.0.5 This release

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page