{"id":36604,"date":"2025-12-20T14:00:41","date_gmt":"2025-12-20T11:00:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/"},"modified":"2025-12-20T14:00:41","modified_gmt":"2025-12-20T11:00:41","slug":"tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/","title":{"rendered":"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#8217;in \u00d6tesine Ge\u00e7mek"},"content":{"rendered":"<h2>Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#8217;in \u00d6tesine Ge\u00e7mek<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz web taray\u0131c\u0131lar\u0131, kullan\u0131c\u0131 deneyimini zenginle\u015ftiren ve i\u015flevselli\u011fi art\u0131ran g\u00fc\u00e7l\u00fc eklentilerle doludur. Ancak bu eklentiler, g\u00fcvenlik ve izolasyon prensipleri gere\u011fi taray\u0131c\u0131 &#8220;sandbox&#8221; ortam\u0131nda s\u0131n\u0131rl\u0131 kal\u0131r. Peki, bir taray\u0131c\u0131 eklentisi yerel bir masa\u00fcst\u00fc uygulamas\u0131yla do\u011frudan nas\u0131l ileti\u015fim kurabilir? \u0130\u015fte tam bu noktada &#8220;Yerel Mesajla\u015fma&#8221; (Native Messaging) devreye girerek, taray\u0131c\u0131 eklentilerinin web&#8217;in s\u0131n\u0131rlar\u0131n\u0131 a\u015fmas\u0131n\u0131 ve sistem d\u00fczeyinde etkile\u015fim kurmas\u0131n\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Bu makalede, Yerel Mesajla\u015fma&#8217;n\u0131n ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, geli\u015ftirme ad\u0131mlar\u0131n\u0131 ve g\u00fcvenlik y\u00f6nlerini detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h3>Yerel Mesajla\u015fma Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Taray\u0131c\u0131 eklentileri, web sayfalar\u0131n\u0131 manip\u00fcle etmek, kullan\u0131c\u0131 aray\u00fcz\u00fcne yeni \u00f6zellikler eklemek veya API&#8217;lar arac\u0131l\u0131\u011f\u0131yla web servisleriyle etkile\u015fim kurmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Ancak, i\u015fletim sistemi kaynaklar\u0131na (dosya sistemi, donan\u0131m, di\u011fer uygulamalar) do\u011frudan eri\u015fimleri yoktur. Bu k\u0131s\u0131tlama, g\u00fcvenlik a\u00e7\u0131s\u0131ndan kritik olsa da, baz\u0131 geli\u015fmi\u015f kullan\u0131m senaryolar\u0131nda bir engel te\u015fkil eder. Yerel Mesajla\u015fma, bu engeli a\u015fmak i\u00e7in geli\u015ftirilmi\u015f bir mekanizmad\u0131r.<\/p>\n<h4>Taray\u0131c\u0131 Eklentilerinin S\u0131n\u0131rlamalar\u0131<\/h4>\n<p>Taray\u0131c\u0131 eklentileri, \u00e7al\u0131\u015ft\u0131klar\u0131 taray\u0131c\u0131 ortam\u0131n\u0131n s\u0131k\u0131 g\u00fcvenlik politikalar\u0131na tabidir. Bu, eklentilerin k\u00f6t\u00fc niyetli davran\u0131\u015flar\u0131 \u00f6nlemek ve kullan\u0131c\u0131n\u0131n gizlili\u011fini korumak amac\u0131yla dosya sistemine yazma\/okuma, keyfi sistem komutlar\u0131 \u00e7al\u0131\u015ft\u0131rma veya di\u011fer masa\u00fcst\u00fc uygulamalar\u0131yla do\u011frudan ileti\u015fim kurma gibi yeteneklerden mahrum b\u0131rak\u0131lmas\u0131 anlam\u0131na gelir. Bu &#8220;sandbox&#8221; yap\u0131s\u0131, web&#8217;in g\u00fcvenli kalmas\u0131n\u0131 sa\u011flarken, eklentilerin potansiyelini de s\u0131n\u0131rlar.<\/p>\n<h4>Web&#8217;in \u00d6tesine Ge\u00e7i\u015f: K\u00f6pr\u00fc Kurma<\/h4>\n<p>Yerel Mesajla\u015fma, taray\u0131c\u0131 eklentisi ile kullan\u0131c\u0131n\u0131n bilgisayar\u0131nda \u00e7al\u0131\u015fan yerel bir uygulama aras\u0131nda g\u00fcvenli ve iki y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131 kurar. Bu sayede, eklenti taray\u0131c\u0131 ortam\u0131n\u0131n \u00f6tesine ge\u00e7erek masa\u00fcst\u00fc uygulamalar\u0131n\u0131n yeteneklerinden faydalanabilir. \u00d6rne\u011fin, bir eklenti yerel bir donan\u0131m cihaz\u0131yla (USB okuyucu, barkod taray\u0131c\u0131) etkile\u015fim kurabilir, sistem genelinde bir \u015fifre y\u00f6neticisiyle senkronize olabilir veya \u00f6zel bir masa\u00fcst\u00fc uygulamas\u0131n\u0131 tetikleyebilir.<\/p>\n<h4>Temel \u00c7al\u0131\u015fma Prensibi<\/h4>\n<p>Yerel Mesajla\u015fma, taray\u0131c\u0131 ile yerel uygulama aras\u0131nda standart girdi (stdin) ve standart \u00e7\u0131kt\u0131 (stdout) kanallar\u0131n\u0131 kullanarak ileti\u015fim kurar. Taray\u0131c\u0131 eklentisi, yerel uygulamay\u0131 bir alt i\u015flem olarak ba\u015flat\u0131r ve JSON format\u0131ndaki mesajlar\u0131 bu kanallar \u00fczerinden g\u00f6nderir ve al\u0131r. Her mesaj, kendi uzunlu\u011funu belirten \u00f6zel bir \u00f6n ek ile ba\u015flar, bu da mesajlar\u0131n do\u011fru bir \u015fekilde ayr\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Mimari ve Temel Bile\u015fenler<\/h3>\n<p>Yerel Mesajla\u015fma mimarisi, taray\u0131c\u0131 eklentisi ve yerel uygulama olmak \u00fczere iki ana bile\u015fenden olu\u015fur. Bu iki bile\u015fen, \u00f6zel bir ileti\u015fim protokol\u00fc \u00fczerinden etkile\u015fime girer.<\/p>\n<h4>Taray\u0131c\u0131 Eklentisi (\u0130stemci)<\/h4>\n<p>Taray\u0131c\u0131 eklentisi, Yerel Mesajla\u015fma s\u00fcrecini ba\u015flatan ve y\u00f6neten taraft\u0131r. Eklentinin <code>manifest.json<\/code> dosyas\u0131nda <code>\"nativeMessaging\"<\/code> izninin belirtilmesi gerekir. Arka plan beti\u011fi (background script) veya di\u011fer eklenti sayfalar\u0131, taray\u0131c\u0131n\u0131n <code>runtime<\/code> API&#8217;s\u0131n\u0131 kullanarak yerel uygulamaya ba\u011flan\u0131r, mesaj g\u00f6nderir ve gelen mesajlar\u0131 dinler.<\/p>\n<h4>Yerel Uygulama (Sunucu)<\/h4>\n<p>Yerel uygulama, kullan\u0131c\u0131n\u0131n i\u015fletim sisteminde \u00e7al\u0131\u015fan herhangi bir program olabilir (Python, Node.js, C#, Java vb.). Bu uygulama, taray\u0131c\u0131 eklentisinden gelen mesajlar\u0131 standart girdiden okur, i\u015fler ve sonu\u00e7lar\u0131 standart \u00e7\u0131kt\u0131ya JSON format\u0131nda geri yazar. Uygulama, taray\u0131c\u0131 taraf\u0131ndan ba\u015flat\u0131l\u0131r ve taray\u0131c\u0131 kapat\u0131ld\u0131\u011f\u0131nda veya ileti\u015fim kanal\u0131 kesildi\u011finde sonlan\u0131r.<\/p>\n<h4>Yerel Uygulama Manifest Dosyas\u0131<\/h4>\n<p>Yerel uygulaman\u0131n taray\u0131c\u0131 taraf\u0131ndan bulunabilmesi ve g\u00fcvenli bir \u015fekilde ileti\u015fim kurabilmesi i\u00e7in \u00f6zel bir JSON manifest dosyas\u0131na ihtiyac\u0131 vard\u0131r. Bu dosya, yerel uygulaman\u0131n ad\u0131n\u0131, a\u00e7\u0131klamas\u0131n\u0131, \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyas\u0131n\u0131n yolunu ve hangi taray\u0131c\u0131 eklentilerinin bu uygulamayla ileti\u015fim kurmas\u0131na izin verildi\u011fini (<code>allowed_origins<\/code>) belirtir. Bu manifest dosyas\u0131, i\u015fletim sisteminin belirli bir konumuna kaydedilir ve taray\u0131c\u0131 taraf\u0131ndan okunur.<\/p>\n<h4>\u0130leti\u015fim Kanal\u0131: Standart Girdi\/\u00c7\u0131kt\u0131<\/h4>\n<p>\u0130leti\u015fim, yerel uygulaman\u0131n standart girdi (stdin) ve standart \u00e7\u0131kt\u0131 (stdout) ak\u0131\u015flar\u0131 \u00fczerinden ger\u00e7ekle\u015fir. Taray\u0131c\u0131, yerel uygulamay\u0131 bir alt i\u015flem olarak ba\u015flatt\u0131\u011f\u0131nda, uygulaman\u0131n stdin&#8217;ine mesajlar yazar ve stdout&#8217;undan mesajlar\u0131 okur. Bu basit ama etkili mekanizma, farkl\u0131 programlama dillerinde yaz\u0131lm\u0131\u015f uygulamalar\u0131n taray\u0131c\u0131yla sorunsuz bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Yerel Uygulama (Host) Kurulumu ve Geli\u015ftirilmesi<\/h3>\n<p>Yerel Mesajla\u015fma&#8217;y\u0131 kullanmak i\u00e7in \u00f6ncelikle taray\u0131c\u0131 eklentinizin ileti\u015fim kuraca\u011f\u0131 yerel uygulamay\u0131 geli\u015ftirmeli ve sisteminize kaydetmelisiniz.<\/p>\n<h4>Yerel Uygulama Geli\u015ftirme (\u00d6rnek: Python)<\/h4>\n<p>Yerel uygulama, herhangi bir programlama dilinde yaz\u0131labilir. \u00d6nemli olan, stdin&#8217;den mesajlar\u0131 okuyabilmesi, i\u015fleyebilmesi ve stdout&#8217;a yan\u0131tlar\u0131 yazabilmesidir. A\u015fa\u011f\u0131da, Python ile yaz\u0131lm\u0131\u015f basit bir yerel uygulama \u00f6rne\u011fi bulunmaktad\u0131r:<\/p>\n<pre><code class=\"language-python\">\nimport sys\nimport json\nimport struct\n\n# Gelen mesaj\u0131 oku\ndef get_message():\n    raw_length = sys.stdin.buffer.read(4)\n    if not raw_length:\n        sys.exit(0)\n    message_length = struct.unpack('@I', raw_length)[0]\n    message = sys.stdin.buffer.read(message_length).decode('utf-8')\n    return json.loads(message)\n\n# Mesaj\u0131 g\u00f6nder\ndef send_message(message):\n    encoded_message = json.dumps(message).encode('utf-8')\n    sys.stdout.buffer.write(struct.pack('@I', len(encoded_message)))\n    sys.stdout.buffer.write(encoded_message)\n    sys.stdout.buffer.flush()\n\nwhile True:\n    received_message = get_message()\n    \n    # Mesaj\u0131 i\u015fle\n    if received_message['action'] == 'echo':\n        response = {'status': 'success', 'data': received_message['payload']}\n    elif received_message['action'] == 'greet':\n        response = {'status': 'success', 'data': f\"Merhaba, {received_message['name']}!\"}\n    else:\n        response = {'status': 'error', 'message': 'Bilinmeyen eylem.'}\n    \n    send_message(response)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu Python beti\u011fi, stdin'den gelen JSON mesajlar\u0131n\u0131 okur, i\u00e7eri\u011fine g\u00f6re i\u015flem yapar ve stdout'a bir JSON yan\u0131t\u0131 g\u00f6nderir. Mesaj uzunlu\u011fu \u00f6neki i\u00e7in <code>struct<\/code> mod\u00fcl\u00fc kullan\u0131l\u0131r.<\/p>\n<h4>Yerel Uygulama Manifest Dosyas\u0131 Olu\u015fturma<\/h4>\n<p>Yerel uygulaman\u0131z i\u00e7in bir manifest dosyas\u0131 olu\u015fturman\u0131z gerekir. Bu dosya, taray\u0131c\u0131n\u0131n uygulaman\u0131z\u0131 nas\u0131l bulaca\u011f\u0131n\u0131 ve kimlerin onunla ileti\u015fim kurabilece\u011fini tan\u0131mlar.<\/p>\n<pre><code class=\"language-json\">\n{\n  \"name\": \"com.example.my_native_app\",\n  \"description\": \"Taray\u0131c\u0131 eklentisi ile ileti\u015fim kuran yerel uygulama\",\n  \"path\": \"C:\\\\path\\\\to\\\\your\\\\python_app.py\",\n  \"type\": \"stdio\",\n  \"allowed_origins\": [\n    \"chrome-extension:\/\/abcdefghijklmnopqrstuvwxyzabcdef\/\",\n    \"moz-extension:\/\/{your-firefox-extension-id}\"\n  ]\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>path<\/code> alan\u0131, yerel uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyas\u0131n\u0131n tam yolunu i\u00e7ermelidir. <code>allowed_origins<\/code> alan\u0131 ise, bu yerel uygulamayla ileti\u015fim kurmas\u0131na izin verilen taray\u0131c\u0131 eklentilerinin kimliklerini (ID'lerini) listeler. Bu, \u00f6nemli bir g\u00fcvenlik \u00f6zelli\u011fidir.<\/p>\n<h4>Manifest Dosyas\u0131n\u0131 Kaydetme (Platforma G\u00f6re)<\/h4>\n<p>Olu\u015fturdu\u011funuz manifest dosyas\u0131n\u0131 i\u015fletim sisteminize kaydetmeniz gerekir. Bu i\u015flem, her i\u015fletim sistemi i\u00e7in farkl\u0131l\u0131k g\u00f6sterir:<\/p>\n<ul>\n<li><strong>Windows:<\/strong> Manifest dosyas\u0131n\u0131n yolu, kay\u0131t defterinde <code>HKEY_CURRENT_USER\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\com.example.my_native_app<\/code> (Chrome i\u00e7in) veya benzer bir anahtar alt\u0131nda belirtilir.<\/li>\n<li><strong>macOS:<\/strong> Manifest dosyas\u0131, <code>~\/Library\/Application Support\/Google\/Chrome\/NativeMessagingHosts\/<\/code> (Chrome i\u00e7in) veya benzer bir dizinde saklan\u0131r.<\/li>\n<li><strong>Linux:<\/strong> Manifest dosyas\u0131, <code>~\/.config\/google-chrome\/NativeMessagingHosts\/<\/code> (Chrome i\u00e7in) veya benzer bir dizinde saklan\u0131r.<\/li>\n<\/ul>\n<p>Taray\u0131c\u0131, bu konumlar\u0131 kontrol ederek kay\u0131tl\u0131 yerel uygulamalar\u0131 bulur.<\/p>\n<h3>Taray\u0131c\u0131 Eklentisi Geli\u015ftirme ve \u0130leti\u015fim<\/h3>\n<p>Yerel uygulama haz\u0131r ve kay\u0131tl\u0131 oldu\u011funa g\u00f6re, \u015fimdi s\u0131ra taray\u0131c\u0131 eklentisini geli\u015ftirmeye geldi.<\/p>\n<h4>Manifest Dosyas\u0131 Ayarlar\u0131 (\u0130zinler)<\/h4>\n<p>Eklentinizin <code>manifest.json<\/code> dosyas\u0131nda <code>\"nativeMessaging\"<\/code> iznini belirtmeniz zorunludur. Bu izin olmadan eklentiniz yerel uygulamalarla ileti\u015fim kuramaz.<\/p>\n<pre><code class=\"language-json\">\n{\n  \"manifest_version\": 3,\n  \"name\": \"Yerel Mesajla\u015fma \u00d6rne\u011fi\",\n  \"version\": \"1.0\",\n  \"permissions\": [\n    \"nativeMessaging\"\n  ],\n  \"background\": {\n    \"service_worker\": \"background.js\"\n  },\n  \"action\": {\n    \"default_popup\": \"popup.html\",\n    \"default_icon\": {\n      \"16\": \"icons\/icon16.png\",\n      \"48\": \"icons\/icon48.png\"\n    }\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Yerel Uygulamaya Ba\u011flanma (<code>runtime.connectNative<\/code>)<\/h4>\n<p>Eklentinizin arka plan beti\u011finde (veya uygun bir ba\u015fka yerde), <code>chrome.runtime.connectNative()<\/code> (veya Firefox i\u00e7in <code>browser.runtime.connectNative()<\/code>) metodunu kullanarak yerel uygulamaya bir port ba\u011flant\u0131s\u0131 a\u00e7ars\u0131n\u0131z. Bu port, iki y\u00f6nl\u00fc ileti\u015fimi sa\u011flar.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ background.js\nconst nativeAppName = \"com.example.my_native_app\";\nlet port = null;\n\nfunction connectToNativeApp() {\n  try {\n    port = chrome.runtime.connectNative(nativeAppName);\n    port.onMessage.addListener(onNativeMessage);\n    port.onDisconnect.addListener(onDisconnected);\n    console.log(\"Yerel uygulamaya ba\u011fland\u0131.\");\n  } catch (error) {\n    console.error(\"Yerel uygulamaya ba\u011flan\u0131rken hata olu\u015ftu:\", error);\n  }\n}\n\nfunction onNativeMessage(message) {\n  console.log(\"Yerel uygulamadan gelen mesaj:\", message);\n  \/\/ Mesaj\u0131 i\u015fleyin, \u00f6rne\u011fin bir popup'a g\u00f6nderin\n  chrome.runtime.sendMessage({ type: \"NATIVE_MESSAGE\", payload: message });\n}\n\nfunction onDisconnected() {\n  if (chrome.runtime.lastError) {\n    console.error(\"Yerel uygulama ba\u011flant\u0131s\u0131 kesildi:\", chrome.runtime.lastError.message);\n  } else {\n    console.log(\"Yerel uygulama ba\u011flant\u0131s\u0131 kesildi.\");\n  }\n  port = null;\n  \/\/ Ba\u011flant\u0131 kesildi\u011finde yeniden ba\u011flanmay\u0131 deneyebilirsiniz\n  \/\/ setTimeout(connectToNativeApp, 5000); \n}\n\n\/\/ Eklenti y\u00fcklendi\u011finde veya bir i\u015flem tetiklendi\u011finde ba\u011flan\nchrome.runtime.onInstalled.addListener(connectToNativeApp);\nchrome.action.onClicked.addListener(connectToNativeApp); \/\/ \u00d6rne\u011fin popup a\u00e7\u0131ld\u0131\u011f\u0131nda\n\n\/\/ Di\u011fer eklenti betiklerinden gelen mesajlar\u0131 dinle\nchrome.runtime.onMessage.addListener((request, sender, sendResponse) => {\n  if (request.type === \"SEND_TO_NATIVE\") {\n    if (port) {\n      port.postMessage(request.payload);\n      console.log(\"Yerel uygulamaya g\u00f6nderilen mesaj:\", request.payload);\n      sendResponse({ status: \"Mesaj g\u00f6nderildi.\" });\n    } else {\n      console.error(\"Yerel uygulama ba\u011flant\u0131s\u0131 yok.\");\n      sendResponse({ status: \"Hata: Ba\u011flant\u0131 yok.\" });\n    }\n  }\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Mesaj G\u00f6nderme ve Alma<\/h4>\n<p>Ba\u011flant\u0131 kurulduktan sonra, <code>port.postMessage()<\/code> metodunu kullanarak JSON format\u0131nda mesajlar g\u00f6nderebilirsiniz. Gelen mesajlar\u0131 dinlemek i\u00e7in ise <code>port.onMessage.addListener()<\/code> metodunu kullan\u0131rs\u0131n\u0131z. Bu mesajlar da JSON format\u0131nda olacakt\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00d6rnek: popup.js dosyas\u0131ndan yerel uygulamaya mesaj g\u00f6nderme\ndocument.getElementById('sendMessageButton').addEventListener('click', () => {\n  const message = { action: 'echo', payload: 'Merhaba yerel uygulama!' };\n  chrome.runtime.sendMessage({ type: \"SEND_TO_NATIVE\", payload: message }, (response) => {\n    console.log(\"G\u00f6nderme yan\u0131t\u0131:\", response);\n  });\n});\n\n\/\/ Yerel uygulamadan gelen mesajlar\u0131 dinleme (popup.js)\nchrome.runtime.onMessage.addListener((request, sender, sendResponse) => {\n  if (request.type === \"NATIVE_MESSAGE\") {\n    document.getElementById('responseDiv').innerText = JSON.stringify(request.payload, null, 2);\n  }\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Hata Y\u00f6netimi<\/h4>\n<p>\u0130leti\u015fim s\u0131ras\u0131nda \u00e7e\u015fitli hatalar meydana gelebilir (yerel uygulaman\u0131n bulunamamas\u0131, izin sorunlar\u0131, uygulaman\u0131n \u00e7\u00f6kmesi vb.). Bu durumlar\u0131 ele almak i\u00e7in <code>port.onDisconnect.addListener()<\/code> metodunu kullanarak ba\u011flant\u0131 kesintilerini izlemeli ve <code>chrome.runtime.lastError<\/code> objesini kontrol etmelisiniz. Sa\u011flam bir hata y\u00f6netimi, kullan\u0131c\u0131 deneyimi ve uygulaman\u0131n g\u00fcvenilirli\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<h3>\u0130leti\u015fim Protokol\u00fc ve Veri Format\u0131<\/h3>\n<p>Yerel Mesajla\u015fma, basit ama etkili bir protokole dayan\u0131r. Bu protokol, taray\u0131c\u0131 ve yerel uygulama aras\u0131nda veri al\u0131\u015fveri\u015finin nas\u0131l yap\u0131laca\u011f\u0131n\u0131 tan\u0131mlar.<\/p>\n<h4>JSON Tabanl\u0131 Mesajla\u015fma<\/h4>\n<p>Hem taray\u0131c\u0131 eklentisi hem de yerel uygulama, mesajlar\u0131 JSON (JavaScript Object Notation) format\u0131nda g\u00f6nderip al\u0131r. Bu, farkl\u0131 diller aras\u0131nda kolay veri de\u011fi\u015fimi sa\u011flar ve mesajlar\u0131n yap\u0131land\u0131r\u0131lm\u0131\u015f olmas\u0131n\u0131 garanti eder. JSON, hem insanlar taraf\u0131ndan okunabilir hem de makineler taraf\u0131ndan kolayca ayr\u0131\u015ft\u0131r\u0131labilir bir formatt\u0131r.<\/p>\n<h4>Mesaj Uzunlu\u011fu \u00d6neki (32-bit Little-Endian)<\/h4>\n<p>Her JSON mesaj\u0131n\u0131n ba\u015f\u0131nda, mesaj\u0131n toplam bayt uzunlu\u011funu belirten 4 baytl\u0131k (32-bit) bir \u00f6nek bulunur. Bu \u00f6nek, \"little-endian\" bayt s\u0131ras\u0131na g\u00f6re kodlanm\u0131\u015ft\u0131r. Yerel uygulama, stdin'den \u00f6nce bu 4 bayt\u0131 okumal\u0131, mesaj\u0131n uzunlu\u011funu \u00e7\u00f6zmeli ve ard\u0131ndan belirtilen uzunlukta veriyi okuyarak tam JSON mesaj\u0131n\u0131 elde etmelidir. Ayn\u0131 \u015fekilde, yerel uygulama da stdout'a bir mesaj yazmadan \u00f6nce bu \u00f6neki eklemelidir. Bu mekanizma, mesajlar\u0131n s\u0131n\u0131rlar\u0131n\u0131n net bir \u015fekilde belirlenmesini sa\u011flar ve ak\u0131\u015f tabanl\u0131 ileti\u015fimi g\u00fcvenilir hale getirir.<\/p>\n<h4>\u00c7ift Y\u00f6nl\u00fc \u0130leti\u015fim Ak\u0131\u015f\u0131<\/h4>\n<p>Yerel Mesajla\u015fma, \u00e7ift y\u00f6nl\u00fc bir ileti\u015fim kanal\u0131n\u0131 destekler. Bu, taray\u0131c\u0131 eklentisinin yerel uygulamaya mesaj g\u00f6nderebilece\u011fi gibi, yerel uygulaman\u0131n da istedi\u011fi zaman eklentiye mesaj g\u00f6nderebilece\u011fi anlam\u0131na gelir. Bu esneklik, karma\u015f\u0131k etkile\u015fim senaryolar\u0131n\u0131n (\u00f6rne\u011fin, yerel uygulaman\u0131n bir olay hakk\u0131nda eklentiyi bilgilendirmesi) uygulanmas\u0131na olanak tan\u0131r.<\/p>\n<h3>G\u00fcvenlik Hususlar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Yerel Mesajla\u015fma, taray\u0131c\u0131 sandbox'\u0131n\u0131n d\u0131\u015f\u0131na \u00e7\u0131kt\u0131\u011f\u0131 i\u00e7in \u00f6nemli g\u00fcvenlik riskleri ta\u015f\u0131yabilir. Bu nedenle, geli\u015ftirme s\u0131ras\u0131nda g\u00fcvenlik en iyi uygulamalar\u0131na dikkat etmek hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h4><code>allowed_origins<\/code> K\u0131s\u0131tlamas\u0131<\/h4>\n<p>Yerel uygulama manifest dosyas\u0131ndaki <code>allowed_origins<\/code> alan\u0131, hangi taray\u0131c\u0131 eklentilerinin yerel uygulaman\u0131zla ileti\u015fim kurabilece\u011fini kesin olarak belirtir. Bu, yetkisiz eklentilerin uygulaman\u0131z\u0131 kullanmas\u0131n\u0131 engeller. Eklentinizin kimli\u011fini (ID'sini) buraya do\u011fru bir \u015fekilde ekledi\u011finizden emin olun. Genellikle, eklentinizin ID'si geli\u015ftirici panelinde veya taray\u0131c\u0131n\u0131n eklenti y\u00f6netim sayfas\u0131nda bulunur.<\/p>\n<h4>Kullan\u0131c\u0131 Onay\u0131 ve G\u00fcven<\/h4>\n<p>Yerel Mesajla\u015fma kullanan bir eklenti, kullan\u0131c\u0131n\u0131n bilgisayar\u0131nda potansiyel olarak g\u00fc\u00e7l\u00fc i\u015flemler ger\u00e7ekle\u015ftirebilir. Bu nedenle, eklentinizin ve yerel uygulaman\u0131z\u0131n ne yapt\u0131\u011f\u0131n\u0131 kullan\u0131c\u0131lara a\u00e7\u0131k\u00e7a anlatman\u0131z ve g\u00fcvenlerini kazanman\u0131z \u00f6nemlidir. Kurulum s\u00fcrecinde veya ilk kullan\u0131mda, kullan\u0131c\u0131lardan yerel uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rma veya belirli izinleri verme konusunda onay almak iyi bir uygulamad\u0131r.<\/p>\n<h4>Giri\u015f Do\u011frulama ve Yetkilendirme<\/h4>\n<p>Yerel uygulaman\u0131z, taray\u0131c\u0131 eklentisinden gelen t\u00fcm giri\u015fleri (mesajlar\u0131) dikkatlice do\u011frulamal\u0131d\u0131r. G\u00fcvenilmeyen bir kaynaktan geliyormu\u015f gibi i\u015flem yap\u0131n ve olas\u0131 g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 (SQL enjeksiyonu, komut enjeksiyonu vb.) \u00f6nlemek i\u00e7in t\u00fcm giri\u015fleri temizleyin ve do\u011frulay\u0131n. Ayr\u0131ca, yerel uygulaman\u0131z\u0131n ger\u00e7ekle\u015ftirdi\u011fi eylemler i\u00e7in uygun yetkilendirme kontrolleri uygulay\u0131n.<\/p>\n<h4>Uygulama \u0130mzalar\u0131 ve G\u00fcvenli Da\u011f\u0131t\u0131m<\/h4>\n<p>Yerel uygulaman\u0131z\u0131 da\u011f\u0131t\u0131rken, uygulaman\u0131n b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve orijinalli\u011fini sa\u011flamak i\u00e7in dijital imzalar kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu, kullan\u0131c\u0131lar\u0131n uygulaman\u0131n g\u00fcvenilir bir kaynaktan geldi\u011fini ve de\u011fi\u015ftirilmedi\u011fini do\u011frulamas\u0131na yard\u0131mc\u0131 olur. Ayr\u0131ca, uygulaman\u0131z\u0131 g\u00fcvenli kanallar \u00fczerinden da\u011f\u0131t\u0131n ve kullan\u0131c\u0131lar\u0131 \u015f\u00fcpheli kaynaklardan indirmemeleri konusunda uyar\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Yerel Mesajla\u015fma, taray\u0131c\u0131 eklentilerinin web'in s\u0131n\u0131rl\u0131 sandbox ortam\u0131n\u0131n \u00f6tesine ge\u00e7erek masa\u00fcst\u00fc uygulamalar\u0131yla g\u00fc\u00e7l\u00fc ve g\u00fcvenli bir \u015fekilde etkile\u015fim kurmas\u0131n\u0131 sa\u011flayan kritik bir teknolojidir. Donan\u0131m entegrasyonundan sistem otomasyonuna kadar geni\u015f bir kullan\u0131m alan\u0131 sunarak, eklentilerin yeteneklerini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Ancak, bu g\u00fcc\u00fcn beraberinde getirdi\u011fi g\u00fcvenlik sorumluluklar\u0131n\u0131 g\u00f6z ard\u0131 etmemek ve en iyi uygulamalar\u0131 takip etmek, hem geli\u015ftiriciler hem de son kullan\u0131c\u0131lar i\u00e7in g\u00fcvenli ve verimli bir deneyim sa\u011flamak a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Do\u011fru uyguland\u0131\u011f\u0131nda, Yerel Mesajla\u015fma, taray\u0131c\u0131 eklentileriyle yapabileceklerinizin s\u0131n\u0131rlar\u0131n\u0131 yeniden tan\u0131mlar.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Yerel Mesajla\u015fma hangi taray\u0131c\u0131lar taraf\u0131ndan destekleniyor?<\/h4>\n<p>Ba\u015fl\u0131ca modern taray\u0131c\u0131lar olan Google Chrome, Mozilla Firefox, Microsoft Edge ve Opera taraf\u0131ndan desteklenmektedir. Her taray\u0131c\u0131n\u0131n kendi API \u00f6n eki (\u00f6rne\u011fin <code>chrome.runtime<\/code> veya <code>browser.runtime<\/code>) ve yerel uygulama manifest dosyas\u0131n\u0131n kay\u0131t yeri farkl\u0131l\u0131k g\u00f6sterebilir.<\/p>\n<h4>2. Yerel Mesajla\u015fma g\u00fcvenli midir?<\/h4>\n<p>Evet, do\u011fru uyguland\u0131\u011f\u0131nda g\u00fcvenlidir. G\u00fcvenlik, \u00f6zellikle <code>allowed_origins<\/code> k\u0131s\u0131tlamas\u0131n\u0131n do\u011fru yap\u0131land\u0131r\u0131lmas\u0131na, yerel uygulaman\u0131n gelen mesajlar\u0131 do\u011frulamas\u0131na ve kullan\u0131c\u0131n\u0131n uygulaman\u0131n kurulumuna onay vermesine ba\u011fl\u0131d\u0131r. Geli\u015ftiricilerin g\u00fcvenlik en iyi uygulamalar\u0131na uymas\u0131 kritik \u00f6neme sahiptir.<\/p>\n<h4>3. Yerel uygulamam herhangi bir programlama dilinde yaz\u0131labilir mi?<\/h4>\n<p>Evet, yerel uygulaman\u0131z Python, Node.js, C#, Java, C++ veya stdin\/stdout \u00fczerinden veri okuyup yazabilen herhangi bir dilde yaz\u0131labilir. \u00d6nemli olan, taray\u0131c\u0131n\u0131n bekledi\u011fi ileti\u015fim protokol\u00fcne (JSON ve 32-bit little-endian uzunluk \u00f6neki) uymas\u0131d\u0131r.<\/p>\n<h4>4. Yerel Mesajla\u015fma yerine ba\u015fka alternatifler var m\u0131?<\/h4>\n<p>Do\u011frudan yerel uygulama etkile\u015fimi i\u00e7in Yerel Mesajla\u015fma en yayg\u0131n ve \u00f6nerilen y\u00f6ntemdir. Alternatif olarak, bir WebSocket sunucusu kurup hem eklentinin hem de yerel uygulaman\u0131n bu sunucuya ba\u011flanmas\u0131n\u0131 sa\u011flayabilirsiniz. Ancak bu, Yerel Mesajla\u015fma'ya g\u00f6re daha karma\u015f\u0131k bir kurulum gerektirir ve taray\u0131c\u0131 taraf\u0131ndan do\u011frudan desteklenen bir mekanizma de\u011fildir.<\/p>\n<h4>5. Yerel Mesajla\u015fma ile ne t\u00fcr uygulamalar geli\u015ftirebilirim?<\/h4>\n<p>\u00c7ok \u00e7e\u015fitli uygulamalar geli\u015ftirebilirsiniz:<\/p>\n<ul>\n<li>Fiziksel donan\u0131mlarla (USB cihazlar\u0131, barkod okuyucular, yaz\u0131c\u0131lar) etkile\u015fim kuran eklentiler.<\/li>\n<li>Sistem genelinde \u015fifre y\u00f6neticileri veya kimlik do\u011frulama ara\u00e7lar\u0131.<\/li>\n<li>Masa\u00fcst\u00fc uygulamalar\u0131yla entegrasyon sa\u011flayan (\u00f6rne\u011fin, bir web sayfas\u0131ndaki veriyi masa\u00fcst\u00fc uygulamas\u0131na aktaran) eklentiler.<\/li>\n<li>Sistem kaynaklar\u0131na eri\u015fim gerektiren (dosya okuma\/yazma, belirli sistem komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rma) kurumsal ara\u00e7lar.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Taray\u0131c\u0131 eklentileri, web sayfalar\u0131n\u0131 manip\u00fcle etmek, kullan\u0131c\u0131 aray\u00fcz\u00fcne yeni \u00f6zellikler eklemek veya API&#8217;lar arac\u0131l\u0131\u011f\u0131yla web servisleriyle e&#8230;","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":[1],"tags":[],"class_list":{"0":"post-36604","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#039;in \u00d6tesine Ge\u00e7mek - 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\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#039;in \u00d6tesine Ge\u00e7mek\" \/>\n<meta property=\"og:description\" content=\"Taray\u0131c\u0131 eklentileri, web sayfalar\u0131n\u0131 manip\u00fcle etmek, kullan\u0131c\u0131 aray\u00fcz\u00fcne yeni \u00f6zellikler eklemek veya API&#039;lar arac\u0131l\u0131\u011f\u0131yla web servisleriyle e...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-20T11:00:41+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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#8217;in \u00d6tesine Ge\u00e7mek\",\"datePublished\":\"2025-12-20T11:00:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\"},\"wordCount\":2354,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\",\"name\":\"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web'in \u00d6tesine Ge\u00e7mek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-20T11:00:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#8217;in \u00d6tesine Ge\u00e7mek\"}]},{\"@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":"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web'in \u00d6tesine Ge\u00e7mek - 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\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web'in \u00d6tesine Ge\u00e7mek","og_description":"Taray\u0131c\u0131 eklentileri, web sayfalar\u0131n\u0131 manip\u00fcle etmek, kullan\u0131c\u0131 aray\u00fcz\u00fcne yeni \u00f6zellikler eklemek veya API'lar arac\u0131l\u0131\u011f\u0131yla web servisleriyle e...","og_url":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-20T11:00:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#8217;in \u00d6tesine Ge\u00e7mek","datePublished":"2025-12-20T11:00:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/"},"wordCount":2354,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/","url":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/","name":"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web'in \u00d6tesine Ge\u00e7mek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-20T11:00:41+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/tarayici-eklentileri-ve-yerel-mesajlasma-webin-otesine-gecmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Taray\u0131c\u0131 Eklentileri ve Yerel Mesajla\u015fma: Web&#8217;in \u00d6tesine Ge\u00e7mek"}]},{"@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\/36604","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=36604"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36604\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36604"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36604"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36604"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}