Files
flashscore/handball.sgo
2026-07-21 03:49:47 +03:00

204 lines
5.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}