紫猫插件-网络共享数据(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)

猜你喜欢

转载自www.cnblogs.com/zjl8455482/p/10226015.html