Detta inlägg är gammalt och kan innehålla inaktuell information.

ÅÄÖ GTFS RT

Hej

Jag har ett problem med åäö ur framförallt servicealerts för Östgötatrafiken. Jag vet inte om jag kan ha missat någon header för att få svaret bra encodat från början, men hur som ser svaret ut som nedan. Jag är högst osäker på om detta är specifikt ÖT problem eller om det är ett generellt problem i mitt pythonscript. Hoppas någon har nåt bra förslag.

Jag har dessutom svårt att hitta testmiljön för api anrop.


delar av api svar Ä=\303 vilket tyder på att jag skulle behöva decoda detta på något vis.
description_text {
translation {
text: " Aspn\303\244set - Berga centrum kl 13:14 \303\244r f\303\266rsenad cirka 10 minuter p\303\245 grund av fordonsfel. "
}

pythonscript
#-*- coding: utf-8 -*-
from google.transit import gtfs_realtime_pb2
import requests
headers={'accept':'application/zip','Accept-encoding':'br, gzip, deflate','If-Modified-Since': 'Mon, 13 Jul 2020 04:24:36 GMT','If-None-Match':'bfc13a64729c4290ef5b2c2730249c88ca92d82d','Method':'GET','ContentType':'application/zip'}
feed = gtfs_realtime_pb2.FeedMessage()
response = requests.get('https://opendata.samtrafiken.se/gtfs-rt/otraf/ServiceAlerts.pb?key=???????????????????????????????', headers=headers)
open('output.pb','wb').write(response.content)
feed.ParseFromString(response.content)
for entity in feed.entity:
if entity.HasField('id'):
print(entity)


Marcus Karlsson

Kommentarer

  • Hej Marcus,

    Eftersom att du sparar response.content som binär data i filen borde den delen gå bra.
    Det kan dock kanske vara att du måste använde .decode(encoding='utf-8') för att avkoda de parsade entiteter (alltså i den sista raden i din exempel-kod).
    Ett exempel hittar du här: https://stackoverflow.com/questions/13110629/decoding-utf-8-strings-in-python.

    Vi har inget testmiljö som är publikt tillgängligt.

    Hälsningar,
    Bert
    Bert på Trafiklab
  • Tack för snabbt svar, man vill tro att denna kod kunde fungerat men något missas i alla fall.

    script.py

    #-*- coding: utf-8 -*-
    from google.transit import gtfs_realtime_pb2
    import requests
    headers={'accept':'application/zip','Accept-encoding':'br, gzip, deflate','If-Modified-Since': 'Mon, 13 Jul 2020 04:24:36 GMT','If-None-Match':'bfc13a64729c4290ef5b2c2730249c88ca92d82d','Method':'GET','Conten>feed = gtfs_realtime_pb2.FeedMessage()
    response = requests.get('https://opendata.samtrafiken.se/gtfs-rt/otraf/ServiceAlerts.pb?key=???????????????????????????????', headers=headers)
    open('output.pb','wb').write(response.content)
    feed.ParseFromString(response.content)
    for entity in feed.entity:
    if entity.HasField('id'):
    text=entity.decode("utf-8")
    print(text)
    Marcus Karlsson
  • Jag tror att du måste köra .decode() på en byte-array, och att man därför ska köra .encode() med den felaktiga encoding först. Så till exempel entity.encode("windows-1252").decode("utf-8")

    Bert på Trafiklab
  • Tack för ännu ett snabbt svar, men jag har dessvärre ingen framgång har testa ett par varianter men får argument error på .encode och .decode dessvärre. Modifierat script nedan, nu syns ju inte pythons indentionspå forumet men det kanske går att läsa ändå. Tacksam för alla tips jag kan få. Jag är absolut ingen professionell utvecklare utan bara för nöjes skull.

    #-*- coding: utf-8 -*-
    from google.transit import gtfs_realtime_pb2
    import requests
    headers={'accept':'application/zip','Accept-encoding':'br, gzip, deflate','If-Modified-Since': 'Mon, 13 Jul 2020 04:24:36 GMT','If-None-Match':'bfc13a64729c4290ef5b2c2730249c88ca92d82d','Method':'GET','ContentType':'application/zip'}
    feed = gtfs_realtime_pb2.FeedMessage()
    response = requests.get('https://opendata.samtrafiken.se/gtfs-rt/otraf/ServiceAlerts.pb?key=????????????????????????????????', headers=headers)
    open('output.pb','wb').write(response.content)
    feed.ParseFromString(response.content)
    for entity in feed.entity:
    if entity.HasField('id'):
    ## testat två varianter med och utan decodesom första argument.
    txt=entity.decode("utf-8").encode("windows-1252").decode("utf-8")
    print(entity)


    Marcus Karlsson
  • Hej Marcus,

    Jag testade och det fungerar bra när man läser specifika fält. Det krånglar bara när man skriver ut hela meddelandet:

    from google.transit import gtfs_realtime_pb2
    import requests
    headers={'accept':'application/zip','Accept-encoding':'br, gzip, deflate','If-Modified-Since': 'Mon, 13 Jul 2020 04:24:36 GMT','If-None-Match':'bfc13a64729c4290ef5b2c2730249c88ca92d82d','Method':'GET','ContentType':'application/zip'}
    feed = gtfs_realtime_pb2.FeedMessage()
    response = requests.get('https://opendata.samtrafiken.se/gtfs-rt/otraf/ServiceAlerts.pb?key=', headers=headers)
    open('output.pb','wb').write(response.content)
    feed.ParseFromString(response.content)
    for entity in feed.entity:
    if entity.HasField('alert'):
    print(entity.alert.header_text.translation[0].text)

    skriver ut

    Hållplats Bollhusgatan avstängd 13 oktober - 30 januari
    Hållplats Gusums centrum flyttas tillfälligt 16 - 29 januari
    Krösatågen ersätts med buss mellan Linköping och Västervik 19 januari

    Hälsningar,
    Bert

    Bert på Trafiklab
  • Tack för hjälpen Bert

    Denna hjälp tog mig ett steg längre så nu kan jag få rätsida på åäö. Jag kommer hårdkoda en riktig .json från denna data för att sedan publicera realtidsdata och störningar på min avgångstavla som kommer täcka min buss och tågtrafik i samma vy. Klockrent att denna möjlighet finns även om vi hobby kodare kan ha det lite motigt ibland.

    För närvarande har jag ett gäng frågor till, men de kommer tas i separata trådar om jag inte löser dem.

    Trevlig helg.
    Marcus Karlsson
  • Vad skönt att det löste sig! Tveka inte att höra av dig om du fastnar med en av dina andra frågor.

    Hälsningar,
    Bert

    Bert på Trafiklab

Kommentera eller skriv ett nytt inlägg

Ditt namn och inlägg kan ses av alla. Din e-post visas aldrig publikt.