204 lines
5.2 KiB
Plaintext
204 lines
5.2 KiB
Plaintext
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
|
||
}
|