Telegram botti

Telegram botti

February 23, 2021 Off By eetuk

Harjoituksen vuoksi aloin tekemään omaa bottia Telegrammiin. Löysin netistä Pythonilla tehdyn valmiin rungon telegram botille jonka pohjalta aloitin. Valmiin koodin sekä Telegrammin dokumentaation avulla pääsin nopeasti vauhtiin.

Yksinkertaistettuna botti toimii saamalla Telegrammilta botille lähtettyjä viestejä HTTP get metodilla osoitteesta https://api.telegram.org/bot<botin_API_avain>/getUpdates.

Viestien lähettäminen toimii vastaavasti HTTP post metodilla osoitteeseen https://api.telegram.org/bot<botin_API_avain>/sendMessage?chat_id=chatID?text=viesti.

Luin rungon koodin tarkasti ajatuksella läpi muutaman kerran jotta ymmärtäisin kuinka se toimii

Weather:

Halusin botille komennon, joka kertoo sään haluamasta paikasta.

Löysin netistä ilmaisen sääpalvelun jossa oli simppeli ja tosi hyvin dokumentoitu API.

Sanan weather jälkeiset sanat täytyi lähettää sääpalvelulle ja palauttaa tulos viestinä.

#Palauta haluttu tieto sääpalvelun JSONista
return str(
"Weather in "+
r.json()["name"]
+" (°C)\n" +
str(r.json()["weather"][0]["description"]).capitalize()
+ "\nTemperature: " + 
str(r.json()["main"]["temp"])+
"\nFeels like: "
+ str(r.json()["main"]["feels_like"])
)

/*Esimerkki sääpalvelun tuloksesta*/
{
  "coord": {
    "lon": -118.2437,
    "lat": 34.0522
  },
  "weather": [
    {
      "id": 802,
      "main": "Clouds",
      "description": "scattered clouds",
      "icon": "03n"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 11.11,
    "feels_like": 9.91,
    "temp_min": 7.78,
    "temp_max": 13,
    "pressure": 1015,
    "humidity": 76
  },
  "visibility": 10000,
  "wind": {
    "speed": 0.73,
    "deg": 55
  },
  "clouds": {
    "all": 40
  },
  "dt": 1613472470,
  "sys": {
    "type": 1,
    "id": 3694,
    "country": "US",
    "sunrise": 1613486188,
    "sunset": 1613525871
  },
  "timezone": -28800,
  "id": 5368361,
  "name": "Los Angeles",
  "cod": 200
}

Viestin voi laittaa myös muodossa “weather in” eikä isoilla kirjaimilla ole väliä.

# jos "weather" mainitaan viestissä
if "weather" in first_chat_text.lower():
    # jaetaan viesti sarjaksi sanoja ja pienennetään isot kirjaimet
    split = first_chat_text.lower().split()
    place = ""
    # jos kaupunkia ei anneta oletetaan Kajaania
    if len(split) is 1:
        place = "Kajaani"
    # ei välitetä in sanasta.
    elif "in" in split[1]:
        for i in range(2, len(split)):
            # laitetaan in jälkeen tulevat sanat place muuttujaan
            place += split[i] + " "
    # jos paikka on yksisanainen
    elif len(split) is 2:
        place = split[1]
    else:
        for i in range(1, len(split)):
            place += split[i] + " "
    place = place.strip()
    # pyydetään sääfunktiolta säätietoja kaupungista
    response = weather.getWeather(place)
    # lähetetään säätiedot
    protokettu.send_message(first_chat_id, response)

JSON:

Opin tässä ymmärtämään ja käyttämään json formaattia. Telegram APIlta saadut viestipäivitykset ovat json formaatissa ja niistä saa kaiken tarvittavan tiedon. Sama homma sään APIn kanssa.

Tallennetut ketut ovat hyvin optimaalisessa formaatissa

Opin myös tallentamaan ja lähettämään kuvia hyvin “kevyellä” tavalla. Jos lähetin botille kuvan ja otin botilla kuvan sekä chatin IDt talteen, pystyin myöhemmin lähettämään kyseisen kuvan botilla minne vain. Itse kuva on siis tallessa Telegrammin palvelimella ja pääsen siihen käsiksi vain muutamalla numerolla!

Täten tein komennon “upload fox”! Jos lähetin kuvan tai videon tuolla tekstillä botti ottaa talteen viestin ja chatin IDt. Sitten komennolla fox botti arpoo yhden kuvista ja lähettää sen.

Ajatuksia

Tässä työssä haastavinta mutta myös palkitsevinta oli APIen käytön opettelu. Nyt nekin sujuu paremmin.