python扫描器-sqlalchemy入库操作

学习

【Python】Flask系列-数据库笔记

实践

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, DateTime, LargeBinary, Text, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import datetime ,time

import json
import binascii
Base = declarative_base()


class SqlPlugin(object):
    class Reports(Base):
        """
            ORM映射子域名的嵌入类
            简单的列表
        """
        __tablename__ = 'result_siblings'  # 建立表列

        id = Column('id', Integer, primary_key=True)                    # 自动增长ID
        host = Column('host', String(256))                              # 主机,目标域名表对应的IP做主要关联
        title = Column('title', String(256))                            # 网站标题
        ip = Column('ip', String(256))                                  # IP
        domain = Column('domain', String(256))                          # 子域名
        port = Column('port', String(256))                              # 当前HTTP网络端口
        country = Column('country', String(256))                        # 国家代码
        province = Column('province', String(256))                      # 省份
        city = Column('city', String(256))                              # 城市
        country_name = Column('country_name', String(256))              # 国家名字
        header = Column('header', String(256))                          # 网络回显
        server = Column('server', String(256))                          # 容器版本
        protocol = Column('protocol', String(256))                      # 协议
        banner = Column('banner', String(256))                          # 版本信息
        cert = Column('cert', String(5000))                             # 证书信息
        isp = Column('isp', String(256))                                # 运营商
        as_number = Column('as_number', String(256))                    # Autonomous System (AS) Numbers
        as_organization = Column('as_organization', String(256))        # as_organization
        data_source = Column('data_source', String(256))                # 数据来源
        app_name = Column('app_name', String(256))                      # 应用指纹
        create_time = Column('create_time', DateTime(), default='now')  # 数据创建时间
        update_time = Column('update_time', DateTime(), default='now')  # 数据更新时间

        # 通过构造函数写入内容
        def __init__(self, insert_value):
            dt = datetime.datetime.now()
            dt_now = dt.strftime('%Y-%m-%d %H:%M:%S')                   # 当前日期和当前时间
            self.update_time = dt_now                                   # 数据更新时间
            self.create_time = dt_now                                   # 数据创建时间

            self.host =            insert_value['host']                 # 主机,目标域名表对应的IP做主要关联
            self.title =           insert_value['title']                # 网站标题
            self.ip =              insert_value['ip']                   # IP
            self.domain =          insert_value['domain']               # 子域名
            self.port =            insert_value['port']                 # 当前HTTP网络端口
            self.country =         insert_value['country']              # 国家代码
            self.province =        insert_value['province']             # 省份
            self.city =            insert_value['city']                 # 城市
            self.country_name =    insert_value['country_name']         # 国家名字
            self.header =          insert_value['header']               # 网络回显
            self.server =          insert_value['server']               # 容器版本
            self.protocol =        insert_value['protocol']             # 协议
            self.banner =          insert_value['banner']               # 版本信息
            self.cert =            insert_value['cert']                 # 证书信息
            self.isp =             insert_value['isp']                  # 运营商
            self.as_number =       insert_value['as_number']            # Autonomous System (AS) Numbers
            self.as_organization = insert_value['as_organization']      # as_organization
            self.data_source =     insert_value['data_source']          # 数据来源
            self.app_name =        insert_value['app_name']             # 应用指纹



    def __init__(self, **kwargs):
        """
            constructor receive a **kwargs as the **kwargs in the sqlalchemy
            create_engine() method (see sqlalchemy docs)
            You must add to this **kwargs an 'url' key with the url to your
            database
            This constructor will :
            - create all the necessary obj to discuss with the DB
            - create all the mapping(ORM)

            todo : suport the : sqlalchemy.engine_from_config

            :param **kwargs:
            :raises: ValueError if no url is given,
                    all exception sqlalchemy can throw
            ie sqlite in memory url='sqlite://' echo=True
            ie sqlite file on hd url='sqlite:////tmp/reportdb.sql' echo=True
            ie mysql url='mysql+mysqldb://scott:tiger@localhost/foo'
        """
        # SqlPlugin.__init__(self)
        self.engine = None
        self.url = None
        self.Session = sessionmaker()

        if 'url' not in kwargs:
            raise ValueError
        self.url = kwargs['url']
        del kwargs['url']

        # 建立库
        try:
            self.engine = create_engine(self.url, **kwargs)              # 链接数据库
            Base.metadata.create_all(bind=self.engine, checkfirst=True)  # 按照子类的结构在数据库中生成对应的数据表信息
            self.Session.configure(bind=self.engine)                     # 将创建的数据库连接关联到这个session
        except:
            raise

    def insert(self, insert_value):
        """
           在后端插入子域名的数据
           :returns: 后端对象的标识以供将来使用或者None
        """

        # 写入当前扫描的信息
        sess = self.Session()
        report = SqlPlugin.Reports(insert_value)  # 把字典参数写入到类的构造函数里
        sess.add(report)                          # 添加要添加的参数
        sess.commit()                             # 提交数据
        reportid = report.id                      # 返回插入到数据库里的索引ID
        sess.close()

        return reportid if reportid else None



    def get_filter_domain(self, domain=None):
        if domain is None:
            raise ValueError
        sess = self.Session()
        # 获取指定地址的所有端口
        out_report = (
            sess.query(SqlPlugin.Reports).filter_by(domain=domain).first())
        sess.close()
        # 查询成功返回值
        if out_report == None:
            return False
        else:
            return True



    def update(self, update_value):
        sess = self.Session()
        update_info = (
            sess.query(SqlPlugin.Reports).filter_by(domain=update_value['domain']).first())  # 查询指定IP,指定端口

        # 更新数据日期
        dt = datetime.datetime.now()
        dt_now = dt.strftime('%Y-%m-%d %H:%M:%S')  # 当前日期和当前时间
        update_info.update_time = dt_now
        update_info.title =           update_value['title']               # 修改标题
        update_info.ip =              update_value['ip']                  # 修改IP
        update_info.domain =          update_value['domain']              # 修改domain
        update_info.port =            update_value['port']                # 修改port
        update_info.country =         update_value['country']             # 修改country
        update_info.province =        update_value['province']            # 修改province
        update_info.city =            update_value['city']                # 修改city
        update_info.country_name =    update_value['country_name']        # 修改country_name
        update_info.header =          update_value['header']              # 修改header
        update_info.server =          update_value['server']              # 修改server
        update_info.protocol =        update_value['protocol']            # 修改protocol
        update_info.banner =          update_value['banner']              # 修改banner
        update_info.cert =            update_value['cert']                # 修改cert
        update_info.isp =             update_value['isp']                 # 修改isp
        update_info.as_number =       update_value['as_number']           # 修改as_number
        update_info.as_organization = update_value['as_organization']     # 修改as_organization
        update_info.data_source =     update_value['data_source']         # 修改data_source
        update_info.app_name =        update_value['app_name']            # 修改app_name

        sess.commit()
        sess.close()


    def get(self, report_id=None):
        """
            获取指定ID的数据

            :param id: str

            :returns: 子域名单条数据
        """
        if report_id is None:
            raise ValueError
        sess = self.Session()
        our_report = (
            sess.query(SqlPlugin.Reports).filter_by(id=report_id).first())
        sess.close()
        return our_report.decode() if our_report else None


    def getall(self):
        """
            :param filter:实现了一个过滤器功能

            :returns: 元组集合(id,子域名数据)
        """
        sess = self.Session()
        nmapreportList = []

        for report in (
                sess.query(SqlPlugin.Reports).
                        order_by(SqlPlugin.Reports.inserted)):
            nmapreportList.append((report.id, report.decode()))
        sess.close()

        return nmapreportList


    def delete(self, report_id=None):
        """
            从后端删除报表

            :param id: 字符串

            :returns: 删除的行数
        """
        if report_id is None:
            raise ValueError
        nb_line = 0
        sess = self.Session()
        nb_line = sess.query(SqlPlugin.Reports). \
            filter_by(id=report_id).delete()
        sess.commit()
        sess.close()
        return nb_line


if __name__ == "__main__":
    sql_opreration = SqlPlugin(url='mysql+pymysql://root:[email protected]:3306/17bdw_data?charset=utf8', echo=False,
                               encoding='utf-8', pool_timeout=3600)
    # 数据
    insert_value = {"host": 1,
                    "title": 2,
                    "ip": 3,
                    "domain": 4,
                    "port": 5,
                    "country": 6,
                    "province": 7,
                    "city":8,
                    "country_name":9,
                    "header":10,
                    "server":11,
                    "protocol":12,
                    "banner":13,
                    "cert":14,
                    "isp":15,
                    "as_number":16,
                    "as_organization":17,
                    "data_source":18,
                    "app_name":200
                    }

    # 判断是否存在这个值来决定是插入还是更新
    if sql_opreration.get_filter_domain(domain=123):
        sql_opreration.update(insert_value)   # 更新数据
    else:
        sql_opreration.insert(insert_value)   # 插入数据

猜你喜欢

转载自www.cnblogs.com/17bdw/p/11699876.html