{"id":4251,"date":"2026-06-16T02:03:34","date_gmt":"2026-06-16T02:03:34","guid":{"rendered":"https:\/\/ifx0.com\/?p=4251"},"modified":"2026-06-16T02:03:35","modified_gmt":"2026-06-16T02:03:35","slug":"code-to-see-who-is-listening-to-your-device","status":"publish","type":"post","link":"https:\/\/ifx0.com\/index.php\/2026\/06\/16\/code-to-see-who-is-listening-to-your-device\/","title":{"rendered":"code to see who is listening to your device"},"content":{"rendered":"\n<p>Code:<\/p>\n<p>&#8221;<\/p>\n<p>import tkinter as tk<br \/>from tkinter import ttk, scrolledtext<br \/>import threading<br \/>import time<br \/>import sys<br \/>import subprocess<br \/>import platform<\/p>\n<p>try:<br \/>import pyaudio<br \/>import numpy as np<br \/>except ImportError:<br \/>pyaudio = None<br \/>np = None<\/p>\n<p>import psutil<\/p>\n<p><br \/>class PrivacyGuardApp:<br \/>def __init__(self, root):<br \/>self.root = root<br \/>self.root.title(&#8220;Privacy Guard \u2013 No Listening&#8221;)<br \/>self.root.geometry(&#8220;700&#215;600&#8221;)<br \/>self.root.resizable(True, True)<\/p>\n<p># Monitoring flags<br \/>self.mic_monitoring = False<br \/>self.mic_thread = None<br \/>self.audio = None<br \/>self.stream = None<\/p>\n<p># Build GUI<br \/>self.create_widgets()<\/p>\n<p># Start network monitoring (refreshes every 5 sec)<br \/>self.refresh_network()<br \/>self.root.after(5000, self.schedule_network_refresh)<\/p>\n<p>def create_widgets(self):<br \/># &#8212;&#8212;&#8212;- Microphone section &#8212;&#8212;&#8212;-<br \/>mic_frame = ttk.LabelFrame(self.root, text=&#8221;Microphone Listening Status&#8221;, padding=10)<br \/>mic_frame.pack(fill=tk.X, padx=10, pady=5)<\/p>\n<p>self.mic_status_label = ttk.Label(mic_frame, text=&#8221;Status: Not monitoring&#8221;, font=(&#8220;Arial&#8221;, 10))<br \/>self.mic_status_label.pack(anchor=tk.W)<\/p>\n<p>self.mic_level_label = ttk.Label(mic_frame, text=&#8221;Current level: &#8212; dB&#8221;, font=(&#8220;Arial&#8221;, 10))<br \/>self.mic_level_label.pack(anchor=tk.W, pady=(5,0))<\/p>\n<p>self.mic_progress = ttk.Progressbar(mic_frame, length=400, mode=&#8217;determinate&#8217;, maximum=100)<br \/>self.mic_progress.pack(anchor=tk.W, pady=5)<\/p>\n<p>btn_frame = ttk.Frame(mic_frame)<br \/>btn_frame.pack(anchor=tk.W, pady=5)<\/p>\n<p>self.start_mic_btn = ttk.Button(btn_frame, text=&#8221;Start Mic Monitor&#8221;, command=self.start_mic_monitoring)<br \/>self.start_mic_btn.pack(side=tk.LEFT, padx=2)<\/p>\n<p>self.stop_mic_btn = ttk.Button(btn_frame, text=&#8221;Stop Mic Monitor&#8221;, command=self.stop_mic_monitoring, state=tk.DISABLED)<br \/>self.stop_mic_btn.pack(side=tk.LEFT, padx=2)<\/p>\n<p>self.mute_mic_btn = ttk.Button(btn_frame, text=&#8221;Mute Microphone (System)&#8221;, command=self.mute_microphone)<br \/>self.mute_mic_btn.pack(side=tk.LEFT, padx=2)<\/p>\n<p># Warning label for missing PyAudio<br \/>if pyaudio is None or np is None:<br \/>warn = ttk.Label(mic_frame, text=&#8221;&#x26a0; PyAudio or numpy not installed \u2013 microphone monitoring disabled.&#8221;,<br \/>foreground=&#8221;red&#8221;)<br \/>warn.pack(anchor=tk.W)<br \/>self.start_mic_btn.config(state=tk.DISABLED)<br \/>self.mute_mic_btn.config(state=tk.DISABLED)<\/p>\n<p># &#8212;&#8212;&#8212;- Network listening ports section &#8212;&#8212;&#8212;-<br \/>net_frame = ttk.LabelFrame(self.root, text=&#8221;Network Ports Listening to Outside World&#8221;, padding=10)<br \/>net_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)<\/p>\n<p>self.net_text = scrolledtext.ScrolledText(net_frame, height=12, width=80, wrap=tk.WORD)<br \/>self.net_text.pack(fill=tk.BOTH, expand=True)<\/p>\n<p>refresh_btn = ttk.Button(net_frame, text=&#8221;Refresh Now&#8221;, command=self.refresh_network)<br \/>refresh_btn.pack(pady=5)<\/p>\n<p># &#8212;&#8212;&#8212;- Instructions &#8212;&#8212;&#8212;-<br \/>info_frame = ttk.LabelFrame(self.root, text=&#8221;How to be sure&#8221;, padding=10)<br \/>info_frame.pack(fill=tk.X, padx=10, pady=5)<\/p>\n<p>info_text = (<br \/>&#8220;\u2022 Microphone level near 0 dB \u2192 microphone is silent (no sound captured).\\n&#8221;<br \/>&#8220;\u2022 Use &#8216;Mute Microphone&#8217; to disable the mic at system level (Windows\/macOS only).\\n&#8221;<br \/>&#8220;\u2022 Network ports listening on 0.0.0.0 or :: are reachable from other devices.\\n&#8221;<br \/>&#8220;\u2022 To close a listening port, stop the associated program (e.g., web server).\\n&#8221;<br \/>&#8220;\u2022 For complete privacy: physically disconnect microphone or use hardware kill switch.&#8221;<br \/>)<br \/>ttk.Label(info_frame, text=info_text, justify=tk.LEFT).pack(anchor=tk.W)<\/p>\n<p># &#8212;&#8212;&#8212;- Microphone monitoring &#8212;&#8212;&#8212;-<br \/>def start_mic_monitoring(self):<br \/>if self.mic_monitoring:<br \/>return<br \/>if pyaudio is None or np is None:<br \/>return<\/p>\n<p>try:<br \/>self.audio = pyaudio.PyAudio()<br \/>self.stream = self.audio.open(format=pyaudio.paInt16,<br \/>channels=1,<br \/>rate=44100,<br \/>input=True,<br \/>frames_per_buffer=1024,<br \/>stream_callback=None)<br \/>self.mic_monitoring = True<br \/>self.mic_thread = threading.Thread(target=self._mic_loop, daemon=True)<br \/>self.mic_thread.start()<br \/>self.start_mic_btn.config(state=tk.DISABLED)<br \/>self.stop_mic_btn.config(state=tk.NORMAL)<br \/>self.mic_status_label.config(text=&#8221;Status: Monitoring (listening for sound)&#8221;, foreground=&#8221;green&#8221;)<br \/>except Exception as e:<br \/>self.mic_status_label.config(text=f&#8221;Error: {e}&#8221;, foreground=&#8221;red&#8221;)<\/p>\n<p>def stop_mic_monitoring(self):<br \/>self.mic_monitoring = False<br \/>if self.stream:<br \/>self.stream.stop_stream()<br \/>self.stream.close()<br \/>if self.audio:<br \/>self.audio.terminate()<br \/>self.start_mic_btn.config(state=tk.NORMAL)<br \/>self.stop_mic_btn.config(state=tk.DISABLED)<br \/>self.mic_status_label.config(text=&#8221;Status: Not monitoring&#8221;, foreground=&#8221;black&#8221;)<br \/>self.mic_level_label.config(text=&#8221;Current level: &#8212; dB&#8221;)<br \/>self.mic_progress[&#8216;value&#8217;] = 0<\/p>\n<p>def _mic_loop(self):<br \/>while self.mic_monitoring and self.stream.is_active():<br \/>try:<br \/>data = self.stream.read(1024, exception_on_overflow=False)<br \/># Convert bytes to numpy int16 array<br \/>samples = np.frombuffer(data, dtype=np.int16)<br \/>if len(samples) &gt; 0:<br \/># RMS value as a rough sound level<br \/>rms = np.sqrt(np.mean(samples.astype(np.float64)**2))<br \/># Convert to dB (0 dB = maximum possible for int16 = 32768)<br \/>if rms &lt; 1e-5:<br \/>db = -100<br \/>else:<br \/>db = 20 * np.log10(rms \/ 32768.0)<br \/># Clip and map to 0-100% for progress bar<br \/>percent = min(100, max(0, int((db + 100) \/ 50 * 100)))<br \/>self.root.after(0, self._update_mic_ui, db, percent)<br \/>else:<br \/>self.root.after(0, self._update_mic_ui, -100, 0)<br \/>except Exception:<br \/>pass<br \/>time.sleep(0.1)<\/p>\n<p>def _update_mic_ui(self, db, percent):<br \/>self.mic_level_label.config(text=f&#8221;Current level: {db:.1f} dB&#8221;)<br \/>self.mic_progress[&#8216;value&#8217;] = percent<br \/># Color hint: if &gt; -40 dB, there is significant sound<br \/>if db &gt; -40:<br \/>self.mic_status_label.config(text=&#8221;Status: Monitoring \u2013 MIC IS CAPTURING SOUND&#8221;, foreground=&#8221;red&#8221;)<br \/>else:<br \/>self.mic_status_label.config(text=&#8221;Status: Monitoring \u2013 microphone appears silent&#8221;, foreground=&#8221;green&#8221;)<\/p>\n<p># &#8212;&#8212;&#8212;- System microphone mute (platform specific) &#8212;&#8212;&#8212;-<br \/>def mute_microphone(self):<br \/>sys_name = platform.system()<br \/>try:<br \/>if sys_name == &#8220;Windows&#8221;:<br \/># Uses nircmd (small tool) or pycaw? Provide simple alternative: show warning<br \/># For simplicity, we&#8217;ll open Windows Sound settings and instruct user.<br \/>subprocess.run(&#8220;start ms-settings:sound&#8221;, shell=True)<br \/>tk.messagebox.showinfo(&#8220;Mute Microphone&#8221;,<br \/>&#8220;Please mute the microphone in the Sound Settings window that opened.\\n&#8221;<br \/>&#8220;Alternatively, use the physical mute button on your headset\/mic.&#8221;)<br \/>elif sys_name == &#8220;Darwin&#8221;: # macOS<br \/># Use osascript to set input volume to 0<br \/>script = &#8216;set volume input volume 0&#8217;<br \/>subprocess.run([&#8220;osascript&#8221;, &#8220;-e&#8221;, script])<br \/>tk.messagebox.showinfo(&#8220;Muted&#8221;, &#8220;Microphone input volume set to 0 (muted).&#8221;)<br \/>elif sys_name == &#8220;Linux&#8221;:<br \/># Try using amixer<br \/>subprocess.run([&#8220;amixer&#8221;, &#8220;set&#8221;, &#8220;Capture&#8221;, &#8220;nocap&#8221;], check=False)<br \/>tk.messagebox.showinfo(&#8220;Muted&#8221;, &#8220;Attempted to mute microphone via amixer.&#8221;)<br \/>else:<br \/>tk.messagebox.showwarning(&#8220;Unsupported&#8221;, f&#8221;Automatic muting not implemented for {sys_name}.&#8221;)<br \/>except Exception as e:<br \/>tk.messagebox.showerror(&#8220;Error&#8221;, f&#8221;Could not mute microphone: {e}&#8221;)<\/p>\n<p># &#8212;&#8212;&#8212;- Network monitoring (listening ports) &#8212;&#8212;&#8212;-<br \/>def refresh_network(self):<br \/>self.net_text.delete(1.0, tk.END)<br \/>listening = []<br \/>try:<br \/>for conn in psutil.net_connections(kind=&#8217;inet&#8217;):<br \/>if conn.status == &#8216;LISTEN&#8217;:<br \/># laddr = (ip, port)<br \/>ip = conn.laddr.ip<br \/>port = conn.laddr.port<br \/># Determine if it listens on external interface<br \/>external = ip in (&#8216;0.0.0.0&#8217;, &#8216;::&#8217;) or ip.startswith(&#8216;::&#8217;)<br \/>pid = conn.pid<br \/>pname = &#8220;&#8221;<br \/>if pid:<br \/>try:<br \/>p = psutil.Process(pid)<br \/>pname = p.name()<br \/>except (psutil.NoSuchProcess, psutil.AccessDenied):<br \/>pname = &#8220;unknown&#8221;<br \/>listening.append((ip, port, external, pid, pname))<br \/>except (psutil.AccessDenied, Exception) as e:<br \/>self.net_text.insert(tk.END, f&#8221;Error reading network connections: {e}\\n&#8221;)<br \/>self.net_text.insert(tk.END, &#8220;Run as administrator\/root to see all ports.\\n&#8221;)<br \/>self.root.after(5000, self.schedule_network_refresh)<br \/>return<\/p>\n<p>if not listening:<br \/>self.net_text.insert(tk.END, &#8220;No listening ports found (or insufficient privileges).\\n&#8221;)<br \/>else:<br \/>header = f&#8221;{&#8216;IP Address&#8217;:&lt;20} {&#8216;Port&#8217;:&lt;8} {&#8216;External?&#8217;:&lt;10} {&#8216;PID&#8217;:&lt;8} {&#8216;Process&#8217;:&lt;20}\\n&#8221;<br \/>self.net_text.insert(tk.END, header)<br \/>self.net_text.insert(tk.END, &#8220;-&#8221; * 70 + &#8220;\\n&#8221;)<br \/>for ip, port, external, pid, pname in listening:<br \/>ext_str = &#8220;YES (outside)&#8221; if external else &#8220;Loopback only&#8221;<br \/>self.net_text.insert(tk.END, f&#8221;{ip:&lt;20} {port:&lt;8} {ext_str:&lt;14} {pid:&lt;8} {pname:&lt;20}\\n&#8221;)<br \/>self.net_text.insert(tk.END, &#8220;\\n&#x26a0; Ports marked &#8216;YES (outside)&#8217; are reachable from other devices.\\n&#8221;)<br \/>self.net_text.insert(tk.END, &#8220;Close the associated program to stop listening.\\n&#8221;)<\/p>\n<p>self.root.after(5000, self.schedule_network_refresh)<\/p>\n<p>def schedule_network_refresh(self):<br \/>if hasattr(self, &#8216;root&#8217;) and self.root.winfo_exists():<br \/>self.refresh_network()<br \/>self.root.after(5000, self.schedule_network_refresh)<\/p>\n<p><br \/>if __name__ == &#8220;__main__&#8221;:<br \/>root = tk.Tk()<br \/>app = PrivacyGuardApp(root)<br \/>root.mainloop() &#8221;<\/p>\n<p><a href=\"https:\/\/www.linkedin.com\/in\/kadiruludag19\/?originalSubdomain=cn\">https:\/\/www.linkedin.com\/in\/kadiruludag19\/?originalSubdomain=cn<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Code: &#8221; import tkinter as tkfrom tkinter import ttk, scrolledtextimport threadingimport timeimport sysimport subprocessimport platform try:import pyaudioimport numpy as npexcept ImportError:pyaudio = Nonenp = None import psutil class PrivacyGuardApp:def __init__(self, root):self.root = rootself.root.title(&#8220;Privacy Guard \u2013 No Listening&#8221;)self.root.geometry(&#8220;700&#215;600&#8221;)self.root.resizable(True, True) # Monitoring <a href=\"https:\/\/ifx0.com\/index.php\/2026\/06\/16\/code-to-see-who-is-listening-to-your-device\/\" class=\"read-more\">Read More &#8230;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4251","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/posts\/4251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/comments?post=4251"}],"version-history":[{"count":1,"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/posts\/4251\/revisions"}],"predecessor-version":[{"id":4252,"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/posts\/4251\/revisions\/4252"}],"wp:attachment":[{"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/media?parent=4251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/categories?post=4251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ifx0.com\/index.php\/wp-json\/wp\/v2\/tags?post=4251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}