1. 程式人生 > >紫貓外掛-網路共享資料(16-18)

紫貓外掛-網路共享資料(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 注意 選擇 任意主機和本地的時候 注意區別

image

4 注意真正的密碼是這個 而不是我們輸入的密碼

image


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  那麼會導致第二個裝置也會停止


資料庫結構:

image

原始碼

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賬號檔案結構如下

image

開啟mysql後臺 先新建表 加2個欄位  txt裡面有幾列我們就加入幾個欄位

image

開始匯入txt

image

設定匯入引數

image

分隔符設定 因為txt裡面分隔符為- 所以我們匯入要設定

image

結果

image


可以給當前表再新增一些需要的欄位 比如id自增 或者是其他欄位 這樣就完成了txt匯入mysql

image

image

mysql匯出為txt

image

設定匯出引數

image

image

得到結果

image



2.獲取最大行數

結果 = zm.NetDataCount([資料表名])  沒什麼說的  無非就是 select count(*) from XXX

3起始行限定

不用多說

4介面資料庫內容寫入表(效率存在問題 不建議用這個辦法 可以直接txt匯入mysql)