from scapy.all import *
from threading import Thread
import pandas
import time
import os
import sys

# initialize the networks dataframe that will contain all access points nearby
networks = pandas.DataFrame(columns=["BSSID", "SSID","dBm_Signal", "Channel", "Crypto"])
# set the index BSSID (MAC address of the AP)
networks.set_index("BSSID", inplace=True)

def callback(packet):
    if packet.haslayer(Dot11Beacon):
        # extract the MAC address of the network
        bssid = packet[Dot11].addr2
        # get the name of it
        ssid = packet[Dot11Elt].info.decode()
        try:
            dbm_signal = packet.dBm_AntSignal
        except:
            dbm_signal = "N/A"
        # extract network stats
        stats = packet[Dot11Beacon].network_stats()
        # get the channel of the AP
        print (chr(27)+"[36m")
        channel = stats.get("channel")
        # get the crypto
        crypto = stats.get("crypto")
        networks.loc[bssid] = (ssid,dbm_signal, channel, crypto)


def print_all():
    while True:
        os.system("clear")
        print(networks)
        time.sleep(0.5)


def change_channel():
    ch = 1
    while True:
        os.system(f"iwconfig {interface} channel {ch}")
        # switch channel from 1 to 14 each 0.5s
        ch = ch % 14 + 1
        time.sleep(0.5)


if __name__ == "__main__":
    os.system("clear")
    import pyfiglet
    banner = pyfiglet.figlet_format("Wifi Scanner")
    print (chr(27)+"[36m")
    print (banner)
    print (chr(27)+"[32m"+"                                                 version : 2.0")  
    print (chr(27)+"[36m"+"          Author : Rahat Khan Tusar(RKT)")
    print (chr(27)+"[36m"+"          Github : https://github.com/r3k4t")
    print
    ip=input("Enter interface(wlp2s0,wlan0 etc) :")
    os.system("sudo airmon-ng start {}".format(ip))
    # interface name, check using iwconfig
    interface=input("Enter interface(wlp2s0mon,wlan0mon etc): ")
    # start the thread that prints all the networks
    printer = Thread(target=print_all)
    printer.daemon = True
    printer.start()
    # start the channel changer
    channel_changer = Thread(target=change_channel)
    channel_changer.daemon = True
    channel_changer.start()
    # start sniffing
    sniff(prn=callback, iface=interface)
