Script om auto aan te melden voor bezoekersvergunning

Pagina: 1
Acties:

Vraag


Acties:
  • +2 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Edit: @ChessSpider heeft een integration geschreven dat precies datgene doet waarvoor ik deze topic was begonnen: Link Bedankt hiervoor

Ik probeer een python script te schrijven waarmee ik een bezoekersauto kan aanmelden op de website van de gemeente. Mijn doel is dat als homeassistant detecteerd dat mijn schoonmoeder op bezoek is met de auto (dit deel lukt goed), deze auto automatische word aangemeld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests
import json

LOGIN_URL = "https://aanvraagparkeren.groningen.nl/DVSWebAPI/api/login"
END_URL = "https://aanvraagparkeren.groningen.nl/DVSWebAPI/api/reservation/end"
CREATE_URL = "https://aanvraagparkeren.groningen.nl/DVSWebAPI/api/reservation/create"


session = requests.Session()
session.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0'}

# inloggen
payload = {"identifier": "geheim", "loginMethod": "Pas", "password": "geheim", "otp": None, "resetCode": None, "asIdentifier": None, "zipCode": None, "permitMediaTypeID": 1}
response = session.post(LOGIN_URL, data=payload)
print(f"Status code na login: {response.status_code}")

aanmeldpayload = {"DateFrom": "2023-08-01T15:57:00.000+02:00", "DateUntil": "2023-08-01T23:59:00.000+02:00", "LicensePlate": {"Value": "geheim", "Name": "abc"}, "permitMediaTypeID": 1, "permitMediaCode": "geheim"}

aanmelden = session.post(CREATE_URL, data=aanmeldpayload)
print(f"Status code after 'aanmelden': {aanmelden.text}")


Waar ik tegen aan loop is dat het wel lijkt te lukken om in te loggen. (response code 200 en een heleboel persoonlijk info als je session.text print). Maar als in probeer de auto aan te melden (regel 17-20) krijg ik response code 401.

Wat ik al gevonden of geprobeerd heb:

- er lijken geen cookies te worden ontvangen ofzo, login.cookies geeft <RequestsCookieJar[]>
- dit automatisch aanmelden lukt wel als ik selenium gebruik, maar dat wil ik liever niet.
- de payload die ik verstuur is verkregen door de json uit developertools in firefox te kopieren als ik het met de hand inlog.
- Ik denk niet dat het met de tijden te maken heeft, die heb ik express een beetje in de toekomst gelegd.

Wat me verder opvalt is dat alle veel gemeente dezelfde /DVSportal/ gebruiken, maar het is me niet gelukt om hier iets van documentatie te vinden.

Zoals misschien uit het codeblock wel duidelijk heb ik nagenoeg geen verstand van programmeren en ik probeer maar wat. Het spijt me als het gewoon iets heel doms is of als wat ik probeer niet kan ofzo.

EDIT:
Iemand met veel meer kennis heeft dit al eens gemaakt. Zie: https://github.com/tcoenraad/python-dvsportal

[ Voor 5% gewijzigd door Völliglosgelöst op 09-10-2023 20:45 ]

Alle reacties


Acties:
  • +1 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 30-09 22:56

remco_k

een cassettebandje was genoeg

Wellicht dat je als antwoord van die login url een token krijgt die je mee moet sturen bij het opvolgende request?

Alles kan stuk.


Acties:
  • +3 Henk 'm!

  • JEightyFive
  • Registratie: Maart 2022
  • Laatst online: 14:24
En als een keer iemand anders op bezoek komt wordt haar kenteken aangemeld? :+
Volgens mij is dit typisch zo'n gevalletje van overengineering. Wat als ze een keer een wijziging aanbrengen? De site ligt er even uit?
Ik ben wel benieuwd hoeveel mensen straks een boete te pakken hebben na een bezoekje :')

Acties:
  • +1 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 15:30
Omdat ik ook Groninger ben:

Was het je opgevallen dat bij /login de response een "Token" bevat die bij /create en bij /end als HTTP Header "Authorization:
Token [...]" wordt teruggegeven?

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • +1 Henk 'm!

  • Richh
  • Registratie: Augustus 2009
  • Laatst online: 29-09 19:19
Het ligt sowieso (nog? :P) niet aan de tijden; een 401 = unauthenticated.

Ik weet dan weer heel weinig van Python af, maar ik vermoed dat het probleem is dat je bij de aanmeld-payload niet voldoende meestuurt. Je zal ergens een token moeten hebben en die meesturen in de headers, en/of de HTTP-cookies als die er zijn moeten definiëren. Anders mag je de 2e call niet uitvoeren en krijg je een 401.

Gratis tip, stuur jezelf op de een of andere manier wel een notificatie als het aanmelden geslaagd is en/of bouw een validator hierop. Mocht het ooit niet werken, dan heb je niet direct een bekeuring aan je broek hangen.

[ Voor 6% gewijzigd door Richh op 01-08-2023 14:37 ]

☀️ 4500wp zuid | 🔋MT Venus 5kW | 🚗 Tesla Model 3 SR+ 2020 | ❄️ Daikin 3MXM 4kW


Acties:
  • +1 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Je kunt voor wat meer inzicht te verkrijgen, wellicht ook een tool als Postman gebruiken, dan kun je beter zien wat je terugkrijgt. Als er dan bijvoorbeeld een authorization bearer erbij zit, kun je die middels het token meenemen en moet je die dus in de Python code (ook) afvangen.

[ Voor 6% gewijzigd door CH4OS op 01-08-2023 14:46 ]


Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Bedankt voor de snelle reacties. Er wordt inderdaad een token gegeven dat was me ook opgevallen. Ik had dat al geprobeerd in de payload te stoppen, maar ik zal het nog via de header probereren.

Acties:
  • +1 Henk 'm!

  • hellum
  • Registratie: Oktober 2007
  • Laatst online: 12-09 17:03
Ik zou met je browsers development tools (of wireshark) eens nagaan wat er precies aan calls wordt gedaan, die kun je dan namaken.

Acties:
  • +1 Henk 'm!

  • theHoff
  • Registratie: April 2006
  • Niet online
Het zal een bearer token zijn die wordt verschaft.

Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
ik heb de volgende twee regels toegevoegd voor de session.post(

code:
1
2
token = json.loads(response.text)["Token"]
session.headers['Authorization'] = f'Token {token}'

hierdoor ziet session.headers er als volgt uit:
code:
1
{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0', 'Authorization': 'Token Ed7mUv7ggdaptxjXoH0lxtoiaQKW9fXu7TOE'}


Dit lijkt me correct.

Dit geeft 500 als statuscode dus daar schiet ik niet veel mee op. Ik maak hieruit op dat de server niet begrijpt wat het aanmoet met deze request. Ik lever iets dus op de verkeerde manier aan (toch?)

- ik heb ook geprobeerd alle headers te kopieren uit developer tools en alleen de token te veranderen naar de verkregen token. geeft ook 500
- ook heb ik het geprobeer zonder het woord Token erin of met Bearer. geeft ook 500
- Ik heb het ook geprobeerd met verschillende invullingen voor een "headers =" argument in de Session.post method. ook 500

Hartelijk bedankt nogmaals voor het meedenken.

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 30-09 22:56

remco_k

een cassettebandje was genoeg

Anomiseer je token even in het 2e code block.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 30-09 22:56

remco_k

een cassettebandje was genoeg

500 is een bad request, dus ja. Je doet nog iets fout. Dat hoeft natuurlijk niet aan de manier van token doorgeven te liggen. Maar kan wel.

Soms komt er bij een 500 ook wat extra info in de response text. Wellicht staat daar een hint in.

[ Voor 26% gewijzigd door remco_k op 01-08-2023 19:00 ]

Alles kan stuk.


Acties:
  • +1 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
remco_k schreef op dinsdag 1 augustus 2023 @ 18:55:
Anomiseer je token even in het 2e code block.
Ik had het al vervangen door een random string voor het voorbeeld. ;)

helaas geen extra info in response, alleen "Message":"An error has occurred." en "Internal server error" als reason. Wat denk ik dat gewoon default is.

[ Voor 30% gewijzigd door Völliglosgelöst op 01-08-2023 19:06 ]


Acties:
  • 0 Henk 'm!

  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

remco_k schreef op dinsdag 1 augustus 2023 @ 18:59:
500 is een bad request, dus ja. Je doet nog iets fout. Dat hoeft natuurlijk niet aan de manier van token doorgeven te liggen. Maar kan wel.

Soms komt er bij een 500 ook wat extra info in de response text. Wellicht staat daar een hint in.
500 is geen bad request, dat zou een 400 zijn. 500 betekend vaak een onverwachtte serverfout.
Völliglosgelöst schreef op dinsdag 1 augustus 2023 @ 18:48:
ik heb de volgende twee regels toegevoegd voor de session.post(

code:
1
2
token = json.loads(response.text)["Token"]
session.headers['Authorization'] = f'Token {token}'

hierdoor ziet session.headers er als volgt uit:
code:
1
{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0', 'Authorization': 'Token Ed7mUv7ggdaptxjXoH0lxtoiaQKW9fXu7TOE'}


Dit lijkt me correct.
[...]
Mij niet. Als het een bearer token is, verwacht ik (en openapi):
code:
1
'Authorization': 'Bearer <token>'

Verschillende methodes, verschillende standaarden. Op MDN staat wel een lijstje, maar Token staat daar niet tussen.

Dat kan ook de 500 verklaren. De server verwacht een keyword die aangeeft wat voor token er komt, om vervolgens (wellicht) een niet bestaand keyword te vinden.

Als je het zeker wilt weten, bezoek eens een pagina terwijl je bent ingelogd in de browser met de devtools open en kijk hoe dat verzoek er uit ziet

[ Voor 11% gewijzigd door Gropah op 01-08-2023 19:13 ]


Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Dit is de volledige (geanonimiseerde) request headers uit devtools

POST /DVSWebAPI/api/reservation/create HTTP/2
Host: aanvraagparkeren.groningen.nl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: application/json, text/plain, */*
Accept-Language: en,fr-FR;q=0.8,en-US;q=0.5,nl;q=0.3
Accept-Encoding: gzip, deflate, br
Authorization: Token Ed7mUv7ggdaptxjXoH0lxtoiaQKW9fXu7TOE
Content-Type: application/json;charset=utf-8
Content-Length: 185
Origin: https://aanvraagparkeren.groningen.nl
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
TE: trailers

Ik lees nog even die MDN pagina, misschien dat ik daar iets wijs uit word.

Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Ik denk niet dat het aan Authorization : Token ... komt ipv Authorization : Bearer.

Ik zie bijvoorbeeld dat dat hier: https://www.django-rest-framework.org/api-guide/authentication/ ook gebruikt wordt.

[ Voor 3% gewijzigd door Völliglosgelöst op 01-08-2023 19:38 ]


Acties:
  • 0 Henk 'm!

  • Falcon
  • Registratie: Februari 2000
  • Laatst online: 29-09 08:39

Falcon

DevOps/Q.A. Engineer

Völliglosgelöst schreef op dinsdag 1 augustus 2023 @ 19:37:
Ik denk niet dat het aan Authorization : Token ... komt ipv Authorization : Bearer.

Ik zie bijvoorbeeld dat dat hier: https://www.django-rest-framework.org/api-guide/authentication/ ook gebruikt wordt.
Als het token begint met "ey" dan is het een Bearer/JWT token. Deze kan je door encoden op https://jwt.io.

Maar kan je een geanomiseerde response bericht hier neerzetten (inclusief de headers) wat je terugkrijgt op de POST https://aanvraagparkeren.groningen.nl/DVSWebAPI/api/login?

[ Voor 3% gewijzigd door Falcon op 01-08-2023 19:59 ]

"We never grow up. We just learn how to act in public" - "Dyslexie is a bitch"


Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Dit post ik op https://aanvraagparkeren.groningen.nl/DVSWebAPI/api/login:
code:
1
{"identifier":"12345","loginMethod":"Pas","password":"1234","otp":null,"resetCode":null,"asIdentifier":null,"zipCode":null,"permitMediaTypeID":1}


Dit krijg ik als response:
code:
1
{"Token":"kWXblablatokenfraaldjaldkfuNqAApMcPu","Name":"","Permits":[{"Code":null,"Type":null,"TypeCode":null,"ZoneCode":"12345","PermitMedias":[{"TypeID":1,"Code":"12345","Balance":235,"ActiveReservations":

en dan nog heel veel dingen die gaan over welke kentekens zijn opgeslagen, maar dat een beetje veel werk om te anoniemiseren. lijkt verder geen belangrijke dingen in te staan"

dit zijn de request headers
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /DVSWebAPI/api/login HTTP/2
Host: aanvraagparkeren.groningen.nl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: application/json, text/plain, */*
Accept-Language: en,fr-FR;q=0.8,en-US;q=0.5,nl;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/json;charset=utf-8
Content-Length: 145
Origin: https://aanvraagparkeren.groningen.nl
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
TE: trailers


en dit de response headers
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/2 200 OK
cache-control: no-cache
pragma: no-cache
content-type: application/json; charset=utf-8
expires: -1
access-control-allow-origin: https://aanvraagparkeren.groningen.nl
access-control-allow-credentials: true
x-ua-compatible: IE=edge
x-frame-options: DENY
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains
x-xss-protection: 1
content-security-policy: connect-src 'self'; default-src 'none'; base-uri 'self'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'sha256-AtCDnvy4UO3dNrQ76vp/BTa8lQ58SALHfjVjUCFAIB0='; style-src 'self';
referrer-policy: no-referrer
permissions-policy: accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-lang=(), ch-prefers-color-scheme=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-full-version=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-viewport-width=(), ch-viewport-height=(), ch-width=()
date: Tue, 01 Aug 2023 18:08:39 GMT
content-length: 19619
X-Firefox-Spdy: h2

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 30-09 22:56

remco_k

een cassettebandje was genoeg

Gropah schreef op dinsdag 1 augustus 2023 @ 19:11:
[...]
500 is geen bad request, dat zou een 400 zijn. 500 betekend vaak een onverwachtte serverfout.
Je hebt gelijk. Vakantie hersenen.
code:
1
400 My bad

:P

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Falcon
  • Registratie: Februari 2000
  • Laatst online: 29-09 08:39

Falcon

DevOps/Q.A. Engineer

Völliglosgelöst schreef op dinsdag 1 augustus 2023 @ 20:19:
Dit post ik op https://aanvraagparkeren.groningen.nl/DVSWebAPI/api/login:
code:
1
{"identifier":"12345","loginMethod":"Pas","password":"1234","otp":null,"resetCode":null,"asIdentifier":null,"zipCode":null,"permitMediaTypeID":1}


Dit krijg ik als response:
code:
1
{"Token":"kWXblablatokenfraaldjaldkfuNqAApMcPu","Name":"","Permits":[{"Code":null,"Type":null,"TypeCode":null,"ZoneCode":"12345","PermitMedias":[{"TypeID":1,"Code":"12345","Balance":235,"ActiveReservations":

en dan nog heel veel dingen die gaan over welke kentekens zijn opgeslagen, maar dat een beetje veel werk om te anoniemiseren. lijkt verder geen belangrijke dingen in te staan"

dit zijn de request headers
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /DVSWebAPI/api/login HTTP/2
Host: aanvraagparkeren.groningen.nl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: application/json, text/plain, */*
Accept-Language: en,fr-FR;q=0.8,en-US;q=0.5,nl;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/json;charset=utf-8
Content-Length: 145
Origin: https://aanvraagparkeren.groningen.nl
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
TE: trailers


en dit de response headers
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HTTP/2 200 OK
cache-control: no-cache
pragma: no-cache
content-type: application/json; charset=utf-8
expires: -1
access-control-allow-origin: https://aanvraagparkeren.groningen.nl
access-control-allow-credentials: true
x-ua-compatible: IE=edge
x-frame-options: DENY
x-content-type-options: nosniff
strict-transport-security: max-age=31536000; includeSubDomains
x-xss-protection: 1
content-security-policy: connect-src 'self'; default-src 'none'; base-uri 'self'; frame-ancestors 'none'; img-src 'self'; script-src 'self' 'sha256-AtCDnvy4UO3dNrQ76vp/BTa8lQ58SALHfjVjUCFAIB0='; style-src 'self';
referrer-policy: no-referrer
permissions-policy: accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=(), ch-device-memory=(), ch-downlink=(), ch-dpr=(), ch-ect=(), ch-lang=(), ch-prefers-color-scheme=(), ch-rtt=(), ch-save-data=(), ch-ua=(), ch-ua-arch=(), ch-ua-bitness=(), ch-ua-full-version=(), ch-ua-mobile=(), ch-ua-model=(), ch-ua-platform=(), ch-ua-platform-version=(), ch-viewport-width=(), ch-viewport-height=(), ch-width=()
date: Tue, 01 Aug 2023 18:08:39 GMT
content-length: 19619
X-Firefox-Spdy: h2
Ik denk dat je hier tegen CSP en CORS aanloopt om xss (Cross Site Scripting) te voorkomen, met andere woorden.. jouw POST op de andere endpoints zal niet werken met alleen dit token.

Eigenlijk heel goed van gemeente Groningen! :)

Mocht je de aanvraag via een Browser sessie willen doen, dan zal je ook een browser-sessie moeten naspelen.. hierin kan bijv. https://Cypress.io je heel goed helpen.

Op API-level verwacht ik niet dat je dit kunt uitvoeren.

"We never grow up. We just learn how to act in public" - "Dyslexie is a bitch"


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je login gaat blijkbaar goed, nu dus enkel nog een kwestie van requests van dat andere endpoint vergelijken en kat in het bakkie. Er zal dus nog een verwchil zitten tussen de browser request en de request door code.

{signature}


Acties:
  • +1 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Nu online
Falcon schreef op dinsdag 1 augustus 2023 @ 20:41:
[...]


Ik denk dat je hier tegen CSP en CORS aanloopt om xss (Cross Site Scripting) te voorkomen, met andere woorden.. jouw POST op de andere endpoints zal niet werken met alleen dit token.

Eigenlijk heel goed van gemeente Groningen! :)

Mocht je de aanvraag via een Browser sessie willen doen, dan zal je ook een browser-sessie moeten naspelen.. hierin kan bijv. https://Cypress.io je heel goed helpen.

Op API-level verwacht ik niet dat je dit kunt uitvoeren.
dat is niet de output die je bij een issue met CORS zou verwachten, dan zou het eerder in het proces al moeten falen en niet een dergelijke body met enige relevante inhoud kunnen verwachten. Maar dat is een aanname. Ik vermoed eerder dat het request niet compleet of correct is.

|>


Acties:
  • 0 Henk 'm!

  • Christiaan676
  • Registratie: December 2011
  • Laatst online: 29-09 20:36
Als ik het goed zie stuur je geen contenttypes op dus voeg is het volgende toe:

Content-Type: application/json;charset=utf-8
Accept: application/json, text/plain, */*

Als zou je verwachten dat de login daar dan ook over zou struikelen.

[ Voor 17% gewijzigd door Christiaan676 op 01-08-2023 20:56 ]


Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Wat fijn dat de gemeente dat op orde heeft. Ik ga ervanuit dat dit gewoon een service is die ze ergens kopen want een snelle google laat zien dat veel gemeentes dezelfde portal gebruiken.

Ik begrijp niet goed hoe de server zou moeten weten dat ik niet vanuit een browser dit request doe, aangezien ik (probeer) identieke POSTS en headers gebruik, maar ik heb hier ook helemaal geen verstand van.

Ik heb het al wel succesvol met Selenium gedaan, maar dit leek me veel efficienter.

Acties:
  • 0 Henk 'm!

  • FreakNL
  • Registratie: Januari 2001
  • Laatst online: 13:43

FreakNL

Well do ya punk?

JEightyFive schreef op dinsdag 1 augustus 2023 @ 14:30:
En als een keer iemand anders op bezoek komt wordt haar kenteken aangemeld? :+
Volgens mij is dit typisch zo'n gevalletje van overengineering. Wat als ze een keer een wijziging aanbrengen? De site ligt er even uit?
Ik ben wel benieuwd hoeveel mensen straks een boete te pakken hebben na een bezoekje :')
Het is natuurlijk wel een leuk projectje. Maar inderdaad, als zij de frontend/api veranderen kun je weer aan de gang. En bovendien, als jouw script eruit ligt (wellicht zelfs door een fout van de andere kant), krijg jij dan de schuld?

Ik zou het bij jezelf houden en je schoonmoeder een SMS/push bericht/signal/telegram sturen als haar auto in de buurt is. Daarna is het haar eigen verantwoording

Acties:
  • 0 Henk 'm!

  • eJazz42
  • Registratie: Augustus 2019
  • Laatst online: 27-09 08:09
Vaak zitten in dit soort tools bepaalde bot checks die bijvoorbeeld kijken of de referrer goed ingesteld staat, de cookies allemaal netjes worden geplaatst en of javascript aan staat.
Uiteindelijk is het vaak wel na te bouwen, maar werkt een tool als cypress, selenium of puppeteer gewoon sneller out of the box omdat dat in essentie ook echt 'normale' browsers zijn.

Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
FreakNL schreef op dinsdag 1 augustus 2023 @ 20:59:
[...]


Het is natuurlijk wel een leuk projectje. Maar inderdaad, als zij de frontend/api veranderen kun je weer aan de gang. En bovendien, als jouw script eruit ligt (wellicht zelfs door een fout van de andere kant), krijg jij dan de schuld?

Ik zou het bij jezelf houden en je schoonmoeder een SMS/push bericht/signal/telegram sturen als haar auto in de buurt is. Daarna is het haar eigen verantwoording
Ik waardeer deze bezorgdheid echt. Het is natuurlijk zonde als je denkt dat het werkt en ze krijgt dan een boete. Ik denk ook dat dat wel te ondervangen is met goede foutmeldingen en validatie. Ik zie bijvoorbeeld dat bij het inloggen de response een overzicht van aangemelde auto's geeft, hiermee kun je natuurlijk makkelijk controleren of de auto is aangemeld. Een notification dat het aanmelden gelukt of gefaalt is lijkt me veilig genoeg. Als ze dan een boete krijgt omdat ik wat te arrogant was, tja dan is het mijn schuld en dan kost dit projectje me een paar tientjes.

Ik beschouw het trouwens wel als mijn verantwoordelijkheid om haar aan te melden, ze komt immers gratis kinderopvang verzorgen. Haar parkeren regelen is toch wel het minste wat daar tegenover mag staan.

Acties:
  • +2 Henk 'm!

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 30-09 23:50

Klippy

Still Game

Zo te zien gebruik je Firefox. In je developer tools in het netwerktabje, onder de XHR requests kan je het hele POST request opslaan als HAR file (of kopieren). Rechtermuisknop en dan "Alles opslaan als HAR" of onder Waarde kopiëren -> "Alles kopiëren als HAR".

Dat kan je in Postman importeren https://blog.postman.com/...orts-importing-har-files/

Dan heb je 100% zeker het hele request. Probeer eens of je dat kan verzenden vanuit Postman?

[edit] Ik bedoel dus het POST request naar https://aanvraagparkeren....PI/api/reservation/create, niet de login.

[ Voor 12% gewijzigd door Klippy op 01-08-2023 21:20 ]

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Acties:
  • +3 Henk 'm!

  • Tidaku
  • Registratie: Oktober 2000
  • Niet online
Misschien helpt dit ook nog:

https://github.com/tcoenraad/python-dvsportal

Acties:
  • 0 Henk 'm!

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 30-09 23:50

Klippy

Still Game

Goed gevonden.
Ik had er ook naar gezocht maar niks gevonden, ook niet op delen van de input, ene Google zoekopdracht naar "permitMediaTypeID" geeft alleen dit topic :)

Die repository lijkt wel vrij compleet ja.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Acties:
  • +1 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Oh dat ziet er inderdaad veel belovend uit. Ik ga dat proberen te lezen. Als ik zo door dvsportal.py en example.py scroll lijkt het wel te begrijpen. Ik ben wel echt een noob hoor, dus het zal wel even duren.

Oh de example.py heb ik werkend gekregen en geeft zoals verwacht de aangemelde auto's weer. Ik ga morgen even proberen of het me ook lukt om iets aan te melden.

[ Voor 44% gewijzigd door Völliglosgelöst op 01-08-2023 21:43 ]


Acties:
  • +2 Henk 'm!

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 30-09 23:50

Klippy

Still Game

Het Pyton script lijkt nog een base64 encoding op het token uit de login response te doen voordat het in de header wordt gezet...

En wat UTF-8 encoding, maar die lijkt me overbodig, de response is al UTF-8.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Acties:
  • 0 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Klippy schreef op dinsdag 1 augustus 2023 @ 21:43:
Het Pyton script lijkt nog een base64 encoding op het token uit de login response te doen voordat het in de header wordt gezet...

En wat UTF-8 encoding, maar die lijkt me overbodig, de response is al UTF-8.
Je hebt het hierover toch?

code:
1
2
3
4
5
async def authorization_header(self):
        await self.token()
        return {
            "Authorization": "Token " + str(base64.b64encode(self._token.encode("utf-8")), "utf-8")
        }

Acties:
  • +4 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
het werkt!

De onderstande aanpassing in example.py werkt om een kenteken aan te melden!
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import asyncio

from dvsportal import DVSPortal


async def main(loop):
    """Show example on fetching permits from DVSPortal."""
    async with DVSPortal(api_host="aanvraagparkeren.groningen.nl",
                         identifier="12345",
                         password="1234",
                         loop=loop) as dvs:
        token = await dvs.token()
        print("Token:", token)
        await dvs.update()
        aanmelden = await dvs.create_reservation(license_plate_value='12AB34', type_id='1', code='zelfde als identifier')
        print("aanmelden:", aanmelden)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(loop))

Acties:
  • 0 Henk 'm!

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 30-09 23:50

Klippy

Still Game

Völliglosgelöst schreef op dinsdag 1 augustus 2023 @ 21:46:
[...]


Je hebt het hierover toch?

code:
1
2
3
4
5
async def authorization_header(self):
        await self.token()
        return {
            "Authorization": "Token " + str(base64.b64encode(self._token.encode("utf-8")), "utf-8")
        }
Ja die regel.

Nu je het werkend hebt zie ik geen reden waarom je eigen script niet kan werken met een kleine aanpassing.

Maar fijn dat het werkt d:)b Dit soort problemen zijn meestal maar kleine issues, alleen lastig te vinden, zeker zonder documentatie.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Acties:
  • 0 Henk 'm!

  • Puch-Maxi
  • Registratie: December 2003
  • Laatst online: 30-09 23:54
@Völliglosgelöst Wat een leuk project! Nu het werkt, mag ik vragen hoe je het kenteken detecteert?
Gaat het op basis van ANPR of kijk je of de mobiel (wifi) van je schoonmoeder in de buurt is oid? :)

My favorite programming language is solder.


Acties:
  • +1 Henk 'm!

  • Tidaku
  • Registratie: Oktober 2000
  • Niet online
Mooi! Nu ben ik ook wel benieuwd hoe je de boel hebt geautomatiseerd.

En kun je werkende script plaatsen?

Acties:
  • 0 Henk 'm!

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 30-09 23:50

Klippy

Still Game

Puch-Maxi schreef op dinsdag 1 augustus 2023 @ 22:41:
@Völliglosgelöst Wat een leuk project! Nu het werkt, mag ik vragen hoe je het kenteken detecteert?
Gaat het op basis van ANPR of kijk je of de mobiel (wifi) van je schoonmoeder in de buurt is oid? :)
Dat lijkt me wat ver gezocht, hij heeft het over Home Assistant, die hebben standaard zones op basis van GPS van je telefoon. Dan moet hij wel de app installeren op haar telefoon, maar dat zal niet zo'n issue zijn.

Bijkomend voordeel is dat, je de parkeer API een 200 teruggeeft, hij automatisch een pushbericht (of SMS) kan sturen naar zijn schoonmoeder.

Het zou een mooie plugin zijn voor https://hacs.xyz/, dan kan je het parkeren helemaal integreren. Die Python code op Github zal een mooie basis zijn, als iemand zich geroepen voelt ben je zo te zien de eerste, lijkt me wel markt voor. Heb hem zelf niet nodig overigens dus kan het ook niet testen.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


Acties:
  • +4 Henk 'm!

  • Völliglosgelöst
  • Registratie: Augustus 2020
  • Laatst online: 04-11-2024
Bedankt voor jullie interesse.

De manier waarop ik nu de aanwezigheid van de auto check is inderdaad met de companion app van home assistant. Ik heb een automation die getriggerd wordt als haar mobiel verbinding verliest met de bluetooth van haar auto, de automation wacht dan 3 minuten en checkt of haar mobiel verbindig heeft gemaakt met de wifi hier in huis zoja dan auto aanmelden. Ditzelfde maar dan omgekeerd voor het afmelden van de auto.

Eenvoudiger zou zijn door alleen het detecteren van haar mobiel op de wifi, maar ja wat als ze dan een keer niet met de auto komt?
Klippy schreef op dinsdag 1 augustus 2023 @ 23:56:
[...]

Het zou een mooie plugin zijn voor https://hacs.xyz/, dan kan je het parkeren helemaal integreren. Die Python code op Github zal een mooie basis zijn, als iemand zich geroepen voelt ben je zo te zien de eerste, lijkt me wel markt voor. Heb hem zelf niet nodig overigens dus kan het ook niet testen.
Ja dit was ook een beetje het doel, want hoe ik het to nu toe deed was home assistant -> appdeamon -> selenium in een docker. Maar vooral foutmeldingen goed opvangen met selenium en dan weer helemaal terug krijgen naar home assistant was erg veel werk.

Als ik de docs van home assistant lees is een integration schrijven niet super ingewikkeld, zeker niet als iemand anders als 90% van de code geschreven heeft, dus ik denk dat ik dit nu wel kan proberen.

Acties:
  • +1 Henk 'm!

  • Tarquin
  • Registratie: Januari 2002
  • Laatst online: 30-09 10:04
Ik lees mee vanwege die tokens.
Het zou misschien ook met een headless browser kunnen. Dan houdt de browser gewoon bij dat je ingelogd bent. Check in dat geval ook even playwright ipv selenium.

Wat betreft de trigger kun je ook nog een knop aan de muur hangen: "Reserveer NU een parkeerplaats voor moeder". Dat scheelt wat tricky dingetjes met bluetooth en een wachttijd enzo.

Nog ééntje dan: Als zij thuis de wifi verliest en binnen 20 minuten op jouw wifi komt, is ze sowieso met de auto.

Het één sluit het ander niet uit - je kunt meerdere triggers hebben.

Acties:
  • 0 Henk 'm!

  • Puch-Maxi
  • Registratie: December 2003
  • Laatst online: 30-09 23:54
Tarquin schreef op woensdag 2 augustus 2023 @ 13:06:
Nog ééntje dan: Als zij thuis de wifi verliest en binnen 20 minuten op jouw wifi komt, is ze sowieso met de auto.
Ja, of met de trein/bus/racefiets/leenauto. Neem aan dat het op kenteken gaat, dus als de schoonmoeder met een andere auto komt dan heeft ze een probleem? :).

My favorite programming language is solder.


Acties:
  • +1 Henk 'm!

  • Tarquin
  • Registratie: Januari 2002
  • Laatst online: 30-09 10:04
Puch-Maxi schreef op woensdag 2 augustus 2023 @ 18:48:
[...]

Ja, of met de trein/bus/racefiets/leenauto. Neem aan dat het op kenteken gaat, dus als de schoonmoeder met een andere auto komt dan heeft ze een probleem? :).
Tsja, zo moet je óf alles of niets automatiseren. Een regel die je 'slechts' 99% van het werk bespaart ga je niet implementeren omdat je de laatste 1% uitzonderingen niet afdekt.
Met home-automation gebruik je heel veel afgeleide regels!

Acties:
  • 0 Henk 'm!

  • NeFoRcE
  • Registratie: Mei 2004
  • Laatst online: 14:45

NeFoRcE

Hallo? Bent u daar?

offtopic:
Ik denk dat je er beter voor kunt zorgen dat je schoonmoeder niet meer op bezoek komt, dat maakt het leven een stuk aangenamer!

Professioneel Heftruck Syndroom


Acties:
  • +1 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 29-09 19:35
Ik weet niet of iemand het hier boeit, maar, ik ben bezig hier iets voor te maken in Home Assistant.

Zie https://github.com/ChessSpider/ha-dvsportal

T.z.t. maak ik het wel HACS compatible. Voor nu moet je zelf een checkout doen van de repository in de custom_integrations mapje. Daarna home assistant herstarten, en DVSPortal integratie toevoegen via het menu.

Development gaat nogal hard nu.

Acties:
  • 0 Henk 'm!

  • Tidaku
  • Registratie: Oktober 2000
  • Niet online
ChessSpider schreef op vrijdag 22 september 2023 @ 12:48:
Ik weet niet of iemand het hier boeit, maar, ik ben bezig hier iets voor te maken in Home Assistant.

Zie https://github.com/ChessSpider/ha-dvsportal

T.z.t. maak ik het wel HACS compatible. Voor nu moet je zelf een checkout doen van de repository in de custom_integrations mapje. Daarna home assistant herstarten, en DVSPortal integratie toevoegen via het menu.

Development gaat nogal hard nu.
Ja leuk! Ik heb de integratie toegevoegd, maar bij het instellen van de integratie moeten vier lege invoervelden worden ingevuld. Uit config_flow.py haal ik dat de velden api-host, username, password en user-agent zijn. De veldnamen missen dus nog.

Had je al gezien dat alle beschikbare api functies in dit js bestand staan: https://parkeerproducten....t-f3b8641d06df02187099.js

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 29-09 19:35
Tidaku schreef op vrijdag 22 september 2023 @ 21:43:
[...]


Ja leuk! Ik heb de integratie toegevoegd, maar bij het instellen van de integratie moeten vier lege invoervelden worden ingevuld. Uit config_flow.py haal ik dat de velden api-host, username, password en user-agent zijn. De veldnamen missen dus nog.

Had je al gezien dat alle beschikbare api functies in dit js bestand staan:
ah leuk dat er interesse is! Kan het zijn dat je de taal van ha op NL hebt ? Ik had dit ook totdat ik een translations bestand in translations/en.json zette. Ik had aangenomen dat ha die wel als fallback zou pakken, maar dan blijkbaar toch niet. Ik zal wel aan chatgpt vragen om een nl.json te genereren.

Mbt API functies, nee nog niet naar gekeken! Maar dat js bestandje is wel een grote blob; ik denk dat het makkelijker is om via de website een reservering te maken en dan de response json te doorzoeken. Daar lijkt sowieso al alle informatie in te zitten die nuttig is !

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 29-09 19:35
@Tidaku kan je een git pull doen ? Volgens mij werkt het nu beter. Zie ook de create / end reservation services.

  • Tidaku
  • Registratie: Oktober 2000
  • Niet online
Ziet er goed uit en werkt ook al naar behoren. De api's waar ik het over had zijn de volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
login/getbase
permitlicenseplate/upsert
permitlicenseplate/remove
permitmedialicenseplate/upsert
permitmedialicenseplate/remove
reservation/create
reservation/update
reservation/end
upgrade
payment/checktransaction
history/reservations
history/upgrades
history/movebalances


Ik heb nog niet geprobeerd of het mogelijk is om met create reservation ook een reservering te updaten, zoniet dan zou de volgende nog wel handig zijn:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
            prolongReservation: function(e, t, n, i) {
                var o = {};
                return o.Minutes = e,
                o.ReservationID = t,
                o.permitMediaTypeID = n,
                o.permitMediaCode = i,
                l({
                    method: "POST",
                    url: "".concat(s, "reservation/update"),
                    data: o
                }, (function(e, t) {
                    e.ErrorMessage ? t.reject({
                        code: e.Result,
                        message: e.ErrorMessage
                    }) : (a.setBaseModel(e),
                    t.resolve())
                }
                ))
            }


In theorie is het mogelijk om alle functies van webapp in home assistant te ontsluiten zodat die hele app niet meer nodig is.

Mijn taalinstellingen staan inderdaad op Nederlands.

Acties:
  • +2 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 29-09 19:35
Afbeeldingslocatie: https://tweakers.net/i/ED3yMfBnEdU9G9hh3NZi7YJTEVQ=/x800/filters:strip_icc():strip_exif()/f/image/QFsIJGb1k3MleBUqL2bMeYM9.jpg?f=fotoalbum_large

:9~

Ik wil denk ik `permitmedialicenseplate/upsert` ook implementeren (met payload {"permitMediaTypeID":1,"permitMediaCode":"<snip>","licensePlate":{"Value":"18aabb","Name":"Test12"},"updateLicensePlate":null} )


wijzigen van reserving ga ik denk ik niet implementeren. Ik heb nu "maak nieuwe reservering" en "annuleer huidige/komende reservering". Dat is voor mij iig voorlopig genoeg.

Nu ff code opschonen en hacs compatible maken en dan weer door met hogwarts legacy :)

[ Voor 38% gewijzigd door ChessSpider op 23-09-2023 23:25 ]


Acties:
  • 0 Henk 'm!

  • maart84
  • Registratie: November 2012
  • Laatst online: 30-09 11:57
Top dit werkt perfect! Nu hoef ik die lelijke website niet meer te gebruiken.

Update: ai, net bericht dat ze in Leiden per 6 november de parkeer website gaan updaten. Ben benieuwd of het andere software wordt...

[ Voor 47% gewijzigd door maart84 op 16-10-2023 11:38 ]

Pagina: 1