Telegram Bot’uyla Betik Çıktılarının Mesaj Olarak İletilmesi

İstediğimiz çıktıları veren bir betik yazdık. Şimdi bunun çıktılarını görmek için her seferinde betiği elle tetikleyip çıktılarını terminalden mi okuyacağız?

Hayır! Betiği çıktılarını bir telegram bot’u aracılığıyla telegrama mesaj atacak duruma getirebiliriz. Sonrasında betiği cron olarak da çalıştırırsak, istediğimiz aralıklarla bize betiğin çıktılarını mesaj atan bir botumuz olur.


Telegram Bot’u Oluşturmak

Yeni bir telegram bot’u oluşturmak için @BotFather hesabına mesaj atıyoruz. Sırasıyla; /newbot, bot'un adı ve bot'un kullanıcı adı değerlerini vererek bot’u oluşturuyoruz.

Bu işlem sonrasında botumuzu oluşturmuş ve HTTP API token'ini elde etmiş oluyoruz. Bot’u kullanabilmemiz için bot’un mesaj göndereceği alanlara erişmesi gerekiyor. Bot’u özel mesajlaşmada kullanmak istiyorsak bir mesaj atmamız, bir kanalda kullanmak istiyorsak kanalda tag’lememiz gerekiyor.

Oluşturduğumuz bot’a (@gelincik_bot) ilk mesajı atıyoruz. Mesaj /start olarak iletiliyor.


API’dan Mesaj Göndermek

Artık oluşturduğumuz bot’u kullanarak eklediğimiz mesajlaşma alanına API üzerinden mesaj gönderebiliriz. Mesaj gönderme işlemini curl komutunu kullanarak gerçekleştireceğiz.

BotFather’da bot’umuzu oluşturduğumuz zaman bize XXXXX:YYYYYYYYYYYYYYY formatında bir token veriliyor. Bu şekilde verilen token’de : karakteri ayraç olarak kullanılmış durumda. Karakterden önceki alan bot’un ID’si, sonraki alan access token’ı şeklinde bölünüyor. API’a istek atarken bot’un adı olarak botXXXXX, access token olarak YYYYYYYYYYYYYYY değerlerini kullanıyoruz.

Bot ile bir chat’e mesaj atabilmemiz için öncelikle o chat’e ait ID değerini öğrenmemiz gerekiyor. Bu değeri öğrenmek için de API’ı kullanarak getUpdates endpoint’ine istek atıyoruz.

curl -q -X POST https://api.telegram.org/botXXXXX:YYYYYYYYYYYYYYYYYYYYYY/getUpdates

{"ok":true,"result":[{"update_id":495336715,
"message":{"message_id":1,"from":{"id":ZZZZZZZZZZZ,"is_bot":false,"first_name":"\u061cBerkay","last_name":"G\u00fc\u00e7l\u00fc","username":"berkayguclu","language_code":"en"},"chat":{"id":ZZZZZZZZZZZ,"first_name":"\u061cBerkay","last_name":"G\u00fc\u00e7l\u00fc","username":"berkayguclu","type":"private"},"date":1718742224,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]}}]}

Bu isteğin sonucunda iletilen JSON verideki id alanı chat ID’sini ifade ediyor. Şimdi bu ID değerini kullanarak sendMessage endpoint’i ile mesaj atabiliriz.

curl -q -X POST https://api.telegram.org/botXXXXX:YYYYYYYYYYYYYYYYYYYYYY/sendMessage -d chat_id=1065130096 -d text="Gelincik deneme mesajıdır."

{"ok":true,"result":{"message_id":2,"from":{"id":XXXXX,"is_bot":true,"first_name":"Gelincik","username":"gelincik_bot"},"chat":{"id":ZZZZZ,"first_name":"\u061cBerkay","last_name":"G\u00fc\u00e7l\u00fc","username":"berkayguclu","type":"private"},"date":1718802382,"text":"Gelincik deneme mesaj\u0131d\u0131r."}}

Telegram Channel’ında Thread ID Nasıl Bulunur?

Bir gruba veya DM’e mesaj atarken chat ID değerini bulmak yeterli oluyor. Fakat içerisinde farklı topic’ler bulunan bir channel’da hangi topik’e mesaj atılacağını belirtmek için Thread ID denilen bir değer gerekiyor.

Bu değeri elde edebilmek için de bot’u önce channel’a eklememiz gerekiyor. Channel’a ekledikten sonra bot’u istenilen topik altına tag’lediğinizde artık getUpdates altından hem chat ID hem de thread ID değerini alabiliyorsunuz. Thread ID kullanımı da aşağıdaki şekilde yapılabilir:

curl -sS -X POST https://api.telegram.org/botXXXXX:YYYYYYYYYYYYYYYYYYYYYY/sendMessage -d chat_id=${CHAT_ID} -d message_thread_id=${THREAD_ID} -d parse_mode="MarkdownV2" -d text="${MESSAGE}"

parse_mode Nedir?

Telegram’a API aracılığıyla gönderilen mesajlar belli kurallar aracılığıyla parse edilir. Bu kurallar sonucunda gönderilen mesaj belli bir formata uyuyorsa kalın, ince, eğik veya altı çizili yazılmalı gibi yazım stilleri uygulanır.

API aracılığıyla mesaj atarken kullanılan parse_mode parametresi, gönderilen mesajların hangi kural setiyle parse edilmesi gerektiğini belirtir. Örneğin markdown stilini kullanıyorsanız kalın yazmak için *metin*, html stilini kullanıyorsanız kalın yazmak için <b>metin</b> şeklinde kullanmanız gerekir.

Parametrenin alabileceği diğer farklı değerler için URL’i inceleyebilirsiniz.


Bonus: Bir önceki yazıda hazırlanan biletinial betiğinin telegram’a mesaj atmasının sağlanması

#!/bin/bash 

curl -sS https://biletinial.com/tr-tr/tiyatro/ankara | grep tr-tr/tiyatro | cut -d\" -f2 > /tmp/ankara 
LINE=$(cat /tmp/ankara | grep -n search | cut -d: -f1 | tail -n1) 
cat /tmp/ankara | tail -n+$(( ${LINE}+1 )) | sort | uniq > /tmp/tiyatro 

while read oyun  
do        
        curl -sS https://biletinial.com${oyun} > /tmp/oyun        

        AD=$(cat /tmp/oyun | pup 'h1 text{}' | sed "s/&#39;/\'/g")        
        BEDEVE=$(cat /tmp/oyun | pup 'div div div[data-sehir="Ankara"] div[class="ed-biletler__sehir__gun"] div[class="ed-biletler__sehir__gun__detay"] :first-child text{}' | grep -B2 "2 Biletin" | sed 's/2 Biletin.*//g')     

        if [ ! -z "$BEDEVE" ];        
        then              
                MESSAGE="""             
                ${AD}             
                ${BEDEVE}         
                """         
                curl -sS -X POST https://api.telegram.org/botXXXXX:YYYYYYYYYYYY/sendMessage -d chat_id=ZZZZZZZ -d message_thread_id=AAAAAAA -d parse_mode="MarkdownV2" -d text="${MESSAGE}" -o /dev/null
        fi  
done</tmp/tiyatro