玩蛇网提供最新Python编程技术信息以及Python资源下载!

Python方法调用网站接口实现MD5值查询

python 培训

这是在Python 2.6.4版及window平台下的操作,目的是为了用Python方法调用网站接口实现MD5值查询的操作。代码是在4年前写的,之前是好用的,现在翻出来没测试过。需要用到的python模块比较多,大概有9个,分别是:os,sys,stat,json,time,getopt,hashlib,urllib2,sqlite3。

Python方法调用网站接口实现MD5值查询源码如下:

#-*-coding:utf-8-*-
'''
注:如不带命令参数,则本程序只会进行HASH值的扫描查询,不会将查询到的结果保存到本地数据库中。
'''

import os
import sys
import stat
import json
import time
import getopt
import hashlib
import urllib2
import sqlite3

class MD5_Search(object):
        
    def __init__(self):
        
        self.db_name = []
        self.state = ('Unknow', 'Safe', 'Virus')
        self.url = "http://xxx.xxx.com/index.php?x=xzj&y=lzsd"

        
    def report(self):
        
        info = ''
        info += "=====================================================================\n"
        info += "@Author: xuzhijian17 2011 LZSD command line scanner \n"
        info += "Copyright (c) 1990 - 2011 Qianyun Technologies\n"
        info += "Program version 10.0.1388, engine 10.0.1516\n"
        info += "Version 1516/3730 %s\n" % time.strftime("%Y-%m-%d %H:%M:%S")
        info += "---------------------------------------------------------------------\n"
        
        return info
    
    def del_file(self, file_path):
        
        try:
            os.chmod(file_path, stat.S_IWRITE)
            os.remove(file_path)
        except WindowsError:
            print "File already delete or does not exist."
                    
    def file_md5(self, file_name):

        with open(file_name, 'rb') as fb:
            md5 = hashlib.md5(fb.read()).hexdigest()            
        return md5
    
    def scan_files(self, folder):
        
        dct = {}
        for x, y, z in os.walk(folder):
            for i in z:
                file_name = os.path.join(x, i)
                if os.path.isfile(file_name):
                    md5 = self.file_md5(file_name)
                    dct[md5] = file_name 
                else:
                    self.del_file(file_name)
        return dct
            
    def db(self, name):
        
        db_name = os.path.join(os.path.dirname(__file__), name)
        if os.path.isfile(db_name):
            db_size = os.path.getsize(db_name)
            if db_size < 10485760: #判断数据库文件是否大于10M
                self.db_name.append(db_name)
            else:
                db_name = os.path.join(os.getcwd(), 'xzj_' + name)
                self.Create_db(db_name)
                self.db_name.append(db_name)
        else:
            self.Create_db(db_name)
            self.db_name.append(db_name)
            
    def Create_db(self, db_name):
        
        conn = sqlite3.connect(db_name)
        cu = conn.cursor()
        cu.execute('''create table if not exists hashQuery(id integer primary key autoincrement,md5 varchar(128)UNIQUE,state varchar(128),date varchar(128))''')
        conn.commit()
        cu.close()
        
    def LocalInquire(self, folder):
        
        dct = {}
        for db_name in self.db_name:
            try:
                conn = sqlite3.connect(db_name)
                cu = conn.cursor()
                for file_md5, file_path in self.scan_files(folder).items():
                    cu.execute("select * from hashQuery where md5=?", (file_md5,))
                    dct[file_path] = cu.fetchone()
            except sqlite3.IntegrityError:
                pass
            finally:
                conn.commit()
                cu.close()

        return dct

    def hashQuery(self, md5):
                
        try:
            req = urllib2.Request(self.url, 'hashs=%s' % md5, headers={'User-Agent':'SucopAnalyze/1.0'})
            page = urllib2.urlopen(req, timeout=10)
            content = page.read()
            page.close()
            for md5, stat in json.loads(content)['data'].items():
                if stat['stat'] == 0: #stat = 0 是未知
                    return 0
                elif stat['stat'] == "1": #stat = 1 是安全
                    return 1
                elif stat['stat'] == "2": #stat = 2 是危险
                    return 2
            
        except urllib2.HTTPError, e:
            print e.code
            print e.msg
            print e.headers
            print e.fp.read()
            
 
2000
#www.iplaypython.com
 
      except urllib2.URLError, e:
            print e
            
    def run(self, db_name, folder, arge1, arge2, arge3, log_path):

        self.db(db_name) 
        
        date = time.ctime()
        conn = sqlite3.connect(self.db_name[-1])
        cu = conn.cursor()

        with open(log_path, 'w') as fp:
            fp.write(self.report())
            try:
                print "Start local scaning......"
                for file_path, database in self.LocalInquire(folder).items():
                    if database:
                        if database[2] == self.state[1]:
                            safe = "%s %s\t%s" % (date, file_path, self.state[1])
                            print safe
                            if arge1:
                                self.del_file(file_path)
                                print file_path + "\t...Delete Succeed"
                            fp.write(safe + '\n')
                        elif database[2] == self.state[2]:
                            malive = "%s %s\t%s" % (date, file_path, self.state[2])
                            print malive
                            if arge2:
                                self.del_file(file_path)
                                print file_path + "\t...Delete Succeed"
                            fp.write(malive + '\n')
                        
                if arge3:
                    print "Start cloud scaning....."
                    for file_md5, file_path in self.scan_files(folder).items():
                        if self.hashQuery(file_md5) == 0:
                            unknow = "%s %s\t%s" % (date, file_path, self.state[0])
                            print unknow
                            fp.write(unknow + '\n')
                        elif self.hashQuery(file_md5) == 1:
                            safe = "%s %s\t%s" % (date, file_path, self.state[1])
                            print safe
                            if arge1:
                                self.del_file(file_path)
                                print file_path + "\t...Delete Succeed"
                                cu.execute("insert into hashQuery(md5,state,date) values('%s','%s','%s')" % (file_md5, self.state[1], date))
                            fp.write(safe + '\n')
                        elif self.hashQuery(file_md5) == 2:
                            malive = "%s %s\t%s" % (date, file_path, self.state[2])
                            print malive
                            if arge2:
                                self.del_file(file_path)
                                print file_path + "\t...Delete Succeed"
                                cu.execute("insert into hashQuery(md5,state,date) values('%s','%s','%s')" % (file_md5, self.state[2], date))
                            fp.write(malive + '\n')
            finally:
                conn.commit()
                cu.close()
    
def main():     

    if len(sys.argv) < 2:
        print __doc__
        sys.exit()

    try:                                
        opts, args = getopt.getopt(sys.argv[1:], "hsmc", ["help", "file=", "log="])
    except getopt.GetoptError:
        print "parameter input error! please type -h or --help."
        sys.exit()
        
    arge1 = None
    arge2 = None
    arge3 = None
    folder = None
    db_name = 'hashQuery.db'
    log_path = os.path.join(os.path.dirname(__file__), 'hashQuery.log')
    
    ms = MD5_Search()
    for opt, arg in opts:               
        if opt in ("-h", "--help"):     
            print __doc__                     
            sys.exit()
        elif opt == "-s":
            arge1 = opt
        elif opt == "-m":
            arge2 = opt
        elif opt == "-c":
            arge3 = opt
        elif opt == "--file":
            folder = arg
        elif opt == "--log":
            log_path = arg
          
    if folder:        
        ms.run(db_name, folder, arge1, arge2, arge3, log_path)

if __name__ == '__main__':
    
    main()       

玩蛇网原创,转载请注明文章出处和来源网址:http://www.iplaypython.com/code/other/o2331.html



微信公众号搜索"玩蛇网Python之家"加关注,每日最新的Python资讯、图文视频教程可以让你一手全掌握。强烈推荐关注!

微信扫描下图可直接关注

玩蛇网Python新手QQ群,欢迎加入: ① 240764603 玩蛇网Python新手群
文章发布日期:2016-04-21 09:51 玩蛇网 www.iplaypython.com

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
相关文章推荐
别人正在看
特别推荐
去顶部去底部