import json import os import requests import io from PIL import Image from urllib.parse import parse_qs, urlparse from google_play_scraper import app # ============================================================ # CATÁLOGO DE APPS # slug -> package ID # ============================================================ catalogoApps = { "posmanager-free": "com.appinitdev.posmanager.free", "nexuslocal": "com.appinitdev.nexusLocal", "fertilitybaby": "com.appinitdev.fertilitybaby", "file-explorer": "com.appinitdev.fileExplorer", "wallet": "com.appinitdev.wallet", "imagetools-pro": "com.appinitdev.imagetools.pro", "goodtime": "com.appinitdev.goodtime", "posmanager": "com.appinitdev.posmanager", "musicpro": "com.appinitdev.musicpro", "imagetools": "com.appinitdev.imagetools", "turismooax": "com.appinitdev.turismoOax", "periodictable": "com.appinitdev.periodictable", "file-manager-free": "com.appinitdev.filefree", "gallery-free": "com.appinitdev.galleryfree", "gallery": "com.appinitdev.gallery", "testers": "com.appinitdev.tester", "chatok": "com.appinitdev.chatok", "derivatives-free": "com.appinitdev.derivatives.free", "methods-free": "com.appinitdev.methods.free", "methods-premium": "com.appinitdev.methods.premium", "math": "com.appinitdev.math", "imc": "com.appinitdev.imc", "birth-free": "com.appinitdev.gestogram", "pregnancy-free": "com.appinitdev.development.free", "notes-premium": "com.appinitdev.notes.premium", "notes-free": "com.appinitdev.notes.free", "puzzle-free": "com.appinitdev.puzzle.fre", "capture-free": "com.appinitdev.capture.premium", "capture-premium": "com.appinitdev.capture.free", "color-premium": "com.appinitdev.color.premium", "color-free": "com.appinitdev.color.free", "pyrotechnics-free": "com.appinitdev.pyrotechnics.free", "encrypted": "com.appinitdev.pyrotechnics.premium", "draw": "com.appinitdev.draw", "pregnancy": "com.appinitdev.pregnancy", "canvas-premium": "com.appinitdev.canvas.premium", "canvas-free": "com.appinitdev.canvas.free", "amplify-free": "com.appinitdev.music", "elementalhub": "com.appinitdev.table", "trace": "com.appinitdev.trace" } # ============================================================ # OBTENER APP ID # ============================================================ def get_app_id(input_text: str) -> str: """ Extrae el Package ID si se proporciona una URL de Google Play. Si ya es un Package ID, lo devuelve directamente. """ if "play.google.com" in input_text: parsed_url = urlparse(input_text) return parse_qs( parsed_url.query ).get( "id", [input_text] )[0] return input_text.strip() # ============================================================ # DESCARGAR Y CONVERTIR IMAGEN A WEBP # ============================================================ def descargar_y_comprimir_imagen( url: str, ruta_destino_base: str ): """ Descarga la imagen en máxima resolución, la convierte a PNG y conserva transparencia. """ if not url: return None if '=' in url: url_max_res = url.split('=')[0] + '=s0' else: url_max_res = url + '=s0' try: respuesta = requests.get( url_max_res, stream=True, timeout=30 ) if respuesta.status_code == 200: imagen_bytes = io.BytesIO( respuesta.content ) imagen = Image.open( imagen_bytes ) if imagen.mode not in ( 'RGB', 'RGBA' ): imagen = imagen.convert( 'RGBA' ) # --- RUTA Y GUARDADO ESTRICTAMENTE EN PNG --- ruta_destino = f"{ruta_destino_base}.png" imagen.save( ruta_destino, 'PNG', optimize=True ) return ruta_destino except Exception as e: print( f"Error descargando/convirtiendo a PNG " f"{url_max_res}: {e}" ) return url # ============================================================ # PREPARAR CARPETA DE IMÁGENES # ============================================================ carpeta_base = "imagen_apps" os.makedirs( carpeta_base, exist_ok=True ) # ============================================================ # EXTRAER DATOS DE TODAS LAS APPS # ============================================================ all_apps_data = [] for slug, app_id in catalogoApps.items(): package_id = get_app_id( app_id ) print( f"\nExtrayendo datos de: " f"{package_id}..." ) try: # ---------------------------------------------------- # Obtener información de Google Play # ---------------------------------------------------- result = app( package_id, lang='es', country='mx' ) # ==================================================== # ASIGNAR SLUG DESDE catalogoApps # ==================================================== result['slug'] = slug # ==================================================== # VERIFICAR APP ID # ==================================================== result['appId'] = package_id # ==================================================== # CARPETA DE LA APP # ==================================================== carpeta_app = os.path.join( carpeta_base, package_id ) os.makedirs( carpeta_app, exist_ok=True ) carpeta_web = ( f"/{carpeta_base}/{package_id}" ) # ==================================================== # 1. ÍCONO # ==================================================== if result.get('icon'): ruta_icon_local = os.path.join( carpeta_app, 'icon' ) if descargar_y_comprimir_imagen( result['icon'], ruta_icon_local ): result['icon'] = ( f"{carpeta_web}/icon.png" ) # ==================================================== # 2. HEADER # ==================================================== if result.get('headerImage'): ruta_header_local = os.path.join( carpeta_app, 'headerImage' ) if descargar_y_comprimir_imagen(result['headerImage'], ruta_header_local): result['headerImage'] = f"{carpeta_web}/headerImage.png" # ==================================================== # 3. SCREENSHOTS # ==================================================== if result.get('screenshots'): rutas_screenshots = [] screenshots_principales = result['screenshots'][:8] for i, screenshot_url in enumerate(screenshots_principales): ruta_screenshot_local = os.path.join( carpeta_app, f'screenshot_{i + 1}' ) if descargar_y_comprimir_imagen(screenshot_url, ruta_screenshot_local): rutas_screenshots.append( f"{carpeta_web}/screenshot_{i + 1}.png" ) result['screenshots'] = rutas_screenshots # ==================================================== # GUARDAR RESULTADO # ==================================================== all_apps_data.append( result ) print( f"✔ ¡Éxito! " f"{result['title']}" ) print( f" Package: {package_id}" ) print( f" Slug: {slug}" ) print( f" URL: /{slug}/" ) except Exception as e: print( f"✖ Error con " f"{package_id}: {e}" ) # ============================================================ # GUARDAR JSON FINAL # ============================================================ with open( 'apps_full_data.json', 'w', encoding='utf-8' ) as f: json.dump( all_apps_data, f, ensure_ascii=False, indent=2 ) print( "\n==========================================" ) print( "🚀 apps_full_data.json generado correctamente." ) print( "📁 Recursos visuales guardados en " "imagen_apps/" ) print( "🔗 Los slugs fueron asignados desde " "catalogoApps." ) print( "==========================================" )