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