From 992f16ad1b5bba93c58fa5757757ca4137ba420d Mon Sep 17 00:00:00 2001 From: ihsangan Date: Wed, 7 Aug 2024 12:11:10 +0800 Subject: [PATCH] add 'server' as aliases for 'zone' parameter, add Zenless Zone Zero, update README - plan to support POST request? --- README.md | 36 ++++++++++++++++++++-------------- src/router/index.ts | 11 ++++++----- src/router/la.ts | 24 +++++++++++------------ src/router/zzz.ts | 44 +++++++++++++++++++++++++++++++++++++++++ src/routing.ts | 48 ++++++++++++++++++++++++++++----------------- 5 files changed, 113 insertions(+), 50 deletions(-) create mode 100755 src/router/zzz.ts diff --git a/README.md b/README.md index 4e8ec7a..f57c959 100755 --- a/README.md +++ b/README.md @@ -4,13 +4,15 @@ API ini dibuat untuk mencari nickname in-game menggunakan ID player, data dari A Awal bermula nya projek ini saat saya mengunjungi web phising yang menggunakan sistem validasi ID pada situsnya (ironis, padahal masih bayak web topup yang belum implementasi beginian), jadi kalo ID nya tidak valid maka data tidak bisa disubmit. Karena dari Codashop request dan parsing data nya lebih ribet, maka dibuatlah API ini. + +Lihat perubahan di [commits](https://github.com/ihsangan/valid/commits/main/). ## Self Deploy Kamu bisa langsung fork aja repo ini, atau bisa tekan tombol dibawah ini (jangan lupa github secrets nya di seting) [![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/ihsangan/valid) ## Endpoint ``` -https://api.isan.eu.org/nickname/ +https://api.isan.eu.org/nickname ``` ## Output application/json; charset=utf-8 ([RFC4627](https://datatracker.ietf.org/doc/html/rfc4627)) @@ -28,63 +30,67 @@ interface Result { # Daftar game Berikut adalah daftar game yang didukung oleh API ini. ### Genshin Impact (America, Asia, Europe, SAR) [CENSORED] -GET `gi?id=PLAYER_ID` +GET `/gi?id=PLAYER_ID` **Contoh:** [600000000](https://api.isan.eu.org/nickname/gi?id=600000000) ### Honkai Impact 3rd [CENSORED] -GET `hi?id=PLAYER_ID` +GET `/hi?id=PLAYER_ID` **Contoh:** [10000001](https://api.isan.eu.org/nickname/hi?id=10000001) ### Honkai: Star Rail (America, Asia, Europe, SAR) [CENSORED] -GET `hsr?id=PLAYER_ID` +GET `/hsr?id=PLAYER_ID` **Contoh:** [600000001](https://api.isan.eu.org/nickname/hsr?id=600000001) ### LifeAfter -GET `la?id=PLAYER_ID&zone=SERVER_NAME` +GET `/la?id=PLAYER_ID&zone=SERVER_NAME` -SERVER_NAME bersifat case-insensitive, untuk daftarnya ada [di sini](https://github.com/ihsangan/valid/blob/main/src/router/la.js). +SERVER_NAME bersifat case-insensitive, untuk daftarnya ada [di sini](https://github.com/ihsangan/valid/blob/main/src/router/la.ts). **Contoh:** [?id=22512309&zone=milestone](https://api.isan.eu.org/nickname/la?id=22512309&zone=milestone) ### Point Blank -GET `pb?id=ZEPETTO_ID` +GET `/pb?id=ZEPETTO_ID` **Contoh:** [wakwaw55](https://api.isan.eu.org/nickname/pb?id=wakwaw55) ### Punishing: Gray Raven (AP, EU, NA) -GET `pgr?id=ID&zone=SERVER_ID` +GET `/pgr?id=ID&zone=SERVER_ID` Case-insensitive, keterangan untuk identifikasi server: AP(Asia-Pasifik), EU(Europe), NA(North America) **Contoh:** [?id=16746755&zone=AP](https://api.isan.eu.org/nickname/pgr?id=16746755&zone=AP) ### Sausage Man -GET `sm?id=PLAYER_ID` +GET `/sm?id=PLAYER_ID` **Contoh:** [5sn9jf](https://api.isan.eu.org/nickname/sm?id=5sn9jf) ### Super Sus -GET `sus?id=SPACE_ID` +GET `/sus?id=SPACE_ID` **Contoh:** [15916600](https://api.isan.eu.org/nickname/sus?id=15916600) ### Valorant -GET `valo?id=URISafeRiotIdAndTag` +GET `/valo?id=URISafeRiotIdAndTag` **Contoh region ID :** [yuyun%23123](https://api.isan.eu.org/nickname/valo?id=yuyun%23123) **Contoh region non ID :** [Westbourne%23USA](https://api.isan.eu.org/nickname/valo?id=Westbourne%23USA) +### Zenless Zone Zero (America, Asia, Europe, SAR) [CENSORED] +GET `/zzz?id=PLAYER_ID` + +**Contoh:** [1000000100](https://api.isan.eu.org/nickname/zzz?id=1000000100) ## ID-REG-ONLY Dibawah ini adalah daftar game yang hanya bisa dipakai menggunakan ID yang terdaftar dari region Indonesia/SEA ### Arena of Valor -GET `aov?id=PLAYER_OR_OPEN_ID` +GET `/aov?id=PLAYER_OR_OPEN_ID` **Contoh:** [124590895269021](https://api.isan.eu.org/nickname/aov?id=124590895269021) ### Call Of Duty -GET `cod?id=PLAYER_OR_OPEN_ID` +GET `/cod?id=PLAYER_OR_OPEN_ID` **Contoh:** [243402956362890880](https://api.isan.eu.org/nickname/cod?id=243402956362890880) ### Free Fire -GET `ff?id=PLAYER_ID` +GET `/ff?id=PLAYER_ID` **Contoh:** [225009777](https://api.isan.eu.org/nickname/ff?id=225009777) ### Mobile Legends: Bang Bang -GET `ml?id=PLAYER_ID&zone=ZONE_ID` +GET `/ml?id=PLAYER_ID&zone=ZONE_ID` **Contoh:** [?id=1114917746&zone=13486](https://api.isan.eu.org/nickname/ml?id=1114917746&zone=13486) ## Parameter Opsional diff --git a/src/router/index.ts b/src/router/index.ts index fd66ded..eab5918 100755 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,13 +1,14 @@ +export { default as aov } from './aov'; +export { default as cod } from './cod'; export { default as ff } from './ff'; -export { default as ml } from './ml'; export { default as gi } from './gi'; export { default as hi } from './hi'; export { default as hsr } from './hsr'; +export { default as la } from './la'; +export { default as ml } from './ml'; export { default as pb } from './pb'; +export { default as pgr } from './pgr'; export { default as sm } from './sm'; export { default as sus } from './sus'; -export { default as aov } from './aov'; -export { default as cod } from './cod'; export { default as valo } from './valo'; -export { default as pgr } from './pgr'; -export { default as la } from './la'; \ No newline at end of file +export { default as zzz } from './zzz'; \ No newline at end of file diff --git a/src/router/la.ts b/src/router/la.ts index a0e52e6..815e139 100755 --- a/src/router/la.ts +++ b/src/router/la.ts @@ -25,6 +25,10 @@ export default async function la(id: number, zone: string): Promise { sn = 'Obelisk'; sv = 500005; break; + case zoneLC.includes('newland'): + sn = 'NewLand'; + sv = 500006; + break; case zoneLC.includes('chaosoutpost'): sn = 'ChaosOutpost'; sv = 500007; @@ -33,6 +37,10 @@ export default async function la(id: number, zone: string): Promise { sn = 'IronStride'; sv = 500008; break; + case zoneLC.includes('crystalthornsea'): + sn = 'CrystalthornSea'; + sv = 500009; + break; case zoneLC.includes('fallforest'): sn = 'FallForest'; sv = 510001; @@ -61,6 +69,10 @@ export default async function la(id: number, zone: string): Promise { sn = 'LevinCity'; sv = 520005; break; + case zoneLC.includes('milestone'): + sn = 'MileStone'; + sv = 520006; + break; case zoneLC.includes('chaoscity'): sn = 'ChaosCity'; sv = 520007; @@ -73,18 +85,6 @@ export default async function la(id: number, zone: string): Promise { sn = 'HopeWall'; sv = 520009; break; - case zoneLC.includes('newland'): - sn = 'NewLand'; - sv = 500006; - break; - case zoneLC.includes('crystalthornsea'): - sn = 'CrystalthornSea'; - sv = 500009; - break; - case zoneLC.includes('milestone'): - sn = 'MileStone'; - sv = 520006; - break; case zoneLC.includes('labyrinthsea'): sn = 'LabyrinthSea'; sv = 520010; diff --git a/src/router/zzz.ts b/src/router/zzz.ts new file mode 100755 index 0000000..60815af --- /dev/null +++ b/src/router/zzz.ts @@ -0,0 +1,44 @@ +import { endpoint, headers, Result } from '../utils'; + +export default async function zzz(id: number): Promise { + let sn = ''; + let sv = ''; + const idStr = id.toString().substring(0, 2); + switch (idStr) { + case '10': + sn = 'America'; + sv = 'prod_gf_us'; + break; + case '13': + sn = 'Asia'; + sv = 'prod_gf_jp'; + break; + case '15': + sn = 'Europe'; + sv = 'prod_gf_eu'; + break; + case '17': + sn = 'SAR (Taiwan, Hong Kong, Macao)'; + sv = 'prod_gf_sg'; + break; + default: + return { + success: false, + message: 'Bad request' + }; + } + const body = `voucherPricePoint.id=946399&voucherPricePoint.price=16000&voucherPricePoint.variablePrice=0&user.userId=${id}&user.zoneId=${sv}&voucherTypeName=ZENLESS_ZONE_ZERO&shopLang=id_ID`; + const response = await fetch(endpoint, { + method: 'POST', + headers, + body + }); + const data = await response.json(); + return { + success: true, + game: 'Zenless Zone Zero', + id, + server: sn, + name: data.confirmationFields.username + }; +} \ No newline at end of file diff --git a/src/routing.ts b/src/routing.ts index f1cb7a0..2a1d3dd 100755 --- a/src/routing.ts +++ b/src/routing.ts @@ -6,19 +6,25 @@ export default async function callAPI(request: Request): Promise { const path = url.pathname; const params = url.searchParams; const id = params.get('id'); - const zone = params.get('zone'); + const zone = params.get('zone') || params.get('server'); if (!id) { - return { success: false, message: 'Bad request' }; + return { + success: false, + message: 'Bad request' + }; } try { let result: Result; switch (true) { + case path.includes('/aov'): + result = await router.aov(Number(id)); + break; + case path.includes('/cod'): + result = await router.cod(Number(id)); + break; case path.includes('/ff'): result = await router.ff(Number(id)); break; - case path.includes('/ml'): - result = await router.ml(Number(id), Number(zone)); - break; case path.includes('/gi'): result = await router.gi(Number(id)); break; @@ -28,35 +34,41 @@ export default async function callAPI(request: Request): Promise { case path.includes('/hsr'): result = await router.hsr(Number(id)); break; + case path.includes('/la'): + result = await router.la(Number(id), zone); + break; + case path.includes('/ml'): + result = await router.ml(Number(id), Number(zone)); + break; case path.includes('/pb'): result = await router.pb(id); break; + case path.includes('/pgr'): + result = await router.pgr(Number(id), zone); + break; case path.includes('/sm'): result = await router.sm(id); break; case path.includes('/sus'): result = await router.sus(Number(id)); break; - case path.includes('/aov'): - result = await router.aov(Number(id)); - break; - case path.includes('/cod'): - result = await router.cod(Number(id)); - break; case path.includes('/valo'): result = await router.valo(id); break; - case path.includes('/pgr'): - result = await router.pgr(Number(id), zone); - break; - case path.includes('/la'): - result = await router.la(Number(id), zone); + case path.includes('/zzz'): + result = await router.zzz(Number(id)); break; default: - result = { success: false, message: 'Bad request' }; + result = { + success: false, + message: 'Bad request' + }; } return result; } catch (error) { - return { success: false, message: 'Not found' }; + return { + success: false, + message: 'Not found' + }; } } \ No newline at end of file