Metadata-Version: 2.4
Name: socialift
Version: 1.1.0
Summary: Instagram, Facebook va LinkedIn uchun asinxron Python SDK — OAuth, kontent, Direct chat, Lead Ads va webhook'lar
Author: Fayoz Turaqulov
License: Socialift — tijorat litsenziyasi
        Copyright (c) 2026 Fayoz Turaqulov. Barcha huquqlar himoyalangan.
        
        1. RUXSAT
           Amaldagi obuna kaliti (`SOCIALIFT_LICENSE_KEY`) egasiga quyidagilar
           ruxsat etiladi:
           a) dasturiy ta'minotni o'z mahsuloti yoki ichki tizimlarida ishlatish;
           b) obuna rejasida ko'rsatilgan seat (muhit) sonidan oshmasdan o'rnatish;
           c) o'z ehtiyoji uchun kodni o'rganish va lokal o'zgartirish kiritish.
        
        2. TAQIQLAR
           Quyidagilar yozma ruxsatsiz taqiqlanadi:
           a) dasturiy ta'minotni yoki uning hosilasini qayta tarqatish, sotish,
              ijaraga berish, sublitsenziyalash;
           b) litsenziya tekshiruvini chetlab o'tish, o'chirish yoki buzish;
           c) obuna kalitini uchinchi shaxsga berish yoki oshkor qilish;
           d) dasturiy ta'minot asosida raqobatdosh mahsulot yaratish.
        
        3. OBUNA
           Ruxsat obuna amal qilgan davrda kuchda. Obuna tugagach yoki bekor
           qilingach 1-banddagi ruxsatlar to'xtaydi.
        
        4. KAFOLATLAR YO'QLIGI
           Dasturiy ta'minot "BOR HOLICHA" taqdim etiladi, hech qanday oshkora
           yoki nazarda tutilgan kafolatsiz. Mualliflar hech qanday zarar uchun
           javobgar emas.
        
        5. UCHINCHI TOMON XIZMATLARI
           Meta (Facebook, Instagram) va LinkedIn API'laridan foydalanish ularning
           o'z shartlariga bo'ysunadi. Ushbu litsenziya ularni qamrab olmaydi.
        
        Savollar: hello@socialift.uz
        
Project-URL: Homepage, https://github.com/1fayoz/socialift
Project-URL: Documentation, https://github.com/1fayoz/socialift/tree/main/docs
Project-URL: Repository, https://github.com/1fayoz/socialift
Project-URL: Issues, https://github.com/1fayoz/socialift/issues
Keywords: instagram,facebook,linkedin,meta,graph-api,lead-ads,webhook,crm,async,sdk
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: AsyncIO
Classifier: Intended Audience :: Developers
Classifier: License :: Other/Proprietary License
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: aiohttp>=3.9
Requires-Dist: cryptography>=42
Provides-Extra: server
Requires-Dist: aiofiles; extra == "server"
Requires-Dist: aiosmtplib; extra == "server"
Requires-Dist: alembic>=1.13; extra == "server"
Requires-Dist: argon2-cffi; extra == "server"
Requires-Dist: asyncpg; extra == "server"
Requires-Dist: bleach; extra == "server"
Requires-Dist: boto3; extra == "server"
Requires-Dist: certifi; extra == "server"
Requires-Dist: cryptography; extra == "server"
Requires-Dist: fastapi[standard]>=0.115; extra == "server"
Requires-Dist: fastapi-filter[sqlalchemy]; extra == "server"
Requires-Dist: fastapi-pagination; extra == "server"
Requires-Dist: gunicorn; extra == "server"
Requires-Dist: pydantic>=2; extra == "server"
Requires-Dist: pydantic-settings>=2; extra == "server"
Requires-Dist: pyjwt; extra == "server"
Requires-Dist: python-dotenv; extra == "server"
Requires-Dist: redis; extra == "server"
Requires-Dist: sqlalchemy[asyncio]>=2; extra == "server"
Requires-Dist: telethon>=1.36; extra == "server"
Requires-Dist: werkzeug; extra == "server"
Provides-Extra: crypto
Requires-Dist: cryptography; extra == "crypto"
Dynamic: license-file

# Socialift

**Instagram, Facebook va LinkedIn uchun asinxron Python SDK** — OAuth,
kontent, Direct chat, Lead Ads va webhook'lar. Bitta kutubxona, uchta
platforma, bitta xato modeli.

[![PyPI](https://img.shields.io/pypi/v/socialift)](https://pypi.org/project/socialift/)
[![Python](https://img.shields.io/pypi/pyversions/socialift)](https://pypi.org/project/socialift/)
[![License](https://img.shields.io/badge/license-Commercial-blue)](LICENSE)

```bash
pip install socialift
```

```python
import asyncio
from socialift import Facebook

async def main():
    async with Facebook(app_id="...", app_secret="...", config_id="...") as fb:
        token = await fb.exchange_code(code, redirect_uri="https://siz.uz/cb")

        for page in await fb.pages(token.access_token):
            print(page.name, "→ instagram:", page.instagram_username)

asyncio.run(main())
```

---

## Nega Socialift

Meta va LinkedIn API'lari bilan ishlash — hujjatlarda yozilmagan o'nlab
tafsilotni bilishni talab qiladi. Socialift ularni sizdan yashiradi:

| Muammo | Socialift'da |
|---|---|
| Business tipidagi app `scope` emas, `config_id` ishlatadi | `login_url(config_id=...)` — avtomatik |
| Instagram'ning ikki oqimi turli host va token talab qiladi | `Instagram(...)` va `Instagram.via_facebook(...)` |
| Page webhook obunasi app sozlamasidan alohida | `subscribe_page()` |
| Lead webhook'da lead mazmuni kelmaydi | `fb.lead(leadgen_id, token)` |
| Forma savollari o'zbekcha/ruscha nomlanadi | `normalize()` — kanonik kalitlar |
| Rate limit, 5xx, tarmoq uzilishi | avtomatik backoff + jitter |
| Har provayder xatoni o'zicha qaytaradi | bitta `ApiError` ierarxiyasi |
| LinkedIn `/rest/*` versiya sarlavhasini talab qiladi | avtomatik |
| Chat'da suhbatdosh haqida faqat `id` keladi | to'liq profil, parallel + keshli |

---

## Imkoniyatlar

| | Facebook | Instagram | LinkedIn |
|---|:---:|:---:|:---:|
| OAuth (login, token, yangilash, bekor qilish) | ✅ | ✅ | ✅ |
| Profil | ✅ | ✅ | ✅ |
| Page'lar va page token'lari | ✅ | — | — |
| Postlar (o'qish / e'lon / o'chirish) | ✅ | ✅ | ✅ |
| Izohlar (javob, yashirish, o'chirish) | ✅ | ✅ | — |
| Statistika va demografika | ✅ | ✅ | — |
| Direct chat + to'liq suhbatdosh profili | — | ✅ | — |
| Lead Ads (formalar, lead'lar, targeting) | ✅ | ✅ | — |
| Webhook (imzo, hodisalar, dedupe) | ✅ | ✅ | — |

---

## Litsenziya va narxlar

Socialift — **tijorat mahsuloti**. Ishlatish uchun amaldagi obuna kaliti
kerak:

```bash
export SOCIALIFT_LICENSE_KEY="slk_..."
```

```python
# yoki kodda
from socialift import Facebook
fb = Facebook(app_id="...", app_secret="...", license_key="slk_...")
```

| Reja | Imkoniyatlar | Seat |
|---|---|---|
| **Trial** (14 kun, bepul) | Profil, postlar, izohlar, webhook | 1 |
| **Starter** | + kontent e'lon qilish | 1 |
| **Pro** | + Instagram Direct, statistika va demografika | 3 |
| **Enterprise** | + Lead Ads, CRM quvuri, prioritet qo'llab-quvvatlash | cheksiz |

Kalit olish: **https://socialift.uz/pricing**

Rejaga kirmagan imkoniyatni chaqirsangiz so'rov **Meta'ga yuborilishidan
oldin** to'xtatiladi:

```python
from socialift import FeatureNotInPlan

try:
    await fb.leads(form_id, page_token)
except FeatureNotInPlan as exc:
    print(exc)   # `lead_ads` imkoniyati `starter` rejasiga kirmaydi...
```

<details>
<summary><b>Litsenziya qanday ishlaydi (texnik tafsilot)</b></summary>

Kalit — Ed25519 bilan imzolangan JSON. Ikki bosqichda tekshiriladi:

1. **Offline** — imzo paketga joylangan ochiq kalit bilan tekshiriladi.
   Kalit mazmunini (reja, muddat, seat) o'zgartirish imzoni buzadi.
2. **Online** — SDK har 12 soatda `api.socialift.uz/api/v1/license/activate`
   ga murojaat qilib qisqa muddatli lease oladi. Bu obunani bekor qilish va
   seat nazoratini ta'minlaydi.

Litsenziya serveri javob bermasa **7 kunlik offline grace** ishlaydi —
tarmoq uzilishi prod'ingizni to'xtatmaydi.

Havosiz muhit (CI, izolyatsiyalangan tarmoq) uchun:

```bash
export SOCIALIFT_LICENSE_OFFLINE=1   # faqat imzo tekshiriladi
```

**Ochiq aytamiz:** Python paketi manba kodi sifatida tarqaladi, shuning
uchun bu DRM emas — huquqiy va tashkiliy himoya vositasi. Litsenziya
shartlari [LICENSE](LICENSE) faylida.

</details>

---

## Misollar

### Instagram Direct — to'liq suhbatdosh profili

`/me/conversations` javobida ishtirokchi haqida atigi `id` va `username`
keladi. SDK har bir suhbatdosh uchun User Profile API'ga **parallel** so'rov
yuboradi (`asyncio.gather`, 8 tadan) va natijani 6 soatga keshlaydi:

```python
from socialift import Instagram

ig = Instagram.via_facebook(app_secret=FB_APP_SECRET)
chats = await ig.conversations(page_token, page_id="1111", ig_user_id="2222")

for chat in chats["data"]:
    c = chat["contact"]
    print(c["name"], c["follower_count"], "bizni kuzatadi:", c["is_user_follow_business"])
```

### Lead Ads — webhook'dan CRM'gacha

```python
from socialift import Facebook, verify_request, parse_events

# 1. Imzoni tekshirish (XOM baytlar!)
if not verify_request(APP_SECRET, raw_body, request.headers):
    return 403

# 2. Hodisalarni ajratish
for event in parse_events(payload):
    if event.field != "leadgen":
        continue
    if await already_processed(event.key):     # takroriy yetkazish
        continue

    # 3. Meta lead MAZMUNINI yubormaydi — Graph API'dan o'qiymiz
    async with Facebook(app_id=APP_ID, app_secret=APP_SECRET) as fb:
        lead = await fb.lead(event.leadgen_id, page_token)

    print(lead.fields)          # {'full_name': ..., 'phone': '+998901234567'}
    print(lead.campaign_name)   # qaysi reklamadan kelgan
```

### Xatolarni ishlash

```python
from socialift import AuthError, PermissionError, RateLimitError

try:
    await ig.send_message(recipient_id, token, "Salom!")
except RateLimitError as exc:
    await asyncio.sleep(exc.retry_after or 60)
except PermissionError:
    ...   # 24 soatlik javob oynasi tugagan
except AuthError:
    ...   # token bekor qilingan → qayta login
```

---

## To'liq server

Tayyor backend kerak bo'lsa — webhook qabul qilish, PostgreSQL'ga yozish,
lead'larni CRM'ga imzolangan webhook bilan uzatish, Django admin:

```bash
pip install "socialift[server]"

socialift init      # .env namunasi + kalitlar generatsiyasi
socialift check     # sozlamalar to'g'rimi
socialift migrate   # alembic upgrade head
socialift serve     # http://localhost:8000/docs
```

62 endpoint · PostgreSQL + Redis talab qilinadi ·
[docs/BACKEND_SETUP.md](docs/BACKEND_SETUP.md)

---

## Hujjatlar

| Hujjat | Kimga |
|---|---|
| [docs/SDK.md](docs/SDK.md) | SDK API ma'lumotnomasi |
| [SECURITY.md](SECURITY.md) | Xavfsizlik modeli, token saqlash, zaiflik xabari |
| [docs/BACKEND_SETUP.md](docs/BACKEND_SETUP.md) | Meta / LinkedIn / CRM sozlash |
| [docs/FRONTEND.md](docs/FRONTEND.md) | Server API'si frontend uchun |
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Arxitektura va qatlamlar |
| [docs/DEPLOYMENT.md](docs/DEPLOYMENT.md) | Server, nginx, CI/CD |
| [docs/PACKAGING.md](docs/PACKAGING.md) | Paket qanday yig'iladi, kod himoyasi, reliz |

---

## Xavfsizlik — qisqacha

- **Token'lar SDK'da saqlanmaydi.** Har chaqiruvga argument sifatida
  uzatiladi — bitta klient bilan ko'p foydalanuvchi nomidan parallel
  ishlash xavfsiz.
- **`appsecret_proof`** har Graph so'rovga avtomatik qo'shiladi: o'g'irlangan
  token boshqa muhitdan ishlamaydi.
- **Page token `repr()` da ko'rinmaydi** — log'ga tasodifan tushmaydi.
- **Webhook imzosi** `hmac.compare_digest` bilan — timing attack'dan himoya.
- **Server:** rate limiting, `TrustedHostMiddleware`, xavfsizlik sarlavhalari,
  prod'da yopiq `/docs`, bazadagi token'lar Fernet bilan shifrlangan.

Batafsil va zaiflik xabar berish: [SECURITY.md](SECURITY.md).

---

## Paket qanday tarqatiladi

`socialift` **kompilyatsiyalangan wheel** sifatida chiqadi: SDK modullari
Cython bilan mashina kodiga (`.so` / `.pyd`) aylantirilgan, `.py` manbasi
paketda yo'q. IDE avtoto'ldirish va `mypy` uchun `.pyi` tip stublari
qo'shilgan, ya'ni ishlab chiqish tajribasi o'zgarmaydi.

Graph API maydon to'plamlari va lead moslashtirish jadvali paketda emas —
ular litsenziya bilan birga serverdan **imzolangan holda** keladi va
uzluksiz yangilanib turadi (SDK'ni yangilash shart emas). Paket bo'lmasa
SDK minimal baseline bilan ishlashda davom etadi — qulflanib qolmaydi.

**Mijozingizning lead ma'lumoti bizning serverga hech qachon ketmaydi.**
Normalizatsiya sizning mashinangizda bajariladi; bizdan faqat qoidalar
keladi.

Qo'llab-quvvatlanadigan muhitlar: CPython 3.11–3.14 · Linux
(x86_64/aarch64, glibc va musl) · macOS (arm64/x86_64) · Windows AMD64.

Batafsil: [docs/PACKAGING.md](docs/PACKAGING.md).

---

## Platformalarning real cheklovlari

Bularni SDK yashira olmaydi:

- **Instagram xabar matni** faqat oxirgi 20 kun uchun keladi.
- **Javob oynasi** — mijozning oxirgi xabaridan 24 soat.
- **Suhbatdosh profili** faqat u biznesga yozgan bo'lsa ochiladi.
- **Demografika** obunachilar 100 tadan kam bo'lsa berilmaydi.
- **Development rejimidagi Meta app** haqiqiy foydalanuvchilardan webhook
  olmaydi — App Review kerak.
- **Page webhook obunasi** app sozlamasidan alohida: `subscribe_page()`.

---

## Talablar

Python 3.11+ · `aiohttp` · `cryptography`

## Qo'llab-quvvatlash

- Hujjatlar: https://github.com/1fayoz/socialift/tree/main/docs
- Savol va xatolar: https://github.com/1fayoz/socialift/issues
- Tijorat: hello@socialift.uz

## Litsenziya

Tijorat litsenziyasi — [LICENSE](LICENSE). Obuna:
https://socialift.uz/pricing
