{"id":41030,"date":"2026-03-03T00:40:45","date_gmt":"2026-03-02T21:40:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=41030"},"modified":"2026-03-03T00:40:45","modified_gmt":"2026-03-02T21:40:45","slug":"telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/","title":{"rendered":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>G\u00fcn\u00fcm\u00fczde dijital d\u00fcnyada i\u00e7erik payla\u015f\u0131m\u0131 ve otomasyon, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin \u00f6nemli yollar\u0131ndan biridir. Telegram botlar\u0131, bu otomasyonu ve etkile\u015fimi sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir platform sunar. Bu makalede, Node.js, Telegraf, Jimp ve Pexels API&#8217;sini kullanarak rastgele ilham verici al\u0131nt\u0131lar \u00fcreten ve bunlar\u0131 \u00e7ekici arka plan g\u00f6rselleri \u00fczerine yazarak kullan\u0131c\u0131lara sunan bir Telegram botu nas\u0131l geli\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Bu proje, sadece bir bot in\u015fa etmenizi sa\u011flamakla kalmayacak, ayn\u0131 zamanda Node.js ile API entegrasyonu, g\u00f6rsel i\u015fleme ve Telegram bot geli\u015ftirme konular\u0131nda pratik deneyim kazanman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Giri\u015f: Neden Bir Al\u0131nt\u0131 Botu?<\/h3>\n<p>\u0130lham verici s\u00f6zler, motivasyon kaynaklar\u0131 veya sadece d\u00fc\u015f\u00fcnd\u00fcr\u00fcc\u00fc al\u0131nt\u0131lar, g\u00fcnl\u00fck hayat\u0131m\u0131zda \u00f6nemli bir yer tutar. Bu t\u00fcr i\u00e7erikleri h\u0131zl\u0131 ve g\u00f6rsel olarak \u00e7ekici bir \u015fekilde sunabilen bir bot, kullan\u0131c\u0131lar\u0131n ilgisini \u00e7ekebilir ve onlara anl\u0131k bir de\u011fer sa\u011flayabilir. Geli\u015ftirece\u011fimiz bot, kullan\u0131c\u0131n\u0131n tek bir komutla rastgele bir al\u0131nt\u0131 almas\u0131n\u0131, bu al\u0131nt\u0131n\u0131n Pexels&#8217;ten \u00e7ekilen g\u00fczel bir arka plan g\u00f6rseli \u00fczerine Jimp k\u00fct\u00fcphanesi ile yaz\u0131lmas\u0131n\u0131 ve ard\u0131ndan Telegram \u00fczerinden payla\u015f\u0131lmas\u0131n\u0131 sa\u011flayacak. Bu s\u00fcre\u00e7, Node.js&#8217;in asenkron yap\u0131s\u0131n\u0131, Telegraf&#8217;\u0131n kolay bot aray\u00fcz\u00fcn\u00fc, Jimp&#8217;in g\u00f6rsel manip\u00fclasyon yeteneklerini ve Pexels&#8217;in geni\u015f g\u00f6rsel k\u00fct\u00fcphanesini bir araya getirecek.<\/p>\n<h3>Kullan\u0131lacak Teknolojiler<\/h3>\n<p>Bu botu in\u015fa ederken a\u015fa\u011f\u0131daki temel teknolojileri kullanaca\u011f\u0131z:<\/p>\n<p>*   <strong>Node.js:<\/strong> Sunucu taraf\u0131 JavaScript \u00e7al\u0131\u015fma zaman\u0131. Botumuzun t\u00fcm arka u\u00e7 mant\u0131\u011f\u0131n\u0131 Node.js \u00fczerinde geli\u015ftirece\u011fiz.<br \/>\n*   <strong>Telegraf:<\/strong> Telegram Bot API&#8217;si i\u00e7in hafif ve g\u00fc\u00e7l\u00fc bir Node.js \u00e7at\u0131s\u0131. Bot ile Telegram sunucular\u0131 aras\u0131ndaki ileti\u015fimi kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Jimp:<\/strong> Pure JavaScript ile yaz\u0131lm\u0131\u015f bir g\u00f6rsel i\u015fleme k\u00fct\u00fcphanesi. G\u00f6rsel manip\u00fclasyon (metin ekleme, yeniden boyutland\u0131rma vb.) i\u00e7in Jimp&#8217;i kullanaca\u011f\u0131z. Jimp&#8217;in avantaj\u0131, C++ ba\u011f\u0131ml\u0131l\u0131klar\u0131 gerektirmemesi ve bu sayede kurulumunun daha kolay olmas\u0131d\u0131r.<br \/>\n*   <strong>Pexels API:<\/strong> \u00dccretsiz y\u00fcksek kaliteli stok g\u00f6rseller sunan bir platform. Botumuz i\u00e7in dinamik arka plan g\u00f6rsellerini Pexels API arac\u0131l\u0131\u011f\u0131yla \u00e7ekece\u011fiz.<br \/>\n*   <strong>Axios:<\/strong> HTTP istekleri yapmak i\u00e7in kullan\u0131lan Promise tabanl\u0131 bir HTTP istemcisi. Pexels API&#8217;sine istek g\u00f6ndermek i\u00e7in kullanaca\u011f\u0131z.<br \/>\n*   <strong>Dotenv:<\/strong> Ortam de\u011fi\u015fkenlerini <code>.env<\/code> dosyas\u0131ndan y\u00fcklemek i\u00e7in bir k\u00fct\u00fcphane. API anahtarlar\u0131 gibi hassas bilgileri g\u00fcvenli bir \u015fekilde saklamak i\u00e7in idealdir.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Ba\u015flamadan \u00f6nce a\u015fa\u011f\u0131daki gereksinimleri kar\u015f\u0131lad\u0131\u011f\u0131n\u0131zdan emin olun:<\/p>\n<p>*   <strong>Node.js ve npm:<\/strong> Bilgisayar\u0131n\u0131zda Node.js ve Node.js paket y\u00f6neticisi (npm) kurulu olmal\u0131. Kurulum i\u00e7in [nodejs.org](https:\/\/nodejs.org) adresini ziyaret edebilirsiniz.<br \/>\n*   <strong>Temel JavaScript Bilgisi:<\/strong> Async\/await, Promise&#8217;ler ve mod\u00fcl sistemi gibi temel JavaScript kavramlar\u0131na a\u015fina olmak faydal\u0131 olacakt\u0131r.<br \/>\n*   <strong>Telegram Hesab\u0131:<\/strong> Botunuzu test etmek i\u00e7in bir Telegram hesab\u0131na ihtiyac\u0131n\u0131z olacak.<br \/>\n*   <strong>Metin Edit\u00f6r\u00fc:<\/strong> Visual Studio Code gibi bir metin edit\u00f6r\u00fc kullanman\u0131z \u00f6nerilir.<\/p>\n<h3>Ad\u0131m 1: Proje Kurulumu ve Gerekli Paketlerin Y\u00fcklenmesi<\/h3>\n<p>\u0130lk olarak, projemiz i\u00e7in bir dizin olu\u015ftural\u0131m ve gerekli npm paketlerini y\u00fckleyelim.<\/p>\n<pre><code class=\"language-bash\">mkdir telegram-quotes-bot\ncd telegram-quotes-bot\nnpm init -y<\/code><\/pre>\n<p>Bu komutlar, <code>telegram-quotes-bot<\/code> ad\u0131nda yeni bir dizin olu\u015fturur, i\u00e7ine girer ve <code>package.json<\/code> dosyas\u0131n\u0131 olu\u015fturan <code>npm init -y<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r. \u015eimdi gerekli paketleri y\u00fckleyelim:<\/p>\n<pre><code class=\"language-bash\">npm install telegraf jimp axios dotenv<\/code><\/pre>\n<p>*   <code>telegraf<\/code>: Telegram bot geli\u015ftirme \u00e7at\u0131s\u0131.<br \/>\n*   <code>jimp<\/code>: G\u00f6rsel i\u015fleme k\u00fct\u00fcphanesi.<br \/>\n*   <code>axios<\/code>: HTTP istekleri i\u00e7in istemci.<br \/>\n*   <code>dotenv<\/code>: Ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in.<\/p>\n<h3>Ad\u0131m 2: Telegram Bot Olu\u015fturma ve Token Alma<\/h3>\n<p>Telegram&#8217;da bir bot olu\u015fturmak i\u00e7in @BotFather ile konu\u015fman\u0131z gerekir.<\/p>\n<p>1.  Telegram&#8217;\u0131 a\u00e7\u0131n ve arama \u00e7ubu\u011funa <code>@BotFather<\/code> yaz\u0131n.<br \/>\n2.  BotFather ile bir sohbet ba\u015flat\u0131n ve <code>\/newbot<\/code> komutunu g\u00f6nderin.<br \/>\n3.  BotFather sizden botunuz i\u00e7in bir isim isteyecektir (\u00f6rn. &#8220;Al\u0131nt\u0131 Botu&#8221;).<br \/>\n4.  Ard\u0131ndan, botunuz i\u00e7in bir kullan\u0131c\u0131 ad\u0131 isteyecektir (\u00f6rn. &#8220;AlintiUreticiBot&#8221; &#8211; kullan\u0131c\u0131 ad\u0131n\u0131n sonu mutlaka &#8220;bot&#8221; ile bitmelidir).<br \/>\n5.  Ba\u015far\u0131l\u0131 bir \u015fekilde olu\u015fturuldu\u011funda, BotFather size botunuzun API token&#8217;\u0131n\u0131 verecektir. Bu token&#8217;\u0131 kopyalay\u0131n ve g\u00fcvende tutun. <code>123456:ABC-DEF1234ghIkl-zyx57W2v1u12345<\/code> gibi g\u00f6r\u00fcnecektir.<\/p>\n<h3>Ad\u0131m 3: Pexels API Anahtar\u0131 Alma<\/h3>\n<p>Botumuzun arka plan g\u00f6rsellerini Pexels&#8217;ten \u00e7ekece\u011fiz. Bunun i\u00e7in bir Pexels API anahtar\u0131na ihtiyac\u0131m\u0131z var.<\/p>\n<p>1.  [Pexels API sayfas\u0131na](https:\/\/www.pexels.com\/api\/documentation\/) gidin.<br \/>\n2.  Bir hesap olu\u015fturun veya mevcut hesab\u0131n\u0131zla giri\u015f yap\u0131n.<br \/>\n3.  &#8220;Your API Key&#8221; b\u00f6l\u00fcm\u00fcnden API anahtar\u0131n\u0131z\u0131 al\u0131n. Bu anahtar\u0131 da kopyalay\u0131n.<\/p>\n<h3>Ad\u0131m 4: Ortam De\u011fi\u015fkenlerini Y\u00f6netme (.env)<\/h3>\n<p>API anahtarlar\u0131 gibi hassas bilgileri do\u011frudan kodunuzda saklamak g\u00fcvenlik riski ta\u015f\u0131r. Bunun yerine, <code>.env<\/code> dosyas\u0131n\u0131 kullanarak bu bilgileri ortam de\u011fi\u015fkenleri olarak saklayaca\u011f\u0131z.<\/p>\n<p>Projenizin k\u00f6k dizininde <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki bilgileri ekleyin (kendi anahtarlar\u0131n\u0131zla de\u011fi\u015ftirin):<\/p>\n<pre><code class=\"language-\">BOT_TOKEN=YOUR_TELEGRAM_BOT_TOKEN\nPEXELS_API_KEY=YOUR_PEXELS_API_KEY<\/code><\/pre>\n<p>Bu dosya, <code>dotenv<\/code> paketi taraf\u0131ndan okunacak ve de\u011fi\u015fkenler <code>process.env<\/code> objesine eklenecektir.<\/p>\n<h3>Ad\u0131m 5: Botun Temel Yap\u0131s\u0131n\u0131 Olu\u015fturma (index.js)<\/h3>\n<p>\u015eimdi projemizin ana dosyas\u0131 olan <code>index.js<\/code>&#8216;i olu\u015ftural\u0131m ve botun temel yap\u0131s\u0131n\u0131 kural\u0131m.<\/p>\n<p>Projenizin k\u00f6k dizininde <code>index.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-javascript\">require('dotenv').config(); \/\/ .env dosyas\u0131ndaki de\u011fi\u015fkenleri y\u00fckle\nconst { Telegraf } = require('telegraf');\n\nconst bot = new Telegraf(process.env.BOT_TOKEN);\n\n\/\/ Bot ba\u015flad\u0131\u011f\u0131nda \u00e7al\u0131\u015facak komut\nbot.start((ctx) => {\n  ctx.reply('Merhaba! Ben bir al\u0131nt\u0131 botuyum. \/quote komutunu kullanarak rastgele bir al\u0131nt\u0131 alabilirsiniz.');\n});\n\n\/\/ Yard\u0131m komutu\nbot.help((ctx) => {\n  ctx.reply('\u0130\u015fte size yard\u0131mc\u0131 olabilecek komutlar:\\n\/start - Botu ba\u015flat\u0131r.\\n\/quote - Rastgele bir al\u0131nt\u0131 ve g\u00f6rsel olu\u015fturur.\\n\/help - Bu yard\u0131m mesaj\u0131n\u0131 g\u00f6sterir.');\n});\n\n\/\/ Botu ba\u015flat\nbot.launch();\n\nconsole.log('Bot \u00e7al\u0131\u015f\u0131yor...');\n\n\/\/ Uygulama kapan\u0131rken botu d\u00fczg\u00fcn bir \u015fekilde kapatmak i\u00e7in\nprocess.once('SIGINT', () => bot.stop('SIGINT'));\nprocess.once('SIGTERM', () => bot.stop('SIGTERM'));<\/code><\/pre>\n<p>Bu kodu kaydettikten sonra terminalde <code>node index.js<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Telegram&#8217;dan botunuza <code>\/start<\/code> veya <code>\/help<\/code> komutlar\u0131n\u0131 g\u00f6ndererek test edebilirsiniz. Botun yan\u0131t verdi\u011fini g\u00f6rmelisiniz.<\/p>\n<h3>Ad\u0131m 6: Al\u0131nt\u0131 Veritaban\u0131 veya Kayna\u011f\u0131<\/h3>\n<p>\u015eimdilik, botumuzun kullanaca\u011f\u0131 al\u0131nt\u0131lar\u0131 do\u011frudan <code>index.js<\/code> dosyas\u0131na bir JavaScript dizisi olarak ekleyelim. Daha sonra bunu bir veritaban\u0131na veya harici bir JSON dosyas\u0131na ta\u015f\u0131yabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ index.js dosyas\u0131nda bot tan\u0131m\u0131ndan sonra ekleyin\nconst quotes = [\n  { text: \"Hayat, bisiklete binmek gibidir. Dengenizi korumak i\u00e7in hareket etmeye devam etmelisiniz.\", author: \"Albert Einstein\" },\n  { text: \"De\u011fi\u015fimin tek de\u011fi\u015fmez ger\u00e7e\u011fidir.\", author: \"Herakleitos\" },\n  { text: \"Yapamayaca\u011f\u0131n\u0131z tek \u015fey, denemedi\u011finizdir.\", author: \"Anonim\" },\n  { text: \"Ba\u015far\u0131, bir yerden bir yere ula\u015fmak de\u011fil, o yolda edindi\u011fin deneyimlerdir.\", author: \"Zig Ziglar\" },\n  { text: \"B\u00fcy\u00fck i\u015fler, b\u00fcy\u00fck hayallerle ba\u015flar.\", author: \"Walt Disney\" },\n  { text: \"Ya\u015fam\u0131n anlam\u0131, onu ya\u015famakt\u0131r.\", author: \"Bruce Lee\" },\n  { text: \"Her zorluk, i\u00e7inde bir f\u0131rsat bar\u0131nd\u0131r\u0131r.\", author: \"Albert Einstein\" },\n  { text: \"Mutluluk bir var\u0131\u015f noktas\u0131 de\u011fil, bir yolculuktur.\", author: \"Anonim\" },\n  { text: \"Bug\u00fcn d\u00fcn\u00fcn \u00f6\u011frencisidir.\", author: \"Publilius Syrus\" },\n  { text: \"\u0130ki \u015fey sonsuzdur: Evren ve insan aptall\u0131\u011f\u0131; ve evren hakk\u0131nda emin de\u011filim.\", author: \"Albert Einstein\" },\n  { text: \"En iyi intikam, b\u00fcy\u00fck ba\u015far\u0131d\u0131r.\", author: \"Frank Sinatra\" },\n  { text: \"E\u011fer bir \u015feyi istiyorsan, git ve al. Nokta.\", author: \"Chris Gardner\" },\n  { text: \"Yarat\u0131c\u0131l\u0131k, zekan\u0131n e\u011flenmesidir.\", author: \"Albert Einstein\" },\n  { text: \"Gelecek, hayallerinin g\u00fczelli\u011fine inananlara aittir.\", author: \"Eleanor Roosevelt\" },\n  { text: \"Hayat %10 ba\u015f\u0131na gelenler ve %90 buna nas\u0131l tepki verdi\u011findir.\", author: \"Charles R. Swindoll\" },\n  { text: \"\u00d6nemli olan ne kadar ya\u015fad\u0131\u011f\u0131m\u0131z de\u011fil, nas\u0131l ya\u015fad\u0131\u011f\u0131m\u0131zd\u0131r.\", author: \"Martin Luther King Jr.\" },\n  { text: \"D\u00fc\u015f\u00fcnce g\u00fcc\u00fcyle d\u00fcnyay\u0131 de\u011fi\u015ftirebilirsin.\", author: \"Swami Vivekananda\" },\n  { text: \"Ba\u015flamak i\u00e7in m\u00fckemmel olmak zorunda de\u011filsin ama m\u00fckemmel olmak i\u00e7in ba\u015flamak zorundas\u0131n.\", author: \"Zig Ziglar\" },\n  { text: \"Her g\u00fcn yeni bir ba\u015flang\u0131\u00e7t\u0131r.\", author: \"Anonim\" },\n  { text: \"Yapt\u0131\u011f\u0131n i\u015fi sevmiyorsan, farkl\u0131 bir \u015fey yap.\", author: \"Steve Jobs\" },\n];\n\nfunction getRandomQuote() {\n  const randomIndex = Math.floor(Math.random() * quotes.length);\n  return quotes[randomIndex];\n}<\/code><\/pre>\n<p><code>getRandomQuote()<\/code> fonksiyonu, <code>quotes<\/code> dizisinden rastgele bir al\u0131nt\u0131 d\u00f6nd\u00fcrecektir.<\/p>\n<h3>Ad\u0131m 7: Pexels API Entegrasyonu (Arka Plan G\u00f6rselleri)<\/h3>\n<p>\u015eimdi Pexels API&#8217;sinden rastgele bir arka plan g\u00f6rseli \u00e7ekecek bir fonksiyon yazal\u0131m.<\/p>\n<pre><code class=\"language-javascript\">\/\/ index.js dosyas\u0131nda di\u011fer import'lardan sonra ekleyin\nconst axios = require('axios');\n\nasync function getPexelsImage(query = 'nature') {\n  try {\n    const response = await axios.get('https:\/\/api.pexels.com\/v1\/search', {\n      headers: {\n        Authorization: process.env.PEXELS_API_KEY,\n      },\n      params: {\n        query: query,\n        orientation: 'landscape', \/\/ Yatay g\u00f6rseller tercih et\n        size: 'medium', \/\/ Orta boyutlu g\u00f6rseller\n        per_page: 1, \/\/ Her istekte 1 g\u00f6rsel al\n        page: Math.floor(Math.random() * 100) + 1, \/\/ Rastgele bir sayfadan al\n      },\n    });\n\n    if (response.data.photos && response.data.photos.length > 0) {\n      return response.data.photos[0].src.large; \/\/ B\u00fcy\u00fck boyutlu g\u00f6rselin URL'sini d\u00f6nd\u00fcr\n    }\n    return null; \/\/ G\u00f6rsel bulunamazsa null d\u00f6nd\u00fcr\n  } catch (error) {\n    console.error('Pexels API hatas\u0131:', error.message);\n    return null;\n  }\n}<\/code><\/pre>\n<p>Bu fonksiyon, Pexels API&#8217;sine <code>query<\/code> parametresiyle bir arama iste\u011fi g\u00f6nderir ve rastgele bir sayfadan yatay, orta boyutlu bir g\u00f6rselin URL&#8217;sini d\u00f6nd\u00fcr\u00fcr. Hata durumunda <code>null<\/code> d\u00f6ner.<\/p>\n<h3>Ad\u0131m 8: Jimp ile G\u00f6rsel \u0130\u015fleme (Al\u0131nt\u0131 G\u00f6rseli Olu\u015fturma)<\/h3>\n<p>\u015eimdi Jimp kullanarak indirilen arka plan g\u00f6rseli \u00fczerine al\u0131nt\u0131y\u0131 yazacak ve bir g\u00f6rsel olu\u015fturacak fonksiyonu yazal\u0131m.<\/p>\n<pre><code class=\"language-javascript\">\/\/ index.js dosyas\u0131nda di\u011fer import'lardan sonra ekleyin\nconst Jimp = require('jimp');\nconst path = require('path');\nconst fs = require('fs\/promises'); \/\/ fs.promises ile async\/await kullanabiliriz\n\nasync function generateQuoteImage(quoteText, authorName, imageUrl) {\n  try {\n    const image = await Jimp.read(imageUrl);\n    const font = await Jimp.loadFont(Jimp.FONT_SANS_32_WHITE); \/\/ Beyaz, 32px sans-serif font\n\n    const imageWidth = image.getWidth();\n    const imageHeight = image.getHeight();\n\n    \/\/ Metin kutusu boyutlar\u0131n\u0131 hesapla\n    const margin = 50;\n    const maxWidth = imageWidth - (margin * 2);\n    const maxHeight = imageHeight - (margin * 2);\n\n    \/\/ Metni ortalamak i\u00e7in\n    image.print(font, margin, margin, {\n      text: quoteText,\n      alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,\n      alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE,\n    }, maxWidth, maxHeight);\n\n    \/\/ Yazar ad\u0131n\u0131 daha k\u00fc\u00e7\u00fck bir fontla ve sa\u011f alt k\u00f6\u015feye yak\u0131n yaz\n    const authorFont = await Jimp.loadFont(Jimp.FONT_SANS_16_WHITE);\n    image.print(authorFont, margin, imageHeight - margin - 30, {\n      text: <code>- ${authorName}<\/code>,\n      alignmentX: Jimp.HORIZONTAL_ALIGN_RIGHT,\n    }, maxWidth, 30); \/\/ Yazar metni i\u00e7in daha k\u00fc\u00e7\u00fck bir y\u00fckseklik\n\n    const outputPath = path.join(__dirname, 'quote_image.jpg');\n    await image.writeAsync(outputPath); \/\/ G\u00f6rseli kaydet\n\n    return outputPath;\n  } catch (error) {\n    console.error('G\u00f6rsel olu\u015fturma hatas\u0131:', error);\n    return null;\n  }\n}<\/code><\/pre>\n<p>Bu fonksiyon:<br \/>\n1.  Pexels&#8217;ten al\u0131nan <code>imageUrl<\/code> ile bir Jimp g\u00f6rseli y\u00fckler.<br \/>\n2.  <code>Jimp.FONT_SANS_32_WHITE<\/code> gibi varsay\u0131lan bir font y\u00fckler (daha geli\u015fmi\u015f projelerde \u00f6zel fontlar da kullanabilirsiniz).<br \/>\n3.  Al\u0131nt\u0131 metnini g\u00f6rselin ortas\u0131na, belirli kenar bo\u015fluklar\u0131 ile yazar.<br \/>\n4.  Yazar ad\u0131n\u0131 daha k\u00fc\u00e7\u00fck bir fontla sa\u011f alt k\u00f6\u015feye yak\u0131n bir yere yazar.<br \/>\n5.  Olu\u015fturulan g\u00f6rseli <code>quote_image.jpg<\/code> olarak projenin k\u00f6k dizinine kaydeder ve bu dosyan\u0131n yolunu d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong>Not:<\/strong> Jimp, varsay\u0131lan olarak birka\u00e7 font sa\u011flar (<code>Jimp.FONT_SANS_8_BLACK<\/code>, <code>Jimp.FONT_SANS_16_BLACK<\/code>, <code>Jimp.FONT_SANS_32_BLACK<\/code>, <code>Jimp.FONT_SANS_64_BLACK<\/code>, <code>Jimp.FONT_SANS_128_BLACK<\/code> ve ayn\u0131 boyutlarda beyaz versiyonlar\u0131). E\u011fer \u00f6zel bir font kullanmak isterseniz, <code>.fnt<\/code> format\u0131nda bir font dosyas\u0131n\u0131 Jimp&#8217;e y\u00fcklemeniz gerekir. Bu daha karma\u015f\u0131k bir konudur ve bu makalenin kapsam\u0131 d\u0131\u015f\u0131ndad\u0131r.<\/p>\n<h3>Ad\u0131m 9: Bot Komutunu Olu\u015fturma (\/quote)<\/h3>\n<p>\u015eimdi botumuzun ana i\u015flevini <code>\/quote<\/code> komutuyla entegre edelim.<\/p>\n<pre><code class=\"language-javascript\">\/\/ index.js dosyas\u0131nda bot.help tan\u0131m\u0131ndan sonra ekleyin\n\nbot.command('quote', async (ctx) => {\n  try {\n    await ctx.reply('Sizin i\u00e7in bir al\u0131nt\u0131 ve g\u00f6rsel olu\u015fturuyorum, l\u00fctfen bekleyin...');\n\n    const randomQuote = getRandomQuote();\n    const imageUrl = await getPexelsImage('inspiration'); \/\/ 'inspiration' veya 'abstract' gibi anahtar kelimelerle arama yapabilirsiniz.\n    \n    if (!imageUrl) {\n      return ctx.reply('\u00dczg\u00fcn\u00fcm, Pexels\\'ten bir arka plan g\u00f6rseli \u00e7ekilemedi.');\n    }\n\n    const imagePath = await generateQuoteImage(randomQuote.text, randomQuote.author, imageUrl);\n\n    if (!imagePath) {\n      return ctx.reply('\u00dczg\u00fcn\u00fcm, g\u00f6rsel olu\u015fturulurken bir hata olu\u015ftu.');\n    }\n\n    \/\/ G\u00f6rseli Telegram'a g\u00f6nder\n    await ctx.replyWithPhoto({ source: imagePath });\n\n    \/\/ G\u00f6rseli g\u00f6nderdikten sonra ge\u00e7ici dosyay\u0131 sil\n    await fs.unlink(imagePath);\n\n  } catch (error) {\n    console.error('Al\u0131nt\u0131 komutu hatas\u0131:', error);\n    ctx.reply('\u00dczg\u00fcn\u00fcm, bir hata olu\u015ftu. L\u00fctfen daha sonra tekrar deneyin.');\n  }\n});<\/code><\/pre>\n<p>Bu kod blo\u011fu:<br \/>\n1.  Kullan\u0131c\u0131 <code>\/quote<\/code> komutunu g\u00f6nderdi\u011finde \u00e7al\u0131\u015f\u0131r.<br \/>\n2.  Kullan\u0131c\u0131ya bir bekleme mesaj\u0131 g\u00f6nderir.<br \/>\n3.  <code>getRandomQuote()<\/code> ile rastgele bir al\u0131nt\u0131 se\u00e7er.<br \/>\n4.  <code>getPexelsImage()<\/code> ile Pexels&#8217;ten bir arka plan g\u00f6rseli URL&#8217;si \u00e7eker. Burada <code>inspiration<\/code> gibi bir anahtar kelime kullanabilirsiniz, b\u00f6ylece daha ilgili g\u00f6rseller gelir.<br \/>\n5.  <code>generateQuoteImage()<\/code> ile al\u0131nt\u0131 ve yazar ad\u0131n\u0131 arka plan g\u00f6rseline yazar ve ge\u00e7ici bir dosya olarak kaydeder.<br \/>\n6.  <code>ctx.replyWithPhoto()<\/code> ile olu\u015fturulan g\u00f6rseli kullan\u0131c\u0131ya g\u00f6nderir.<br \/>\n7.  <code>fs.unlink()<\/code> ile ge\u00e7ici olarak kaydedilen g\u00f6rsel dosyas\u0131n\u0131 siler. Bu, sunucunuzda gereksiz dosyalar\u0131n birikmesini \u00f6nler.<br \/>\n8.  Hata durumlar\u0131n\u0131 yakalar ve kullan\u0131c\u0131ya uygun bir mesaj g\u00f6nderir.<\/p>\n<h3>Ad\u0131m 10: Botu \u00c7al\u0131\u015ft\u0131rma ve Test Etme<\/h3>\n<p>T\u00fcm kodlar\u0131 birle\u015ftirdikten sonra <code>index.js<\/code> dosyan\u0131z\u0131n son hali a\u015fa\u011f\u0131daki gibi olmal\u0131d\u0131r (yorum sat\u0131rlar\u0131 hari\u00e7):<\/p>\n<pre><code class=\"language-javascript\">require('dotenv').config();\nconst { Telegraf } = require('telegraf');\nconst Jimp = require('jimp');\nconst axios = require('axios');\nconst path = require('path');\nconst fs = require('fs\/promises');\n\nconst bot = new Telegraf(process.env.BOT_TOKEN);\n\nconst quotes = [\n  { text: \"Hayat, bisiklete binmek gibidir. Dengenizi korumak i\u00e7in hareket etmeye devam etmelisiniz.\", author: \"Albert Einstein\" },\n  { text: \"De\u011fi\u015fimin tek de\u011fi\u015fmez ger\u00e7e\u011fidir.\", author: \"Herakleitos\" },\n  { text: \"Yapamayaca\u011f\u0131n\u0131z tek \u015fey, denemedi\u011finizdir.\", author: \"Anonim\" },\n  { text: \"Ba\u015far\u0131, bir yerden bir yere ula\u015fmak de\u011fil, o yolda edindi\u011fin deneyimlerdir.\", author: \"Zig Ziglar\" },\n  { text: \"B\u00fcy\u00fck i\u015fler, b\u00fcy\u00fck hayallerle ba\u015flar.\", author: \"Walt Disney\" },\n  { text: \"Ya\u015fam\u0131n anlam\u0131, onu ya\u015famakt\u0131r.\", author: \"Bruce Lee\" },\n  { text: \"Her zorluk, i\u00e7inde bir f\u0131rsat bar\u0131nd\u0131r\u0131r.\", author: \"Albert Einstein\" },\n  { text: \"Mutluluk bir var\u0131\u015f noktas\u0131 de\u011fil, bir yolculuktur.\", author: \"Anonim\" },\n  { text: \"Bug\u00fcn d\u00fcn\u00fcn \u00f6\u011frencisidir.\", author: \"Publilius Syrus\" },\n  { text: \"\u0130ki \u015fey sonsuzdur: Evren ve insan aptall\u0131\u011f\u0131; ve evren hakk\u0131nda emin de\u011filim.\", author: \"Albert Einstein\" },\n  { text: \"En iyi intikam, b\u00fcy\u00fck ba\u015far\u0131d\u0131r.\", author: \"Frank Sinatra\" },\n  { text: \"E\u011fer bir \u015feyi istiyorsan, git ve al. Nokta.\", author: \"Chris Gardner\" },\n  { text: \"Yarat\u0131c\u0131l\u0131k, zekan\u0131n e\u011flenmesidir.\", author: \"Albert Einstein\" },\n  { text: \"Gelecek, hayallerinin g\u00fczelli\u011fine inananlara aittir.\", author: \"Eleanor Roosevelt\" },\n  { text: \"Hayat %10 ba\u015f\u0131na gelenler ve %90 buna nas\u0131l tepki verdi\u011findir.\", author: \"Charles R. Swindoll\" },\n  { text: \"\u00d6nemli olan ne kadar ya\u015fad\u0131\u011f\u0131m\u0131z de\u011fil, nas\u0131l ya\u015fad\u0131\u011f\u0131m\u0131zd\u0131r.\", author: \"Martin Luther King Jr.\" },\n  { text: \"D\u00fc\u015f\u00fcnce g\u00fcc\u00fcyle d\u00fcnyay\u0131 de\u011fi\u015ftirebilirsin.\", author: \"Swami Vivekananda\" },\n  { text: \"Ba\u015flamak i\u00e7in m\u00fckemmel olmak zorunda de\u011filsin ama m\u00fckemmel olmak i\u00e7in ba\u015flamak zorundas\u0131n.\", author: \"Zig Ziglar\" },\n  { text: \"Her g\u00fcn yeni bir ba\u015flang\u0131\u00e7t\u0131r.\", author: \"Anonim\" },\n  { text: \"Yapt\u0131\u011f\u0131n i\u015fi sevmiyorsan, farkl\u0131 bir \u015fey yap.\", author: \"Steve Jobs\" },\n];\n\nfunction getRandomQuote() {\n  const randomIndex = Math.floor(Math.random() * quotes.length);\n  return quotes[randomIndex];\n}\n\nasync function getPexelsImage(query = 'nature') {\n  try {\n    const response = await axios.get('https:\/\/api.pexels.com\/v1\/search', {\n      headers: {\n        Authorization: process.env.PEXELS_API_KEY,\n      },\n      params: {\n        query: query,\n        orientation: 'landscape',\n        size: 'medium',\n        per_page: 1,\n        page: Math.floor(Math.random() * 100) + 1,\n      },\n    });\n\n    if (response.data.photos && response.data.photos.length > 0) {\n      return response.data.photos[0].src.large;\n    }\n    return null;\n  } catch (error) {\n    console.error('Pexels API hatas\u0131:', error.message);\n    return null;\n  }\n}\n\nasync function generateQuoteImage(quoteText, authorName, imageUrl) {\n  try {\n    const image = await Jimp.read(imageUrl);\n    const font = await Jimp.loadFont(Jimp.FONT_SANS_32_WHITE);\n\n    const imageWidth = image.getWidth();\n    const imageHeight = image.getHeight();\n\n    const margin = 50;\n    const maxWidth = imageWidth - (margin * 2);\n    const maxHeight = imageHeight - (margin * 2);\n\n    image.print(font, margin, margin, {\n      text: quoteText,\n      alignmentX: Jimp.HORIZONTAL_ALIGN_CENTER,\n      alignmentY: Jimp.VERTICAL_ALIGN_MIDDLE,\n    }, maxWidth, maxHeight);\n\n    const authorFont = await Jimp.loadFont(Jimp.FONT_SANS_16_WHITE);\n    image.print(authorFont, margin, imageHeight - margin - 30, {\n      text: <code>- ${authorName}<\/code>,\n      alignmentX: Jimp.HORIZONTAL_ALIGN_RIGHT,\n    }, maxWidth, 30);\n\n    const outputPath = path.join(__dirname, 'quote_image.jpg');\n    await image.writeAsync(outputPath);\n\n    return outputPath;\n  } catch (error) {\n    console.error('G\u00f6rsel olu\u015fturma hatas\u0131:', error);\n    return null;\n  }\n}\n\nbot.start((ctx) => {\n  ctx.reply('Merhaba! Ben bir al\u0131nt\u0131 botuyum. \/quote komutunu kullanarak rastgele bir al\u0131nt\u0131 alabilirsiniz.');\n});\n\nbot.help((ctx) => {\n  ctx.reply('\u0130\u015fte size yard\u0131mc\u0131 olabilecek komutlar:\\n\/start - Botu ba\u015flat\u0131r.\\n\/quote - Rastgele bir al\u0131nt\u0131 ve g\u00f6rsel olu\u015fturur.\\n\/help - Bu yard\u0131m mesaj\u0131n\u0131 g\u00f6sterir.');\n});\n\nbot.command('quote', async (ctx) => {\n  try {\n    await ctx.reply('Sizin i\u00e7in bir al\u0131nt\u0131 ve g\u00f6rsel olu\u015fturuyorum, l\u00fctfen bekleyin...');\n\n    const randomQuote = getRandomQuote();\n    const imageUrl = await getPexelsImage('inspiration');\n    \n    if (!imageUrl) {\n      return ctx.reply('\u00dczg\u00fcn\u00fcm, Pexels\\'ten bir arka plan g\u00f6rseli \u00e7ekilemedi.');\n    }\n\n    const imagePath = await generateQuoteImage(randomQuote.text, randomQuote.author, imageUrl);\n\n    if (!imagePath) {\n      return ctx.reply('\u00dczg\u00fcn\u00fcm, g\u00f6rsel olu\u015fturulurken bir hata olu\u015ftu.');\n    }\n\n    await ctx.replyWithPhoto({ source: imagePath });\n\n    await fs.unlink(imagePath);\n\n  } catch (error) {\n    console.error('Al\u0131nt\u0131 komutu hatas\u0131:', error);\n    ctx.reply('\u00dczg\u00fcn\u00fcm, bir hata olu\u015ftu. L\u00fctfen daha sonra tekrar deneyin.');\n  }\n});\n\nbot.launch();\n\nconsole.log('Bot \u00e7al\u0131\u015f\u0131yor...');\n\nprocess.once('SIGINT', () => bot.stop('SIGINT'));\nprocess.once('SIGTERM', () => bot.stop('SIGTERM'));<\/code><\/pre>\n<p>\u015eimdi terminalinizde tekrar <code>node index.js<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. Botunuzu Telegram&#8217;da a\u00e7\u0131n ve <code>\/quote<\/code> komutunu g\u00f6nderin. Birka\u00e7 saniye i\u00e7inde, rastgele bir al\u0131nt\u0131 ve g\u00fczel bir arka plan g\u00f6rseliyle olu\u015fturulmu\u015f bir foto\u011fraf g\u00f6rmelisiniz.<\/p>\n<h3>Geli\u015ftirmeler ve \u0130leri Seviye \u00d6zellikler<\/h3>\n<p>Bu temel al\u0131nt\u0131 botunu daha da geli\u015ftirmek i\u00e7in bir\u00e7ok yol bulunmaktad\u0131r:<\/p>\n<h4>Kullan\u0131c\u0131dan Al\u0131nt\u0131 Alma<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n kendi al\u0131nt\u0131lar\u0131n\u0131 <code>\/addquote <al\u0131nt\u0131> - <yazar><\/code> format\u0131nda eklemesine izin verebilirsiniz. Bu al\u0131nt\u0131lar\u0131 bir veritaban\u0131nda saklayarak botun al\u0131nt\u0131 havuzunu geni\u015fletebilirsiniz.<\/p>\n<h4>Kategori Bazl\u0131 Al\u0131nt\u0131lar<\/h4>\n<p>Al\u0131nt\u0131lar\u0131 kategorilere ay\u0131rarak kullan\u0131c\u0131lar\u0131n <code>\/quote <kategori><\/code> (\u00f6rn. <code>\/quote motivasyon<\/code>) gibi komutlarla belirli kategorilerden al\u0131nt\u0131lar almas\u0131n\u0131 sa\u011flayabilirsiniz. Pexels API&#8217;sine de kategoriye \u00f6zel arama sorgular\u0131 g\u00f6nderebilirsiniz.<\/p>\n<h4>\u00d6zelle\u015ftirilebilir Fontlar ve Renkler<\/h4>\n<p>Jimp ile \u00f6zel fontlar y\u00fckleyebilir ve metin renklerini veya arka plan\u0131 dinamik olarak de\u011fi\u015ftirebilirsiniz. Bu, kullan\u0131c\u0131lara daha fazla \u00f6zelle\u015ftirme se\u00e7ene\u011fi sunar.<\/p>\n<h4>Veritaban\u0131 Entegrasyonu<\/h4>\n<p>Al\u0131nt\u0131lar\u0131 bir JavaScript dizisinde saklamak yerine, MongoDB (NoSQL) veya PostgreSQL (SQL) gibi bir veritaban\u0131 kullanarak daha esnek ve \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm sunabilirsiniz. Bu, al\u0131nt\u0131lar\u0131 kolayca eklemenize, d\u00fczenlemenize ve silmenize olanak tan\u0131r.<\/p>\n<h4>G\u00f6rsel Filtreleri<\/h4>\n<p>Jimp, g\u00f6rsellere parlakl\u0131k, kontrast, bulan\u0131kl\u0131k gibi \u00e7e\u015fitli filtreler uygulaman\u0131za olanak tan\u0131r. Botunuzun olu\u015fturdu\u011fu g\u00f6rsellere rastgele filtreler ekleyerek \u00e7e\u015fitlili\u011fi art\u0131rabilirsiniz.<\/p>\n<h4>Inline Mod<\/h4>\n<p>Telegram&#8217;\u0131n inline modu, kullan\u0131c\u0131lar\u0131n herhangi bir sohbette <code>@botkullan\u0131c\u0131ad\u0131 <sorgu><\/code> yazarak botunuzdan i\u00e7erik almas\u0131na olanak tan\u0131r. Bu, al\u0131nt\u0131lar\u0131 do\u011frudan sohbet i\u00e7inde olu\u015fturup payla\u015fmay\u0131 \u00e7ok daha kolay hale getirir.<\/p>\n<h4>Hata Y\u00f6netimi ve Loglama<\/h4>\n<p>Daha sa\u011flam bir bot i\u00e7in kapsaml\u0131 hata y\u00f6netimi ve loglama mekanizmalar\u0131 eklemek \u00f6nemlidir. Hatalar\u0131 bir dosyaya veya harici bir loglama hizmetine yazarak botunuzun sorunlar\u0131n\u0131 daha kolay tespit edebilirsiniz.<\/p>\n<h4>Da\u011f\u0131t\u0131m (Deployment)<\/h4>\n<p>Botunuzu s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda tutmak i\u00e7in bir sunucuda (\u00f6rne\u011fin Heroku, Vercel, DigitalOcean, AWS EC2) da\u011f\u0131tman\u0131z gerekir. Bu platformlar, Node.js uygulamalar\u0131n\u0131 bar\u0131nd\u0131rmak i\u00e7in uygun ortamlar sunar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Node.js, Telegraf, Jimp ve Pexels API&#8217;sini kullanarak nas\u0131l i\u015flevsel bir Telegram al\u0131nt\u0131 \u00fcretici botu olu\u015fturaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik. Proje kurulumundan Telegram ve Pexels API entegrasyonuna, Jimp ile g\u00f6rsel i\u015flemeye ve son olarak bot komutunu olu\u015fturmaya kadar her a\u015famay\u0131 ele ald\u0131k. Bu s\u00fcre\u00e7, sadece bir bot in\u015fa etmekle kalmad\u0131, ayn\u0131 zamanda modern web geli\u015ftirme teknikleri ve API&#8217;ler aras\u0131 entegrasyon hakk\u0131nda de\u011ferli bilgiler sa\u011flad\u0131.<\/p>\n<p>Bu bot, ki\u015fisel projeleriniz i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r ve yukar\u0131da belirtilen geli\u015ftirmelerle \u00e7ok daha g\u00fc\u00e7l\u00fc ve kullan\u0131\u015fl\u0131 hale getirilebilir. Unutmay\u0131n, bot geli\u015ftirme d\u00fcnyas\u0131 s\u00fcrekli geli\u015fiyor ve yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131zla s\u0131n\u0131rlar\u0131 zorlamak tamamen sizin elinizde. \u015eimdi kendi botunuzu daha da ileri ta\u015f\u0131mak i\u00e7in kazand\u0131\u011f\u0131n\u0131z bu bilgileri kullanabilirsiniz!<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[136],"tags":[],"class_list":{"0":"post-41030","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber\" \/>\n<meta property=\"og:description\" content=\"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-02T21:40:45+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber\",\"datePublished\":\"2026-03-02T21:40:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\"},\"wordCount\":1900,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\",\"name\":\"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-03-02T21:40:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber","og_description":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.","og_url":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-03-02T21:40:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber","datePublished":"2026-03-02T21:40:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/"},"wordCount":1900,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/","name":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-03-02T21:40:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/telegram-alinti-uretici-botu-nasil-yapilir-node-js-telegraf-jimp-ve-pexels-ile-adim-adim-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Telegram Al\u0131nt\u0131 \u00dcretici Botu Nas\u0131l Yap\u0131l\u0131r: Node.js, Telegraf, Jimp ve Pexels ile Ad\u0131m Ad\u0131m Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=41030"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41030\/revisions"}],"predecessor-version":[{"id":41031,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41030\/revisions\/41031"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}