informasi seputar sepak bola
No comments yet. Be the first to comment!
1/**
2 * FOOTBALL STALKER - SofaScore
3 * Author : gienetic
4 * Base : https://play.google.com/store/apps/details?id=com.sofascore.results
5 */
6
7const axios = require('axios');
8const dayjs = require('dayjs');
9
10const headers = {
11 'Host': 'sofavpn.com',
12 'cache-control': 'max-age=0',
13 'accept-encoding': 'gzip',
14 'user-agent': 'com.sofascore.results/250702/110f52'
15};
16
17const posFull = {
18 D: 'Bek',
19 M: 'Gelandang',
20 F: 'Penyerang',
21 G: 'Kiper'
22};
23
24async function stalkPlayer(query) {
25 const res = await axios.get('https://sofavpn.com/api/v1/search/all', {
26 params: {
27 q: query,
28 page: 0
29 },
30 headers
31 });
32
33 const players = res.data.results.filter(r => r.type === 'player');
34 if (!players.length) return '❌ Tidak ditemukan pemain.';
35
36 let output = '';
37 for (let i = 0; i < players.length; i++) {
38 const e = players[i].entity;
39 const detail = await axios.get(`https://sofavpn.com/api/v1/player/${e.id}`, {
40 headers
41 });
42 const p = detail.data.player;
43 const team = p.team || {};
44 const league = team.tournament || {};
45 const country = p.country || {};
46
47 const dob = p.dateOfBirthTimestamp ? dayjs.unix(p.dateOfBirthTimestamp).format('D MMMM YYYY') : '-';
48 const contractUntil = p.contractUntilTimestamp ? dayjs.unix(p.contractUntilTimestamp).format('D MMMM YYYY') : '-';
49 const mv = p.proposedMarketValueRaw ? `€${p.proposedMarketValueRaw.value.toLocaleString('de-DE')}` : '-';
50
51 output += `#${i + 1} - ${p.name}\n`;
52 output += ` ➤ Nama Singkat : ${p.shortName || '-'}\n`;
53 output += ` ➤ Posisi : ${p.position || '-'} (${posFull[p.position] || '-'})\n`;
54 output += ` ➤ Nomor Punggung : ${p.jerseyNumber || p.shirtNumber || '-'}\n`;
55 output += ` ➤ Tinggi Badan : ${p.height ? p.height + ' cm' : '-'}\n`;
56 output += ` ➤ Kaki Dominan : ${p.preferredFoot || '-'}\n`;
57 output += ` ➤ Tanggal Lahir : ${dob}\n`;
58 output += ` ➤ Kontrak Hingga : ${contractUntil}\n`;
59 output += ` ➤ Harga Pasar : ${mv}\n`;
60 output += ` ➤ Tim : ${team.name || '-'}\n`;
61 output += ` ➤ Liga : ${league.name || '-'}\n`;
62 output += ` ➤ Negara : ${country.name || '-'}\n`;
63 output += ` ➤ Slug Pemain : ${p.slug || '-'}\n`;
64 output += ` ➤ Slug Tim : ${team.slug || '-'}\n`;
65 output += ` ➤ Gambar Pemain : https://sofavpn.com/api/v1/player/${p.id}/image\n\n`;
66 }
67
68 return output.trim();
69}
70
71async function stalkTeam(query) {
72 const res = await axios.get('https://sofavpn.com/api/v1/search/teams', {
73 params: {
74 q: query,
75 page: 0
76 },
77 headers
78 });
79
80 const teams = res.data.results;
81 if (!teams.length) return '❌ Tidak ditemukan tim.';
82
83 let output = '';
84 for (const [i, t] of teams.entries()) {
85 const detail = await axios.get(`https://sofavpn.com/api/v1/team/${t.entity.id}`, {
86 headers
87 });
88 const team = detail.data.team;
89 const country = team.category?.country || {};
90 const league = team.tournament || {};
91 const manager = team.manager || {};
92 const venue = team.venue || {};
93 const form = detail.data.pregameForm || {};
94
95 output += `#${i + 1} - ${team.name}\n`;
96 output += ` ➤ Nama Singkat : ${team.shortName || '-'}\n`;
97 output += ` ➤ Olahraga : ${team.sport?.name || '-'}\n`;
98 output += ` ➤ Negara : ${country.name || '-'}\n`;
99 output += ` ➤ Liga : ${league.name || '-'}\n`;
100 output += ` ➤ Posisi Saat Ini : ${form.position || '-'}\n`;
101 output += ` ➤ Performa Terakhir : ${form.form?.join(', ') || '-'}\n`;
102 output += ` ➤ Pelatih : ${manager.name || '-'} (${manager.country?.name || '-'})\n`;
103 output += ` ➤ Kota Stadion : ${venue.city?.name || '-'}\n`;
104 output += ` ➤ Lokasi Stadion : ${venue.venueCoordinates ? `${venue.venueCoordinates.latitude}, ${venue.venueCoordinates.longitude}` : '-'}\n`;
105 output += ` ➤ Slug Tim : ${team.slug || '-'}\n`;
106 output += ` ➤ Gambar Tim : https://sofavpn.com/api/v1/team/${team.id}/image\n\n`;
107 }
108
109 return output.trim();
110}
111
112async function stalkMatch(query) {
113 const res = await axios.get('https://sofavpn.com/api/v1/search/unique-tournaments', {
114 params: {
115 q: query,
116 page: 0
117 },
118 headers
119 });
120
121 const results = res.data.results;
122 if (!results.length) return '❌ Tidak ditemukan turnamen.';
123
124 let output = '';
125 for (const [i, result] of results.entries()) {
126 const e = result.entity;
127 const detail = await axios.get(`https://sofavpn.com/api/v1/unique-tournament/${e.id}`, {
128 headers
129 });
130 const u = detail.data.uniqueTournament;
131
132 const titleHolder = u.titleHolder || {};
133 const mostTitles = (u.mostTitlesTeams || []).map(t => t.name).join(', ') || '-';
134 const start = u.startDateTimestamp ? dayjs.unix(u.startDateTimestamp).format('D MMMM YYYY') : '-';
135 const end = u.endDateTimestamp ? dayjs.unix(u.endDateTimestamp).format('D MMMM YYYY') : '-';
136
137 output += `#${i + 1} - ${u.name}\n`;
138 output += ` ➤ Slug Turnamen : ${u.slug || '-'}\n`;
139 output += ` ➤ Wilayah : ${u.category?.name || '-'}\n`;
140 output += ` ➤ Jenis Olahraga : ${u.category?.sport?.name || '-'}\n`;
141 output += ` ➤ Juara Bertahan : ${titleHolder.name || '-'} (${titleHolder.country?.name || '-'})\n`;
142 output += ` ➤ Tim Terbanyak Juara: ${mostTitles}\n`;
143 output += ` ➤ Tanggal Mulai : ${start}\n`;
144 output += ` ➤ Tanggal Selesai : ${end}\n\n`;
145 }
146
147 return output.trim();
148}
149
150// stalkPlayer('kadek arel').then(console.log);
151// stalkTeam('persija').then(console.log);
152// stalkMatch('liga 1').then(console.log);
153
154module.exports = {
155 stalkPlayer,
156 stalkTeam,
157 stalkMatch
158};