Bir önceki yazıda, ücretsiz bir Telegram botunun nasıl oluşturulacağını ve barındırılacağını öğrenmiştik ve sonunda ona ilginç özellikler ekleyeceğimizi söylemiştik. İşte bu da onlardan biri, yeni yayınlarınızı (hem Blogger hem de WordPress) Telegram kanallarınızdaki abonelerinize bildirmenize olanak tanıyacak.
Gereksinimler
- Bir Telegram botunun nasıl oluşturulacağına ilişkin öğreticiyi tamamladınız.
- Bir Telegram kanalı oluşturun (genel veya özel olabilir).
Çalışanı yapılandırma
Koddaki değişiklikleri uygulamadan önce her şeyi hazırlamamız gerektiğinden, Cloudflare'deki ayarlarda bazı değişiklikler yapacağız.
KV ad alanı oluşturma
İlk olarak, sol menüden "Çalışanlar ve Sayfalara" gidin, "KV" seçin, "Ad Alanı Oluştur "a tıklayın, bir isim verin ve değişiklikleri kaydedin.
Ortam değişkenleri oluşturma
Çalışanlar ve Sayfalara Genel Bakışa gidin, çalışanınıza tıklayın ve Ayarlar'a gidin. Burada Değişkenler bölümünü seçin ve "Ortam değişkenleri" altında "Değişkenleri düzenle" tıklayın:
"Değişken adı" alanına CURRENT_FEED yazın ve "Değer" alanına örneğin bir Blogger veya WordPress beslemesinin URL'sini ekleyin:
https://www.example.com/feeds/posts/default?alt=json&max-results=1
https://www.example.com/wp-json/wp/v2/posts?per_page=1
Değişiklikleri kaydedin ve aynı bölümde "KV ad alanı bağlantıları" bulana kadar aşağı kaydırın. Değişken adı alanının KV_STORAGE_FEED olması gereken yeni bir değişken ekleyin ve "Değer" alanında daha önce oluşturduğunuz ad alanını seçin, son olarak değişiklikleri kaydedin.
Tetikleyicileri Yapılandırma / Tetikleyiciler
Değişken yapılandırmasını tamamladıktan sonra, "Tetikleyiciler" sekmesine gidin, "Cron tetikleyicileri" bulmak için aşağı kaydırın ve "Tetikleyici ekle "ye tıklayın.
Yalnızca tetikleyicinin çalışmasını istediğiniz zaman aralığını belirtmeniz gerekir; örneğin, 30 dakika belirtirseniz bot her 30 dakikada bir yeni gönderileri kontrol edecektir.
Kodu ekleyin
Her şeyi doğru yaptıysanız, tebrikler, neredeyse bitirdik. Şimdi "Hızlı düzenleme" düğmesine basarak kodu düzenleyelim, burada zaten önceki eğitime karşılık gelen bir kodumuz olduğunu unutmayın.
Yeni değişkenler
Kodun ilk satırında bir boşluk bırakın ve daha önce ayarladığımız ortam değişkenlerine atıfta bulunacak aşağıdaki değişkenleri ekleyin.
const FEED = CURRENT_FEED
const KV_NAMESPACE = KV_STORAGE_FEED
Kanal elde etme fonksiyonu
Bu fonksiyonun görevi, botun yönetici olarak eklendiği tüm kanalların ID'sini saklayan nesneyi almak ve ayrıştırmak olacaktır. Bu daha sonrası için önemlidir:
// Obtiene los canales de KV
async function getChannels () {
let channels = await KV_NAMESPACE.get('channels') || {}
// Si channels no es un objeto, convertirlo
if (typeof channels !== 'object') {
channels = JSON.parse(channels)
}
return channels
}
Kanal listesini yönetme işlevi
Bot bir kanala eklendiğinde, bu fonksiyon ID'yi kanal adıyla birlikte isim alanımıza eklemeye özen gösterecektir. Bot bir kanaldan çıkarılırsa, bu kimlik de kayıt defterinden silinecektir.
// Üyelik durumunu yönetir
// https://core.telegram.org/bots/api#chatmember
async function manageMember (member) {
const chatTitle = member.chat.title
const chatId = member.chat.id
const chatType = member.chat.type
// bot durumu (administrator, kicked, left, member, restricted, creator)
const status = member.new_chat_member.status
// Si el tipo de chat no es "channel", no hacer nada
if (chatType !== 'channel') {
return
}
// Obtener los canales de KV o crear un objeto vacío
const channels = await getChannels()
// Si el bot es "administrator", agregar y almacenarlo en KV
if (status === 'administrator') {
channels[chatId] = chatTitle
await KV_NAMESPACE.put('channels', JSON.stringify(channels))
}
// Si el estado es "left" o "kicked", eliminar el canal de KV
if (status === 'left' || status === 'kicked') {
delete channels[chatId]
await KV_NAMESPACE.put('channels', JSON.stringify(channels))
}
}
Güncelle onUpdate fonksiyonu
Önceki derste bu fonksiyonu zaten oluşturmuştuk, ancak bu özellik için değiştirilmesi gerekecek. onUpdate() fonksiyonunu bulun ve bu yeni versiyonla değiştirin:
async function onUpdate (update) {
// Güncelleme bir mesaj içeriyorsa, "onMessage" işlevi çağrılır..
if ('message' in update) {
await onMessage(update.message)
}
// Si es un estado de miembro, se llama a la función "manageMember".
if ('my_chat_member' in update) {
await manageMember(update.my_chat_member)
}
}
Beslemeyi yönetme işlevi
Bu işlev beslemeyi alır, Blogger'dan mı yoksa WordPress'ten mi olduğunu ayırt eder, en son gönderiyi alır ve kanallarınıza gönderir. Bu süreçte, gelecekteki karşılaştırmalar için KV ad alanında son gönderinin kimliğini de saklayacaktır.
// Güncellemeleri eşzamansız olarak işleme
async function handleScheduled (event) {
try {
// Obtener el enlace de la entrada (Solo Blogger)
function getLink (links) {
for (const link of links) {
if (link.rel === 'alternate') {
return link.href
}
}
}
// Blogger veya WordPress feed alın
const feed = await fetch(FEED)
const data = await feed.json()
// Beslemenin Blogger'dan olup olmadığını kontrol edin
const isBlogger = data.feed
// En son besleme girişini alın
const newEntry = isBlogger ? data.feed.entry[0] : data[0]
// En son girişin ve KV'nin kimliğini alın
const newEntryId = isBlogger ? newEntry.id.$t : newEntry.id
const getEntryId = await KV_NAMESPACE.get('currentEntryId')
// Yazı kimliğini sayıya dönüştürme (yalnızca WordPress)
const currentEntryId = isBlogger ? getEntryId : Number(getEntryId)
// Yeni bir giriş kimliği varsa, tüm kanallara gönderin.
if (!currentEntryId || newEntryId !== currentEntryId) {
// Actualizar la ID de la entrada almacenado en KV
await KV_NAMESPACE.put('currentEntryId', newEntryId)
// Girişin başlığını ve bağlantısını alın
const title = isBlogger ? newEntry.title.$t : newEntry.title.rendered
const link = isBlogger ? getLink(newEntry.link) : newEntry.link
// Mesaj metnini ayarlayın
const messageText = `${title}\n${link}`
const channels = await getChannels()
// Tüm kanallara mesaj gönderin
for (const channelId of Object.keys(channels)) {
await sendPlainText(channelId, messageText)
}
}
} catch (error) {
console.error('Error al obtener o procesar el feed:', error)
}
}
Şimdi, sadece scheduled olayda handleScheduled işlevini çağırmamız gerekiyor. Bunu yapmak için aşağıdaki kodu önceki işlevin altına ekleyin:
// Güncellemeleri göndermek için düzenli aralıklarla çalışır
addEventListener('scheduled', event => {
event.waitUntil(handleScheduled(event))
})
"Kaydet ve dağıt" düğmesine basın ve işiniz bitti. Şimdi botunuzu bir telegram kanalına yönetici olarak eklemeniz yeterlidir ve güncellemelerinizi göndermeye başlayacaktır.
Sonuç
Bu, abonelerinizi e-postalara boğmak zorunda kalmadan yeni yayınlarınızdan haberdar etmenin harika, kullanışlı ve ücretsiz bir yoludur. Bu kodun çalıştığını görmek istiyorsanız, buradaki Telegram kanalına abone olabilir ve güncellemeleri kontrol edebilirsiniz.
Herhangi bir sorunuz veya öneriniz varsa, yorumlarda bırakmaktan çekinmeyin. Bu yazıyı sosyal ağlarınızda paylaşmayı unutmayın. Uğradığınız için çok teşekkür ederim.