Files
flashscore/handball.sgo

204 lines
5.2 KiB
Plaintext
Raw Permalink Normal View History

2026-07-21 03:49:47 +03:00
package flashscore
import (
"bytes"
"fmt"
webspider "spider"
"time"
"github.com/PuerkitoBio/goquery"
)
func listScheduledHandballMatches() (result []ScheduledMatch, err error) {
spider, err := webspider.NewSpider(nil)
if err != nil {
panic(err)
}
// Загружаем AJAX страницу с таблицами матчей
//url := fmt.Sprintf(h2hTablesURLPattern, matchID)
buf, err := spider.Get(handballAllGamesFeedURL, map[string]string{
"referer": "https://d.flashscore.com/x/feed/proxy-local",
"x-requested-with": "XMLHttpRequest",
// Важное поле! Код можно найти в исходниках либо подсмотреть. Без кода
// сервер отдает 401 ошибку
"x-fsign": feedSign,
"x-referer": "https://www.flashscore.com/handball/",
"x-geoip": "1",
})
if err != nil {
err = fmt.Errorf("Load handball All Games feed: %s", err)
return
}
result, err = parseListOfScheduledMatches(string(buf))
if err != nil {
err = fmt.Errorf("parseListOfScheduledMatches: %s", err)
return
}
return
}
func Check() (err error) {
matches, err := listScheduledHandballMatches()
if err != nil {
return
}
matches = DiscardScheduledMatchesFurtherThan(matches, 24*time.Hour)
for _, m := range matches {
report, err := GetUpcomingMatchReport(m.MatchID)
if err != nil {
// log
}
}
return
}
func GetUpcomingMatchReport(matchID string) (report HandballUpcomingMatchReport, err error) {
report.IsComplete = true
spider, err := webspider.NewSpider(nil)
if err != nil {
panic(err)
}
// Загружаем Landing
landingURL := fmt.Sprintf(h2hLandingURLPattern, matchID)
buf, err := spider.Get(landingURL, nil)
if err != nil {
err = fmt.Errorf("load h2hLanding: %s", err)
return
}
doc, err := goquery.NewDocumentFromReader(bytes.NewBuffer(buf))
if err != nil {
err = fmt.Errorf("goquery.NewDocumentFromReader: %s", err)
return
}
// FIX - добавить чемпионат и парсинг инфы
//_, _, report.Home, report.Away, err = s.parseFootballMatchInfo(doc)
//if err != nil {
// return
//}
// Загружаем AJAX страницу с таблицами матчей
url := fmt.Sprintf(h2hTablesURLPattern, matchID)
buf, err = spider.Get(url, map[string]string{
"referer": "https://d.flashscore.com/x/feed/proxy-local",
"x-requested-with": "XMLHttpRequest",
// Важное поле! Код можно найти в исходниках либо подсмотреть. Без кода
// сервер отдает 401 ошибку
"x-fsign": feedSign,
"x-referer": fmt.Sprintf(h2hLandingURLPattern, matchID),
"x-geoip": "1",
})
if err != nil {
err = fmt.Errorf("load h2hTables: %s", err)
return
}
doc, err = goquery.NewDocumentFromReader(bytes.NewBuffer(buf))
if err != nil {
err = fmt.Errorf("goquery.NewDocumentFromReader: %s", err)
return
}
// var (dirtyTeamID string
// OVERALL - последние матчи команд (хозяев и гостей)
// Внутри блока <div id="tab-h2h-overall" будут 2 таблицы:
// <table class="head_to_head h2h_home"
// <table class="head_to_head h2h_away"
//
// Строки (tr) внутри таблицы имеют вид:
// <tr class="odd highlight"
// <tr class="even highlight"
overall := doc.Find("#tab-h2h-overall")
if overall.Length() == 0 {
err = fmt.Errorf("Div #tab-h2h-overall not found")
return
}
overall = overall.First()
// Последние матчи хозяев (во всех турнирах, на выезде и в гостях)
home := overall.Find(".h2h_home")
if home.Length() == 0 {
err = fmt.Errorf("Table .h2h_home not found")
return
}
report.HomeTeamMatches, err = parseMatchesResults(home.First().Find(".highlight"))
if err != nil {
return
}
// Последние матчи AWAY команды (во всех турнирах, на выезде и в гостях)
away := overall.Find(".h2h_away")
if away.Length() == 0 {
err = fmt.Errorf("Table .h2h_away not found")
return
}
report.AwayTeamMatches, err = parseMatchesResults(away.First().Find(".highlight"))
if err != nil {
return
}
// Последние личные встречи (во всех турнирах, на выезде и в гостях)
h2h := overall.Find(".h2h_mutual")
if home.Length() == 0 {
err = fmt.Errorf("Table .h2h_mutual not found")
return
}
report.H2H, err = parseMatchesResults(h2h.First().Find(".highlight"))
if err != nil {
return
}
/*
var hasLostMatch bool
hasLostMatch, report.HomeTeamMatches, err = s.addSummaryToFootballMatches(report.HomeTeamMatches)
if err != nil {
return
}
if hasLostMatch {
report.IsComplete = false
}
hasLostMatch, report.AwayTeamMatches, err = s.addSummaryToFootballMatches(report.AwayTeamMatches)
if err != nil {
return
}
if hasLostMatch {
report.IsComplete = false
}
hasLostMatch, report.H2H, err = s.addSummaryToFootballMatches(report.H2H)
if err != nil {
return
}
if hasLostMatch {
report.IsComplete = false
}
*/
// load odds +
report.Odds, err = loadFootballOdds(spider, matchID)
if err != nil {
err = fmt.Errorf("loadOdds: %s", err)
return
}
return
}