今天在折腾易语言的时候,有一个小想法,准备搞一下登录常用地或者说异地登录检测,于是着手写了一下代码,希望大神斧正。
先说下我的思路:获取最近十次的用户登录地(如江苏省 苏州市,安徽省 宣城市等)->获取当前登录用户的登录地->判断当前登录地在最近十次登录地中出现的次数(这里使用到了”寻找重复文本个数”,文末提供代码)->如果出现次数大于八次则判定为正常登录反之异地登录。
这里操作的是”循环发送消息”的mysql数据库,首先从数据库获取指定用户名的最近十次登录地,这里使用的sql语句:SELECT 字段名 FROM `表名` WHERE `uid` = '指定用户名' order by id desc limit 10
通过php执行该SQL语句获取最近十次登录地,并存到易语言的变量。
获取当前登录地的真实IP,并通过IP定位API转换一下,这里使用的API为高德地图提供的免费API接口,使用前需要申请一下KEY(https://lbs.amap.com/),目前该接口免费提供每天300000调用次数以及200/秒并发量上限。
下面上代码(如果你只会照搬,下面代码你是使用不了的,其中需要修改的已经备注出来了):
.版本 2 .程序集 窗口程序集_启动窗口 .子程序 __启动窗口_创建完毕 功能_异地登录检测 (“用户名”) .子程序 功能_获取IP所在城市, 文本型, 公开, 本命令由【精易网页调试助手】生成,请配合精易模块使用。 .参数 ip, 文本型 .局部变量 局_网址, 文本型 .局部变量 局_方式, 整数型 .局部变量 ADD_协议头, 类_POST数据类 .局部变量 局_提交协议头, 文本型 .局部变量 局_结果, 字节集 .局部变量 局_返回, 文本型 .局部变量 province, 文本型 .局部变量 city, 文本型 局_网址 = “https://restapi.amap.com/v3/ip?ip=” + ip + “&output=json&key=这里是你自己申请的KEY” 局_方式 = 0 ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36”) 局_提交协议头 = ADD_协议头.获取协议头数据 () 局_结果 = 网页_访问 (局_网址, 局_方式, , , , 局_提交协议头, , , , , ) 局_返回 = 到文本 (编码_编码转换对象 (局_结果)) province = 文本_取出中间文本 (局_返回, #引号 + “province” + #引号 + “:” + #引号, #引号 + “,”, , ) city = 文本_取出中间文本 (局_返回, #引号 + “city” + #引号 + “:” + #引号, #引号 + “,”, , ) 返回 (province + “ ” + city) .子程序 功能_获取真实IP, 文本型, 公开, 本命令由【精易网页调试助手】生成,请配合精易模块使用。 .局部变量 局_网址, 文本型 .局部变量 局_方式, 整数型 .局部变量 ADD_协议头, 类_POST数据类 .局部变量 局_提交协议头, 文本型 .局部变量 局_结果, 字节集 .局部变量 局_返回, 文本型 局_网址 = “https://api.qcclouds.cn/ip/api.php” 局_方式 = 1 ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36”) 局_提交协议头 = ADD_协议头.获取协议头数据 () 局_结果 = 网页_访问 (局_网址, 局_方式, , , , 局_提交协议头, , , , , ) 局_返回 = 到文本 (编码_编码转换对象 (局_结果)) 返回 (局_返回) .子程序 功能_异地登录检测, , 公开, 检测当前软件登录地是否为常用登录地 .参数 qq, 文本型 .局部变量 获取当前登录地, 文本型 .局部变量 获取最近登录地, 文本型 .局部变量 检测, 整数型 获取当前登录地 = 功能_获取IP所在城市 (功能_获取真实IP ()) 获取最近登录地 = "这里需要你自己写,我是数据库获取的,你可以试试其他的" 检测 = 寻找重复文本个数 (获取最近登录地, 获取当前登录地, ) .判断开始 (检测 < 8) 信息框 (“异地登录”, #信息图标, “温馨提示”, ) .默认 信息框 (“正常登录”, #信息图标, “温馨提示”, ) .判断结束 .子程序 寻找重复文本个数, 整数型, 公开, 寻找重复文本个数 .参数 被查找的文本, 文本型 .参数 欲查找的文本, 文本型 .参数 是否区分大小写, 逻辑型, 可空, 假就不区分 真就区分 .局部变量 查找索引, 整数型 .局部变量 找到的个数, 整数型 .局部变量 文本长度, 整数型 是否区分大小写 = 取反 (是否区分大小写) 文本长度 = 取文本长度 (欲查找的文本) .如果真 (寻找文本 (被查找的文本, 欲查找的文本, , 是否区分大小写) = -1) 返回 (0) .如果真结束 查找索引 = 寻找文本 (被查找的文本, 欲查找的文本, , 是否区分大小写) 找到的个数 = 找到的个数 + 1 .判断循环首 (寻找文本 (被查找的文本, 欲查找的文本, 查找索引 + 文本长度, 是否区分大小写) ≠ -1) 查找索引 = 寻找文本 (被查找的文本, 欲查找的文本, 查找索引 + 文本长度, 是否区分大小写) 找到的个数 = 找到的个数 + 1 .判断循环尾 () 返回 (找到的个数)
下面是我测试的截图,所有数据皆为临时生成,最后一张是mysql数据库表:
这个思路不知道正不正确,看上去也挺简单的,希望小白和我共同学习,同时希望大神可以帮我我斧正,十分感谢。