socialcli 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of socialcli might be problematic. Click here for more details.
- socialcli-0.3.0.dist-info/METADATA +168 -0
- socialcli-0.3.0.dist-info/RECORD +224 -0
- socialcli-0.3.0.dist-info/WHEEL +4 -0
- socialcli-0.3.0.dist-info/entry_points.txt +3 -0
- socialcli-0.3.0.dist-info/licenses/LICENSE +21 -0
- socialctl/__init__.py +0 -0
- socialctl/__main__.py +6 -0
- socialctl/adapters/__init__.py +6 -0
- socialctl/adapters/base.py +68 -0
- socialctl/adapters/errores.py +56 -0
- socialctl/adapters/facebook.py +180 -0
- socialctl/adapters/instagram.py +442 -0
- socialctl/adapters/tiktok.py +535 -0
- socialctl/adapters/youtube.py +331 -0
- socialctl/agent_errors.py +176 -0
- socialctl/agent_guide.py +23 -0
- socialctl/approval_cli.py +27 -0
- socialctl/auth.py +139 -0
- socialctl/authflow.py +344 -0
- socialctl/brands.py +194 -0
- socialctl/capabilities.py +57 -0
- socialctl/capabilities.yml +5945 -0
- socialctl/cli.py +1766 -0
- socialctl/connection_service/__init__.py +0 -0
- socialctl/connection_service/__main__.py +33 -0
- socialctl/connection_service/app.py +496 -0
- socialctl/connection_service/assets/PLATFORM-LOGOS-LICENSE.txt +50 -0
- socialctl/connection_service/assets/connection.css +75 -0
- socialctl/connection_service/assets/facebook.webp +0 -0
- socialctl/connection_service/assets/instagram.svg +194 -0
- socialctl/connection_service/assets/socialcli-logo.png +0 -0
- socialctl/connection_service/assets/tiktok.png +0 -0
- socialctl/connection_service/assets/youtube.svg +1 -0
- socialctl/connection_service/landing.py +146 -0
- socialctl/connection_service/legacy.py +48 -0
- socialctl/connection_service/peer.py +13 -0
- socialctl/connection_service/providers.py +324 -0
- socialctl/connection_service/settings.py +76 -0
- socialctl/connection_service/store.py +124 -0
- socialctl/connections/__init__.py +0 -0
- socialctl/connections/account_cli.py +438 -0
- socialctl/connections/cli.py +379 -0
- socialctl/connections/client.py +126 -0
- socialctl/connections/credential_cli.py +224 -0
- socialctl/connections/credential_store.py +49 -0
- socialctl/connections/file_store.py +193 -0
- socialctl/connections/keychain.py +78 -0
- socialctl/connections/meta_user.py +81 -0
- socialctl/connections/rotation_cli.py +116 -0
- socialctl/connections/saas_client.py +91 -0
- socialctl/connections/temporary_media.py +62 -0
- socialctl/delivery_options.py +70 -0
- socialctl/engagement.py +200 -0
- socialctl/engagement_cli.py +50 -0
- socialctl/executor.py +135 -0
- socialctl/formatter.py +291 -0
- socialctl/hosted_media.py +152 -0
- socialctl/identity.py +200 -0
- socialctl/inbox.py +298 -0
- socialctl/inbox_cli.py +46 -0
- socialctl/inventory.py +155 -0
- socialctl/inventory_cli.py +171 -0
- socialctl/inventory_sources.py +101 -0
- socialctl/management/__init__.py +1 -0
- socialctl/management/batch_cli.py +115 -0
- socialctl/management/batches.py +325 -0
- socialctl/management/changes.py +485 -0
- socialctl/management/cli.py +227 -0
- socialctl/management/comments_cli.py +352 -0
- socialctl/management/community_batch_cli.py +63 -0
- socialctl/management/community_batches.py +294 -0
- socialctl/management/community_changes.py +370 -0
- socialctl/management/community_cli.py +142 -0
- socialctl/management/community_schema.py +119 -0
- socialctl/management/facebook_groups.py +1118 -0
- socialctl/management/groups_cli.py +274 -0
- socialctl/management/inbox_readers.py +87 -0
- socialctl/management/meta_changes.py +197 -0
- socialctl/management/meta_cli.py +342 -0
- socialctl/management/meta_client.py +631 -0
- socialctl/management/meta_comment_inbox.py +565 -0
- socialctl/management/meta_comments.py +587 -0
- socialctl/management/meta_errors.py +59 -0
- socialctl/management/meta_pagination.py +52 -0
- socialctl/management/meta_schema.py +128 -0
- socialctl/management/meta_webhooks.py +147 -0
- socialctl/management/metadata_parts.py +144 -0
- socialctl/management/owned_assets.py +85 -0
- socialctl/management/owned_changes.py +470 -0
- socialctl/management/owned_cli.py +128 -0
- socialctl/management/owned_reorder.py +62 -0
- socialctl/management/owned_schema.py +368 -0
- socialctl/management/reply_context.py +24 -0
- socialctl/management/reply_evidence.py +80 -0
- socialctl/management/resource_changes.py +407 -0
- socialctl/management/resource_cli.py +136 -0
- socialctl/management/snippet_readback.py +26 -0
- socialctl/management/stories.py +713 -0
- socialctl/management/stories_cli.py +172 -0
- socialctl/management/youtube.py +323 -0
- socialctl/management/youtube_community.py +326 -0
- socialctl/management/youtube_metadata.py +122 -0
- socialctl/management/youtube_owned.py +259 -0
- socialctl/management/youtube_resources.py +305 -0
- socialctl/media.py +269 -0
- socialctl/media_cli.py +183 -0
- socialctl/media_ingress.py +211 -0
- socialctl/media_preflight.py +114 -0
- socialctl/media_registry.py +301 -0
- socialctl/media_requirements.py +52 -0
- socialctl/metricas/__init__.py +6 -0
- socialctl/metricas/almacen.py +133 -0
- socialctl/metricas/analytics_changes.py +295 -0
- socialctl/metricas/analytics_cli.py +191 -0
- socialctl/metricas/analytics_client.py +304 -0
- socialctl/metricas/analytics_ingest.py +260 -0
- socialctl/metricas/analytics_schema.py +174 -0
- socialctl/metricas/base.py +147 -0
- socialctl/metricas/facebook.py +418 -0
- socialctl/metricas/insights.py +227 -0
- socialctl/metricas/instagram.py +133 -0
- socialctl/metricas/modelos.py +87 -0
- socialctl/metricas/piezas.py +134 -0
- socialctl/metricas/reach.py +94 -0
- socialctl/metricas/reporting_client.py +112 -0
- socialctl/metricas/resumen.py +251 -0
- socialctl/metricas/slugs.py +89 -0
- socialctl/metricas/tiktok.py +185 -0
- socialctl/metricas/youtube.py +403 -0
- socialctl/migration_cli.py +60 -0
- socialctl/migration_files.py +68 -0
- socialctl/models.py +150 -0
- socialctl/native_schedule/__init__.py +13 -0
- socialctl/native_schedule/api_delivery.py +15 -0
- socialctl/native_schedule/api_reconcile.py +40 -0
- socialctl/native_schedule/approval.py +160 -0
- socialctl/native_schedule/cadence.py +73 -0
- socialctl/native_schedule/cli.py +510 -0
- socialctl/native_schedule/dispatcher.py +120 -0
- socialctl/native_schedule/facebook.py +112 -0
- socialctl/native_schedule/facebook_reels.py +140 -0
- socialctl/native_schedule/first_comment.py +181 -0
- socialctl/native_schedule/handoff.py +193 -0
- socialctl/native_schedule/instagram_delivery.py +224 -0
- socialctl/native_schedule/instagram_runtime.py +66 -0
- socialctl/native_schedule/inventory.py +70 -0
- socialctl/native_schedule/migration.py +310 -0
- socialctl/native_schedule/models.py +103 -0
- socialctl/native_schedule/reconcile.py +83 -0
- socialctl/native_schedule/remote_data.py +177 -0
- socialctl/native_schedule/report.py +151 -0
- socialctl/native_schedule/store.py +560 -0
- socialctl/native_schedule/verification.py +32 -0
- socialctl/native_schedule/youtube.py +339 -0
- socialctl/operation_output.py +87 -0
- socialctl/plantillas/accounts.yml +33 -0
- socialctl/plantillas/brand.md +95 -0
- socialctl/plantillas/estrategia.md +64 -0
- socialctl/postfile.py +240 -0
- socialctl/preflight.py +73 -0
- socialctl/publication_policy.py +34 -0
- socialctl/publication_status.py +75 -0
- socialctl/publication_steps.py +398 -0
- socialctl/publish_output.py +96 -0
- socialctl/publisher.py +445 -0
- socialctl/queue_migration.py +302 -0
- socialctl/read_budget.py +224 -0
- socialctl/read_reports.py +91 -0
- socialctl/rutas.py +103 -0
- socialctl/saas/__init__.py +1 -0
- socialctl/saas/access.py +75 -0
- socialctl/saas/auth.py +213 -0
- socialctl/saas/backup.py +124 -0
- socialctl/saas/billing.py +327 -0
- socialctl/saas/billing_enrollment.py +1237 -0
- socialctl/saas/billing_enrollment_schema.py +519 -0
- socialctl/saas/billing_inventory.py +775 -0
- socialctl/saas/billing_reconcile.py +127 -0
- socialctl/saas/billing_routes.py +27 -0
- socialctl/saas/budget.py +66 -0
- socialctl/saas/connections.py +374 -0
- socialctl/saas/consent.py +52 -0
- socialctl/saas/lifecycle.py +341 -0
- socialctl/saas/mail.py +89 -0
- socialctl/saas/maintenance.py +68 -0
- socialctl/saas/meta_user.py +298 -0
- socialctl/saas/meta_webhooks.py +358 -0
- socialctl/saas/migration.py +107 -0
- socialctl/saas/models.py +8 -0
- socialctl/saas/operations.py +102 -0
- socialctl/saas/pages.py +126 -0
- socialctl/saas/pairing.py +158 -0
- socialctl/saas/permissions.py +57 -0
- socialctl/saas/reminders.py +128 -0
- socialctl/saas/renewal.py +74 -0
- socialctl/saas/restore_guard.py +229 -0
- socialctl/saas/revocation.py +97 -0
- socialctl/saas/rotation.py +114 -0
- socialctl/saas/routes.py +221 -0
- socialctl/saas/settings.py +34 -0
- socialctl/saas/store.py +106 -0
- socialctl/saas/temporary_media.py +245 -0
- socialctl/saas/webhooks.py +76 -0
- socialctl/schedule_remote.py +262 -0
- socialctl/schedule_sqlite.py +44 -0
- socialctl/scheduler.py +581 -0
- socialctl/scheduler_launchd.py +319 -0
- socialctl/scheduler_systemd.py +167 -0
- socialctl/source_links.py +119 -0
- socialctl/ui/__init__.py +1 -0
- socialctl/ui/assets/agent-manual.md +850 -0
- socialctl/ui/assets/agents.md +27 -0
- socialctl/ui/assets/components.css +20 -0
- socialctl/ui/assets/connection-layout.css +53 -0
- socialctl/ui/assets/otp.template.html +10 -0
- socialctl/ui/assets/tokens.css +1 -0
- socialctl/ui/assets/trial.template.html +11 -0
- socialctl/ui/assets/web-layout.css +38 -0
- socialctl/ui/email/otp.html +10 -0
- socialctl/ui/email/trial.html +11 -0
- socialctl/upload_consent.py +13 -0
- socialctl/workspace.py +8 -0
- socialctl/youtube_data.py +471 -0
- socialctl/youtube_data_service.py +225 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: socialcli
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: SocialCli: publish and manage creator-owned social content from the terminal.
|
|
5
|
+
Project-URL: Homepage, https://socialcli.app
|
|
6
|
+
Project-URL: Repository, https://github.com/engels-florentino/SocialCli
|
|
7
|
+
Project-URL: Issues, https://github.com/engels-florentino/SocialCli/issues
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Python: >=3.11
|
|
11
|
+
Requires-Dist: httpx>=0.28.1
|
|
12
|
+
Requires-Dist: keyring>=25.0
|
|
13
|
+
Requires-Dist: pydantic>=2.13.5
|
|
14
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
15
|
+
Requires-Dist: typer>=0.27.2
|
|
16
|
+
Provides-Extra: connection-server
|
|
17
|
+
Requires-Dist: cryptography>=43; extra == 'connection-server'
|
|
18
|
+
Requires-Dist: fastapi>=0.115; extra == 'connection-server'
|
|
19
|
+
Requires-Dist: uvicorn>=0.30; extra == 'connection-server'
|
|
20
|
+
Provides-Extra: headless-credentials
|
|
21
|
+
Requires-Dist: cryptography>=43; extra == 'headless-credentials'
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
<p align="center"><img src="docs/assets/socialcli-logo.png" width="128" height="128" alt="SocialCli logo: S and terminal prompt >_"></p>
|
|
25
|
+
|
|
26
|
+
# SocialCli
|
|
27
|
+
|
|
28
|
+
**Current source version: 0.3.0.** SocialCli SaaS is the current SocialCli
|
|
29
|
+
product. The repository root on `main` is its single development workspace;
|
|
30
|
+
the CLI, hosted connection service and account/billing components live together
|
|
31
|
+
here. Earlier versions remain in Git history for reference and migration.
|
|
32
|
+
|
|
33
|
+
**A social media CLI for AI agents and the people who supervise them.** Use a terminal-enabled assistant to inspect your accounts, draft posts and prepare user-approved actions on YouTube, Facebook, Instagram and TikTok. SocialCli provides concrete commands, validation, previews and local records for creators and teams.
|
|
34
|
+
|
|
35
|
+
[Website and documentation](https://socialcli.app/) · [AI agent guide](docs/ai-agents.md) · [Setup](SETUP.md) · [Security](SECURITY.md) · [TikTok limitations](docs/tiktok-review.md)
|
|
36
|
+
|
|
37
|
+
## Work with your AI agent
|
|
38
|
+
|
|
39
|
+
Install SocialCli where your agent can run shell commands, point it at your creator workspace and name the brand explicitly. Try:
|
|
40
|
+
|
|
41
|
+
> Check MyBrand's TikTok connection and available capabilities. Summarize missing permissions without publishing.
|
|
42
|
+
|
|
43
|
+
> Use MyBrand/media/my-video.mp4, draft a caption in our brand voice and show the complete TikTok dry-run preview. Wait for my approval before sending it.
|
|
44
|
+
|
|
45
|
+
> Inspect my YouTube video and propose a description change. Show the proposal and fingerprint before applying anything.
|
|
46
|
+
|
|
47
|
+
[The AI agent guide](docs/ai-agents.md) includes the commands behind these prompts, workspace instructions and the approval workflow. JSON is available on supported diagnostics and inventory commands. SocialCli runs through the agent's shell; it does not include an AI model or an MCP server. Your agent must keep credentials private and preserve the distinction between confirmed, pending and uncertain results.
|
|
48
|
+
|
|
49
|
+
## Public SaaS pilot
|
|
50
|
+
|
|
51
|
+
Copy this line into your terminal-enabled AI assistant:
|
|
52
|
+
|
|
53
|
+
> Install SocialCli: https://socialcli.app/agents
|
|
54
|
+
|
|
55
|
+
The installation guide verifies the selected release download and uses
|
|
56
|
+
https://pilot.socialcli.app for email sign-in, assistant approval and account
|
|
57
|
+
connections. The pilot supports eligible YouTube, Facebook, Instagram and TikTok
|
|
58
|
+
test accounts. Provider verification is separate from the OAuth publishing
|
|
59
|
+
toggle; Meta development access and TikTok sandbox restrictions still apply.
|
|
60
|
+
Stripe uses test mode. Planned access costs
|
|
61
|
+
USD 10/month after 14 free days from the first successful connection. No real
|
|
62
|
+
subscriptions are collected in this pilot.
|
|
63
|
+
|
|
64
|
+
The current client release target is **0.3.0** (published first to TestPyPI and
|
|
65
|
+
then to PyPI through the reviewed release workflow). The compatible hosted
|
|
66
|
+
runtime is `socialcli-saas-candidate:45fda63`. The client's wheel and
|
|
67
|
+
source archive are verified against the
|
|
68
|
+
reviewed build hashes before publication. Provider commercial approvals and live
|
|
69
|
+
billing cutover remain separate from package publication. See the
|
|
70
|
+
[release record](deploy/saas/release.md).
|
|
71
|
+
The [stable release scope](docs/stable-scope.md) excludes unsupported automatic
|
|
72
|
+
operations; disabled research catalogue entries are not offered features.
|
|
73
|
+
|
|
74
|
+
## Install and connect
|
|
75
|
+
|
|
76
|
+
Use the short installation prompt above. Your assistant needs a persistent shell,
|
|
77
|
+
Python 3.11+, macOS or Linux and protected credential storage. The bootstrap
|
|
78
|
+
verifies the exact wheel before installation and resolves dependencies from normal
|
|
79
|
+
PyPI. Video validation also requires ffprobe from FFmpeg.
|
|
80
|
+
|
|
81
|
+
The setup order is **brand → credentials → account login → connect**. Ask for the
|
|
82
|
+
brand name explicitly, preserve its workspace outside the application repository,
|
|
83
|
+
and read socialcli agent-guide setup. The account step uses
|
|
84
|
+
https://pilot.socialcli.app. Give each printed link directly to the user without
|
|
85
|
+
opening it; the user signs in and approves the assistant and provider account in
|
|
86
|
+
their browser. Never request OTPs or provider tokens in chat.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
socialcli account login --brand MyBrand --service https://pilot.socialcli.app --no-browser
|
|
90
|
+
socialcli connect youtube --brand MyBrand --management --analytics --no-browser
|
|
91
|
+
socialcli connections --brand MyBrand --json
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Run these after creating the brand and configuring protected credentials as shown
|
|
95
|
+
in the [connection guide](docs/connections.md). OS keyring and explicit encrypted
|
|
96
|
+
file storage are supported; there is no silent fallback. Use the same workspace,
|
|
97
|
+
store and key in later conversations. Connecting never authorizes publication.
|
|
98
|
+
|
|
99
|
+
For source development use uv sync --group dev, uv run pytest and
|
|
100
|
+
uv run socialcli --help in the repository. [SETUP.md](SETUP.md) covers independent
|
|
101
|
+
operator apps; customers of the hosted SaaS do not need developer credentials.
|
|
102
|
+
|
|
103
|
+
## Review and publish
|
|
104
|
+
|
|
105
|
+
Create `MyBrand/posts/my-video/post.yml` and place your produced file in `MyBrand/media/`. [Example](examples/post.yml):
|
|
106
|
+
|
|
107
|
+
```yaml
|
|
108
|
+
slug: my-video
|
|
109
|
+
campaign: clip-vertical
|
|
110
|
+
platforms:
|
|
111
|
+
tiktok:
|
|
112
|
+
body: "A story worth telling."
|
|
113
|
+
hashtags: []
|
|
114
|
+
media: ["my-video.mp4"]
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
socialcli publish my-video --brand MyBrand --only tiktok --dry-run
|
|
119
|
+
socialcli publish my-video --brand MyBrand --only tiktok
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The first command displays a preview without publishing. The second displays it again and requests confirmation. TikTok defaults to **inbox**: the video reaches your inbox and you complete publication in TikTok. A pending confirmation status does not mean the video is published.
|
|
123
|
+
|
|
124
|
+
## Features
|
|
125
|
+
|
|
126
|
+
- Separate brands, local credentials and token renewal where supported by the provider.
|
|
127
|
+
- File validation, previews and confirmation before publication.
|
|
128
|
+
- Publishing, inventory, metrics and content management, subject to each platform's permissions and capabilities.
|
|
129
|
+
- Scheduling with approval checks and handling of ambiguous results to reduce duplicates.
|
|
130
|
+
- Adapter tests with simulated responses that do not publish to real accounts.
|
|
131
|
+
|
|
132
|
+
Each command group documents its options with `socialcli <group> --help`. The internal Python package remains `socialctl`; the public command is `socialcli`. `socialctl` remains a compatibility alias.
|
|
133
|
+
|
|
134
|
+
## Status and limitations
|
|
135
|
+
|
|
136
|
+
Public source code does not grant production API access. Each platform imposes requirements, permissions, quotas and reviews. SocialCli **has no accredited TikTok production approval**. Direct Post is disabled and excluded from the current offer; creator-reviewed inbox upload is supported. Direct Post still lacks the complete user experience controls described in [the technical review](docs/tiktok-review.md). Publishing this repository does not satisfy those requirements.
|
|
137
|
+
|
|
138
|
+
Metrics and management permissions are separate from publishing permissions. A valid connection does not demonstrate authorization for every feature. Check capabilities and verify remote results before retrying an uncertain operation.
|
|
139
|
+
|
|
140
|
+
## Contributing and support
|
|
141
|
+
|
|
142
|
+
Read [CONTRIBUTING.md](CONTRIBUTING.md). For questions or bugs, open an [issue](https://github.com/engels-florentino/SocialCli/issues) without tokens, keys, `.env` files or private logs. Report vulnerabilities through the private channel described in [SECURITY.md](SECURITY.md).
|
|
143
|
+
|
|
144
|
+
[MIT license](LICENSE). SocialCli is not affiliated with the platforms it integrates.
|
|
145
|
+
|
|
146
|
+
## Account, media and scheduling
|
|
147
|
+
|
|
148
|
+
[Account](https://socialcli.app/account/) lets you manage your brand, connected
|
|
149
|
+
platforms, approved assistants and billing. The plan covers one brand and one
|
|
150
|
+
account per supported platform. Subscribe during the 14-day trial without losing
|
|
151
|
+
its remaining days; the first USD 10 payment is due at the original trial end.
|
|
152
|
+
The current pilot uses Stripe test mode and collects no live payments.
|
|
153
|
+
|
|
154
|
+
Instagram can use automatic 15-minute temporary staging on florentino.pro for
|
|
155
|
+
supplied originals, up to 512 MiB and subject to quotas. Files are excluded from
|
|
156
|
+
backups and removed after the operation or by expiry cleanup. Local schedules
|
|
157
|
+
keep the original on the customer runner and stage it only at dispatch. Verified
|
|
158
|
+
native scheduling uses provider storage where supported. See
|
|
159
|
+
[media handling](MEDIA-INGESTION.md) and [scheduling](NATIVE-SCHEDULING.md).
|
|
160
|
+
|
|
161
|
+
Read the packaged socialcli agent-guide topic for the operation, the
|
|
162
|
+
[capability matrix](docs/capabilities.md), [security](SECURITY.md),
|
|
163
|
+
[privacy policy](https://socialcli.app/privacy.html) and
|
|
164
|
+
[terms](https://socialcli.app/terms.html). Historical 0.2.6 releases and deploy
|
|
165
|
+
records are migration evidence, not a second current product.
|
|
166
|
+
|
|
167
|
+
SocialCli is operated by **Florentino.pro**. For private account, billing or privacy
|
|
168
|
+
questions, contact [admin@socialcli.app](mailto:admin@socialcli.app).
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
socialctl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
socialctl/__main__.py,sha256=3s7Cky_ATIRXnfgny8sqCzMRHxjYav3L9SliXLqcwTs,141
|
|
3
|
+
socialctl/agent_errors.py,sha256=xLzVgBuwUSY8M0ePXEQZcAc9kTF4XrpFewcoJeN2RII,12875
|
|
4
|
+
socialctl/agent_guide.py,sha256=p8IAs3NKbBu24XmBofcWfDAHGoHS-nISY9z7P-yiG3g,1749
|
|
5
|
+
socialctl/approval_cli.py,sha256=fxIZE7YY4nklzgsIEVltNgL7CiZ_zr7iLl_w46p91YU,1192
|
|
6
|
+
socialctl/auth.py,sha256=OyaJ2FFws7DrAZgxbXSCDy2Ql_ID6b1oL6cTvlTN4ac,5556
|
|
7
|
+
socialctl/authflow.py,sha256=lkz9SeZ-B2oTtNd_wY5A2slNPS08o14_kw5GJkN1DhU,14130
|
|
8
|
+
socialctl/brands.py,sha256=sXWGTB86Ua8-23cpP0AFivTNkRrtbNONl8OIeBvCz38,7001
|
|
9
|
+
socialctl/capabilities.py,sha256=U2Nei99yeid0IqLkGcvVQYXpFJrv4U-cXY2SyQP9MQs,2672
|
|
10
|
+
socialctl/capabilities.yml,sha256=_4ox5_m3TOxD9QLjxgpUzkN7GTlarL-N5FQV_GUNtg0,301164
|
|
11
|
+
socialctl/cli.py,sha256=bO4ndUvXfPwim0qpmPTbyuWjBMoSbIUDaMVUIZ36Xy8,80555
|
|
12
|
+
socialctl/delivery_options.py,sha256=B2yyGTOyJwgnv5gKS_RO241Nf3YxIVkL8JtpBm0sxRA,4165
|
|
13
|
+
socialctl/engagement.py,sha256=SCWSL0BdYpWMzN1qaIz-cIhHTlP3WB4MXUdrkQQFSr8,13746
|
|
14
|
+
socialctl/engagement_cli.py,sha256=Azo4kTqE6ZUDsyWA5oe30hpnPzH3KnFFsZ3UyzlTX90,2887
|
|
15
|
+
socialctl/executor.py,sha256=vWY96Ic94R0w7srcCPMEpAl_9Ys-wSMHIdb5U2p_6r0,5751
|
|
16
|
+
socialctl/formatter.py,sha256=Q0LFYzaIBwh04MP8F6qENxP-0LT0VWIKFtQHpdxG-8M,11737
|
|
17
|
+
socialctl/hosted_media.py,sha256=5kY5aDqPo0HAFWniarh_rJEjc4Aqv8W8y4OcERTPUJ0,7984
|
|
18
|
+
socialctl/identity.py,sha256=lnu65GD4y5kNugG1olNTAGZWuunewEXoGNm4HToLmvA,9232
|
|
19
|
+
socialctl/inbox.py,sha256=q9O6lkfRRCKcL-E4KIo4zSjlhYNEuedp3LP--FHuuhs,20042
|
|
20
|
+
socialctl/inbox_cli.py,sha256=a6c9SYcNLfjp5MwXQWa1yi0p9eyoCU0QqmR4Z1Ag9sU,3198
|
|
21
|
+
socialctl/inventory.py,sha256=57RxmRUgLPhLePRP3G-Bfav0CQ9qnk7P1wEnD6eThGY,7088
|
|
22
|
+
socialctl/inventory_cli.py,sha256=fiwHLRcCtYW6VYBIrcxLpsJVZD1e98zhfqTD_4bsNLA,9458
|
|
23
|
+
socialctl/inventory_sources.py,sha256=17OsoPxc5kRfHuZJuj1hAwbsC-jfFUt4IfC2HBR-Pgw,5177
|
|
24
|
+
socialctl/media.py,sha256=qERziLP5N1vgrnXrsKkQf9iCUUeF2ERDS1SUntUdNOU,11397
|
|
25
|
+
socialctl/media_cli.py,sha256=Y8XWyPxs9F8OG9PnoLIIEOL6vItH9s-kUcGgVcwTphA,9242
|
|
26
|
+
socialctl/media_ingress.py,sha256=S9xfOo-b0Jga_0kzuZSBSP7xWh1FzrmmFGAOpEwj-QU,11409
|
|
27
|
+
socialctl/media_preflight.py,sha256=iHwI6cS1fEC5TxidEPc4OLwb4WX284d2itPNYhxEWrk,7328
|
|
28
|
+
socialctl/media_registry.py,sha256=TBLA4DBdPGppa3wqI-Ykoyp15JkBo60jkS6nMVG-qPA,12872
|
|
29
|
+
socialctl/media_requirements.py,sha256=LX0ze-d_N2C2f60_-RJc_fn8R-Gz5p1OY_cDuRTd_VY,3672
|
|
30
|
+
socialctl/migration_cli.py,sha256=N8EIUuvvCnO9NI-eeplsSvQIK3mMscjoQqXpl7qWAZQ,3019
|
|
31
|
+
socialctl/migration_files.py,sha256=ohpaIZF0RjLAI2Rj5AQwZcRRbKH8hEYBy8ncatZ-R3s,2776
|
|
32
|
+
socialctl/models.py,sha256=xkT06nUZtGd7m8WgZZLgNEq-h7ghyr_pH9eHA8KWt4I,5405
|
|
33
|
+
socialctl/operation_output.py,sha256=6j4_zFuanr97Ym9RshJydjaZ9oPdk2zlP9uaRdxStbs,4192
|
|
34
|
+
socialctl/postfile.py,sha256=RSNQKKEHH8OE7eosd9nkRUsT2o9Q7A3oAL55Gw9A8uE,8946
|
|
35
|
+
socialctl/preflight.py,sha256=Sa2dEcNvb_L-8Gd5M0FMJM8eH7tctewtppKKzKsAfz0,3294
|
|
36
|
+
socialctl/publication_policy.py,sha256=NgZ3xJwh1oCpO8Pq-IWZDDM53QLnRKSIwwj3ZtekQEQ,1666
|
|
37
|
+
socialctl/publication_status.py,sha256=9uAubMLqjhBHvY6UC8C_6GZVjjvmLtjSv0ZQUNPnVTc,3223
|
|
38
|
+
socialctl/publication_steps.py,sha256=lgzxiX6wqcpnqe2lasGtvk_PgyzEGTM7nWR5DgJYBXw,20189
|
|
39
|
+
socialctl/publish_output.py,sha256=-etcw5NhQ5v003SJ9x4iVslNItvxcZjLx05AfDe0Qa0,4406
|
|
40
|
+
socialctl/publisher.py,sha256=IacW5xVvnVhCLSQvhVp-EXLRv4DNXsM-BYlf29zZI9A,19481
|
|
41
|
+
socialctl/queue_migration.py,sha256=LfxhCmIWlpvcEs1OCjh-ch4bUU5KaEodMT8mEVFTCxg,17295
|
|
42
|
+
socialctl/read_budget.py,sha256=vEmAFPw0YVQiMWO_Pir-n0Ml1nwMUHwR7eCmqzZ_AEU,8980
|
|
43
|
+
socialctl/read_reports.py,sha256=5G_ISxwy1PeMfanDuWX3_VpE9E8yRa1QR1UJi0LCZwI,3832
|
|
44
|
+
socialctl/rutas.py,sha256=BFMEwYFcYtjCgrdBEjnjtjzbfd2M24UbxMkLoDWVs4Y,3176
|
|
45
|
+
socialctl/schedule_remote.py,sha256=mDMJt6OVjktzbqdg3zZHcuMOGzty6b5_YgOKZurPrgU,11872
|
|
46
|
+
socialctl/schedule_sqlite.py,sha256=eNH6crxROqKpFEMBYHgmzoH-wJTsimtV5IFTPglfJno,1732
|
|
47
|
+
socialctl/scheduler.py,sha256=SkIRSHGlz5Zna893OhD7SNqr7j16MhWnxsdXSC1yHYE,24357
|
|
48
|
+
socialctl/scheduler_launchd.py,sha256=j83yWSOn6-ayxICPD0ZFXcvMWzUaMXbAbS5VUxxyI_M,14729
|
|
49
|
+
socialctl/scheduler_systemd.py,sha256=LENCFf1ONdgxS3g_8bmPbap1nz6A1cqNUmvoc8uUKx8,8104
|
|
50
|
+
socialctl/source_links.py,sha256=uLYTZHUV1LLG9E-mzaR9ZcGY_MYuGHiA9hegyvUAR-Q,5150
|
|
51
|
+
socialctl/upload_consent.py,sha256=o5yvAHIW1aFrxh4_5DyfmzGIi7xGzxCvyhCeBPsk4iI,625
|
|
52
|
+
socialctl/workspace.py,sha256=9UHAudzn5L7ph5xDIvKMmFV9Tfqgp2AC7uqSyhFZOBY,282
|
|
53
|
+
socialctl/youtube_data.py,sha256=Mwj4GtupQ7QMwVQH17gY57rxyaoAKoXjfvC_9K0CNo8,25904
|
|
54
|
+
socialctl/youtube_data_service.py,sha256=0LFwEP3wwL-0dFeFmGtRkZrdYbH_aZYwwYzkvYTfXJg,12515
|
|
55
|
+
socialctl/adapters/__init__.py,sha256=alhYdPAuSS3mjoWJkUvcPPiJ-j_wthyWiT2jFOmKyso,259
|
|
56
|
+
socialctl/adapters/base.py,sha256=yIaNIElmmhVSaqryNe1IEtkmNVGk0ubKV1ZaUhbfPko,2440
|
|
57
|
+
socialctl/adapters/errores.py,sha256=zwMDFMSpm1HTEe3BYrWoFgnQKyZK0BXcfob9m2wfbII,2281
|
|
58
|
+
socialctl/adapters/facebook.py,sha256=1XT_6j2Tdj3_poXkHk7TW3hzdc5IlE0TPqsI1UrAQuU,7617
|
|
59
|
+
socialctl/adapters/instagram.py,sha256=QASMlAhcRg8y8Ief1CiJKgPOWt6-0MuwqzBbZiYlsr8,20807
|
|
60
|
+
socialctl/adapters/tiktok.py,sha256=A65fWWsOIm5BocSbR6GoizYmARQkTfC7kjfaKqGSGWs,22473
|
|
61
|
+
socialctl/adapters/youtube.py,sha256=rOvYUvFmEYjgFt82KU03LMRwIqZHc0snAQcuTaleUTI,14232
|
|
62
|
+
socialctl/connection_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
+
socialctl/connection_service/__main__.py,sha256=7lRogxeJPacEv-nroh9ZdXAjH2IiJgY1Jhe_ZMOp2tc,1196
|
|
64
|
+
socialctl/connection_service/app.py,sha256=flGGsMs-0c71a7i-9v1dQvif-D7iYaIogUgWDcLy66o,29517
|
|
65
|
+
socialctl/connection_service/landing.py,sha256=U_u3CETMb1FxHLhV6g_zp-KAkV-6lBtE8MR5zDs_HY4,9165
|
|
66
|
+
socialctl/connection_service/legacy.py,sha256=7RfnXZ-8QV9F7K3zhNIJnu8qdfHbKe93-GzMps7u4KU,2932
|
|
67
|
+
socialctl/connection_service/peer.py,sha256=j58hz1rkIgctAvwpIfzPGKEIla0koqeCh19Td9kDf-4,484
|
|
68
|
+
socialctl/connection_service/providers.py,sha256=vZlMdD7yl0CcD766gK2nISICiq30UUuM89DkrgXCuXw,18621
|
|
69
|
+
socialctl/connection_service/settings.py,sha256=SeZ8GWka5kJ0u5NUNXBfjwdDZ9wRQ_5Br12ZzUHaIm8,4068
|
|
70
|
+
socialctl/connection_service/store.py,sha256=xnaWOp_6CfVItuw3GrIV80vHjptOEvN6Fnbnp7JyBYc,7804
|
|
71
|
+
socialctl/connection_service/assets/PLATFORM-LOGOS-LICENSE.txt,sha256=qTln01sbo6pxnSHj1JaDJc4Rp0fim4tZrsuFT5p1u_A,7424
|
|
72
|
+
socialctl/connection_service/assets/connection.css,sha256=QIfJppSpAGofSeD-eWxpFi7lO7P8A9j-hH4EP3VPSog,8723
|
|
73
|
+
socialctl/connection_service/assets/facebook.webp,sha256=BOOKYfnLN0C085IMpaMYSAJ2YwVv4Hcg1-dg5GQQtwo,27072
|
|
74
|
+
socialctl/connection_service/assets/instagram.svg,sha256=aaf9ceB3ERS1s4DkE0EloGbjXambRP5WBO4ML8eejp4,13615
|
|
75
|
+
socialctl/connection_service/assets/socialcli-logo.png,sha256=ShFXrB9hES6MvNdMNDCuYHQmT6BsP_323nKJmq4cblY,847748
|
|
76
|
+
socialctl/connection_service/assets/tiktok.png,sha256=B9yfoewhvRdduETG1WjAN0iWGsTpImgYsPZ3PBoeCYQ,11997
|
|
77
|
+
socialctl/connection_service/assets/youtube.svg,sha256=f1FWRIucG2UVbjTkRD8O_4uF9a-ng_yKjQn0k4D-1CQ,474
|
|
78
|
+
socialctl/connections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
79
|
+
socialctl/connections/account_cli.py,sha256=Nr7DaM7FuxUVkvh3FavarbSFLU7ooMDDxyPujSUTz1A,27606
|
|
80
|
+
socialctl/connections/cli.py,sha256=EsQ9iHriZREMbFk7NIuV3xA20kpAvzB44vepDvEElf8,22719
|
|
81
|
+
socialctl/connections/client.py,sha256=EXUSsN5hBsXSv9ZT70EUe3lnH7mlTVSdbKXzmkMxRz8,6216
|
|
82
|
+
socialctl/connections/credential_cli.py,sha256=NL9oEzYefHEobwgkmiRQ_3bPH-QahTyN_b_A4fDXSIk,12688
|
|
83
|
+
socialctl/connections/credential_store.py,sha256=vyEPLgDMnmd8joDwj1kKvzzF-kMy-BYoxSrKn0X2M-8,1939
|
|
84
|
+
socialctl/connections/file_store.py,sha256=sKhunqb0boJRSoXTqZcnmRVAdgVRpxGDeoukDZDTrhI,7838
|
|
85
|
+
socialctl/connections/keychain.py,sha256=jHZw4oRqd4GWit0kqe2zxLMpPmKwdg-dZiAMDWsyJZ0,2709
|
|
86
|
+
socialctl/connections/meta_user.py,sha256=tNx5OIScdsCgdgBt0pWHlqXVxalHfFH716lUaYpEC3A,5184
|
|
87
|
+
socialctl/connections/rotation_cli.py,sha256=AEYAQCwsGRIf5jWpkQm8GY_Y4nNHa0CqMChNeqDayNo,8470
|
|
88
|
+
socialctl/connections/saas_client.py,sha256=JXJILjmTdq_1yTeTqWFA4orohdJ5sJtjiNM9pK89PCk,7234
|
|
89
|
+
socialctl/connections/temporary_media.py,sha256=BnVkZL0ClgTVP516xYvmgvtGalkqbet0OMe9913AiQE,3144
|
|
90
|
+
socialctl/management/__init__.py,sha256=t04iFkzm438qvqCPfHueAiF1fak4eKJMY93ejC3p6p0,55
|
|
91
|
+
socialctl/management/batch_cli.py,sha256=fVDgKOv-AbW88FQM3X_ESJzx_7JzUlNCkBo6Hp6K8lo,6001
|
|
92
|
+
socialctl/management/batches.py,sha256=EUVlU8jbRU2akUu4fc_xVTw8MAZEVO-Qvo1thTvy_fE,14027
|
|
93
|
+
socialctl/management/changes.py,sha256=yrIL6qI3Rf9kpaVjravwDDd1NhTOxs3KoeK2j8akX08,17526
|
|
94
|
+
socialctl/management/cli.py,sha256=zFFeVm0ifVqbz9ztPhVRYEjmQNch58qVtDL_wr6rTm8,7933
|
|
95
|
+
socialctl/management/comments_cli.py,sha256=ihKZl9ssGTR8XI6BdWvsX56QvYuR1kl_N62fdGyWtC0,20001
|
|
96
|
+
socialctl/management/community_batch_cli.py,sha256=9xAWIzKxK7ovabP1ngLqOn5ZU6BJuSFTqoyYnN8Ec6o,3732
|
|
97
|
+
socialctl/management/community_batches.py,sha256=3ZaqXxD4W78NfK0MvGddSXuRtwgDBRFyBFNs4_QAww4,16169
|
|
98
|
+
socialctl/management/community_changes.py,sha256=he4BqaHGnY0mW8XU6aCYB5kg47DKa8pkGA4hoR3fmUg,20600
|
|
99
|
+
socialctl/management/community_cli.py,sha256=no9awxKiCIKxHAhzSYMYDszCRbPgX4Ak0tZCWt9a840,10169
|
|
100
|
+
socialctl/management/community_schema.py,sha256=CWzv443pnGZCE4jd8DumsH1cAEPumpTx1xTYPxEXOrc,5092
|
|
101
|
+
socialctl/management/facebook_groups.py,sha256=6QLkAHsWwHF7OwKhFMGKDwtDeVgPv2pgigt050cPvC4,45511
|
|
102
|
+
socialctl/management/groups_cli.py,sha256=21p5ZfnScYik5yxidJDF44BMVzCRiQ0ZlnykMfz0Fzk,11445
|
|
103
|
+
socialctl/management/inbox_readers.py,sha256=8DTUlivtAiLRnO5-yHDjngX4wDWHbOfNROAK6SLl348,3760
|
|
104
|
+
socialctl/management/meta_changes.py,sha256=mMX4sBDg6seFnD-865KiODWs8xXeXxI7f9klp6-aYJY,8818
|
|
105
|
+
socialctl/management/meta_cli.py,sha256=qG_y2prECoyzlo2-RAj3n89tRbX4UKBjij12acgrtrY,14019
|
|
106
|
+
socialctl/management/meta_client.py,sha256=giynNCMmePUC9IaU34nW4Fh0pxMQLSiID9ISJQnQVjM,39380
|
|
107
|
+
socialctl/management/meta_comment_inbox.py,sha256=KD9J3pX-J6-9c_GSc4kMXWHNLabNcoCMJS8CkBm1vLk,28390
|
|
108
|
+
socialctl/management/meta_comments.py,sha256=ilBmnMj5x6FpYw_jPBAVgpyWCvEerSTcI6ueM3YaUqY,30298
|
|
109
|
+
socialctl/management/meta_errors.py,sha256=jOrYOBaeYm2ZwwgwR8HPdiH9BhoZn5MxX0eLHfKPgfk,2695
|
|
110
|
+
socialctl/management/meta_pagination.py,sha256=uCNLokJjzjvCwiudZ0Rqu5gXNSNozRSgkqDtCN_KF28,2252
|
|
111
|
+
socialctl/management/meta_schema.py,sha256=x_mdfMQTcXbay21iWlU9XVrG1jIWoSfzXdMDCEbwkbM,4693
|
|
112
|
+
socialctl/management/meta_webhooks.py,sha256=Xt0jqA6lqG28h8VFq6lsZHI7Gmpr8hO6qzDYDdUikwc,8093
|
|
113
|
+
socialctl/management/metadata_parts.py,sha256=KI-AXjE1ansOi3XCTwH4vYwseFOJoBi_fvGsqq8Dcrg,7775
|
|
114
|
+
socialctl/management/owned_assets.py,sha256=8vgMEIrTV_T2FiVTAZU_wQQnJOlUUHCWfLIX2iTEzhw,4004
|
|
115
|
+
socialctl/management/owned_changes.py,sha256=hZbnmpj96s0gZd71MlCIBRO1Aiy30D6RtT_R97A7Nt4,25772
|
|
116
|
+
socialctl/management/owned_cli.py,sha256=39I45aeav-qgFA-6tYG5Zd4BnUWP1WSRyIqZPU1Vomw,6691
|
|
117
|
+
socialctl/management/owned_reorder.py,sha256=zk59W3TJZ1HcgsMeOwj85DzB7Ry1kPjif5sN_lw646w,3623
|
|
118
|
+
socialctl/management/owned_schema.py,sha256=EX9i66XrMMRpRIYmlu0errC3HUB82spDBXEiXw0mmco,19952
|
|
119
|
+
socialctl/management/reply_context.py,sha256=wWLUvtLqdtaT03J0fhescPlToLtxSk5HXofigNmbAIg,1509
|
|
120
|
+
socialctl/management/reply_evidence.py,sha256=gscXyZj9SbWhUn7OW40rFgLTwuHu-jgj-TB0M7JQiUQ,4320
|
|
121
|
+
socialctl/management/resource_changes.py,sha256=nseklqxxZ0cuaFckcgG3CavdwXPdIho-_rEGZAhwDrA,20964
|
|
122
|
+
socialctl/management/resource_cli.py,sha256=hINDGj4Zi0GAWzqKtzyqqrEx7xAf8tk1-N8kqntaow8,7127
|
|
123
|
+
socialctl/management/snippet_readback.py,sha256=WO84_L7TyqJtD4okdAyF8ki5pwa7FqTFn-fOcVh9WM4,1246
|
|
124
|
+
socialctl/management/stories.py,sha256=CBne8BcGlGoUYH2-i9eLPC3Yxf7Mlh4gtUlMeKwKQIE,29554
|
|
125
|
+
socialctl/management/stories_cli.py,sha256=TgEvjoAyGauR2bX27vumbdEyWD5ryXyfDTRJWuH0fAE,7104
|
|
126
|
+
socialctl/management/youtube.py,sha256=Eas89K5o76s-8JMJo7f9K_yl5EBY0KjxAThAHffXxnM,13108
|
|
127
|
+
socialctl/management/youtube_community.py,sha256=wZIrHz8aP5QA4viZMU9EVrsAvqv888HOFzDV0j-2PuY,19517
|
|
128
|
+
socialctl/management/youtube_metadata.py,sha256=zYIlgtC6s-NuhyDzwaA-3GdhNyU7sytW48FUJWn_Kx0,6513
|
|
129
|
+
socialctl/management/youtube_owned.py,sha256=_BeteA8L6C7V9YBo656HR0Mri5ZvbzDSPrrjCDPFMLw,15751
|
|
130
|
+
socialctl/management/youtube_resources.py,sha256=FW-dVF2LGCq0ivfbLH4AmoFBviBGdkEds5LI9l6A9KA,15656
|
|
131
|
+
socialctl/metricas/__init__.py,sha256=cpYEcSTf66Rnre_I6pn8pGZFN3gUmX9SSQ6NKsOalcI,285
|
|
132
|
+
socialctl/metricas/almacen.py,sha256=ppIYnb1N7fu5pwKhhinGUWub2VB5R7MrZuQ4q6-9SkE,4948
|
|
133
|
+
socialctl/metricas/analytics_changes.py,sha256=F3lBUSAjgQl9v6yQkNAfLEisn8b6y2FhAS8YQx3mIbU,14825
|
|
134
|
+
socialctl/metricas/analytics_cli.py,sha256=jIOz3l9X8DXy-xoC51NOT_KxTa7YfGxOwHke5g4JFcY,11031
|
|
135
|
+
socialctl/metricas/analytics_client.py,sha256=BPijijFWmOmyaj5xiIpCWPk-AvRHERQFjfieNxaT7CA,18909
|
|
136
|
+
socialctl/metricas/analytics_ingest.py,sha256=zNbM9DEeNnfoapCTj1cypXEfQ48Kz0unr26dfARa9Hc,15438
|
|
137
|
+
socialctl/metricas/analytics_schema.py,sha256=gKUJ2fXqGYcm0dqs_KWATlAGOK6X8VZ74qGH1r6clZY,11690
|
|
138
|
+
socialctl/metricas/base.py,sha256=v5Y2c0FJqkaN-yQiHwqgOmpdHuBERzfIIZmii3jMPLQ,6912
|
|
139
|
+
socialctl/metricas/facebook.py,sha256=fRkQ3bVyo8Xv85upsi9lvmSP69M8oyFAhtbsic7WwHA,18527
|
|
140
|
+
socialctl/metricas/insights.py,sha256=v2KwGytyDZzXR3uFAJSfFnEBIcaJBAs7K8nrV3P6sIk,12503
|
|
141
|
+
socialctl/metricas/instagram.py,sha256=drsyavF3NYhhDJ5bl_AAhQKKpQygv31qFTifegyd3u4,5683
|
|
142
|
+
socialctl/metricas/modelos.py,sha256=wEo0X_N7JmcD510xKjaM3quVi41dYGJyNXQ-NYXMlZQ,2714
|
|
143
|
+
socialctl/metricas/piezas.py,sha256=Ng52s-CTQUTdf1nWcRR84LVbuuWZxKoPyvKSbgEKumI,5924
|
|
144
|
+
socialctl/metricas/reach.py,sha256=mPyDHJdj-6xXf3tLDEGIc9P4aEPUjQyMEsasF2sk8o8,4181
|
|
145
|
+
socialctl/metricas/reporting_client.py,sha256=4xfrTyrl4gOBVyIrL3zpUVUI600Bbvswy2dKbCmX2Jc,5998
|
|
146
|
+
socialctl/metricas/resumen.py,sha256=UTwT9VGVzaTS3WWEsKGH_HJ7mVWiUfsxk0zhu7O_2qE,11112
|
|
147
|
+
socialctl/metricas/slugs.py,sha256=FluUgAs4Y2n_IwiLS1xch575Pc99F8vjDBbVgYt3LQc,3459
|
|
148
|
+
socialctl/metricas/tiktok.py,sha256=z2iEkzW1owaF6twpcNcthSlqgOyusDE5X28jIlsdL34,8141
|
|
149
|
+
socialctl/metricas/youtube.py,sha256=PrHudr_VMskf5XFSfVqmTeBurY3_7ip4UlDiHhFg2Uw,17630
|
|
150
|
+
socialctl/native_schedule/__init__.py,sha256=NF-U_AIOP6YCmsQqJD-pjCijdRqi65j_eFywNi9EylI,387
|
|
151
|
+
socialctl/native_schedule/api_delivery.py,sha256=CoJHpVEDW6jJs31avBl82_iQ7YTWCFet0OIaBGfjqiY,492
|
|
152
|
+
socialctl/native_schedule/api_reconcile.py,sha256=FwSPSL31LLGyP9ZrtuP3Iz6qs2iXhhUHZGEqpqsfEy4,1862
|
|
153
|
+
socialctl/native_schedule/approval.py,sha256=tZB9_afKEUSkP4np0oTP7WCQeE6aYAUD7ytGG87Al_U,8179
|
|
154
|
+
socialctl/native_schedule/cadence.py,sha256=iWRsyPX7Njoku7Tkd1-Xi0P_DtzkgxW01kbB8iW7nlA,3024
|
|
155
|
+
socialctl/native_schedule/cli.py,sha256=Kitq5Eyu_yXf7ieS1YLiGgsC333CPdPjbIM6pjUO_Yw,30614
|
|
156
|
+
socialctl/native_schedule/dispatcher.py,sha256=fOUCy9Edkk41jx7VRNn5s9R2QYxnuJWGe9EMaPy2vjs,6862
|
|
157
|
+
socialctl/native_schedule/facebook.py,sha256=F8pj0aeUVgo1Nu3HdeXAnDPQKkfZ7eBE45OVaue1QSM,5037
|
|
158
|
+
socialctl/native_schedule/facebook_reels.py,sha256=t2GIH_rehfNVGp2nwcGyCLUljpWTai3TQtAvWM58ZG0,6827
|
|
159
|
+
socialctl/native_schedule/first_comment.py,sha256=FGwCnuUkirqx0WFaF3AvH7k6HL9VGqkh7bZl88uWMVM,9818
|
|
160
|
+
socialctl/native_schedule/handoff.py,sha256=BaqT4gn9ItikDkJctgd_t2NkNxuDa0MY_d3J6KfPkG8,9207
|
|
161
|
+
socialctl/native_schedule/instagram_delivery.py,sha256=cq73jAcrMDQug4hEYl7I_YK7u47ssUT7X1V1R9yYy9s,10648
|
|
162
|
+
socialctl/native_schedule/instagram_runtime.py,sha256=dgGJyzIrKFQjD0tKucx3b-265n24nuKEqIBCBHfBP7c,4141
|
|
163
|
+
socialctl/native_schedule/inventory.py,sha256=nxIwhOX1KcXnfpZ0vCEwiIW8RLpanYg60SwNPFpC8C0,3765
|
|
164
|
+
socialctl/native_schedule/migration.py,sha256=5Wea4pWq_gp9Ybnu2d00cyiotuyCi1_OZes2ia2T6xI,17247
|
|
165
|
+
socialctl/native_schedule/models.py,sha256=EBlrDJtfazoBeWsLlX0toYOkcEQ1ueYUgF29YBAA_w4,3759
|
|
166
|
+
socialctl/native_schedule/reconcile.py,sha256=LcSEayCfL5AvCPGTGksGLsnF1FVVh3UYQQeS7nVOrF8,4158
|
|
167
|
+
socialctl/native_schedule/remote_data.py,sha256=CTLfLulufRN-xfLWmaKObwCVj6pGFT281zCRWo3H5xs,11245
|
|
168
|
+
socialctl/native_schedule/report.py,sha256=prEbasLdLRxZ-DkNoHoDTMN6NoL3XnnYpHHD2GzTzKA,6945
|
|
169
|
+
socialctl/native_schedule/store.py,sha256=Ag6c9JulrnCgnFP3kBS8hX1s5wPXGUnFO2o4mDLVcDI,34016
|
|
170
|
+
socialctl/native_schedule/verification.py,sha256=sPNpRqr5yYgfnWw9EUL-eT5AQtXMS5r4m00cu7_R8Uc,1517
|
|
171
|
+
socialctl/native_schedule/youtube.py,sha256=49R69xWvbQ2uhlcxTPD2txHnqVxkICZNYWKk4LtnGd4,17634
|
|
172
|
+
socialctl/plantillas/accounts.yml,sha256=Oi5qZBY-BtFJNM4GbT_zRuRlLWf1VcH33BDoclUX53Y,1362
|
|
173
|
+
socialctl/plantillas/brand.md,sha256=v8asOxL9RIC9l2AvJOKeSVL7Pncugx5hBfFI9IoOpQo,3298
|
|
174
|
+
socialctl/plantillas/estrategia.md,sha256=crm69Lq8gOjbMgbW9IYD8vxBG16XVdkJSeWVL_fYqGY,2195
|
|
175
|
+
socialctl/saas/__init__.py,sha256=BWyJVYgra20jZGzjbv08u6p9zFpR-SF8HSu1DB0nQoU,82
|
|
176
|
+
socialctl/saas/access.py,sha256=DtiWaeemSzCrimoaIsPysczeDGstjA7GgjACtXJXpdE,3673
|
|
177
|
+
socialctl/saas/auth.py,sha256=aPvwP5zKrZrp6RFRkTMLPOKoCwz0skKsg0uXuYFGeHg,10771
|
|
178
|
+
socialctl/saas/backup.py,sha256=2dXt4xs8DzfpCGzz_tjecPfRKONo0cI_bu9KmaENdew,6420
|
|
179
|
+
socialctl/saas/billing.py,sha256=EQK2rePnawJENCS1iW_s4XpreD2Y2k3Qkr0NRXTblQM,20172
|
|
180
|
+
socialctl/saas/billing_enrollment.py,sha256=yxUvMQS_q-aCAv9Yn6EfCVs9tblPUmEeVAu620HVkr8,66814
|
|
181
|
+
socialctl/saas/billing_enrollment_schema.py,sha256=0_FT1h38iavzXIDh4DW0hEBIYZ71fd3AmXBTjZG1T_g,15458
|
|
182
|
+
socialctl/saas/billing_inventory.py,sha256=GJ8P6khOhjWh-9vjLHjuHXKVh2DZl_lprGrC7NGfV30,39775
|
|
183
|
+
socialctl/saas/billing_reconcile.py,sha256=ieyhuJrHkJ9hoEmkeQUBM0hD-1OoVNlHeTVAdj67Cgs,8054
|
|
184
|
+
socialctl/saas/billing_routes.py,sha256=n8fWUz_lsZlvq9JJjDHW5BL_uWWiD72bF5rdi0Svo7A,1199
|
|
185
|
+
socialctl/saas/budget.py,sha256=w8B-0Tm5VowhTdmB58omRhbBPKrs2s8c4w5-tMFIhG4,1887
|
|
186
|
+
socialctl/saas/connections.py,sha256=0CM09BBwvnBCQSJsOundJzYB7ZET-HCyBG5QCYSJjuo,25711
|
|
187
|
+
socialctl/saas/consent.py,sha256=hkwbHyqsXDyQI8pdPIMBkg9v8jGn3ezJTWTUntDGu2M,2581
|
|
188
|
+
socialctl/saas/lifecycle.py,sha256=hGKIeM8iaWPb0XCNg6pNKkfLNgCzG0TVc0AFVYnOHuc,25799
|
|
189
|
+
socialctl/saas/mail.py,sha256=qpONTBD263B7iK_JbowyrpAZnVQioEV1Rw99IAnWZMA,3465
|
|
190
|
+
socialctl/saas/maintenance.py,sha256=tiLPsrA_svQPI_gGbAyPk9S9zYO3yfEULgMa75axHsM,3547
|
|
191
|
+
socialctl/saas/meta_user.py,sha256=JnbflRaPnlxlEe3NE0wM61e1WlZoM8WONzm9flpJY3Q,17992
|
|
192
|
+
socialctl/saas/meta_webhooks.py,sha256=iJByhQF44lCs1tStkCmzNwLEPDWxEU_cDMGzf79EdHI,21709
|
|
193
|
+
socialctl/saas/migration.py,sha256=cuF64WbXaIFfrtj8P2dXQNW1XZ_RGJs1PBZwQO8ysUc,7674
|
|
194
|
+
socialctl/saas/models.py,sha256=hyVA-3gTS6s1bUONjW65Io24AoZlKSLt84m8vPwrnjQ,171
|
|
195
|
+
socialctl/saas/operations.py,sha256=x3pIScVhS2MyM9s-Zx4x1bfHmighk1lxSKX3MVzrwRI,5680
|
|
196
|
+
socialctl/saas/pages.py,sha256=q5P3TFuESZpb1fHh7rSSunC9O0Y3YwbbheAw1f16blI,10052
|
|
197
|
+
socialctl/saas/pairing.py,sha256=eA0mPWq-Xw174XTggYdeE3zcqKy1Xeludmf4pQCAKFI,9321
|
|
198
|
+
socialctl/saas/permissions.py,sha256=T7URr-Mu-zyyKbNyx-PV-BlYCDaGmRFnv5ZoToT-myw,2910
|
|
199
|
+
socialctl/saas/reminders.py,sha256=tiJ82R87Jd8-o1JzDaBjzqIs2AneIFpOui2NNZHC22w,7919
|
|
200
|
+
socialctl/saas/renewal.py,sha256=T6O8UCoI_2NGoapyFT9tbZM4v7XQbZ0eh6RxFrU7N1Y,3823
|
|
201
|
+
socialctl/saas/restore_guard.py,sha256=nf0qhKVklY1OqnFioUzDR4e4iTEe0f5VhIfs8Us_RJc,14395
|
|
202
|
+
socialctl/saas/revocation.py,sha256=JbNNFgDbXEiF4Xq_VFrwpeLsAe1MrD-4pOOgR1m8_wk,5498
|
|
203
|
+
socialctl/saas/rotation.py,sha256=CWsVXYo8u70HgipqwD8WBlqHGPyhH123fqTsacF5Pbo,7631
|
|
204
|
+
socialctl/saas/routes.py,sha256=dJN2rjNUdYnNvUOtzrs5aeZ1nSo1XaXSagho4Eh1pXo,12477
|
|
205
|
+
socialctl/saas/settings.py,sha256=xfjgjn2ugFTh_5Gu8u8j7uuOTpb8LdUJmQ9OO6Gs13c,1558
|
|
206
|
+
socialctl/saas/store.py,sha256=JzLc3cSvkMsh6j8bdGBLf_MLWjGAg0-0wNyOC009xn4,9126
|
|
207
|
+
socialctl/saas/temporary_media.py,sha256=V7XFLSlceNiUkKkaWglvfG91p30D15eplEDmaAguXVE,12851
|
|
208
|
+
socialctl/saas/webhooks.py,sha256=P7TK4jmz67fFZhNHEyVozZqgkEk2gQi8i0VyuwJXVnc,4442
|
|
209
|
+
socialctl/ui/__init__.py,sha256=LjSx2Msio0qF4fna7yYdXqlVJly4PzFoolJcPoxxhyk,89
|
|
210
|
+
socialctl/ui/assets/agent-manual.md,sha256=mG_NhiuWrmZS0DxIPAPdvwdW2lRzbF7bKP--2N54Qbs,53108
|
|
211
|
+
socialctl/ui/assets/agents.md,sha256=8hVflKSVHufG7krFaapHge8QTXDQa_UighsA3JWnhrU,1955
|
|
212
|
+
socialctl/ui/assets/components.css,sha256=pI9mI4hlm-e-dclRoZac8JVlEam1iIJ6AhO0KSIw_ZM,1854
|
|
213
|
+
socialctl/ui/assets/connection-layout.css,sha256=SxkRkagEy7Bo2uj-eAri946iapIQqbD5hqvq-I2BDZc,6480
|
|
214
|
+
socialctl/ui/assets/otp.template.html,sha256=g0JXM6gtfciL9BmwDORVHjLYq65OMjXyCPQGq2L9cFY,1248
|
|
215
|
+
socialctl/ui/assets/tokens.css,sha256=Pzna4WThULiIsbeFL2ISpRZKavzwesj9FwoXGk20Bf4,315
|
|
216
|
+
socialctl/ui/assets/trial.template.html,sha256=f8fYQLkw-4YukGTwIgeKbETknhj2KyUb9pfPKU1YyOQ,1572
|
|
217
|
+
socialctl/ui/assets/web-layout.css,sha256=oe5ZarZ_ql989sF29-5Bn4189IvHI5Oxwt89KjkPO04,6007
|
|
218
|
+
socialctl/ui/email/otp.html,sha256=tEzv7traUe2qcMH98HNJyCtF8lLIUyqGQ1ybDqLL2s0,1194
|
|
219
|
+
socialctl/ui/email/trial.html,sha256=auzr8MAOwsM5-wmSzL3TV1o4WXZhbTy63j73A3yKd10,1508
|
|
220
|
+
socialcli-0.3.0.dist-info/METADATA,sha256=OKKYGPm5FoYYRUfzTpoAmqpjHOUh2S5gWsBVAwfVsV0,9572
|
|
221
|
+
socialcli-0.3.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
222
|
+
socialcli-0.3.0.dist-info/entry_points.txt,sha256=fch-ed2Pcudr_MshRQ3CAo40v7F-xbu18UQxmdhjugU,78
|
|
223
|
+
socialcli-0.3.0.dist-info/licenses/LICENSE,sha256=USd1tS37hSkMGbxwJJZvncsZ-NZBbe1rUbtwSZvLnVg,1074
|
|
224
|
+
socialcli-0.3.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Engels Florentino
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
socialctl/__init__.py
ADDED
|
File without changes
|
socialctl/__main__.py
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'Common interface for platform adapters.'
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
from socialctl.brands import Brand
|
|
10
|
+
from socialctl.formatter import validar_privacidad, validar_texto
|
|
11
|
+
from socialctl.media import validar_media
|
|
12
|
+
from socialctl.models import Platform, PlatformPost, PostResult, ValidationError
|
|
13
|
+
|
|
14
|
+
_SIN_VALOR = object()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _sigue_siendo_abstracta(cls: type) -> bool:
|
|
18
|
+
'Return whether cls still has an unimplemented abstract method.'
|
|
19
|
+
for nombre in dir(cls):
|
|
20
|
+
try:
|
|
21
|
+
miembro = getattr(cls, nombre)
|
|
22
|
+
except AttributeError:
|
|
23
|
+
continue
|
|
24
|
+
if getattr(miembro, "__isabstractmethod__", False):
|
|
25
|
+
return True
|
|
26
|
+
return False
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Adapter(ABC):
|
|
30
|
+
'Common validation and publication interface for every supported platform.'
|
|
31
|
+
|
|
32
|
+
platform: Platform
|
|
33
|
+
|
|
34
|
+
def __init_subclass__(cls, **kwargs: object) -> None:
|
|
35
|
+
'Require every concrete adapter to declare a valid Platform value.'
|
|
36
|
+
super().__init_subclass__(**kwargs)
|
|
37
|
+
|
|
38
|
+
if _sigue_siendo_abstracta(cls):
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
valor = getattr(cls, "platform", _SIN_VALOR)
|
|
42
|
+
|
|
43
|
+
if valor is _SIN_VALOR:
|
|
44
|
+
raise TypeError(
|
|
45
|
+
f"{cls.__name__} does not declare 'platform': every concrete "
|
|
46
|
+
'Adapter must assign a Platform value. The type annotation '
|
|
47
|
+
'inherited from Adapter is insufficient; assign a value '
|
|
48
|
+
"(for example, 'platform = Platform.TIKTOK')."
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if not isinstance(valor, Platform):
|
|
52
|
+
raise TypeError(
|
|
53
|
+
f"{cls.__name__} declares 'platform = {valor!r}', which is not a "
|
|
54
|
+
'Platform member. Use a Platform value '
|
|
55
|
+
'(for example, Platform.TIKTOK).'
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def validate(self, post: PlatformPost, brand: Brand) -> list[ValidationError]:
|
|
59
|
+
'Validate platform content limits without network access.'
|
|
60
|
+
return validar_texto(post) + validar_media(post) + validar_privacidad(post)
|
|
61
|
+
|
|
62
|
+
@abstractmethod
|
|
63
|
+
def publish(self, post: PlatformPost, brand: Brand, client: httpx.Client) -> PostResult:
|
|
64
|
+
'Publish the post only after validate() returns no errors.'
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
ADAPTADORES: dict[Platform, type[Adapter]] = {}
|
|
68
|
+
'Registry of adapter classes keyed by Platform. Consumers instantiate ADAPTADORES[platform]() without arguments; concrete adapters must not require constructor parameters.'
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'Extract actionable provider error text while redacting known credentials.\n\nPrefer the provider error.message field when it is a nonempty string. Otherwise\nretain a bounded response-body excerpt. Redact literal and URL-encoded known\nsecrets of at least eight characters, including proxy responses that reflect\nrequest URLs or bodies. This keeps diagnostics useful without disclosing tokens.'
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import urllib.parse
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
|
|
9
|
+
# Recorte razonable para no volcar cuerpos de respuesta gigantes (p. ej. una
|
|
10
|
+
# página de error HTML de un proxy intermedio) en un mensaje de error.
|
|
11
|
+
_LONGITUD_MAXIMA_CUERPO_ERROR = 500
|
|
12
|
+
|
|
13
|
+
_MARCA_REDACCION = '[TOKEN REDACTED]'
|
|
14
|
+
|
|
15
|
+
# Ver docstring del módulo: evita que un "secreto" de relleno (típicamente
|
|
16
|
+
# muy corto en los tests que no versan sobre seguridad, p. ej. la cadena
|
|
17
|
+
# "t") acabe redactando subcadenas normales de un mensaje legítimo. Ningún
|
|
18
|
+
# token real de las cuatro redes que publica este proyecto es tan corto.
|
|
19
|
+
_LONGITUD_MINIMA_SECRETO_REDACTABLE = 8
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _redactar_secretos(texto: str, secretos: tuple[str, ...]) -> str:
|
|
23
|
+
'Redact literal and URL-encoded occurrences of each sufficiently long secret.'
|
|
24
|
+
for secreto in secretos:
|
|
25
|
+
if not secreto or len(secreto) < _LONGITUD_MINIMA_SECRETO_REDACTABLE:
|
|
26
|
+
continue
|
|
27
|
+
texto = texto.replace(secreto, _MARCA_REDACCION)
|
|
28
|
+
codificado = urllib.parse.quote(secreto, safe="")
|
|
29
|
+
if codificado != secreto:
|
|
30
|
+
texto = texto.replace(codificado, _MARCA_REDACCION)
|
|
31
|
+
return texto
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def mensaje_de_error(respuesta: httpx.Response, *secretos: str) -> str:
|
|
35
|
+
'Return bounded provider error text with known credentials redacted.'
|
|
36
|
+
try:
|
|
37
|
+
mensaje = respuesta.json()["error"]["message"]
|
|
38
|
+
if isinstance(mensaje, str) and mensaje:
|
|
39
|
+
return _redactar_secretos(mensaje, secretos)
|
|
40
|
+
except Exception:
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
cuerpo = respuesta.text.strip()
|
|
45
|
+
except Exception:
|
|
46
|
+
cuerpo = ""
|
|
47
|
+
|
|
48
|
+
cuerpo = _redactar_secretos(cuerpo, secretos)
|
|
49
|
+
|
|
50
|
+
if not cuerpo:
|
|
51
|
+
return f"HTTP {respuesta.status_code}"
|
|
52
|
+
|
|
53
|
+
if len(cuerpo) > _LONGITUD_MAXIMA_CUERPO_ERROR:
|
|
54
|
+
cuerpo = cuerpo[:_LONGITUD_MAXIMA_CUERPO_ERROR] + "…"
|
|
55
|
+
|
|
56
|
+
return f"HTTP {respuesta.status_code}: {cuerpo}"
|