zoukankan      html  css  js  c++  java
  • Python修饰器 ,控制授权,通过ini配置文件 使用密钥 给函数限制试用期和过期后试用次数

     Python脚本可以通过 pyinstaller 等打包成exe分发给别人使用,如何控制自己的包不被‘盗版’呢?

    通过增加装饰器,网络验证,本地配置文件都通过的话才可使用

     1 # -*- coding:utf-8 -*-
     2 import ConfigParser#, os
     3 import requests
     4 import re
     5 import pandas as pd #习惯性用了pandas的日期模块
     6 
     7 
     8 class Initconfig:
     9     """read,write config ini file, default relative path :config.ini
    10         get_value : if ini not exist,will make one
    11         set_value : modefy one variable and close; not fit for a lot of variables
    12     """
    13     def __init__(self, filename = None):
    14         if not filename:
    15             filename = 'myconfig.ini'
    16         self.filename = filename
    17         self.cfg = ConfigParser.ConfigParser()
    18 
    19     def get_value(self, Section, Key, Default=""):
    20         self.cfg.read(self.filename)
    21         try:
    22             value = self.cfg.get(Section, Key)
    23         except:
    24             value = Default
    25         return value
    26 
    27     def set_value(self, Section, Key, Value):
    28         with open(self.filename, 'w+') as fp:
    29             if not self.cfg.has_section(Section):
    30                 self.cfg.add_section(Section)  
    31             self.cfg.set(Section, Key, Value)
    32             self.cfg.write(fp)
    33 
    34 
    35 def verify_blog_key():
    36     xx = requests.get('http://www.cnblogs.com/willowj/p/7170767.html')
    37     key = re.findall('"key" = (w+)', xx.text)
    38     xx.connection.close()
    39     if key:
    40         key = key[-1]
    41         if key == 'asfklbzxchjgd':
    42             return True
    43 
    44 
    45 def use_ctrl(config_file):
    46     '''wraper func with  each config ini file'''
    47     def _ctrl(func):
    48         def verifed(*arg):          #控制 有效期
    49             if pd.datetime.now() < pd.datetime(2017, 7, 11) or verify_blog_key(): # 网络控制密钥
    50                 return func(*arg) 
    51             
    52             myini = Initconfig(filename=config_file)
    53             if myini.get_value('key', 'key') == 'asfklbzxchjgd' :
    54                 return func(*arg)   #配置文件 密钥
    55             
    56             times = myini.get_value('key', 'time') # 试用次数
    57             if not times:
    58                 myini.set_value('key', 'time', 1)
    59                 times = '1'
    60             if times.isdigit() and int(times) < 6:
    61                 myini.set_value('key', 'time',int(times)+1)
    62                 return func(*arg)
    63             
    64             print 'pakage tools liscence expired, please contact distributor'
    65     
    66         return verifed
    67     return _ctrl
    68 
    69 
    70 if __name__ == '__main__':
    71     @use_ctrl('use_ctrl_test.ini')
    72     def test_func():
    73         print 'ok'
    74         
    75     for x in range(7):
    76         test_func()
    ok
    ok
    ok
    ok
    ok
    pakage tools liscence expired, please contact distributor
    pakage tools liscence expired, please contact distributor

    时间,网络密钥,本地配置文件密钥 都不通过的情况下,执行5次后,无法再执行了。

      ini配置文件:

      [key]
      time = 5

     漏洞是,每删除配置文件一次就能用5次

    ----------------》密钥:

    "key" = asfklbzxchjgd

    "key" = asfklbzxchjgd

  • 相关阅读:
    Java基础多线程之后台守护线程,setDaemon(true)
    Java基础多线程间通讯之多生产者、多消费者模式示例:
    Java基础多线程通讯之生产者消费者模式示例:
    Java基础多线程之单例模式之懒汉式:
    Java基础多线程间通讯同步操作示例一(未优化):
    Java基础多线程之线程中止示例:
    Java基础多线程之join抢夺CPU执行权直到该线程结束。
    Java基础多线程之单例模式之饿汉式:
    Java基础多线程间通讯示例操作(已优化)二:
    Java基础多线程之实际开发中常见写法:
  • 原文地址:https://www.cnblogs.com/willowj/p/7170767.html
Copyright © 2011-2022 走看看