78 lines
3.0 KiB
Python
78 lines
3.0 KiB
Python
"""Разведка публичных Telegram-каналов под абузы: t.me/s без сессии и ключей.
|
|
|
|
python tools/tg_discover.py name1,name2,... # проверить и показать
|
|
python tools/tg_discover.py --file data/tg_cand.txt # список из файла
|
|
python tools/tg_discover.py ... --min 3 # печатать только годные
|
|
|
|
Для каждого канала: HTTP-статус, сколько постов даёт парсер (после отсева
|
|
служебного и пустышей) и сколько из них новые для базы.
|
|
"""
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
|
|
from omni import feeds, sources, store # noqa: E402
|
|
|
|
|
|
def candidates(argv):
|
|
"""Позиционные аргументы = имена/списки через запятую; --file/--min пропускаем."""
|
|
names = []
|
|
skip_next = False
|
|
for a in argv:
|
|
if skip_next:
|
|
skip_next = False
|
|
continue
|
|
if a in ("--file", "--min"):
|
|
skip_next = True
|
|
continue
|
|
if a.startswith("--"):
|
|
continue
|
|
names += [x.strip() for x in a.split(",") if x.strip()]
|
|
if "--file" in argv:
|
|
p = Path(argv[argv.index("--file") + 1])
|
|
names += [x.strip() for x in p.read_text(encoding="utf-8").splitlines() if x.strip()]
|
|
seen, out = set(), []
|
|
for n in names:
|
|
k = n.lower().lstrip("@")
|
|
if k and k not in seen:
|
|
seen.add(k)
|
|
out.append(n.lstrip("@"))
|
|
return out
|
|
|
|
|
|
def main():
|
|
args = sys.argv[1:]
|
|
min_items = 1
|
|
if "--min" in args:
|
|
min_items = int(args[args.index("--min") + 1])
|
|
todo = candidates(args)
|
|
print(f"кандидатов {len(todo)}")
|
|
good = []
|
|
for name in todo:
|
|
src = sources.Source("probe_" + name.lower(), "abuse", "html",
|
|
f"https://t.me/s/{name}", "tg_web", ("abuse",), 25, "", {})
|
|
try:
|
|
items = feeds.fetch(src)
|
|
except Exception as e:
|
|
print(f" {name:24} ошибка: {type(e).__name__}")
|
|
continue
|
|
c = store.conn()
|
|
urls = {r[0] for r in c.execute("SELECT url FROM items WHERE source=?", (src.name,))}
|
|
c.close()
|
|
fresh = sum(1 for it in items if it.url not in urls)
|
|
mark = ""
|
|
if fresh >= min_items and items:
|
|
good.append((name, len(items), fresh))
|
|
mark = " <-- ГОДЕН"
|
|
print(f" {name:24} постов {len(items):>3} новых {fresh:>3}{mark}")
|
|
print(f"\nгодных каналов: {len(good)}")
|
|
for name, n, f in sorted(good, key=lambda x: -x[1]):
|
|
print(f" {name:24} постов {n:>3} новых {f}")
|
|
if good:
|
|
Path("data/tg_good.txt").write_text("\n".join(g[0] for g in good), encoding="utf-8")
|
|
print("список: data/tg_good.txt")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |