const fetch = require("node-fetch"); const base64url = require("base64url"); const express = require("express"); const app = express(); const PORT = 4000; function buildAndroidInstanceId(userId, androidName, androidIp, coorUrl) { const instanceJson = { userId: userId, androidName: androidName, androidIp: androidIp, svc: "", coorUrl: coorUrl }; return base64url.encode(JSON.stringify(instanceJson)); } app.get("/generate-url", async (req, res) => { const { email, password, game = "com.roblox.client", quality = "SD", androidName, androidIp } = req.query; if (!email || !password) { return res.status(400).send("Missing email or password in query."); } try { const response = await fetch(`https://luna.loan/api/user-info?email=${encodeURIComponent(email)}&password=${encodeURIComponent(password)}`); const data = await response.json(); if (!data.user_info || !data.user_info.data) { return res.status(500).send("Invalid user info response from localhost API."); } const userInfo = data.user_info.data; const phoneList = data.phone_list.data.list[0]; const coorUrl = "https://coor-la.prod.cloudmoonapp.com"; const androidInstanceId = buildAndroidInstanceId( userInfo.user_id, androidName || "MyDevice", androidIp || "127.0.0.1", coorUrl ); const cloudMoonUrl = `https://www.cloudmoonapp.com/run-site/index.html` + `?userid=${phoneList.android_id}` + `&game=${game}` + `&android_instance_id=${androidInstanceId}` + `&coor_url=${encodeURIComponent(coorUrl)}` + `&uuid=${userInfo.user_id}` + `&quality=${quality}` + `&token=${userInfo.token}` + `&email=${encodeURIComponent(userInfo.email)}`; res.json({ url: cloudMoonUrl }); } catch (error) { console.error(error); res.status(500).send("no"); } }); app.listen(PORT, () => { console.log(`my dih is at http://localhost:${PORT}`); });