[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80039":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":15,"starSnapshotCount":15,"syncStatus":18,"lastSyncTime":31,"discoverSource":32},80039,"PlayDL","ZethRise\u002FPlayDL","ZethRise","a google play APK File Downloader Bot for telegram in Python","",null,"Python",71,12,1,0,4,9,2,3.34,"MIT License",false,"main",true,[25,26,27],"downloader","python","telegram","2026-06-12 02:03:57","# PlayDL\n\nPlayDL is a Telegram bot that takes a Google Play link, downloads the app, merges split APKs when needed, and sends a regular installable APK back to the user.\n\nThe bot is built with Python 3.13 and aiogram 3.28.x\n\nPersian guide: [README-Fa.md](README-Fa.md)\n\n## What It Does\n\n- Extracts the package name from the link.\n- Downloads the app with one of the supported downloader backends.\n- Converts `.apks` or split APK folders into one installable `.apk`.\n- Delivers the APK through one of three channels:\n  - **Telegram** — direct upload (needs local Bot API server for files > 50 MB).\n  - **NixFile** — Selenium-driven hosted link on `panel.nixfile.com`.\n  - **Rubika** — sent to any `@username` from the bot-owned Rubika account, with a parallel-chunk uploader and zip wrap (Rubika rejects `.apk`).\n- Saves user\u002Fjob status in MongoDB.\n\n## Requirements\n\n- Python 3.13\n- MongoDB\n- Java 17+\n- Telegram Bot API local server\n- One Google Play downloader backend:\n  - Recommended: [`alltechdev\u002Fgplay-apk-downloader`](https:\u002F\u002Fgithub.com\u002Falltechdev\u002Fgplay-apk-downloader)\n  - Alternative: [`gplaydl`](https:\u002F\u002Fpypi.org\u002Fproject\u002Fgplaydl\u002F)\n  - Alternative: [`apkeep`](https:\u002F\u002Fgithub.com\u002FEFForg\u002Fapkeep)\n- [`APKEditor.jar`](https:\u002F\u002Fgithub.com\u002FREAndroid\u002FAPKEditor\u002Freleases) for merging split APKs\n\nPlayDL can install missing helper tools on startup when `AUTO_INSTALL_TOOLS=true`. It can clone `alltechdev\u002Fgplay-apk-downloader`, install `gplaydl` with pip, install `apkeep` with Cargo if Rust is present, and download the latest APKEditor jar. It does not install OS services\u002Fpackages such as Java, MongoDB, Telegram Bot API server, git, or Rust.\n\n## Install\n\n```bash\nuv venv\nsource .venv\u002Fbin\u002Factivate\nuv pip install -r requirements.txt\ncp .env.example .env\npython Main.py\n```\n\nOn Windows PowerShell:\n\n```powershell\npy -3.13 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npip install -r requirements.txt\nCopy-Item .env.example .env\n```\n\n## Install Java\n\nUbuntu\u002FDebian:\n\n```bash\nsudo apt update\nsudo apt install -y openjdk-17-jre-headless\njava -version\n```\n\nFull JDK, if you need it:\n\n```bash\nsudo apt install -y openjdk-17-jdk\n```\n\nCentOS\u002FRHEL\u002FRocky:\n\n```bash\nsudo dnf install -y java-17-openjdk\njava -version\n```\n\n## APKEditor\n\nDownload the latest `APKEditor-*.jar` from:\n\nhttps:\u002F\u002Fgithub.com\u002FREAndroid\u002FAPKEditor\u002Freleases\n\nPlace it here:\n\n```text\ntools\u002FAPKEditor.jar\n```\n\nOr point to it in `.env`:\n\n```env\nAPKEDITOR_JAR=\u002Fopt\u002Fapkeditor\u002FAPKEditor.jar\n```\n\n## Configuration\n\nEdit `.env`:\n\n```env\nBOT_TOKEN=123456:CHANGE_ME\n\nTELEGRAM_API_BASE_URL=http:\u002F\u002F127.0.0.1:8081\nTELEGRAM_API_IS_LOCAL=true\n\nMONGODB_URI=mongodb:\u002F\u002Flocalhost:27017\nMONGODB_DB_NAME=playdl\n\nAUTO_INSTALL_TOOLS=true\nTOOLS_DIR=tools\nDOWNLOAD_DIR=storage\u002Fdownloads\nMAX_PARALLEL_JOBS=2\n```\n\n## Downloader Setup\n\n### Recommended: alltech gplay\n\nThis backend is closest to what the bot needs. It downloads Google Play files and can merge\u002Fsign split APKs.\n\n```env\nPLAY_DOWNLOADER_BACKEND=alltech-gplay\nALLTECH_GPLAY_PATH=tools\u002Fgplay-apk-downloader\u002Fgplay\nALLTECH_AUTO_AUTH=true\nALLTECH_AUTH_FILE=~\u002F.gplay-auth.json\nPLAY_ARCH=arm64\nMERGE_SPLITS=true\n```\n\nWith `AUTO_INSTALL_TOOLS=true`, the bot clones this repo into `tools\u002Fgplay-apk-downloader` if it is missing. With `ALLTECH_AUTO_AUTH=true`, it also runs `gplay auth` once if `~\u002F.gplay-auth.json` is missing.\n\n### gplaydl\n\n`gplaydl` is installed by `requirements.txt`. It can download base and split APK files. PlayDL then merges them with APKEditor.\n\n```env\nPLAY_DOWNLOADER_BACKEND=gplaydl\nPLAY_ARCH=arm64\nAPKEDITOR_JAR=tools\u002FAPKEditor.jar\n```\n\nWith auto-install enabled, the bot runs `python -m pip install gplaydl>=2.1,\u003C3` if the `gplaydl` command is missing.\n\n### apkeep\n\nGood if you already use apkeep and have Google Play credentials or an AAS token.\n\n```env\nPLAY_DOWNLOADER_BACKEND=apkeep\nAPKEEP_SOURCE=google-play\nAPKEEP_EMAIL=you@example.com\nAPKEEP_TOKEN=your_aas_token\n```\n\nWith auto-install enabled, the bot runs `cargo install apkeep` if `apkeep` is missing and Cargo is available.\n\n### Custom command\n\nUse this when you have your own downloader script.\n\n```env\nPLAY_DOWNLOADER_BACKEND=custom\nPLAY_DOWNLOADER_CMD=apkeep -a \"{package}\" \"{output_dir}\"\nAPKS_TO_APK_CMD=java -jar tools\u002FAPKEditor.jar m -i \"{input}\" -o \"{output}\"\n```\n\nAvailable template variables:\n\n- `{url}`: full Google Play URL\n- `{package}`: package name, for example `org.telegram.messenger`\n- `{output_dir}`: job download folder\n- `{arch}`: configured architecture, for example `arm64`\n\n## Uploader Setup\n\n### NixFile\nGo to nixfile.com, create an account and put the username & password in your **.env** file in `NIXFILE_USERNAME` and `NIXFILE_PASS` fields. The bot logs in on the first run and reuses the saved session afterwards.\n\n### Rubika\nThe Rubika channel sends the APK from a bot-owned Rubika user account to any `@username`. Auth is via a pre-generated rubpy session file.\n\n```bash\npython session_rubika.py\n```\n\nFollow the prompts (phone number, OTP). This creates `storage\u002Fplaydl_rubika.rp`. If the file is missing the Rubika button stays in the menu but uploads return \"Rubika غیرفعال است\".\n\nRubika rejects `.apk` extensions on user-account uploads, so the bot zips the file as `NitoNumber-1.zip` before sending. To avoid timeouts on large APKs, rubpy's sequential 1 MB chunk uploader is monkey-patched on startup to upload 8 chunks in parallel — see `_parallel_upload_file` in `Services\u002Frubika.py`. Adjust `RUBIKA_UPLOAD_CONCURRENCY` in the same file if the Rubika DC rate-limits.\n\nTunables in `.env`:\n\n```env\nRUBIKA_SESSION_NAME=playdl_rubika\nRUBIKA_SESSION_DIR=storage\nRUBIKA_MAX_FILE_MB=500\nRUBIKA_UPLOAD_TIMEOUT=900\n```\n\n## Run\n\n```bash\npython Main.py\n```\n\n## How Split APK Merging Works\n\nIf the downloader returns:\n\n- one `.apk`: the bot sends it as-is\n- one `.apks`: APKEditor merges it into `.apk`\n- multiple split `.apk` files in a folder: APKEditor merges the folder into `merged.apk`\n\nIf `alltech-gplay` is used with `MERGE_SPLITS=true`, it gets the first chance to merge. If split files still come out, PlayDL runs its own APKEditor merge step.\n\n## Project Layout\n\n```text\nApp\u002F        bot startup and configuration\nHandlers\u002F   aiogram class-based handlers\nDataBase\u002F   MongoDB access layer\nServices\u002F   download, conversion, job helpers\nUtils\u002F      Persian texts and inline keyboards\ntools\u002F      optional local jars\u002Fscripts\nstorage\u002F    downloads and runtime files\n```\n# Important!\n## this project uses Telegram-bot-api and you should set it up on your server to run this bot\n","PlayDL 是一个基于 Telegram 的 Google Play 应用下载机器人，使用 Python 编写。它能够从提供的 Google Play 链接中提取应用包名，利用支持的后端工具下载应用，并在必要时合并分割的 APK 文件，最终将可安装的 APK 文件发送给用户。该机器人采用 Python 3.13 和 aiogram 3.28.x 构建，通过 Telegram、NixFile 或 Rubika 渠道分发文件，并利用 MongoDB 存储用户和任务状态。适用于需要自动下载并分享 Android 应用的场景，特别适合开发者或需要频繁测试不同版本应用的用户。","2026-06-11 03:59:00","CREATED_QUERY"]