MCPcopy Index your code
hub / github.com/ZethRise/PlayDL

github.com/ZethRise/PlayDL @v1.5.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.5.0 ↗ · + Follow
239 symbols 958 edges 33 files 5 documented · 2%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

PlayDL

PlayDL یک ربات تلگرام برای دانلود برنامه از Google Play است. کاربر لینک برنامه را می‌فرستد، ربات برنامه را دانلود می‌کند، اگر فایل‌ها split باشند آن‌ها را به یک APK قابل نصب تبدیل می‌کند و فایل نهایی را در تلگرام برای کاربر می‌فرستد.

این پروژه با Python 3.13 و aiogram 3.28.x ساخته شده

English guide: README.md

امکانات

  • استخراج package name از لینک
  • دانلود برنامه با چند backend مختلف
  • تبدیل .apks یا split APKها به یک .apk معمولی
  • ارسال APK از سه مسیر:
  • تلگرام — آپلود مستقیم (برای فایل بزرگ‌تر از ۵۰ مگابایت نیاز به Local Bot API دارد).
  • NixFile — آپلود به panel.nixfile.com با Selenium و گرفتن لینک.
  • روبیکا — ارسال به هر @username از حساب روبیکای ربات با آپلودر چند-تکه موازی و wrap داخل zip (روبیکا پسوند .apk را قبول نمی‌کند).
  • ذخیره وضعیت jobها در MongoDB

پیش‌نیازها

اگر AUTO_INSTALL_TOOLS=true باشد، PlayDL ابزارهای کمکی را موقع شروع نصب می‌کند: repo مربوط به alltechdev/gplay-apk-downloader را clone می‌کند، gplaydl را با pip نصب می‌کند، اگر Rust/Cargo نصب باشد apkeep را نصب می‌کند و آخرین APKEditor jar را دانلود می‌کند. سرویس‌ها و پکیج‌های سیستمی مثل Java، MongoDB، Telegram Bot API server، git و Rust را خودش نصب نمی‌کند.

نصب

uv venv
source .venv/bin/activate
uv pip install -r requirements.txt
cp .env.example .env
python App.main

در Windows PowerShell:

py -3.13 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env

نصب Java

Ubuntu/Debian:

sudo apt update
sudo apt install -y openjdk-17-jre-headless
java -version

اگر JDK کامل خواستی:

sudo apt install -y openjdk-17-jdk

CentOS/RHEL/Rocky:

sudo dnf install -y java-17-openjdk
java -version

دریافت APKEditor

آخرین فایل APKEditor-*.jar را از این صفحه بگیر:

https://github.com/REAndroid/APKEditor/releases

بعد داخل این مسیر بگذار:

tools/APKEditor.jar

یا مسیرش را در .env تنظیم کن:

APKEDITOR_JAR=/opt/apkeditor/APKEditor.jar

تنظیمات اصلی

فایل .env را ویرایش کن:

BOT_TOKEN=123456:CHANGE_ME

TELEGRAM_API_BASE_URL=http://127.0.0.1:8081
TELEGRAM_API_IS_LOCAL=true

MONGODB_URI=mongodb://localhost:27017
MONGODB_DB_NAME=playdl

AUTO_INSTALL_TOOLS=true
TOOLS_DIR=tools
DOWNLOAD_DIR=storage/downloads
MAX_PARALLEL_JOBS=2

تنظیم دانلودر

پیشنهاد اصلی: alltech gplay

این گزینه برای کار ما مناسب‌تر است، چون دانلود Google Play، merge، patch و signing را خودش انجام می‌دهد.

PLAY_DOWNLOADER_BACKEND=alltech-gplay
ALLTECH_GPLAY_PATH=tools/gplay-apk-downloader/gplay
ALLTECH_AUTO_AUTH=true
ALLTECH_AUTH_FILE=~/.gplay-auth.json
PLAY_ARCH=arm64
MERGE_SPLITS=true

اگر AUTO_INSTALL_TOOLS=true باشد، ربات این repo را داخل tools/gplay-apk-downloader clone می‌کند. اگر ALLTECH_AUTO_AUTH=true باشد، وقتی ~/.gplay-auth.json وجود نداشته باشد یک بار gplay auth را اجرا می‌کند.

gplaydl

gplaydl با requirements.txt نصب می‌شود. فایل‌های base و split را دانلود می‌کند و PlayDL آن‌ها را با APKEditor تبدیل می‌کند.

PLAY_DOWNLOADER_BACKEND=gplaydl
PLAY_ARCH=arm64
APKEDITOR_JAR=tools/APKEditor.jar

اگر نصب خودکار فعال باشد و دستور gplaydl پیدا نشود، ربات آن را با pip نصب می‌کند.

apkeep

اگر از apkeep استفاده می‌کنی و اکانت/توکن Google Play داری:

PLAY_DOWNLOADER_BACKEND=apkeep
APKEEP_SOURCE=google-play
APKEEP_EMAIL=you@example.com
APKEEP_TOKEN=your_aas_token

اگر نصب خودکار فعال باشد و apkeep پیدا نشود، ربات با cargo install apkeep نصبش می‌کند. برای این حالت Rust/Cargo باید از قبل نصب باشد.

دستور دلخواه

اگر دانلودر اختصاصی خودت را داری:

PLAY_DOWNLOADER_BACKEND=custom
PLAY_DOWNLOADER_CMD=apkeep -a "{package}" "{output_dir}"
APKS_TO_APK_CMD=java -jar tools/APKEditor.jar m -i "{input}" -o "{output}"

متغیرهای قابل استفاده:

  • {url}: لینک کامل Google Play
  • {package}: نام پکیج، مثل org.telegram.messenger
  • {output_dir}: پوشه دانلود همان job
  • {arch}: معماری انتخاب شده، مثل arm64

تنظیم آپلودر

NixFile

در nixfile.com اکانت بساز و NIXFILE_USERNAME و NIXFILE_PASS را در .env بگذار. ربات بار اول لاگین می‌کند و session را برای دفعات بعد ذخیره می‌کند.

روبیکا

کانال روبیکا فایل APK را از حساب روبیکای ربات برای هر @username می‌فرستد. احراز با فایل session از قبل ساخته‌شده با rubpy انجام می‌شود.

python session_rubika.py

شماره موبایل و کد OTP را وارد کن. فایل storage/playdl_rubika.rp ساخته می‌شود. اگر این فایل نباشد دکمه روبیکا فعال است ولی هنگام آپلود پیام «Rubika غیرفعال است» می‌گیری.

روبیکا روی اکانت کاربری اجازه آپلود .apk نمی‌دهد، پس ربات قبل از ارسال فایل را داخل NitoNumber-1.zip بسته‌بندی می‌کند. برای جلوگیری از timeout روی APKهای بزرگ، آپلودر sequential ۱ مگابایتی rubpy موقع startup با یک پچ جایگزین می‌شود که ۸ chunk را موازی بالا می‌فرستد — تابع _parallel_upload_file در Services/rubika.py. اگر DC روبیکا rate-limit کرد، مقدار RUBIKA_UPLOAD_CONCURRENCY همان فایل را پایین بیار.

تنظیمات .env:

RUBIKA_SESSION_NAME=playdl_rubika
RUBIKA_SESSION_DIR=storage
RUBIKA_MAX_FILE_MB=500
RUBIKA_UPLOAD_TIMEOUT=900

اجرا

python Main.py

تبدیل Split APK چطور انجام می‌شود؟

اگر دانلودر خروجی زیر را بدهد:

  • یک .apk: همان فایل ارسال می‌شود
  • یک .apks: با APKEditor به .apk تبدیل می‌شود
  • چند split APK داخل یک پوشه: پوشه با APKEditor به merged.apk تبدیل می‌شود

اگر alltech-gplay با MERGE_SPLITS=true فعال باشد، اول خودش merge را انجام می‌دهد. اگر باز هم خروجی split بود، PlayDL مرحله merge با APKEditor را اجرا می‌کند.

ساختار پروژه

App/        شروع bot و تنظیمات
Handlers/   هندلرهای class-based aiogram
DataBase/   لایه MongoDB
Services/   دانلود، تبدیل و مدیریت job
Utils/      متن‌های فارسی و کیبوردهای inline
tools/      jarها و اسکریپت‌های اختیاری
storage/    فایل‌های دانلود و runtime

مهم!

این ربات بر روی Telegram-bot-api کار میکنه و باید خودتون روی سرورتون ستاپش کنید قبل از ران کردن این ربات

Core symbols most depended-on inside this repo

main_keyboard
called by 36
Utils/keyboards.py
_safe_edit_text
called by 24
Handlers/links.py
safe
called by 17
Utils/html.py
update_job
called by 16
DataBase/mongo.py
_require_db
called by 14
DataBase/mongo.py
run_process
called by 13
Services/commands.py
delivery_keyboard
called by 11
Utils/keyboards.py
cancel_keyboard
called by 9
Utils/keyboards.py

Shape

Method 134
Function 70
Class 35

Languages

Python100%

Modules by API surface

Services/nixfile.py39 symbols
Utils/progress.py26 symbols
DataBase/mongo.py20 symbols
Services/downloader.py19 symbols
Handlers/links.py19 symbols
Services/bootstrap.py17 symbols
Services/rubika.py15 symbols
Handlers/file2link.py11 symbols
Services/sweeper.py9 symbols
Services/converter.py9 symbols
Handlers/search.py9 symbols
Services/search.py7 symbols

Datastores touched

(mongodb)Database · 1 repos

For agents

$ claude mcp add PlayDL \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact