GitHub’dan Telegram’a güncellemeler almak için FastAPI’yi kullanma

İster gelişmekte olan bir geliştirici ister deneyimli bir yazılım mühendisi olun, muhtemelen insanların projelerine kaynak kodunu barındırdıkları, diğer geliştiricilerin diğer projelerine katkıda bulundukları ve açık kaynaklı yazılım geliştirdikleri bir platform olan GitHub’ı kullandınız .

Esasen GitHub, çok çeşitli açık kaynaklı yazılımları ve ilgili projeleri bulabileceğiniz fiili bir platform haline geldi. GitHub’a bağlanacak uygulamalar geliştirmek için tonlarca özelliğe ve açık bir API’ye sahiptir.

Telegram, hızlı ve genişletilebilir bir mesajlaşma platformudur ve en büyük avantajlarından biri sohbet botlarıdır. Sohbet botları kolayca programlanabilir, çalışmak için basit bir HTTP API’ye sahiptir ve yönetimi kolaydır. Ve çoğu dilde Telegram’ın Bot API’sini kullanmak için sarmalayıcılar vardır.

Bu makalede, Python ve GitHub web kancaları ile bir GitHub deposundan güncellemeler alan bir Telegram botu oluşturacağız. Sunucu tarafı için FastAPI’yi ve mesajları göndermek için Telegram’ın HTTP API’sini kullanacağız.

Gereksinimler

  • Sunucuyu oluşturmak için makinenize Python yüklendi.
  • Bir Telegram hesabı
  • Aşağıdaki bölümlerde tartışacağımız bir Telegram botu.

Python geliştirme ortamını kurma

Başlamadan önce, temiz bir kurulum için bir Python Sanal Ortamı oluşturacağız.

Projeyi oluşturmak için ihtiyaç duyacağımız paketler şunlardır:

  • Arka uç çerçevesi olarak FastAPI
  • Telegram API ile iletişim için zaman uyumsuz HTTP istekleri için HTTPX .
  • Sunucu için Uvicorn
  • Pyngrok yerel sunucumuzda tünel oluşturacak

Hazır? Ortamı kurarak başlayalım. Tüm kodu bir dosyaya yazacağız : main.py

$ mkdir fastapi - tg
 $ cd fastapi 
 - tg
 $ python3 - m venv venv
 $ Kaynak venv 
 / bin / etkinleştirmek Linux ve Mac için #
 $ venv \ Scripts \ activ # Windows için
 ( venv ) $ pip yüklemek fastapi uvicorn pyngrok httpx

Telegram’dan bot kimlik bilgilerini alma

Mesajların tarafımıza gönderilip alınabilmesi için programlanabilir bir şeye ihtiyacımız var. Telegram botlarının devreye girdiği yer burasıdır. Botlar, Telegram mesajlaşma platformu için programlanabilir sohbet botlarıdır.

Bir telgraf botu BOT_TOKEN, bot için benzersiz bir tanımlayıcı olan a’ya sahip olacaktır. Telegram için bir bot oluşturmak için BOT_TOKEN. Bunu yapmak için Telegram’daki başka bir bot olan BotFather ile konuşacağız .

BotFather’a komut girerek yeni bir bot oluşturabiliriz . Botun adını ve görünen adını da girmemiz gerekiyor./newbot

Bu adımları tamamladıktan sonra BOT_TOKEN,. Sahip olduğunuzda, bunu bu bölümün sonunda gerçekleştireceğimiz bir ortam değişkenleri olarak ayarlayın .terminal/cmd

Şimdi, komutu uygulayarak botunuzu başlatın ./start

Başarılı bir şekilde bir Telegram Botu oluşturduktan sonra, bir sonraki adım, CHAT_IDbir Telegram kullanıcısı için benzersiz bir tanımlayıcı olan ve her Telegram kullanıcısının bir tane vardır.

Almak için, Telegram’da Json Dump Bot CHAT_ID ile bir sohbet konuşması açın . Komut kendisi size metninde bir JSON nesnesi verecektir. Şuna benzer görünecek:/start

{
   "güncelleme_kimliği" : 143931094 ,
 
   "mesaj" : {
 
     "message_id" : 155844 ,
 
     "kimden" : {
 
       "id" : 123456789 , // bu olduğunu Chat_ID ait bir telgraf kullanıcısı
   
       "is_bot" : yanlış ,
 
       "first_name" : "<name>" ,
 
       "kullanıcı adı" : "<kullanıcı adı>"
 
     },
     "sohbet" : {
 
       "id" : 123456789 , // bu olduğunu Chat_ID ait bir telgraf kullanıcısı
   

       "first_name" : "<name>" ,
 
       "kullanıcı adı" : "<kullanıcı adı>" ,
 
       "type" : "özel"
 
     },
     "tarih" : 1575035172 ,
 
     "text" : "/ start" ,
 
     "varlıklar" : [
 
       {
         "ofset" : 0 ,
 
         "uzunluk" : 6 ,
 
         "type" : "bot_command"
 
       }
     ]
   }
 }

Biz alabilirsiniz CHAT_IDdan idtuşu. İkimiz de sahip olduktan sonra TOKENve CHAT_IDbizim yerel oturuma ortam değişkenleri olarak bu eklemeniz gerekir.

Terminal / Komut İstemi’nde şu komutları yürütün:

# İçin linux / mac
 
 $  ihracat TOKEN = < bot_token >
 $  dışa aktar CHAT_ID = < chat_id >
 
 Windows için #
 
 $  set TOKEN = < bot_token >
 $  set CHAT_ID = < chat_id >

Ortam değişkenlerini yükledikten sonra, sunucumuzu yazalım

FastAPI ile sunucunun oluşturulması

“Merhaba Dünya!” İle başlayacağız FastAPI ile uç nokta. FastAPI, Python için nispeten yeni bir web çerçevesidir ve son birkaç ayda oldukça popülerlik kazanmıştır.

Eşzamansız işlemleri destekler ve API’ler için bir özellik olan Python Tür İpuçları ve OpenAPI’ye dayanır. Ayrıca ve uç noktalarda da belgeler alıyoruz ./docs/redoc

nameUrl parametresi olarak iletilen bir döndüren basit bir “Merhaba Dünya” uç noktası oluşturalım :

# main.py

dan fastapi ithalat FastAPI 

app = FastAPI () 

@app . get ( "/ {isim}" )
eşzamansız def helloname ( ad : str ) :  
    "" "
    Wave emojisiyle Kullanıcıya Merhaba döndürür
    "" "
    return f "Merhaba {isim} "  👋

Bunun FastAPI ile basit bir “Merhaba Dünya” uygulaması olduğuna dikkat edin. Burada uç noktayı olarak belirtiyoruz /. Bu uç noktanın, olarak belirttiğimiz bir URL parametresi var name.

Sunucuyu çalıştırmak için kullanacağımız Uvicorn, bir ASGI (Asenkron Sunucu Gateway Interface) sunucusu.

Sunucuyu başlatmak için terminalde aşağıdaki komutu yürütün:

$ uvicorn main : uygulama - yeniden yükle - bağlantı noktası 9000

Bu, FastAPI sunucumuzu adresinden başlatacak . Biz giderseniz , biz tarafından otomatik oluşturulan interaktif dokümanlar bulabilirsiniz Swagger .port 9000http://localhost:9000/docs

Biz giderseniz , biz REDOC daha otomatik oluşturulan dokümanlar göreceksiniz.http://localhost:9000/redoc

Son noktayı curl veya Httpie ile getirmeye çalışırsak , sonuç şu olacaktır:

Şimdi, web kancaları almak ve mesaj göndermek için sunucumuzu yazalım. Sunucumuz aşağıdaki görevleri yapacak:

  • GitHub’dan web kancaları alın
  • Webhook yükünü işleyin ve mesajlara dönüştürün
  • Mesajı kullanıcıya Telegram ile gönderin

GitHub’dan web kancaları alma

Web kancaları, bir eylem gerçekleştiğinde bir sunucu tarafından başka bir uygulamaya gönderilen bilgiler ve yüklerdir. Genellikle webhook yükleri JSON biçimindedir.

GitHub, bir havuzda bir eylem meydana gelirse, belirtilen bir URL’ye bir web kancası gönderir. Sunucumuza bu web kancalarını almak ve işlemek için yazacağız, ardından sonraki bölümlerde sunucuya daha fazla işlevsellik ekleyeceğiz.

Basitlik uğruna, yalnızca starve pull_requestGitHub olaylarını ele alacağız . starDepo rol aldı edildiğinde olayı tetiklenir ve pull_requestbir çekme isteği açıldığında veya kapatıldığında olay tetiklenir. GitHub çekme istekleri hakkında daha fazla bilgiyi buradan okuyabilirsiniz .

# main.py
 dan fastapi ithalat FastAPI , Request
 
 işletim sistemini içe aktar

 
 app = FastAPI ()
 
 TOKEN = os . getenv ( "TOKEN" ) # Telegram Bot API Anahtarı
  
 CHAT_ID = os . getenv ( "CHAT_ID" ) # Telegram Sohbet Kimliği
  
 
 eşzamansız def sendTgMessage () :
  
 # YAPMAK
 
 @app . gönderi ( "/ kanca" )
 async def recWebHook ( req : Request ) :
   
     "" "
     İlgili verileri almak için Webhook'u alın ve Webhook Yükünü işleyin
     Tüm GitHub Webhook Etkinlikleri ve Yükleri için https://developer.github.com/webhooks/event-payloads adresine bakın.
     "" "
     Vücut = bekliyoruz req . json ()
 
     Olay = req . üstbilgiler . get ( "X-Github-Event" )
 
     eğer olay == "yıldız" : Olay bir yıldız ise # onay
     
         nos_stars = body \ [ "depo" \] [ "stargazers_count" ]
         starrer_username = body \ [ "gönderen" \] [ "giriş" ]
         repo_url = body \ [ "depo" \] [ "html_url" ]
         repo_name = body \ [ "depo" \] [ "ad" ]
         message = f " {starrer_username} \ [ {repo_name} \] ( {repo_url} ) 'a yıldız ekledi . \ n \ n Toplam Yıldızlar {nos_stars} "

         bekliyoruz sendTgMessage ( mesaj )
     elif event == "pull_request" : # olayın bir çekme isteği olup olmadığını kontrol edin
     
         pr_number = body [ "sayı" ]
         eğer vücut \ [ "pull_request" \] [ "birleştirilmiş" ] == Doğru :
  
             pr_action = "birleştirilmiş"
 
         pr_action = body [ "eylem" ]
         pr_title = body \ [ "pull_request" \] [ "başlık" ]
         pr_desc = body \ [ "pull_request" \] [ "gövde" ]
         pr_login = body \ [ "gönderen" \] [ "giriş" ]
         pr_login_url = body \ [ "gönderen" \] [ "html_url" ]
         pr_url = body \ [ "pull_request" \] [ "html_url" ]
         message = f "Çekme İsteği (\ [ {pr_number} \] ( {pr_url} )) {pr_action} tarafından \ [ {pr_login} \] ( {pr_login_url} ). \ n \ n Başlık: * {pr_title} * \ n \ n Açıklama: ** {pr_desc} ** "
 
         bekliyoruz sendTgMessage ( mesaj )

Bu kodda, Webhook’u GitHub’dan almak ve webhook’ları Telegram aracılığıyla gönderilecek bir mesaja işlemek için uç noktayı yazdık. Daha sonra webhook yükünü ve FastAPI sınıfıyla birlikte başlıklarını alacağız./hookRequest

İlk olarak, eylemin ne olduğunu kontrol edeceğiz. Bu bir yıldız veya çekme isteği etkinliğiyse, belirli etkinlik için mesajlar oluşturacağız. İstediğimiz verileri JSON gövdesinden alıyoruz. JSON bir Python sözlüğüne ayrıştırılır, bu nedenle sözlük anahtarlarını dizinler olarak kullanacağız ve bu anahtarların değerlerini alacağız.  Aynısını yapmak için sözlük yöntemini de kullanabilirsiniz .get()

Yıldız etkinliği için, mevcut yıldız sayısını, arşive yıldız atan kişinin GitHub kullanıcı adını ve arşivin URL’sini alıyoruz. Ve çekme istekleri için, çekme isteğinin başlığını ve gövdesini de alacağız ve ayrıca çekme isteğinin birleştirilip birleştirilmediğini kontrol edeceğiz.

Bu şekilde, sorunlar ve incelemeler gibi diğer birçok olayı da kapsayabiliriz ve neredeyse hepsi benzer bir modeldedir. Şimdi, üretilen görüntüyü telgrafa gönderme yöntemini yazacağız .sendTgMessage()

Telegram’a mesaj gönderme

Telegram’ın güçlü bir bot API’si vardır. Bunun için tonlarca sarmalayıcı var, ancak bu blog gönderisinde, mesajı yukarıda oluşturduğumuz bot aracılığıyla eşzamansız olarak göndermek için HTTP API’yi kullanacağız.

# main.py
 httpx içe
 aktar
 
 zaman uyumsuz def sendTgMessage ( mesaj : str ) :
  
     "" "
     Mesajı Telegram BOT API ile telgrafa gönderir
     "" "
     tg_msg = { "chat_id" : CHAT_ID , "text" : mesaj , "parse_mode" : "Markdown" }
    
     API_URL = f "https://api.telegram.org/bot {TOKEN} / sendMessage"
 

     zaman uyumsuz ile httpx . İstemci olarak AsyncClient () :
  
         müşteri bekliyoruz. gönderi ( API_URL , json = tg_msg )

Burada, mesajın argüman olarak bulunduğu fonksiyona sahibiz. Telegram, mesajlarda Markdown ve HTML biçimlendirmesi için harika bir desteğe sahiptir. Markdown biçimlendirme seçeneğini burada kullanalım. Telegram mesajları için biçimlendirme seçenekleri hakkında daha fazla bilgiyi buradan okuyabilirsiniz .

Telegram Bot API’si POSTsendMessageson noktaya yönelik isteğin gövdesi olarak JSON olarak verilere ihtiyaç duyar . JSON gövdesi, mesajı göndermek için aşağıdaki anahtarlara ihtiyaç duyar:

  • CHAT_IDAnahtar bot mesaj göndermesi gerektiğini kullanıcının sohbet kimliği içindir
  • textAna mesaj ne olması gerektiği içindir
  • parse_mode mesajın biçimlendirme seçeneği içindir
  • DokümanlardasendMessage API yöntemi için diğer anahtarlar hakkında bilgi edinebilirsiniz .

Python sözlüklerini POSTistek gövdesi olarak kullanıyoruz ve isteği httpx ile gönderiyoruz . Httpx, Python istek kitaplığının benzer bir API’sine sahip zaman uyumsuz bir HTTP kitaplığıdır.

Mesaj gönderildikten sonra, mesaj gönderilmiş olsun ya da olmasın bir JSON yanıtı alacağız.

Sunucuyu çalıştırma ve test etme

Sunucumuzu çalıştıralım. İşte tam kaynak kodu:

# main.py
 dan fastapi ithalat FastAPI , Request
  
 işletim sistemini içe aktar

 httpx içe
 aktar
 
 app = FastAPI ()
 
 
 TOKEN = os . getenv ( "TOKEN" ) # Telegram Bot API Anahtarı
  
 CHAT_ID = os . getenv ( "CHAT_ID" ) # Telegram Sohbet Kimliği
  
 
 zaman uyumsuz def sendTgMessage ( mesaj : str ) :
  
     "" "
     Mesajı Telegram BOT API ile telgrafa gönderir
     "" "
     yazdır ( mesaj )
     tg_msg = { "chat_id" : CHAT_ID , "text" : mesaj , "parse_mode" : "Markdown" }
    
     API_URL = f "https://api.telegram.org/bot {TOKEN} / sendMessage"
 

     zaman uyumsuz ile httpx . İstemci olarak AsyncClient () :
  
         müşteri bekliyoruz
 . gönderi ( API_URL , json = tg_msg )
 
 @app . gönderi ( "/ kanca" )
 async def recWebHook ( req : Request ) :
   
     "" "
     İlgili verileri almak için Webhook'u alın ve Webhook Yükünü işleyin
     Tüm GitHub Webhook Etkinlikleri ve Yükleri için https://developer.github.com/webhooks/event-payloads adresine bakın.
     "" "
     Vücut = bekliyoruz req . json ()
 
     baskı ( gövde )
     Olay = req . üstbilgiler . get ( "X-Github-Event" )
 
     eğer olay == "yıldız" : Olay bir yıldız ise # onay
     
         nos_stars = body \ [ "depo" \] [ "stargazers_count" ]
         starrer_username = body \ [ "gönderen" \] [ "giriş" ]
         repo_url = body \ [ "depo" \] [ "html_url" ]
         repo_name = body \ [ "depo" \] [ "ad" ]
         message = f " {starrer_username} \ [ {repo_name} \] ( {repo_url} ) 'a yıldız ekledi . \ n \ n Toplam Yıldızlar {nos_stars} "

         bekliyoruz sendTgMessage ( mesaj )
     elif event == "pull_request" : # olayın bir çekme isteği olup olmadığını kontrol edin
     
         pr_number = body [ "sayı" ]
         eğer vücut \ [ "pull_request" \] [ "birleştirilmiş" ] == Doğru :
  
             pr_action = "birleştirilmiş"
 
         pr_action = body [ "eylem" ]
         pr_title = body \ [ "pull_request" \] [ "başlık" ]
         pr_desc = body \ [ "pull_request" \] [ "gövde" ]
         pr_login = body \ [ "gönderen" \] [ "giriş" ]
         pr_login_url = body \ [ "gönderen" \] [ "html_url" ]
         pr_url = body \ [ "pull_request" \] [ "html_url" ]
         message = f "Çekme İsteği (\ [ {pr_number} \] ( {pr_url} )) {pr_action} tarafından \ [ {pr_login} \] ( {pr_login_url} ). \ n \ n Başlık: {pr_title} \ n \ n Açıklama: {pr_desc} "
 
   bekliyoruz sendTgMessage ( mesaj )

Sunucumuzu çalıştırmak için komut satırında / terminalde aşağıdaki komutu uygulayın. Sanal ortamın içinde olduğunuzdan emin olun:

$ uvicorn main : uygulama - yeniden yükle - bağlantı noktası 9000

Bu, sunucumuzu 9000 numaralı bağlantı noktasında açacaktır. GitHub’dan yerel sunucumuza veri almak için yerel sunucumuzu internete açmalıyız , burası ngrok’un devreye girdiği yerdir . Pyngrok’u pip ile zaten kurduk . Pyngrok, dağıtım için kendi ikilisi olan ngrok için bir Python sarmalayıcısıdır.

Sunucumuzda tünel oluşturmak için sunucumuzun çalışır durumda olması gerekir. Başka bir terminal / komut satırı penceresi veya sekmesi açın ve sanal ortamı etkinleştirin. Ardından aşağıdakileri yürütün:

$ ngrok http 9000

Şuna benzer bir çıktı görmelisiniz:

Yerel sunucumuzu açığa çıkaracak iki URL olacaktır. Yalnızca httpsönek veya ikinci URL’ye sahip olana ihtiyacımız olacak .

Bir sonraki adım GitHub’a web kancalarını bu URL’ye göndermesini söylemektir.

GitHub’a bağlanma

Sunucumuzu GitHub’a bağlamak için bir depoya ihtiyacımız var. Bu, yeni bir depo veya mevcut bir depo olabilir. Yeni bir depo oluşturmak istiyorsanız, yeni bir depo oluşturmak için https://github.new adresine gidin .

Web kancaları ayarlamak için, arşivinizdeki ayarlar sekmesine gidin ve web kancaları bölümünü seçin . Yeni bir web kancası eklemek için düğmeye basın . Daha sonra GitHub şifrenizi girmeniz istenecektir.Add Webhook

Bunu yaptıktan sonra, ngrok’tan aldığımız URL’yi ekleyin (URL’ye sonek olarak eklemeyi unutmayın ), çünkü bu, webhook’ları almak için uç noktamızdır. Değişim To . Ardından, almak istediğiniz webhook etkinliklerini seçin. Bizim durumumuzda ve olayına ihtiyacımız var . Son olarak, bu değişiklikleri kaydedin./hookcontent-typeapplication/jsonstarpull_request

İşte örnek olarak kısa bir video.

Botumuzun çalıştığından emin olmak için depoya yıldız ekleyin. Her şey düzgün çalışıyorsa, oluşturduğumuz bottan belirtilene Telegram’da bir mesaj alacağız CHAT_ID. İşte örnek bir mesaj.

Tebrikler! Sunucumuz çalışıyor ve Telegram’a mesaj gönderiyor. Ne kadar serin?

Sorunlar, incelemeler, göndermeler ve benzerleri hakkında ayrıntılı bilgi almak için webhook işlemeyi genişletebilirsiniz. Tüm webhook olayları GitHub Belgelerinde güzel bir şekilde belgelenmiştir. Ayrıca, Telegram Bot API belgeleri iyi bir referanstır.

Tam kaynak kodunu GitHub’da bulabilirsiniz .

GitHub ve Telegram’ı kullanmak için sonraki adımlar

Elbette, sorunlar, yeni itmeler ve çekme talebi incelemeleri ve diğer GitHub web kancası olayları hakkında bilgi almak için bu projeyi daha da genişletebilirsiniz. Ancak bunu yapmak için GitHub webhook ayarlarında ihtiyacınız olan olayları değiştirdiğinizden emin olun.

Ayrıca bot ile kanallara / gruplara mesaj gönderebilirsiniz – sadece botu kanala / gruba ekleyin ve CHAT_IDortam değişkenini kanal / grup kimliği ile değiştirin .

Sonuç

FastAPI ve Python ile bir REST API yapmayı, bir Telegram Botu oluşturmayı ve yerel bir sunucuyu ngrok ile GitHub’a bağlamayı öğrendik. Okuduğunuz için teşekkürler!

Makalenin orjinal kaynağı için tıklayınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.