پرش به محتویات

Session (نشست)

Session‌ها بخش مهمی از کتابخانه هستند که اطلاعات احراز هویت و کش entity را ذخیره می‌کنند.


Session چیست؟

اولین پارامتری که به سازنده SoroushClient پاس می‌دهید session است و به طور پیش‌فرض نام session (یا مسیر کامل) است. یعنی اگر SoroushClient('anon') ایجاد کنید و متصل شوید، فایل anon.session در دایرکتوری جاری ایجاد می‌شود.

یادداشت

اگر رشته پاس دهید، فایلی در دایرکتوری کاری جاری خواهد بود، اگرچه می‌توانید مسیرهای مطلق نیز پاس دهید.

فایل session اطلاعات کافی برای ورود بدون ارسال مجدد کد دارد، بنابراین اگر مجبور هستید بیش از یک بار کد را وارد کنید، شاید دایرکتوری کاری را تغییر می‌دهید، فایل را تغییر نام می‌دهید یا حذف می‌کنید، یا از نام‌های تصادفی استفاده می‌کنید.


محتوای فایل Session

فایل‌های دیتابیس با استفاده از sqlite3 شامل اطلاعات لازم برای ارتباط با سرورهای سروش‌پلاس هستند، مانند:

  • آدرس IP سرور و پورت
  • کلید احراز هویت (برای رمزگذاری پیام‌ها)
  • اطلاعات entity‌های مشاهده شده
  • access_hash کاربران و کانال‌ها

کش Entity

این فایل‌ها به طور پیش‌فرض تمام input entity‌هایی که دیده‌اید را ذخیره می‌کنند تا بتوانید فقط با شناسه آنها، اطلاعات کاربر یا کانال را دریافت کنید. سروش‌پلاس access_hash مورد نیاز برای بازیابی اطلاعات بیشتر را ارسال نخواهد کرد اگر فکر کند قبلاً آنها را دیده‌اید. به همین دلیل کتابخانه نیاز دارد این اطلاعات را به صورت آفلاین ذخیره کند.

غیرفعال کردن ذخیره‌سازی Entity

اگر قصد کار با رویدادها را ندارید، یا نیازی به کش access_hash مرتبط با شناسه Entity‌ها ندارید، می‌توانید این کار را با تنظیم client.session.save_entities = False غیرفعال کنید.


انواع Session Storage

اگر نمی‌خواهید از ذخیره‌سازی Session پیش‌فرض SQLite استفاده کنید، می‌توانید از یکی از پیاده‌سازی‌های دیگر یا پیاده‌سازی خود استفاده کنید.

یادداشت

اگرچه اغلب اینطور نیست، ممکن است SQLite به اندازه کافی کند باشد که قابل توجه باشد، در این صورت می‌توانید از ذخیره‌سازی دیگری استفاده کنید. توجه داشته باشید که این نادر است و بیشتر افراد این مشکل را نخواهند داشت.

پیاده‌سازی‌های موجود

SPlusthon سه پیاده‌سازی از کلاس انتزاعی Session دارد:

from splusthon.sessions import MemorySession, SQLiteSession, StringSession
  1. MemorySession: اطلاعات session را در حافظه ذخیره می‌کند.
  2. SQLiteSession: اطلاعات session را در پایگاه‌داده SQLite روی دیسک ذخیره می‌کند. پیش‌فرض.
  3. StringSession: اطلاعات session را در حافظه ذخیره می‌کند، اما می‌تواند به صورت رشته ذخیره شود.

استفاده از StringSession

from splusthon.sync import SoroushClient
from splusthon.sessions import StringSession

with SoroushClient(StringSession(string), api_id, api_hash) as client:
    ...  # استفاده از کلاینت

    # ذخیره session به صورت رشته
    string = client.session.save()

# همچنین می‌توانید هر نوع session دیگری را به صورت رشته ذخیره کنید
client = SoroushClient('sqlite-session', api_id, api_hash)
string = StringSession.save(client.session)

ایجاد Storage سفارشی

ساده‌ترین راه برای ایجاد پیاده‌سازی storage سفارشی خود، استفاده از MemorySession به عنوان پایه و بررسی نحوه کار SQLiteSession یا یکی از پیاده‌سازی‌های انجمن است.

فایل‌های پایتون مربوطه را می‌توانید در دایرکتوری sessions/ در مخزن SPlusthon پیدا کنید.

پس از ایجاد پیاده‌سازی خود، می‌توانید آن را به لیست پیاده‌سازی‌های session نگهداری شده توسط انجمن اضافه کنید.


String Sessions

StringSession راهی راحت برای تعبیه credentialهای ورود مستقیماً در کد شما برای قابلیت حمل بسیار آسان است، زیرا فقط به یک رشته نیاز دارند تا بتوانند بدون درخواست شماره تلفن و کد وارد شوند (یا شروع سریع‌تر اگر از bot token استفاده می‌کنید).

تولید String Session

ساده‌ترین راه برای تولید StringSession به شرح زیر است:

from splusthon.sync import SoroushClient
from splusthon.sessions import StringSession

with SoroushClient(StringSession(), api_id, api_hash) as client:
    print(client.session.save())

این کار را به عنوان راهی برای خروجی گرفتن کلید احراز هویت خود (آنچه برای ورود به حساب شما لازم است) در نظر بگیرید. این یک رشته در خروجی استاندارد (احتمالاً ترمینال شما) چاپ می‌کند.

هشدار

این رشته را ایمن نگه دارید! هر کسی با این رشته می‌تواند از آن برای ورود به حساب شما و هر کاری که می‌خواهد استفاده کند.

این مشابه نشت فایل‌های *.session آنلاین است، اما نشت یک رشته آسان‌تر از نشت یک فایل است.

استفاده از String Session

پس از دریافت رشته (که کمی طولانی است)، آن را به نوعی در اسکریپت خود بارگذاری کنید. می‌توانید از یک فایل متنی معمولی و open(...).read() استفاده کنید یا آن را مستقیماً در یک متغیر ذخیره کنید:

string = '1aaNk8EX-YRfwoRsebUkugFvht6DUPi_Q25UOCzOAqzc...'
with SoroushClient(StringSession(string), api_id, api_hash) as client:
    client.loop.run_until_complete(client.send_message('me', 'سلام'))

این رشته‌ها واقعاً برای استفاده در مکان‌هایی مانند Heroku راحت هستند زیرا سیستم‌فایل موقت آنها فایل‌های خارجی را پس از پایان برنامه حذف می‌کند.


نکات مهم

  1. ایمنی Session: فایل‌های session حساس هستند و نباید به صورت آنلاین به اشتراک گذاشته شوند.
  2. تغییر نام فایل: اگر فایل session را تغییر نام دهید یا جابجا کنید، ممکن است مجبور شوید دوباره وارد شوید.
  3. پشتیبان: همیشه از فایل‌های session خود پشتیبان بگیرید.
  4. StringSession: برای استقرار در محیط‌های ابری مانند Heroku مناسب است.

مرحله بعدی

برای یادگیری بیشتر درباره رویدادها، بخش رویدادها (Events) را مطالعه کنید.