• 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:root@192.168.221.143: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)   # 插入数据
    
  • 相关阅读:
    php单例设计模式
    js实用技巧
    快速排序java实现
    PHP大小写问题
    http转https
    wx-charts 微信小程序图表插件
    如何判断微信内置浏览器 MicroMessenger
    小程序:下拉加载更多时bindscrolltolower多次执行
    PHP内核
    CSS的4种引入方式以及优先级
  • 原文地址:https://www.cnblogs.com/17bdw/p/11699876.html
Copyright © 2020-2023  润新知