Ayogiakbar

FOOTBALL STALKER

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