紫貓外掛-網路共享資料(16-18)
QM[zm]04.16 網路共享資料之資料庫許可權(VIP)
小知識:簡單的限制同名裝置登陸功能 實現思路
每次某個裝置登陸 就把登陸裝置的裝置Id上傳介面 介面在資料庫裡面查詢對應的裝置 找到欄位是否已執行為1 當該裝置指令碼停止 就給介面傳送一個資訊 讓該欄位為-1 但是這會涉及到介面的功能設計和php程式碼的管理 如果有相同裝置id的裝置想要執行指令碼 先到介面的資料庫搜尋是否已執行欄位的值 如果為1 表明已經有該裝置執行 自然會阻止重名裝置運轉 如果沒有裝置執行 則允許執行後 把欄位 已執行欄位 的值改為1 給自己介面上增加這個功能(這個思路其實不用看了
注意:如果網站掛在外網 需要調整幾點 因為要考慮安全因素了
1.資料庫的名字test 這個資料庫名並不安全 請自己重想一個數據庫名 並在sql.php裡面修改成對應的名字
2 對於資料庫的賬號 不要用root賬號 風險過大 可以在後臺設定一個普通使用者 給與一定的基礎許可權就夠了 具體設定方法 可以百度 沒什麼太多需要說的 一個具體的連結可以參考https://jingyan.baidu.com/article/fa4125acb2fd8d28ad709245.html
3 注意 選擇 任意主機和本地的時候 注意區別
4 注意真正的密碼是這個 而不是我們輸入的密碼
QM[zm]04.17 網路共享資料之指令碼授權加密驗證(VIP)
以前的老問題:老師這節課提到了 中控系統的一個最要緊的東西 如果指令碼是非正常的停止 沒有給介面傳送終止的命令 介面資料庫自然沒有記錄該指令碼已經停止 這就需要介面資料庫定時執行一個數據庫遍歷任務 檢視所有的記錄裡面所記錄的最新時間和當前時間對比 超過2分鐘的就會認定已經下線 。如果是普通的虛擬主機 因為沒法進入伺服器端 更沒法用at命令來設定定時任務 所以無法實現這個定時操作 還有其他的投機取巧的辦法 以前部落格也有闡述 但是依然無法實現
老師提出了一個解決辦法 雖然不是十分完美 但是的確是解決了 下面就是思路
老師提出用隨機字串來驗證的思路也不錯
目的:我們要實現一個裝置號當前只有一個可以登陸的
思路結構(主要是資料庫表的結構和執行思路):(不過會頂號)
舉個例子:裝置id YTYUTU34234GSj 這個裝置 上的指令碼執行 產生了一個隨機數之為987324 然後把這個隨機數值送到資料介面上傳到介面資料庫記錄 記錄的樣式
id 1 | 裝置id YTYUTU34234GSj | 裝置驗證碼 :987324 | 最新更新時間 :2019-01-05 17:23 (應該是時間戳)
如果此時我又開了一個裝置 把該裝置的裝置id也設定為YTYUTU34234GSj 執行第二個裝置的指令碼 也會產生一個隨機值 但是 基本不可能跟第一個裝置的隨機數一樣 打個比方為945832 把這個資料提交到介面 介面資料庫接收了 該裝置id對應的記錄改為了
id 1 | 裝置id YTYUTU34234GSj | 裝置驗證碼 :945832 | 最新更新時間 :2019-01-05 17:30 (應該是時間戳)
當第一個裝置週期性的驗證介面資料庫當前裝置id對應的驗證碼的時候 介面資料庫的驗證碼現在為945832 而不是第一個裝置的987324 那麼第一個裝置會自己停止執行指令碼並提示發生裝置id衝突 如果存在第三個裝置 該裝置id也為YTYUTU34234GSj 那麼會導致第二個裝置也會停止
資料庫結構:
原始碼:
Import "zm.luae" //匯入外掛,只需執行一次 zm.Init //初始化外掛,只需執行一次 Randomize Dim 顯示字串="" Dim 當前驗證字串=隨機數字字母字串(array(0,15)) //Dim 裝置id=GetDeviceID() Dim 裝置id="1234567890" //因為就算用模擬器複製一個映象 裝置id還是有區別 所以我就指定下裝置id讓他們相同 TracePrint "生成的 當前驗證字串["&當前驗證字串&"]" Dim 網路資料庫介面地址="http://192.168.0.102/sql.php" zm.NetDataInit 網路資料庫介面地址, "測試資料庫" zm.NetDataSet 裝置id, 當前驗證字串 //把當前的裝置id和當前裝置對應的隨機驗證字串上傳給介面資料庫記錄到其中 //設定幾個執行緒需要用到的變數 因為執行緒和主程式碼之間很多東西無法通用 Thread.SetShareVar "多執行緒裝置id", 裝置id Thread.SetShareVar "多執行緒當前驗證字串", 當前驗證字串 Thread.SetShareVar "多執行緒是否執行","1" Thread.Start 多執行緒_裝置網路驗證 //執行多執行緒 執行緒負責連結介面資料庫檢測當前裝置id對應的驗證字串和指令碼本身的驗證字串是否一致 //主迴圈程式碼 Do //若干操作 If Thread.GetShareVar("多執行緒是否執行") <> "1" Then For 5 ShowMessage "主程式碼<發生裝置衝突 當前指令碼停止>" Delay 2000 Next EndScript //主程式碼停止 Else ShowMessage "主程式碼[本次檢測一切正常 允許當前裝置執行指令碼]" Delay 1000 End If Delay 20000 Loop Sub 多執行緒_裝置網路驗證() Dim 網路資料庫介面地址="http://192.168.0.102/sql.php" zm.NetDataInit 網路資料庫介面地址, "測試資料庫" Dim 網路上獲取的當前驗證字串=zm.NetDataGet(Thread.GetShareVar("多執行緒裝置id")) TracePrint "網路上獲取的 多執行緒當前驗證字串為["&網路上獲取的當前驗證字串&"]" Do //連結介面資料庫 把當前裝置id提交獲取資料庫裡面記錄的驗證字串 然後和本地的驗證字串比較 網路上獲取的當前驗證字串=zm.NetDataGet(Thread.GetShareVar("多執行緒裝置id")) If 網路上獲取的當前驗證字串 <> Thread.GetShareVar("多執行緒當前驗證字串") Then Thread.SetShareVar "多執行緒是否執行", "-1" //將該執行緒值變為-1 通知主程式碼停止 TracePrint "多執行緒內發現網路驗證字串和本地的驗證字串不同 多執行緒停止" EndScript //執行緒停止 Else ShowMessage "多執行緒[一切正常]" End If Delay 10000 //10秒檢測一次 Loop End Sub //下面是隨機生成指定長度字串的函式 和主程式碼無關 Function 隨機數字字母字串(配置陣列或者長度數值) Dim arr,str,result If IsArray(配置陣列或者長度數值) Then If 配置陣列或者長度數值(0) = 0 Then str="a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-1-2-3-4-5-6-7-8-9-0" arr = Split(str, "-") ElseIf 配置陣列或者長度數值(0) = 1 Then str="1-2-3-4-5-6-7-8-9-0" arr = Split(str, "-") ElseIf 配置陣列或者長度數值(0) = 2 Then str="a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z" arr = Split(str, "-") End If Else str="a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z-1-2-3-4-5-6-7-8-9-0" arr = Split(str, "-") End If //35個字元 For cint(配置陣列或者長度數值(1)) result=result&arr(cint(隨機數(0,ubound(arr)))) Delay 10 Next TracePrint "得到的隨機字串為: " & result 隨機數字字母字串=result End Function Function 隨機數(最小值,最大值) Dim 結果 結果 = Int((最大值 - 最小值 + 1) * Rnd() + 最小值) 隨機數=結果 End Function
QM[zm]04.18 網路共享資料之一些更新內容(VIP)
1.sql匯入匯出
txt匯入mysql
鑑於手機指令碼用的比較多的是txt來儲存一些重要的賬號密碼資訊 所以這裡演示下如何把txt裡面的賬號密碼資訊傳遞到資料庫裡面 老師的辦法可行 但是效率有點低
常見的txt賬號檔案結構如下
開啟mysql後臺 先新建表 加2個欄位 txt裡面有幾列我們就加入幾個欄位
開始匯入txt
設定匯入引數
分隔符設定 因為txt裡面分隔符為- 所以我們匯入要設定
結果
可以給當前表再新增一些需要的欄位 比如id自增 或者是其他欄位 這樣就完成了txt匯入mysql
mysql匯出為txt
設定匯出引數
得到結果
2.獲取最大行數
結果 = zm.NetDataCount([資料表名]) 沒什麼說的 無非就是 select count(*) from XXX
3起始行限定
不用多說
4介面資料庫內容寫入表(效率存在問題 不建議用這個辦法 可以直接txt匯入mysql)