大家好,我是公衆号3分鐘學堂的郭立員~
前些天有朋友問怎麼實現這個功能,如下圖所示:
這個功能就是給自己的腳本加上一個可以領免費測試卡的功能,要想實現它需要注意的内容挺多的,下面我們逐個來說一下:
(1)功能上說要實現兩個操作:點擊按鈕獲取激活碼(測試卡) 寫入輸入框
①點擊按鈕獲取一個激活碼
因為腳本要給别人使用,所以激活碼不能是本地的,隻能是來自服務器端,那麼可以使用post/get方式獲取。
激活碼的來源,可以是預先生成好的一批激活碼,也可以是每次點擊按鈕生成新的激活碼,它們各有優缺點:
預生成的激活碼:生成的激活碼數量是固定的,用一個少一個,所以要定期補充。
新生成激活碼:這種方式要求腳本具有生成激活碼的權限,同時一旦被人破解可以無限制生成激活碼,導緻驗證系統形同虛設了。
選用哪種方式,除了考慮它們優缺點以外,還要看你的驗證系統有沒有相關的功能,比如新生成激活碼的方式,就要求驗證系統支持用戶端注冊或者導入激活碼。
這期文章中我會用到讀取服務器文本的方式,預先把激活碼存在服務器文本,讀取一個删除一個。
②把激活碼寫入到輸入框中
這邊是需要靜态頁面修改元素的,使用UIP.SetAttribute命令,一行代碼而已,稍後看源碼就行。
(2)腳本中的邏輯注意事項:
這個注意事項是來自于腳本的限制說明:※每天可免費領取3張測試卡,測試時間為1小時
①限制每天3張測試卡,那麼需要有領取記錄,記錄可以存在腳本運行的本地設備,也可以存在于服務器端,兩者對比的話,存在本地容易些。
②存儲的要點:時間和張數
因為是每天三張,所以過了半夜12點要重新更新可測試數量,記錄好當天的日期,防止重複領取。
③限制1小時的測試時間,這個就是基本的網絡驗證,沒啥可說的。
(3)本地存儲的操作流程
選用的存儲媒介是數據(.db),因為這種後綴的文件普通人不常用到,沒有對應的工具不容易打開,這樣就可以達到隐藏的效果。
存儲的格式如下:
在數據庫表中有兩列數據,分别是time和num,代表日期和次數。
寫這部分邏輯框架需要考慮全面,大家跟着我一塊去想想這個邏輯:
第一步:判斷數據庫在手機/模拟器上是否存在
不存在:當前設備是首次使用腳本
存在:當前設備已經使用過
第二步:針對上面兩種情況分别處理
首次使用:那麼新建數據庫,寫入日期和次數1
非首次使用:要判斷當前表格裡面的time列中有沒有今天的日期數據。
沒有:今天還沒有使用過
有:今天已經使用。
第三步:繼續分情況處理
沒有今天的日期數據:在數據庫中寫入今天日期和次數1
有今天的日期數據:讀取數據庫中當天日期對應的num列中的次數,判斷次數是否小于3次
小于3次:今天還可以繼續使用,把今天日期對應的次數 1
不小于3次:今天免費測試次數用完。
這部分寫成代碼是:
Import "SQLite3.lua"
Dim dbpath="/sdcard/pictures/abc.db"
Dim t=DateTime.Format("%Y%m%d")
If Dir.Exist(dbpath) = 0 Then
showmessage "首次使用"
sqlite3.SQLCreate(dbpath, "code", {"time","num"})
sqlite3.SQLInsert DBpath, "code", {"time":t, "num":1}
Else
dim ret=sqlite3.SQLSelect(DBpath, "code", "num", "WHERE time="&t)
If Len(ret) = 0 Then
showmessage "今天首次使用"
sqlite3.SQLInsert DBpath, "code", {"time":t, "num":1}
Else
showmessage encode.TableToJson(ret)
If cint(ret[1]["num"]) < 3 Then
sqlite3.SQLUpdate DBpath, "code", {"num":ret[1]["num"] 1}, "WHERE time=" & t
showmessage "第"&ret[1]["num"] 1&"次領卡"
Else
showmessage "今天3次測試卡已經領過了,明天再來"
End If
End If
End If
在以上的代碼中,并沒有獲取測試卡的操作,僅僅是對測試卡需要獲取的記錄,我們寫每次寫入/修改數據庫内容都是要配合獲取測試的操作。
這其中包括建庫、當天首次使用、次數小于3等這幾種情況。
(4)讀取服務器上的文本
這一步需要一個php文件,完成讀取文本内容和删除文本内容的操作,把php文件和存有測試卡的文本放到服務器裡面,運行下面代碼就可以了。
需要這個文件可以加我微信xiaomu86119,備注【服務器文本】
Dim ip="http://192.168.1.3/File" //我建了一個file的文件夾,不是一定有這個目錄的
Dim 文件名="code" //文本名字
TracePrint url.get(ip&"/File.php?uid=6&txtid="&文件名&"&hid=1")
(5)寫入輸入框
Function 函數名1()
Dim 測試卡="abc0001"
uip.SetAttribute("輸入框1",{"初始文本":測試卡})
End Function
=正文完=
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!