Telegram Üzerinden IOT

Bu makalede, Telegram API’si üzerinden Bot’ları haberleştirmenin yolu açıklanmaktadır. Bu sayede; haberleşme katmanının Telegram üzerinden gerçekleştiği IOT uygulamaları geliştirilebilir.

Burada anlatılan API’nin örnek iOS (Swift) uygulamasını https://github.com/keremkoseoglu/Swift-Library/tree/master/EasyTelegram adresine görebilirsiniz.

Bot Oluşturma

Öncelikle örnek Bot’lara ihtiyacımız olacak. Bu iş için, Telegram’ın BotFather hesabına yazarak Bot’ları yaratıyoruz. Bu işlemin detayları, https://core.telegram.org/bots#6-botfather adresinde açıklanmıştır. Burada açıklandığı şekilde Bot’larımızı oluşturuyoruz.

Her bir Bot için bir Token’ımız oluyor. Bu Token’ı not etmemiz gerekiyor. Örnek bir Token, 908248142:AAEhftGMYS33gjdfB5OcaEn4P0qk745Qz_9 formatında olabilir.

Bot ayarlarında; Allow Groups etkin ve Group Privacy devre dışı olmalıdır. 

Channel Açma

Telegram, normal şartlar altında Bot’ların birbiriyle konuşmasını önlemiştir. Bot’lar birbirlerinin mesajlarını göremezler. Bunun tek istisnası, bir Channel içerisinde Admin olan Bot’lar (diğer Bot’lar dahil) tüm iletileri görebilmektedir. Bu yüzden, bir Channel oluşturup, tüm Bot’ları buraya dahil edip, hepsini Admin yapıyoruz.

Bu kanalın ID’sini not ediyoruz. Örnek bir ID, – işareti ile başlar. Mesela -1001171080089 formatında olabilir.

Bot İle Mesaj Gönderme

Bot ile kanala mesaj göndermek için, Bot ID ve Channel ID’yi birleştirerek oluşturduğumuz URL’yi çağırmak yeterlidir. Örnek bir adres:  https://api.telegram.org/bot908248142:AAEhftGMYS33gjdfB5OcaEn4P0qk745Qz_9/sendMessage?chat_id=-1001171080089&text=Hello

Bu adres; söz konusu Bot üzerinden, ilgili kanala “Hello” iletisini göndermektedir. Cevaben dönen JSON verisi, mesajın başarılı gidip gitmediğini gösterir. 

{
   "ok": true,
   "result": {
     "message_id": 389,
     "chat": {
       "id": -1001171080089,
       "title": "kkbotschannel",
       "type": "channel"
     },
     "date": 1556538469,
     "text": "Hello"
   }
 }

HTTP Get yerine HTTP Post ile de mesaj gönderilebilir, bu konuda Telegram kaynaklarına bakabilirsiniz.

Gelen Mesajları Okuma

Bot’a gelen (özel mesaj veya kanal mesajı formatındaki) iletileri çekmek için, yine belli bir URL’yi çağırmak yeterlidir.

Örnek bir adres: https://api.telegram.org/bot908248142:AAEhftGMYS33gjdfB5OcaEn4P0qk745Qz_9/getUpdates

Cevaben dönen JSON verisi, gelen iletileri barındırır.

{
   "ok": true,
   "result": [
     {
       "update_id": 215790851,
       "channel_post": {
         "message_id": 386,
         "chat": {
           "id": -1001171080089,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556522887,
         "text": "/test",
         "entities": [
           {
             "offset": 0,
             "length": 5,
             "type": "bot_command"
           }
         ]
       }
     },
     {
       "update_id": 215790852,
       "channel_post": {
         "message_id": 387,
         "chat": {
           "id": -1001171080089,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556537185,
         "text": "/setup_for_project drone:kkbot03bot project:dummy",
         "entities": [
           {
             "offset": 0,
             "length": 18,
             "type": "bot_command"
           }
         ]
       }
     },
     {
       "update_id": 215790853,
       "channel_post": {
         "message_id": 388,
         "chat": {
           "id": -1001171080089,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556537195,
         "text": "/my_project_setup drone:kkbot03bot project:dummy success:TRUE",
         "entities": [
           {
             "offset": 0,
             "length": 17,
             "type": "bot_command"
           }
         ]
       }
     },
     {
       "update_id": 215790854,
       "channel_post": {
         "message_id": 389,
         "chat": {
           "id": -1001171080089,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556538469,
         "text": "Hello"
       }
     }
   ]
 }

Bu dönen sonuçta; Chat ID üzerinden kanala gelmiş iletileri filtrelenebilir.

Bu API’de bir kerede dönecek ileti sayısı sınırlıdır. URL’ye ?offset=x şeklinde belli bir update_id +1 değeri verilirse, o message_id’den sonraki iletiler gelecektir.

Üstteki örnekte; ilk iletiyi (215790851) pas geçmek istersek, https://api.telegram.org/bot908248142:AAEhftGMYS33gjdfB5OcaEn4P0qk745Qz_9/getUpdates?offset=215790852 adresini yazıyoruz, gelen sonuç:

{
   "ok": true,
   "result": [
     {
       "update_id": 215790852,
       "channel_post": {
         "message_id": 387,
         "chat": {
           "id": -1001171080087,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556537185,
         "text": "/setup_for_project drone:kkbot03bot project:dummy",
         "entities": [
           {
             "offset": 0,
             "length": 18,
             "type": "bot_command"
           }
         ]
       }
     },
     {
       "update_id": 215790853,
       "channel_post": {
         "message_id": 388,
         "chat": {
           "id": -1001171080087,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556537195,
         "text": "/my_project_setup drone:kkbot03bot project:dummy success:TRUE",
         "entities": [
           {
             "offset": 0,
             "length": 17,
             "type": "bot_command"
           }
         ]
       }
     },
     {
       "update_id": 215790854,
       "channel_post": {
         "message_id": 389,
         "chat": {
           "id": -1001171080087,
           "title": "kkbotschannel",
           "type": "channel"
         },
         "date": 1556538469,
         "text": "Hello"
       }
     }
   ]
 }

Kanaldaki Admin’lerin Tespiti

Bot’un yetkili olduğu kanaldaki diğer Admin’leri tespit etmek için çağırılacak örnek adres: https://api.telegram.org/bot908248142:AAEhftGMYS33gjdfB5OcaEn4P0qk745Qz_9/getChatAdministrators?chat_id=-1001171080089

Gelecek örnek cevap:

{
   "ok": true,
   "result": [
     {
       "user": {
         "id": 808248142,
         "is_bot": true,
         "first_name": "kkbot02",
         "username": "kkbot02bot"
       },
       "status": "administrator",
       "can_be_edited": false,
       "can_change_info": true,
       "can_post_messages": true,
       "can_edit_messages": true,
       "can_delete_messages": true,
       "can_invite_users": true,
       "can_restrict_members": true,
       "can_promote_members": false
     },
     {
       "user": {
         "id": 883393886,
         "is_bot": false,
         "first_name": "Dr. Kerem",
         "last_name": "Koseoglu",
         "username": "keremkoseoglu",
         "language_code": "en"
       },
       "status": "creator"
     }
   ]
 }

Kanala Gönderilmiş Dosyanın İndirilmesi

Kanaldaki iletileri çektiğimizde, arada bir dosya gönderilmiş olduğunu görebiliriz. Aşağıda, dosya içeren örnek bir cevap görebilirsiniz.

{
   "ok": true,
   "result": [
     {
       "update_id": 910197243,
       "message": {
         "message_id": 15,
         "from": {
           "id": 883393886,
           "is_bot": false,
           "first_name": "Dr. Kerem",
           "last_name": "Koseoglu",
           "username": "keremkoseoglu",
           "language_code": "en"
         },
         "chat": {
           "id": -366311109,
           "title": "kkbots",
           "type": "group",
           "all_members_are_administrators": true
         },
         "date": 1554892091,
         "photo": [
           {
             "file_id": "AgADBAADNbExG7y4cFFunYKwAtmdmT4EIhsABH7Hd5ye3fXOokkEAAEC",
             "file_size": 1831,
             "width": 90,
             "height": 73
           },
           {
             "file_id": "AgADBAADNbExG7y4cFFunYKwAtmdmT4EIhsABHHbrosp10scoUkEAAEC",
             "file_size": 4144,
             "width": 108,
             "height": 88
           }
         ],
         "caption": "test_caption"
       }
     }
   ]
 }

Bu son cevaptaki file_id’yi not alıyoruz. Zira Bot’un dosyayı indirmesi için bu değere ihtiyacı var.

İlk adımda, Bot ID ve bu dosyanın ID’sini birleştirerek aşağıdaki formata gelen adresi çağırıyoruz: https://api.telegram.org/bot990410563:AAEy8e3dc-pRcg5gjMtImsoDJ2MzPJYQfu9/getFile?file_id=AgADBAADNbExG7y4cFFunYKwAtmdmT4EIhsABHHbrosp10scoUkEAAEC

Bu adresten geriye, bir File Path dönüyor.

{
   "ok": true,
   "result": {
     "file_id": "AgADBAADNbExG7y4cFFunYKwAtmdmT4EIhsABHHbrosp10scoUkEAAEC",
     "file_size": 4144,
     "file_path": "photos/file_0.jpg"
   }
 }

Bu Path, 24 saat boyunca geçerli olacak bir adres içermektedir. İkinci adımda, Bot ID ile cevaptaki File Path’i birleştirerek yeni bir adres çağırıyoruz. Örnek: https://api.telegram.org/file/bot990410563:AAEy8e3dc-pRcg5gjMtImsoDJ2MzPJYQfu9/photos/file_0.jpg

Bu adreste, kanala gönderilen fotoğrafa doğrudan doğruya erişebiliyoruz. 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s