Конкурс [ Пишем Hack-Tools ] - Парсер e-mail адресов

mailparser_2.png

Статья для участия в Конкурсе программистов
Сегодня мы разберём программу для парсинга e-mail адресов с страницы. Пока это бета версия.
Внешний вид программы в Windows
screen1.png

Графическая оболочка выполнена в Tkinter входящий в состав Python и не требующий отдельной установки.

Let's go!

Импортируем модули и добавляем иконку:
Python:
import requests
import re       
from tkinter import *
from tkinter import filedialog

icon="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"


Создаём главное окно с названием "root", задаем размеры окна и запрет на изменение окна .Записываем информацию о версии, название
Python:
root=Tk()
root.geometry("325x250")
root.resizable(width=False, height=False)
__version__="0.0.1 Beta"
root.title("MailParser "+__version__+" By Pirnazar")


Пишем функцию которая будет выполняться при нажатии кнопки Save для сохранения результатов в файл.
Python:
def save():
    fn = filedialog.SaveAs(filetypes = [('*.txt', '.txt')]).show()
    if fn == '':
        return
    if not fn.endswith(".txt"):
        fn+=".txt"
    open(fn, 'wt').write(email.get('1.0', 'end'))


Теперь самое главное, сердце программы))
Python:
def run():
    database=[]                                                  # создаем "базу" (список) ссылок чтоб не было дубликатов
    headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
    }                                                                   # Задаем User-Agent-a чтоб не палиться 
  
    url=url_value.get()                                       # Получаем ссылку на страницу
    try:                                                               # Попробуем сделать запрос
       page=requests.get(url,headers=headers)
    except:                                                        # Если не получилось сделать запрос тогда
       url="http://"+url                                      # добавляем начала ссылки "http://" 
       page=requests.get(url,headers=headers)   # Снова попробуем отправить запрос
    page=str(page.text)                                       
    emails=re.findall('\w+\@\w+.\w+',page)        # Ищем e-mail адреса  
    for i in range(len(emails)):                               # Запускаем цикл for в списке email
            if emails[i] in database:                           # Если e-mail адрес есть в базе данных тогда 
                pass                                                    # ничего))
            else:                                                        # В противном случай 
                email.insert(END, emails[i]+'\n')        # Добавляем в текстовое поле
                database.append(emails[i])               # Добавляем в базу данных

Пакуем иконку в окно:
Python:
root.tk.call('wm', 'iconphoto', root._w, img)


Создаем надписи, кнопки, текстовое поля...
Python:
text_1=Label(text="URL:")
text_1.place(x=10,y=10)


url_value=Entry(width=30)
url_value.place(x=45,y=10)


run=Button(text="Run",height=1,command=run)
run.place(x=235,y=10)


email=Listbox( font="Courier 9", width=41, height=12)
email.place(x=15,y=42)


save_btn=Button(text="Save",command=save)
save_btn.place(x=273,y=10)


И напоследок отображаем наше окно:
Python:
root.mainloop()


Полный код:
Python:
import requests
import re       
from tkinter import *
from tkinter import filedialog
def run():
    database=[]                                                        # создаем "базу" (список) ссылок чтоб не было дубликатов
    headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
    }                                                                        # Задаем User-Agent-a чтоб не палиться
    url=url_value.get()                                           # Получаем ссылку на страницу
    try:                                                                   # Попробуем сделать запрос
       page=requests.get(url,headers=headers)
    except:                                                            # Если не получилось сделать запрос тогда
       url="http://"+url                                         # добавляем начала ссылки "http://"
       page=requests.get(url,headers=headers)  # Снова попробуем отправить запрос
    page=str(page.text)                                       
    emails=re.findall('\w+\@\w+.\w+',page)     # Ищем e-mail адреса 
    for i in range(len(emails)):                            # Запускаем цикл for в списке email
            if emails[i] in database:                        # Если e-mail адрес есть в базе данных тогда
                pass                                                 # ничего))
            else:                                                     # В противном случай
                email.insert(END, emails[i]+'\n')     # Добавляем в текстовое поле
                database.append(emails[i])            # Добавляем в базу данных

def save():
    fn = filedialog.SaveAs(filetypes = [('*.txt', '.txt')]).show()
    if fn == '':
        return
    if not fn.endswith(".txt"):
        fn+=".txt"
    open(fn, 'wt').write(email.get('1.0', 'end'))
root=Tk()
root.geometry("325x250")
root.resizable(width=False, height=False)
__version__="0.0.1 Beta"
root.title("MailParser "+__version__+" By Pirnazar")
icon="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"
img = PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)
text_1=Label(text="URL:")
text_1.place(x=10,y=10)
url_value=Entry(width=30)
url_value.place(x=45,y=10)
run=Button(text="Run",height=1,command=run)
run.place(x=235,y=10)
email=Listbox( font="Courier 9", width=41, height=12)
email.place(x=15,y=42)
save_btn=Button(text="Save",command=save)
save_btn.place(x=273,y=10)
root.mainloop()
Для работы программы требуется установленный Python3. Если у вас он не установлен, то очень подробная инструкция.
И еще можно скачать бинарник и код программы в формате py программы с .
Жду от вас примечаний, полежаний поводу программы.
Спасибо всем
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
В строке emails=re.findall('\w+\@\w+.\w+',page) лишний слэш.
Правильно так emails=re.findall('\w+@\w+.\w+', page)

И ещё я малость добавил к коду - теперь если адресов не найдено, пользователь увидит сообщение, а не будет думать что прога сломалась )

fail.png



Python:
    emails=re.findall('\w+@\w+.\w+', page)     # Ищем e-mail адреса
    fail = 'Ничего не найдено!'
    for i in range(len(emails)):                            # Запускаем цикл for в списке email
            if emails[i] in database:                        # Если e-mail адрес есть в базе данных тогда
                pass                                                 # ничего))
            else:                                                     # В противном случай
                email.insert(END, emails[i]+'\n')     # Добавляем в текстовое поле
                database.append(emails[i])            # Добавляем в базу данных
    if len(emails) == 0:
        email.insert(END, fail)

P.S. Рекомендую добавить кнопку очистки адресов, чтобы не перезапускать программу при повторном сканировании
 
Последнее редактирование:

BKeaton

Green Team
18.07.2018
204
340
BIT
158
В строке emails=re.findall('\w+\@\w+.\w+',page) лишний слэш.
Правильно так emails=re.findall('\w+@\w+.\w+', page)

И ещё я малость добавил к коду - теперь если адресов не найдено, пользователь увидит сообщение, а не будет думать что прога сломалась )
Спасибо
Рекомендую добавить кнопку очистки адресов, чтобы не перезапускать программу при повторном сканировании
Принял ваши пожелания
 

BKeaton

Green Team
18.07.2018
204
340
BIT
158
Upgrade
Вышла новая версия программы
1544772945728.png

Добавлены:
1. Фильтры(Gmail,Yandex,Mail.ru)
2. Кнопки очищения
3. Теперь глубина проверки страниц 2
Программа одно поточная работает медленно((
Python:
import requests
import re
from tkinter import *
from tkinter import filedialog

fail = 'Ничего не найдено!'

def run():   
    database=[]
    headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
    }
  
    url=url_value.get()
    try:
        page=requests.get(url,headers=headers)

    except:
        url="http://"+url
        page=requests.get(url,headers=headers)
            
    page=str(page.text)
    urls=re.findall('<a href="([^"]+)">',page)
    urls.insert(0,url)

    for k in range(len(urls)):
        page=requests.get(urls[k],headers=headers)
        page=str(page.text)
        if var.get()==0:
            emails=re.findall('\w+@\w+.\w+',page)

        if var.get()==1:
            emails=re.findall('\w+@gmail.com',page)

        if var.get()==2:
            emails=re.findall('\w+@yandex.ru',page)

        if var.get()==3:
            emails=re.findall('\w+@mail.ru',page)

        for i in range(len(emails)):
            if emails[i] in database:
                pass
            else:
                email.insert(END, emails[i]+'\n')
                database.append(emails[i])

    if len(emails)==0:
        email.insert(END, fail)
        
def save():
    fn = filedialog.SaveAs(filetypes = [('*.txt', '.txt')]).show()
    if fn == '':
        return
    if not fn.endswith(".txt"):
        fn+=".txt"
    open(fn, 'wt').write(email.get('1.0', 'end'))

def clear1():
    url_value.delete(0,"end")

def clear2():
    email.delete(1.0,END)

root=Tk()
root.geometry("400x250")
root.resizable(width=False, height=False)
__version__="0.1.0"
root.title("MailParser "+__version__+" By Pirnazar")

icon="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"
img = PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)

var=IntVar()
var.set(0)

text_1=Label(text="URL:")
text_1.place(x=10,y=10)

text_2=Label(text="Filters:")
text_2.place(x=325,y=40)

url_value=Entry(width=30)
url_value.place(x=50,y=10)

run=Button(text="Run",height=1,command=run)
run.place(x=245,y=10)

email=Text(wrap=NONE, font="Courier 9", width=43, height=13)
email.place(x=15,y=42)

save_btn=Button(text="Save",command=save)
save_btn.place(x=285,y=10)

clear_url=Button(text="Clear",command=clear1)
clear_url.place(x=325,y=10)

clear_text=Button(text="Clear",command=clear2)
clear_text.place(x=325,y=145)

All=Radiobutton(text="All",variable=var,value=0)
All.place(x=325,y=60)

Gmail=Radiobutton(text="Gmail",variable=var,value=1)
Gmail.place(x=325,y=80)

Yandex=Radiobutton(text="Yandex",variable=var,value=2)
Yandex.place(x=325,y=100)

Mail_ru=Radiobutton(text="Mail.ru",variable=var,value=3)
Mail_ru.place(x=325,y=120)

root.mainloop()
скачать бинарник и код программы в формате py программы с
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Вышла новая версия программы

Всегда хорошо, когда есть развитие программы. Программа работает, но однако в программе есть ошибки. Консоль вся усыпана. Стрелочкой указал явный косяк.
Ошибка This inspection warns about local variables referenced before assignment. Легко решается одной строчкой. Попробуйте исправить самостоятельно. Это не единственная проблема.

ji.png


P.S. НЕ буду томить, а я сейчас очень занят. Вот перевод ошибки:
Эта проверка предупреждает о локальных переменных, на которые ссылаются перед назначением.
Решить можно по-разному. Самый быстрый способ - это объявить глобальную переменную - в начало функции допишите одну строчку и этот вопрос решён.

Python:
def run():
    global emails

Другой недостаток заключается в том что недостаточно хорошо настроена фильтрация HTML. То есть на одних страницах будет без ошибок, а на других будут ошибки.
 
Последнее редактирование:
  • Нравится
Реакции: BKeaton
M

Miron_T32

Сегодня мы разберём программу для парсинга e-mail адресов с страницы. Пока это бета версия.
Внешний вид программы в Windows
Посмотреть вложение 24088
Графическая оболочка выполнена в Tkinter входящий в состав Python и не требующий отдельной установки.

Let's go!

Импортируем модули и добавляем иконку:
Python:
import requests
import re      
from tkinter import *
from tkinter import filedialog

icon="iVBORw0KGgoAAAANSUhEUgAAAEAAAAAxCAYAAABqF6+6AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAfDSURBVGhD7VppTFRXFMbYJWpasdo1/eEWo8bGiOyi1CrFRtrGtJqmGqst1PCjLE03RUSUgiJgTJuGamm1Vq2KFlu1Sm0DgrKIoKDgBsimSIVBZ2Nm3nD6ncd74wBiZ4ZZMPEmX+6b9+6555zvnnvuu/eNm9uj0i8GnoT0OMAfCJAwFfWofvU6wIWfhX0rgO3AH8BBYIcZ9kj3M1EnAj4D3B+LzXseLVOAbCANCAJG9iH9BO5PAT6RCGKS3rBY0wBsGA6bCoCvgOE22Pc6ZI4Au4HnbJB3mcggaP5ZCumX7WAFR8R5gHPGgC+c4E4AyXa21BP9VT0MUyILRsbb2Xm5uwm4qASYjAFZEmDVjw62zFuaDu4O1mN192xYIfC41ZLWC3wBkW3WizlW4ji6n+FYFd16z8EvJn1AFF6udmPNm5SweHFKfHJySlxcnN0Rv359SlxCQsrK8RPCB7u5vcU6B4T3kiHen4WGLqPDx4jaFOSwcr2eDsTEVkuOH0M91tUkPAMD/mYjQqOjw0ijJWFvJhlrr9uXA0Eg/dHjRDebKfOv7DLJaV5tol1NwHwYkMFGLF+6NFz0Wquljl/2kFBTax8S4LwOzhsuVor9Ze7fLxPwKtTudDUBK2HAlyIBy5d3EYDSqdFQx65fyVjf0C8SOvV60h05RoJZRGVmZsoE8O7xMICU4LwCh7rp2wLVC3sSIJKg05FmUxoJ1TU2kcDOa9K3mUZe7sSMAH7l/h3gDZfTCuzotm3/DppD7keAsaGR9Dl5pDt0mAynCshQfoEMFfcgVFwkGfJ9QX5eUkr67BNkKC4hfUFRNwLNCGC1vGO0x37DYgJhDBNvKkzAm72mgNEozlsyCAiFThIuXyXh6jWgWsI1Ml6rJiN+M7ru455UC5VV1KnoWk2YRKGu3kSCqwnoydQ3uLGgJwHGC5foav5RqtI20eW7dVSta6Ebxjt0y6ikdtKTEe7kt1dQjqKcTt+5RKBJLBWaOrFuJRVdUd/oyicqNekOHxWJ5NKDgEPQ/aLFw+eAhmvQZ1Q3AnR6Ev48Qc0draTQq0gn6OiGpoX0RgPd1rbSdVUzrnXUoL5FSoOaLt2pIYVOxa5SvbpZdFKpV1Kzts006obyCjKUne8i4N4q4A69nAT5IMVl5V1o5mlgWgaNRSXUWVtHtwx3SGXoEI2uUTaKdVtHG9WobpLGoKFGzb/Ss3pq1SlFAhpBChcViGvRKkwE8OjzasB1ZlaWvArwsRkfpbm0vATtfNzlFhoR8XGnop2M/+SKhrdobosEdHYaqbK9Bu4RKToUVAcn7+ruUrWySWxXq2ygNikCmtQt9ycAdwUkVbp4iQ5km16EPoXaWJd6Lyn/DfXE6KSvl1DRGWQtg+iEmrpGn4uStKZrnXTVQQa6oq+jYnUVlWmrxbvtpDG1O6uupPKO2ntRwFf1TXRg8xY+HeLCo89nBC4v78GCzbEeXgvObf1BKCktFUpKSoSC4kKh6EyxeH26uECsi/Gb78t1ftEpIbcwT8hD3bPdSdw/WZgvnIEcPxNRVCTsXvBODvRNGTtuXE1GRsZkl3sPA/jNKBepmM/4RwO8QXEYcGY+cvCgQTsjIyNp48aNWuw8N4SHh49wNRFvwwA+wXVG8fXx8WHnad26dZScnMx13dq1az9yhvIH6eAPHascbMSIUaNG1a9evVp0HqNPa9asoYSEBJGQ+Pj4UzExMa/JNoSEhDj1a9NQKObvAEscRMKQoUOHlnDop6amio4zAeZISkoSyQAR28PCwmZ7e3vfnDFjxveBgYEvOMimXt3yslgO2DscecNTOGzYsIj09PT34WCdFPq9iMBUoLS0NFq0aBFNnz6dAgICyM/PrwVERIGIx5xBBH/F4UzNn8K6bRxsVM5HbueAZbI8osAdjiZhGmg59NlpORI4AqKiosjLy4sQAcT5AgTIRJSBCHHv4ujCKwNvlXMBTpC2lDEQSgfygPt+C0AumIRo2JeYmEgc/kwC54bg4GDy8PAQnTeHv78/gQBG1qxZs16xxShrZfwgsBfgTQt/HR79Px08jec84t8CfNQWaYnC2NjYYDhezLkBc5+mTZvWy3lzIpgERIUedSqmhVMSJb+3bwSyAH5z3ApsAJIkcLTwKS9vbn4CPgCGWOK8WZtBiIZVQUFB5Onp+UACmAxfX195WjQhT/Bplj2mq0Umj5dGeankKDvLp0oc5k9Z1EMfjaZOnfr5zJkzRed6hn9fv+X8gOlRDNng/uh3uSxGcjIc2cFznWEpCdxOlkG9D9Niosud6Y8BICIQI3tSmutWESHJaEBEIohw748dLpdFSC8DEbX8LmDNtJDzA0i4DkI+dLkj/TFg7ty5w+FEAohQ8+haMy04P7AMiMgHZjvrRao//vYpiyiYAGf22JofOIqYBIcY58xOQUIQHCmUXpEtiggpoZ7F1LB2aXama9bpAhEr4FijJfmBCUA+eSj+o2QVC3PmzBkJ5zZhruv6yg/SqrBL7hgvTE79FGeVQ7Y2RnKbAiIOSgnPNC14NQBUeG76+gQCHu53hAeRhDCfDyJK5WkhJb4YcxkQ4PLjN1sH2iK5hQsXDobjESCiHaPfNG/ePP7rn6mAAKecKVhkrCMbIRrGAB49dThz0+RI/2zu+xEBWAX+AztunxXD/JLRAAAAAElFTkSuQmCC"


Создаём главное окно с названием "root", задаем размеры окна и запрет на изменение окна .Записываем информацию о версии, название
Python:
root=Tk()
root.geometry("325x250")
root.resizable(width=False, height=False)
__version__="0.0.1 Beta"
root.title("MailParser "+__version__+" By Pirnazar")


Пишем функцию которая будет выполняться при нажатии кнопки Save для сохранения результатов в файл.
Python:
def save():
    fn = filedialog.SaveAs(filetypes = [('*.txt', '.txt')]).show()
    if fn == '':
        return
    if not fn.endswith(".txt"):
        fn+=".txt"
    open(fn, 'wt').write(email.get('1.0', 'end'))


Теперь самое главное, сердце программы))
Python:
def run():
    database=[]                                                  # создаем "базу" (список) ссылок чтоб не было дубликатов
    headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
    }                                                                   # Задаем User-Agent-a чтоб не палиться
 
    url=url_value.get()                                       # Получаем ссылку на страницу
    try:                                                               # Попробуем сделать запрос
       page=requests.get(url,headers=headers)
    except:                                                        # Если не получилось сделать запрос тогда
       url="http://"+url                                      # добавляем начала ссылки "http://"
       page=requests.get(url,headers=headers)   # Снова попробуем отправить запрос
    page=str(page.text)                                      
    emails=re.findall('\w+\@\w+.\w+',page)        # Ищем e-mail адреса 
    for i in range(len(emails)):                               # Запускаем цикл for в списке email
            if emails[i] in database:                           # Если e-mail адрес есть в базе данных тогда
                pass                                                    # ничего))
            else:                                                        # В противном случай
                email.insert(END, emails[i]+'\n')        # Добавляем в текстовое поле
                database.append(emails[i])               # Добавляем в базу данных

Пакуем иконку в окно:
Python:
root.tk.call('wm', 'iconphoto', root._w, img)


Создаем надписи, кнопки, текстовое поля...
Python:
text_1=Label(text="URL:")
text_1.place(x=10,y=10)


url_value=Entry(width=30)
url_value.place(x=45,y=10)


run=Button(text="Run",height=1,command=run)
run.place(x=235,y=10)


email=Listbox( font="Courier 9", width=41, height=12)
email.place(x=15,y=42)


save_btn=Button(text="Save",command=save)
save_btn.place(x=273,y=10)


И напоследок отображаем наше окно:
Python:
root.mainloop()


Полный код:
Python:
import requests
import re      
from tkinter import *
from tkinter import filedialog
def run():
    database=[]                                                        # создаем "базу" (список) ссылок чтоб не было дубликатов
    headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'
    }                                                                        # Задаем User-Agent-a чтоб не палиться
    url=url_value.get()                                           # Получаем ссылку на страницу
    try:                                                                   # Попробуем сделать запрос
       page=requests.get(url,headers=headers)
    except:                                                            # Если не получилось сделать запрос тогда
       url="http://"+url                                         # добавляем начала ссылки "http://"
       page=requests.get(url,headers=headers)  # Снова попробуем отправить запрос
    page=str(page.text)                                      
    emails=re.findall('\w+\@\w+.\w+',page)     # Ищем e-mail адреса
    for i in range(len(emails)):                            # Запускаем цикл for в списке email
            if emails[i] in database:                        # Если e-mail адрес есть в базе данных тогда
                pass                                                 # ничего))
            else:                                                     # В противном случай
                email.insert(END, emails[i]+'\n')     # Добавляем в текстовое поле
                database.append(emails[i])            # Добавляем в базу данных

def save():
    fn = filedialog.SaveAs(filetypes = [('*.txt', '.txt')]).show()
    if fn == '':
        return
    if not fn.endswith(".txt"):
        fn+=".txt"
    open(fn, 'wt').write(email.get('1.0', 'end'))
root=Tk()
root.geometry("325x250")
root.resizable(width=False, height=False)
__version__="0.0.1 Beta"
root.title("MailParser "+__version__+" By Pirnazar")
icon="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"
img = PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)
text_1=Label(text="URL:")
text_1.place(x=10,y=10)
url_value=Entry(width=30)
url_value.place(x=45,y=10)
run=Button(text="Run",height=1,command=run)
run.place(x=235,y=10)
email=Listbox( font="Courier 9", width=41, height=12)
email.place(x=15,y=42)
save_btn=Button(text="Save",command=save)
save_btn.place(x=273,y=10)
root.mainloop()
Для работы программы требуется установленный Python3. Если у вас он не установлен, то очень подробная инструкция.
И еще можно скачать бинарник и код программы в формате py программы с .
Жду от вас примечаний, полежаний поводу программы.
Спасибо всем
Ребят, только не кидайте помидорами. Но я хотел бы узнать, а для чего нужен парсер? Чем он полезен?
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Ребят, только не кидайте помидорами. Но я хотел бы узнать, а для чего нужен парсер? Чем он полезен?

Здесь всё понятно - в данном случае это сборщик е-мейл со страниц html, чтобы не собирать руками. Кому это в первую очередь нужно? Конечно спамерам - набрать базу, и рассылать разную заразу или "выгодные предложения".
Но чтобы инструмент был действительно хорош, нужно к нему приделать рекурсивный обход. То есть чтобы он сам сканировал страницу за страницей сайта, а то вручную быстро надоест )
 
  • Нравится
Реакции: Miron_T32, Jkx и Cenzor
C

Cenzor

Согласен с explorer, надо сделать рекурсию в рамках одного ресурса, и парсить со всего ресурса.
А то, что это одна страница...
У меня даже где-то есть самописанный парсер с рекурсией
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!