پیکربندی
پیکربندی چطور کار میکند؟
نقش config.py، متغیرهای محیطی و تنظیمات ذخیرهشده در MongoDB، ترتیب اولویت آنها، تغییراتی که ریاستارت میخواهند و فایلهای خصوصی.
WZML-X تنظیماتش را از سه جا میگیرد: فایل config.py، متغیرهای محیطی، و تنظیماتی که در MongoDB ذخیره شدهاند (همانهایی که با /bsetting از داخل تلگرام تغییر میدهید). این صفحه توضیح میدهد هر کدام چه نقشی دارد و وقتی یک مقدار در چند جا تعریف شده، کدام برنده میشود.
شرح تکتک متغیرهای پیکربندی در مرجع متغیرها و منوهای /bsetting در تنظیمات ربات آمده است.
فایل config.py
config.py را از روی نمونهٔ config_sample.py میسازید:
cp config_sample.py config.py
این یک فایل پایتون است، پس قواعد پایتون را رعایت کنید: رشتهها داخل کوتیشن، عددها بدون کوتیشن، مقادیر بولی به شکل True و False، و فهرست و دیکشنری با [] و {}:
BOT_TOKEN = "1234567890:AA..."
OWNER_ID = 123456789
STATUS_LIMIT = 10
AS_DOCUMENT = False
SEARCH_PLUGINS = ["https://..."]
LEECH_DUMP_CHATS = {"A": -1001234567890}
متغیرهای ضروری
| متغیر | توضیح |
|---|---|
BOT_TOKEN | توکن ربات از @BotFather |
OWNER_ID | شناسهٔ عددی تلگرام مالک ربات |
TELEGRAM_API | شناسهٔ API از my.telegram.org |
TELEGRAM_HASH | هش API از my.telegram.org |
DATABASE_URL | آدرس اتصال MongoDB |
کد ربات چهار متغیر اول را بررسی میکند و اگر یکی خالی باشد، با خطای BOT_TOKEN variable is missing! (یا نام متغیر مربوط) متوقف میشود. DATABASE_URL را README.md ضروری میداند؛ ربات بدون آن هم بالا میآید، اما هیچ تغییری از /bsetting ذخیره نمیشود (در لاگ: update_config skipped: DB not connected) و قابلیتهایی مثل /broadcast، اطلاع از کارهای ناتمام بعد از ریاستارت و ذخیرهٔ فایلهای خصوصی کار نمیکنند.
تبدیلهای خودکار
هنگام بارگذاری، ربات چند مقدار را خودش اصلاح میکند:
DEFAULT_UPLOAD: هر مقداری جزgdبهrcتبدیل میشود.BASE_URL،RCLONE_SERVE_URL،INDEX_URLوSEARCH_API_LINK:/در ابتدا و انتهای آنها حذف میشود.USENET_SERVERS: اگر اولین سرورhostنداشته باشد، کل فهرست نادیده گرفته میشود.LEECH_DUMP_CHATمنسوخ شده است؛ اگر هنوز آن را دارید، ربات هشدار میدهد و مقدارش را بهLEECH_LOG_CHATمنتقل میکند (اگرLEECH_LOG_CHATخالی باشد).
متغیرهای محیطی
هر متغیری که در مرجع متغیرها هست، با همان نام بهعنوان متغیر محیطی هم پذیرفته میشود و بعد از خواندن config.py، روی آن اعمال میشود. چون متغیر محیطی همیشه متن است، ربات آن را بر اساس نوع مقدار پیشفرض تبدیل میکند:
| نوع پیشفرض | چطور خوانده میشود |
|---|---|
| بولی | true، 1 یا yes (بدون توجه به حروف بزرگ و کوچک) یعنی روشن؛ هر چیز دیگری یعنی خاموش. |
| عدد صحیح | با int() تبدیل میشود؛ اگر نشد، پیشفرض میماند. |
| فهرست | یک فهرست پایتون مثل ["a", "b"]، یا مقادیر جداشده با ویرگول مثل a,b. |
| دیکشنری | یک دیکشنری پایتون مثل {"A": -100123}؛ اگر قابل خواندن نباشد، پیشفرض میماند. |
update.py (که قبل از ربات اجرا میشود) فقط این هشت متغیر را از محیط میخواند: BOT_TOKEN، TELEGRAM_API، TELEGRAM_HASH، OWNER_ID، DATABASE_URL، BASE_URL، UPSTREAM_REPO و UPSTREAM_BRANCH. همین هشت متغیر در ادغام با پایگاه داده (بخش بعد) هم مثل مقادیر config.py حساب میشوند.
تنظیمات ذخیرهشده در MongoDB
وقتی DATABASE_URL تنظیم شده باشد، ربات اینها را در پایگاه دادهٔ wzmlx نگه میدارد، جدا برای هر ربات (بر اساس شناسهٔ ربات):
- همهٔ متغیرهای پیکربندی (هر بار که ربات شروع میشود و هر بار که از
/bsettingچیزی را تغییر میدهید) - نسخهای از
config.pyآخرین شروع، تا ربات بفهمد شما چه چیزی را در آن تغییر دادهاید - فایلهای خصوصی
- تنظیمات Aria2، qBittorrent و SABnzbd
- تنظیمات کاربران، RSS، کارهای ناتمام، لینکهای پخش و وضعیت پلاگینها
تغییری که از /bsetting ← Config Variables بدهید، همان لحظه در پایگاه داده ذخیره میشود و بیشتر آنها بدون ریاستارت اعمال میشوند.
کدام مقدار برنده میشود؟
هنگام شروع، ربات مقادیر را به این ترتیب روی هم میگذارد؛ هر لایه، لایههای قبلی را بازنویسی میکند:
- پیشفرضهای کد (کلاس
Configدرbot/core/config_manager.py) config.py- متغیرهای محیطی
- تنظیمات ذخیرهشده در MongoDB، با یک استثنا: هر کلیدی که مقدارش در
config.py(یا آن هشت متغیر محیطی) نسبت به شروع قبلی تغییر کرده باشد، مقدار جدیدconfig.pyبرنده میشود و در پایگاه داده هم ذخیره میشود.
در اولین استقرار، که هنوز چیزی در پایگاه داده نیست، مقادیر config.py جاهای خالی را پر میکنند.
در عمل یعنی:
- اگر مقداری را از
/bsettingتغییر دهید، بعد از ریاستارت هم همان میماند، حتی اگر درconfig.pyچیز دیگری نوشته شده باشد. - اگر بعداً همان کلید را در
config.pyعوض کنید، در شروع بعدی مقدارconfig.pyجایگزین میشود. - متغیرهای محیطی غیر از آن هشت مورد ممکن است بعد از اولین اجرا با مقدار ذخیرهشده در پایگاه داده بازنویسی شوند. برای تغییر ماندگار، از
config.pyیا/bsettingاستفاده کنید. - دکمهٔ
Resetدر/bsettingمقدار را به پیشفرض کد برمیگرداند، نه به مقدارconfig.py. این دکمه برای متغیرهای حساس (BOT_TOKEN،OWNER_ID،TELEGRAM_API،TELEGRAM_HASHوDATABASE_URL) نمایش داده نمیشود. - اگر
BOT_TOKENرا به توکن یک ربات دیگر عوض کنید، چون دادهها بر اساس شناسهٔ ربات جدا میشوند، تنظیمات ذخیرهشدهٔ ربات قبلی بارگذاری نمیشود.
کدام تغییرها ریاستارت لازم دارند؟
وقتی یکی از این متغیرها را از /bsetting ویرایش میکنید، ربات یادداشت Restart required for this edit to take effect! را نشان میدهد:
| متغیر | چرا |
|---|---|
BOT_TOKEN، TELEGRAM_API، TELEGRAM_HASH | اتصال ربات به تلگرام فقط هنگام شروع ساخته میشود. |
OWNER_ID | مالک ربات |
DATABASE_URL | اتصال پایگاه داده |
USER_SESSION_STRING | حساب کاربری تلگرام فقط هنگام شروع وصل میشود. |
STREAM_TOKENS | رباتهای پخش فقط هنگام شروع وصل میشوند. |
TG_PROXY | پروکسی اتصال به تلگرام |
AUTHORIZED_CHATS | چتها و کاربرهای مجاز |
CMD_SUFFIX | پسوند نام دستورها |
چند مورد دیگر که پیامهای خود ربات به آن اشاره میکنند:
HELPER_TOKENS: رباتهای کمکی فقط هنگام شروع وصل میشوند؛ پیام دستور/streamهم میگوید بعد از افزودنSTREAM_TOKENSیاHELPER_TOKENSریاستارت کنید.- روشن کردن دوبارهٔ SABnzbd: خاموش کردن
NZBدرModule Settingsهمان لحظه SABnzbd را متوقف میکند، اما روشن کردن دوبارهاش ریاستارت میخواهد (در لاگ:SABnzbd requires restart to re-enable). .netrc: طبق متن بخشPrivate Files، تغییر.netrcتا ریاستارت روی Aria2 اثر نمیکند.
برخی تغییرها همان لحظه اعمال میشوند، مثلاً: QUEUE_ALL، QUEUE_DOWNLOAD و QUEUE_UPLOAD (صف فوراً بررسی میشود)، RSS_DELAY، SEARCH_PLUGINS و SEARCH_API_LINK، متغیرهای RCLONE_SERVE_* (سرویس rclone serve دوباره اجرا میشود)، JD_EMAIL و JD_PASS (JDownloader دوباره بوت میشود)، STATUS_UPDATE_INTERVAL و TORRENT_TIMEOUT. روشن و خاموش کردن JDownloader، پخش، RSS و پلاگینها در Module Settings هم بدون ریاستارت انجام میشود.
فایلهای خصوصی
بعضی تنظیمات فایل هستند، نه متغیر. این فایلها کنار config.py (در پوشهٔ اصلی ربات) قرار میگیرند و میتوانید از /bsetting ← Private Files آنها را مدیریت کنید:
| فایل | کاربرد |
|---|---|
config.py | پیکربندی اصلی. بارگذاری آن از این منو، پیکربندی را دوباره میخواند. |
token.pickle | توکن OAuth گوگل درایو برای حساب مالک. |
rclone.conf | پیکربندی Rclone با ریموتهای شما. با بارگذاری آن، rclone serve هم دوباره اجرا میشود. |
accounts.zip | فایلهای JSON سرویساکانتها در پوشهٔ accounts/ داخل zip. پس از بارگذاری استخراج میشود و USE_SERVICE_ACCOUNTS خودکار روشن میشود؛ با حذف آن خاموش میشود. |
list_drives.txt | فهرست درایوها برای جستوجو با /list؛ هر خط: NAME DRIVE_ID INDEX_URL (لینک ایندکس اختیاری است). |
categories.txt | دستههای مقصد آپلود گوگل درایو؛ هر خط: نام، شناسهٔ درایو و در صورت تمایل لینک ایندکس. |
shortener.txt | سرویسهای کوتاهکنندهٔ لینک؛ هر خط دو بخش دارد: دامنهٔ سرویس و کلید API. |
cookies.txt | کوکیهای پیشفرض yt-dlp (کاربرها میتوانند کوکی خودشان را در /usetting بگذارند). |
terabox.txt | کوکیهای TeraBox در قالب Netscape. |
.netrc | نام کاربری و رمز سایتها برای Aria2 و yt-dlp. |
نحوهٔ کار با این منو:
Add/Delete File: فایل را بفرستید تا ذخیره شود؛ نام فایل را بهصورت متن بفرستید (مثلاًrclone.conf) تا حذف شود.config.pyبا این روش حذف نمیشود.Create New File: یک پیام متنی بفرستید که خط اول آن نام فایل و بقیهاش محتوای فایل باشد.
فایلهایی که اینجا بارگذاری میکنید در MongoDB هم ذخیره میشوند و در هر شروع دوباره روی دیسک نوشته میشوند؛ پس با ساختن دوبارهٔ کانتینر از بین نمیروند. اگر UPSTREAM_REPO شامل @github.com باشد (مخزن خصوصی با توکن)، ربات بعد از بارگذاری میپرسد Push to UPSTREAM_REPO ?.
ساختن token.pickle، سرویساکانتها و list_drives.txt در اسکریپتهای کمکی توضیح داده شده است.