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_ID
bir 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_ID
dan id
tuşu. İkimiz de sahip olduktan sonra TOKEN
ve CHAT_ID
bizim 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
name
Url 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 star
ve pull_request
GitHub olaylarını ele alacağız . star
Depo rol aldı edildiğinde olayı tetiklenir ve pull_request
bir ç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./hook
Request
İ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 POST
, sendMessage
son 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_ID
Anahtar bot mesaj göndermesi gerektiğini kullanıcının sohbet kimliği içindirtext
Ana mesaj ne olması gerektiği içindirparse_mode
mesajın biçimlendirme seçeneği içindir- Dokümanlarda
sendMessage
API yöntemi için diğer anahtarlar hakkında bilgi edinebilirsiniz .
Python sözlüklerini POST
istek 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./hook
content-type
application/json
star
pull_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_ID
ortam 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.