#!/usr/bin/env python
import requests
import re
from urllib.parse import urljoin
from bs4 import BeautifulSoup


class Scanner:
    def __init__(self, url, links_ignore):                                                                              # khởi tạo biến cho các method bên trong class Scanner
        self.session = requests.Session()                                                                               # mỗi lần request sẽ đi kèm 1 session cho request đó, ta sẽ lưu lại session để không bị mất
        self.target = url
        self.list_links = []
        self.link_to_ignore = links_ignore

    def get_link(self, url):
        responses = self.session.get(url)                                                                               # gửi GET đến target website với session cụ thể đã lưu từ trước
        return re.findall('(?:href=")(.*?)"', str(responses.content, 'utf8'))

    def crawl(self, url=None):
        if url is None:
            url = self.target
        try:
            href_links = self.get_link(url)                                                                             # gọi ra method get_link
            for link in href_links:
                link = urljoin(url, link)

                if "#" in link:
                    link = link.split("#")[0]

                if self.target in link and link not in self.list_links and link not in self.link_to_ignore:             # chỉ in ra những link của target website và ignore các link logout
                    self.list_links.append(link)
                    print(link)
                    self.crawl(link)
        except:
            pass

    def extract_form(self, url):  # lọc thẻ form từ target website
        resposnes = self.session.get(url)
        parsed_html = BeautifulSoup(resposnes.content, "html.parser")
        return parsed_html.findAll("form")

    def submit_form(self, form, value, url):  # điền nội dung vào form
        action = form.get("action")
        post_url = urljoin(url, action)  # nối link với nội dung trong thẻ action để ra đích đến để gửi POST
        method = form.get("method")

        input_tags = form.findAll("input")
        post_data = {}
        for inputs in input_tags:
            input_name = inputs.get("name")
            input_type = inputs.get("type")
            input_value = inputs.get("value")
            if input_type == "text":    #Nếu loại thẻ là text thì gán giá trị
                input_value = value

            post_data[input_name] = input_value     # input_name khi POST = thông tin ta nhập vào form trên 1 website
        if method == "post":
            return self.session.post(post_url, data=post_data)
        return self.session.get(post_url, params=post_data)

    def run_scanner(self):
        for link in self.list_links:
            forms = self.extract_form(link)
            for form in forms:
                print("[+] Đang kiểm tra form tại " + link)

            if "=" in link:   # link có dấu "=" thì là link có gửi Data -> link có GET hoặc POST
                print("[+] Đang kiểm tra " + link)

