kurzer Script für Lottozahlen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von paedubucher » 15.10.2021 21:52:23

Evtl. liesse sich das ganze mit Debianpup etwas vereinfachen? Damit lässt sich HTML parsen statt als blosser Text verarbeiten. Beispiel:

Code: Alles auswählen

curl -H "User-Agent: Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0" https://www.irishlottery.com/daily-million-archive | pup 'ul.balls'
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: kurzer Script für Lottozahlen

Beitrag von tHoRax » 15.10.2021 23:17:09

Wie soll man auch darauf kommen, dass diese verrückten Iren :) einen User-Agent dazwischen schalten?
Wieder was dazu gelernt :)
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von paedubucher » 16.10.2021 10:32:21

tHoRax hat geschrieben: ↑ zum Beitrag ↑
15.10.2021 23:17:09
Wie soll man auch darauf kommen, dass diese verrückten Iren :) einen User-Agent dazwischen schalten?
Wieder was dazu gelernt :)
Die wollen halt bösartige Hacker vom Hacken abhalten! Den User Agent auf den Google Bot umzustellen hat auch oftmals interessante Auswirkungen, indem man damit etwa durch Paywalls hindurchblicken kann.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von Meillo » 16.10.2021 11:23:12

paedubucher hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 10:32:21
Den User Agent auf den Google Bot umzustellen hat auch oftmals interessante Auswirkungen, indem man damit etwa durch Paywalls hindurchblicken kann.
Interessant Idee ...


Willst du eigentlich mit pup noch ein ganzes Script fuer den Anwendungsfall schreiben?
Use ed once in a while!

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von inne » 16.10.2021 11:55:06

Meillo hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 11:23:12
paedubucher hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 10:32:21
Den User Agent auf den Google Bot umzustellen hat auch oftmals interessante Auswirkungen, indem man damit etwa durch Paywalls hindurchblicken kann.
Interessant Idee ...
Richtig gute Idee.
Kann man damit auch die "Ich akzeptire Cookies Banner" /wegskripten/? Das würde mich hier gerade richitg gut weiter bringen. Vielen Dank @paedubucher!

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von paedubucher » 16.10.2021 13:57:25

Meillo hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 11:23:12
paedubucher hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 10:32:21
Den User Agent auf den Google Bot umzustellen hat auch oftmals interessante Auswirkungen, indem man damit etwa durch Paywalls hindurchblicken kann.
Interessant Idee ...


Willst du eigentlich mit pup noch ein ganzes Script fuer den Anwendungsfall schreiben?
Wäre eine gute Übung und würde einen interessanten Vergleich ermöglichen. Ich werde das gelegentlich noch versuchen.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von Meillo » 16.10.2021 19:07:23

paedubucher hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 13:57:25
Meillo hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 11:23:12
Willst du eigentlich mit pup noch ein ganzes Script fuer den Anwendungsfall schreiben?
Wäre eine gute Übung und würde einen interessanten Vergleich ermöglichen. Ich werde das gelegentlich noch versuchen.
:THX:
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von paedubucher » 16.10.2021 19:48:44

Leider ist pup nicht ganz so mächtig wie jq, doch mit mehreren Schritten bringt man schon etwas hin:

Code: Alles auswählen

#!/usr/bin/bash

url='https://www.irishlottery.com/daily-million-archive'
agent='Mozilla/5.0 (X11; Linux x86_64; rv:93.0) Gecko/20100101 Firefox/93.0'

curl -H "User-Agent: ${agent}" "${url}" >lottery.html

date_pat='[A-Z]{1}[a-z]+ [0-9]{1,2}[a-z]{2} [0-9]+'
time_pat='[0-9]{1,2}:[0-9]{1,2}[a-z]{2}'
pup -f lottery.html 'tr th a text{}' | grep -E -o "${date_pat}" >dates.txt
pup -f lottery.html 'tr th a text{}' | grep -E -o "${time_pat}" >times.txt
pup -f lottery.html 'tr ul.balls text{}' | grep -E -o '[0-9]+' >balls.txt

paste -d ' ' dates.txt times.txt > datetimes.txt
offset=1
while read -r result_date
do
    balls=$(tail -n +$offset balls.txt | head -n 6 | tr '\n' ' ')
    offset=$(expr $offset + 6)
    zball=$(tail -n +$offset balls.txt | head -n 1)
    offset=$(expr $offset + 1)
    echo -e "${result_date}\t${balls}\tZz:${zball}"
done <datetimes.txt
Das ganze Datums- und Zeitformat ist leider nicht so schön, d.h. man müsste es noch etwas zurechtrücken, damit man es mit date parsen und schöner formatiert ausgeben könnte. Aber funktionieren tut es schon einmal.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von paedubucher » 16.10.2021 20:54:24

Die Verwendung von pup erinnerte mich daran, dass ich mal eine Go-Library namens htmlsqueeze geschrieben habe, um Selektoren auf HTML-Dokumente anzuwenden. Ich habe jetzt ein kleines Programm daraus gebastelt:

Code: Alles auswählen

package main

import (
	"fmt"
	"log"
	"net/http"
	"regexp"
	"strconv"
	"strings"
	"time"

	hs "github.com/patrickbucher/htmlsqueeze"
	"golang.org/x/net/html"
)

const (
	lotteryURL = "https://www.irishlottery.com/daily-million-archive"
	userAgent  = "Mozilla/5.0 (X11; Linux x86_64; rv:93.0) Gecko/20100101 Firefox/93.0"

	dateInputFmt  = "2006 January 2 3:04 pm"
	dateOutputFmt = "02.01.2006 15:04"
)

var (
	datePat = regexp.MustCompile(`^([A-Z][a-z]+) ([0-9]{1,2})[a-z]{2} ([0-9]{4})`)
	timePat = regexp.MustCompile(`([0-9]{1,2}):([0-9]{2})([ap]m)`)
)

func main() {
	doc, err := getDocument(lotteryURL, userAgent)
	if err != nil {
		log.Fatal(err)
	}

	tableRowMatcher := [][]hs.Predicate{
		[]hs.Predicate{hs.TagMatcher("tr")},
	}
	datetimeMatcher := [][]hs.Predicate{
		[]hs.Predicate{hs.TagMatcher("th")},
		[]hs.Predicate{hs.TagMatcher("a")},
	}
	ballsMatcher := [][]hs.Predicate{
		[]hs.Predicate{hs.TagMatcher("td")},
		[]hs.Predicate{hs.TagMatcher("ul")},
		[]hs.Predicate{
			hs.TagMatcher("li"),
		},
	}
	nodes := hs.Apply(doc, tableRowMatcher)
	for _, node := range nodes {
		datetime := hs.Squeeze(node, datetimeMatcher, hs.ExtractChildText)
		if len(datetime) < 1 {
			continue
		}
		raw := strings.TrimSpace(datetime[0])
		dateFormatted := reformatDate(raw)
		fmt.Printf("%s ", dateFormatted)
		balls := toIntSlice(hs.Squeeze(node, ballsMatcher, hs.ExtractChildrenTexts))
		if len(balls) != 7 {
			continue
		}
		for _, ball := range balls[:6] {
			fmt.Printf("%2d ", ball)
		}
		fmt.Printf("Zz: %2d\n", balls[6])
	}
}

func toIntSlice(values []string) []int {
	numbers := make([]int, 0)
	for _, val := range values {
		v, err := strconv.Atoi(val)
		if err == nil {
			numbers = append(numbers, v)
		}
	}
	return numbers
}

func reformatDate(rawDate string) string {
	dateFields := datePat.FindStringSubmatch(rawDate)
	timeFields := timePat.FindStringSubmatch(rawDate)
	month := dateFields[1]
	day := dateFields[2]
	year := dateFields[3]
	hour := timeFields[1]
	minute := timeFields[2]
	phase := timeFields[3]
	dateStr := fmt.Sprintf("%s %s %s %s:%s %s", year, month, day, hour, minute, phase)
	parsed, err := time.Parse(dateInputFmt, dateStr)
	if err != nil {
		return ""
	}
	formatted := parsed.Format(dateOutputFmt)
	return formatted
}

func getDocument(url, agent string) (*html.Node, error) {
	client := &http.Client{}
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, fmt.Errorf("prepare GET %s: %v", url, err)
	}
	req.Header.Set("User-Agent", agent)
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("perform GET %s: %v", url, err)
	}
	defer resp.Body.Close()
	body, err := html.Parse(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("parse HTML of %s: %v", url, err)
	}
	return body, nil
}
Die Ausgabe sieht recht ordentlich aus:

Code: Alles auswählen

16.10.2021 14:00 10 15 18 20 26 36 Zz:  1
15.10.2021 21:00  7 13 15 17 19 39 Zz: 20
15.10.2021 14:00  1  8  9 22 31 39 Zz:  5
14.10.2021 21:00  4  5 13 20 27 37 Zz: 28
14.10.2021 14:00  3  7 22 26 33 35 Zz: 30
Natürlich könnte man das Programm noch erweitern, indem man etwa Datumsangaben als Parameter zulassen würde.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: kurzer Script für Lottozahlen

Beitrag von tHoRax » 16.10.2021 21:43:02

Wow! :)
Wusste gar nicht, dass sich so viele ausser mir sich mit dem Glücksspiel befassen, aller Achtung! :)
@paedubucher
Danke für die Unterstützung.
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: kurzer Script für Lottozahlen

Beitrag von paedubucher » 16.10.2021 22:46:20

tHoRax hat geschrieben: ↑ zum Beitrag ↑
16.10.2021 21:43:02
Wow! :)
Wusste gar nicht, dass sich so viele ausser mir sich mit dem Glücksspiel befassen, aller Achtung! :)
@paedubucher
Danke für die Unterstützung.
Mache ich eigentlich gar nicht, aber wenn eine interessante Programmieraufgabe an mir vorbeifliegt, muss ich zupacken :wink:
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: kurzer Script für Lottozahlen

Beitrag von tHoRax » 17.10.2021 11:35:38

von paedubucher » 16.10.2021 21:46:20


Wow! :)
Wusste gar nicht, dass sich so viele ausser mir sich mit dem Glücksspiel befassen, aller Achtung! :)
@paedubucher
Danke für die Unterstützung.

Mache ich eigentlich gar nicht, aber wenn eine interessante Programmieraufgabe an mir vorbeifliegt, muss ich zupacken
Dafür liebe und schätze ich das dt. Debianforum sehr, schon seit meiner Anmeldung hier.Einfach toll dieses Forum!Hier wird wie im Verona-Slogan "Dir geholfen!".
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM

Antworten