網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
程序員可能會(huì)私下給別人開發(fā)一些工具,但是通常要給別人試用一下,但是萬(wàn)一別人試用后,把你拉黑,那就白忙活了。今天就分享如何在 Python 里設(shè)置有效期。
為了設(shè)置有效期,首先要獲取當(dāng)前時(shí)間,如果獲取本地時(shí)間,那么別人可以通過(guò)修改操作系統(tǒng)的時(shí)間來(lái)一直保持有效。最好的辦法就是獲取網(wǎng)絡(luò)時(shí)間。你說(shuō)他斷網(wǎng)怎么辦?
如果斷網(wǎng),有兩種方法,要么不給用,要么再取本地時(shí)間。
1、獲取網(wǎng)絡(luò)時(shí)間
如何獲取網(wǎng)絡(luò)時(shí)間呢,可以從 HTTP 返回的 Header 里獲取時(shí)間,由于這個(gè)時(shí)間是 GMT 格式的 UTC 時(shí)間,我們還需要轉(zhuǎn)為本地時(shí)間,下面的腳本都考慮到了,均采用標(biāo)準(zhǔn)庫(kù)。
from?datetime?import?datetime
from?urllib.request?import?urlopen
import?time
import?ssl
import?sys
ssl._create_default_https_context?=?ssl._create_unverified_context
def?get_network_time():
????url?=?"https://www.baidu.com"
????try:
????????with?urlopen(url)?as?res:
????????????utctime?=?gmtstr_to_localtime(res.getheader("Date"))
????????????return?datetime_from_utc_to_local(utctime)
????except?Exception?as?e:
????????print("請(qǐng)檢查網(wǎng)絡(luò)設(shè)置")
????????sys.exit()
def?gmtstr_to_localtime(gmtstr)?->?datetime:
????return?datetime.strptime(gmtstr,?"%a,?%d?%b?%Y?%H:%M:%S?GMT")
def?datetime_from_utc_to_local(utc_datetime):
????now_timestamp?=?time.time()
????offset?=?datetime.fromtimestamp(now_timestamp)?-?datetime.utcfromtimestamp(
????????now_timestamp
????)
????return?utc_datetime?+?offset
if?__name__?==?"__main__":
????print(get_network_time())
????#?Output:
????#?2022-07-19?06:39:12
2、上鎖
這一步很簡(jiǎn)單,一個(gè)日期判斷就搞定了:
def?lock():
????now?=?get_network_time()
????end_date?=?datetime(2022,?8,?26)
????if?now?>?end_date:
????????print("試用已到期")
????????sys.exit()
然后把上面獲取網(wǎng)絡(luò)時(shí)間的代碼及 lock 函數(shù)均放在 lock.py 文件里,在我們的核心模塊 core_work.py 中導(dǎo)入:
from?lock?import?lock
def?somefunc():
????lock()
????#?do?your?work
在需要 lock() 的地方調(diào)用下 lock 函數(shù)就可以了。
你可能還需要一個(gè) startup.py 腳本來(lái)啟動(dòng)整個(gè)程序:
from?core_work?import?main
main()
3、編譯 pyd
不編譯的話,或者編譯為 pyc 的話,上面的工作等于沒做,pyc 可以直接反編譯成 py 文件,連命名符號(hào)都不變。
編譯的話,只需要需要把獲取網(wǎng)絡(luò)時(shí)間的代碼,lock 函數(shù)的定義及調(diào)用 lock 的代碼都編譯成 pyd,本例子中就是 lock.py 和 core_work.py 編譯成 lock.pyd 和 core_work.pyd,然后把源代碼 lock.py 和 core_work.py 刪除,其實(shí)就可以發(fā)布了,想破解只能反編譯 pyd 文件,得到的是匯編代碼,這個(gè)門檻已經(jīng)拒絕了大多數(shù)的人。
pyd 的編譯流程是 .py -> .c -> pyd,也就是說(shuō) pyd 是從 c 語(yǔ)言編譯的,除了隱藏源代碼之外,速度也會(huì)變快一些。
如果不放心的話,那就 pyinstall -k key startup.py 再加密打包一下,key 就是加密的密碼,如果在 pyd 文件 import 了第三方庫(kù),那么要在 spec 文件中填寫 hiddenimports。
如何編譯 pyd 呢?代碼如下:
from?distutils.core?import?setup
from?Cython.Build?import?cythonize
files?=?["lock.py",?"core_work.py"]
setup(
????name="yourapp",
????ext_modules=cythonize(files),
????script_args=["build_ext",?"-b",?"./build",?"-t",?"./build/temp"],
)
運(yùn)行之前你要 pip install cython。
然后在 build 文件夾就可以看到編譯好的 pyd 文件,然后把他們移動(dòng)到源代碼的位置,重命名為 xxx.pyd 就可以了。
原文鏈接:https://mp.weixin.qq.com/s/-TBM2PUFwsZJFC0egS17IQ
相關(guān)推薦
- 2022-08-07 詳解Qt使用QImage類實(shí)現(xiàn)圖像基本操作_C 語(yǔ)言
- 2022-12-24 React重新渲染超詳細(xì)講解_React
- 2022-07-07 python中的format是什么意思,format怎么用_python
- 2022-05-04 Spring.Net框架簡(jiǎn)介_實(shí)用技巧
- 2022-11-09 Docker?安裝啟動(dòng)Jenkins的方法(docker-compose)_docker
- 2023-01-26 Redis中如何設(shè)置日志_Redis
- 2022-06-02 docker基本命令及使用實(shí)例詳解_docker
- 2022-10-23 Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之插入排序示例詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支