精华内容
下载资源
问答
  • 但是Total Control 真是一款神奇的软件,有了它,不仅可以用脚本实现自动打开安装卸载手机软件功能,还可以用脚本实现在多个手机上同时自动打开卸载手机上的软件。我今天就来分享一下用其他的脚本语言的使用实例。...

    很多人都在贴吧以及群里吐槽Total Control的脚本难用,易用性太差。我觉得这点TC确实应该反省一下,毕竟软件使用者很多都不是脚本掌握很好的开发人员。但是Total Control 真是一款神奇的软件,有了它,不仅可以用脚本实现自动打开安装卸载手机软件等功能,还可以用脚本实现在多个手机上同时自动打开卸载手机上的软件。

    cabe9119a5dc6a2367836d69fcd02539.png

    我今天就来分享一下用其他的脚本语言的使用实例。想用脚本实现安装卸载手机软件,是不是很高级,但是我不会JavaScript 怎么办?没关系,Total Control 提供的 REST API 支持任意语言,易语言,python,java,都可以的哦!要实现在多个手机上同时打开、关闭指定应用程序,首先我们得用电脑连接多个手机,然后使用 Total Control 提供的 REST API 控制手机,使用Total Control REST API 的一般步骤:

    1. 获取 Total Control 脚本开发所用的开发 token

    2. 获取多个设备 ID 值,例如:{"ids":["device@33254183","device@230441652"]}

    3. 通过第二步的多个设备 ID 值(多设备),对获取的设备进行操作

    (一) Total Control 提供的REST API 获取多台设备 ID 集合的方法:

    1. 获取所有设备 ID 集合

    请求方法:GET

    请求 URL:

    http://127.0.0.1:8090/TotalControl/v1/devices?q=all&token=270eq7lXQK8bXYsJ

    2. 根据给定的组名称获取组内所有设备 ID 集合

    请求方法:GET

    请求 URL:

    http://127.0.0.1:8090/TotalControl/v1/devices?q=group&name=group1&token=270eq7lXQK8bXYsJ

    3. 自动连接设备,对当前准备好的设备自动连接

    请求方法:POST

    请求 URL:

    http://127.0.0.1:8090/TotalControl/v1/devices/connections?token=270eq7lXQK8bXYsJ

    上面三种获取设备 ID 集合的方法返回值如下:

    {

    "ids":[

    "device@795844152",

    "device@795812215"

    ]

    }

    (二) 易语言实现在多个手机上同时自动打开软件

    函数功能:打开或运行设备上指定的软件

    请求方式:POST

    http://IP:8090/TotalControl/v1/devices/:device/apps/:packageName?state=active&token=:token

    参数说明:

    9955ef442df6f0b209dd4f648cc6cace.png

    易语言请求实例:同时打开多个手机上的微信,微信的软件名为 " com.tencent.mm"

    代码如下:

    .版本 2

    .程序集 窗口程序集_启动窗口

    .子程序 __启动窗口_创建完毕

    .局部变量 base64, 文本型

    .局部变量 token, 文本型

    .局部变量 devices, 文本型

    .局部变量 j_token, 类_json, , , 用来解析获取 token 的 json

    .局部变量 j_dev, 类_json, , , 用来解析获取设备ID 值的 json

    .局部变量 j_ret, 类_json, , , 用来解析 REST API 接口的json

    .局部变量 bool, 逻辑型

    .局部变量 bool_dev, 逻辑型

    .局部变量 bool_ret, 逻辑型

    .局部变量 AppName, 文本型

    .局部变量 status, 文本型

    .局部变量 数组成员, 类_json

    base64 = 到文本 (编码_BASE64编码 (到字节集 (“sigma:3D391497”)))

    输出调试文本 (“将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: ” + base64)

    bool = j_token.解析 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/login”, 0, , , , “Authorization:” + base64, , , , , , , , , )))

    .如果 (bool)

    输出调试文本 (“第一步,获取 token,返回值为:” + j_token.取数据文本 ())

    token = j_token.取通用属性 (“['value'].token”)

    输出调试文本 (“获取的 token 值为: ” + token)

    bool_dev = j_dev.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices?q=all&token=” + token, 0))))

    .如果 (bool_dev)

    输出调试文本 (“第二步,获取设备 ID 值,返回值为:” + j_dev.取数据文本 ())

    devices = j_dev.取属性对象 (“ids”)

    输出调试文本 (“获取的设备 ID 值为: ” + devices)

    AppName = “com.tencent.mm”

    bool_ret = j_ret.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/ids/apps/” + AppName + “?state=active&token=” + token + “&ids=” + devices, 1))))

    .如果 (bool_ret)

    输出调试文本 (“第三步,打开手机” + devices + “上指定软件” + AppName)

    输出调试文本 (“REST API 打开指定软件的返回值为: ” + j_ret.取数据文本 ())

    .否则

    输出调试文本 (“该 API 执行失败”)

    .如果结束

    .否则

    输出调试文本 (“获取设备 ID 值失败”)

    .如果结束

    .否则

    输出调试文本 (“获取 token 失败”)

    .如果结束

    运行结果:

    * 将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: c2lnbWE6M0QzOTE0OTc=

    * 第一步,获取 token,返回值为:{"status":true,"value":{"token":"ZEGpMU851z2CR45y"}}

    * 获取的 token 值为: ZEGpMU851z2CR45y

    * 第二步,获取设备 ID 值,返回值为:{"ids":["device@33254183","device@230441652"]}

    * 获取的设备 ID 值为: ["device@33254183","device@230441652"]

    * 第三步,打开手机["device@33254183","device@230441652"]上指定软件com.tencent.mm

    * REST API 打开指定软件的返回值为: [{"id":"device@33254183","code":200,"retval":{"status":true,"value":"make it active."}},{"id":"device@230441652","code":200,"retval":{"status":true,"value":"make it active."}}]

    (三) 易语言实现在多个手机上同时自动关闭软件

    函数功能:关闭设备上指定的软件

    请求方式:POST

    http://IP:8090/TotalControl/v1/devices/:device/apps/:packageName?state=inactive&token=:token

    参数说明:

    49d286d9444a1936d26bf98d1b601ef6.png

    易语言实例:同时关闭多个手机上的抖音小视频软件,抖音小视频的软件名为 "com.ss.android.ugc.aweme"

    代码如下:

    .版本 2

    .程序集 窗口程序集_启动窗口

    .子程序 __启动窗口_创建完毕

    .局部变量 base64, 文本型

    .局部变量 token, 文本型

    .局部变量 devices, 文本型

    .局部变量 j_token, 类_json, , , 用来解析获取 token 的 json

    .局部变量 j_dev, 类_json, , , 用来解析获取设备ID 值的 json

    .局部变量 j_ret, 类_json, , , 用来解析 REST API 接口的json

    .局部变量 bool, 逻辑型

    .局部变量 bool_dev, 逻辑型

    .局部变量 bool_ret, 逻辑型

    .局部变量 AppName, 文本型

    .局部变量 status, 文本型

    .局部变量 数组成员, 类_json

    base64 = 到文本 (编码_BASE64编码 (到字节集 (“sigma:3D391497”)))

    输出调试文本 (“将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: ” + base64)

    bool = j_token.解析 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/login”, 0, , , , “Authorization:” + base64, , , , , , , , , )))

    .如果 (bool)

    输出调试文本 (“第一步,获取 token,返回值为:” + j_token.取数据文本 ())

    token = j_token.取通用属性 (“['value'].token”)

    输出调试文本 (“获取的 token 值为: ” + token)

    bool_dev = j_dev.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices?q=all&token=” + token, 0))))

    .如果 (bool_dev)

    输出调试文本 (“第二步,获取设备 ID 值,返回值为:” + j_dev.取数据文本 ())

    devices = j_dev.取属性对象 (“ids”)

    输出调试文本 (“获取的设备 ID 值为: ” + devices)

    AppName = “com.ss.android.ugc.aweme”

    bool_ret = j_ret.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/ids/apps/” + AppName + “?state=inactive&token=” + token + “&ids=” + devices, 1))))

    .如果 (bool_ret)

    输出调试文本 (“第三步,关闭手机” + devices + “上指定软件” + AppName)

    输出调试文本 (“REST API 关闭指定软件的返回值为: ” + j_ret.取数据文本 ())

    .否则

    输出调试文本 (“该 API 执行失败”)

    .如果结束

    .否则

    输出调试文本 (“获取设备 ID 值失败”)

    .如果结束

    .否则

    输出调试文本 (“获取 token 失败”)

    .如果结束

    运行结果:

    * 将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: c2lnbWE6M0QzOTE0OTc=

    * 第一步,获取 token,返回值为:{"status":true,"value":{"token":"FTGyfvsaOmMP5j3g"}}

    * 获取的 token 值为: FTGyfvsaOmMP5j3g

    * 第二步,获取设备 ID 值,返回值为:{"ids":["device@33254183","device@230441652"]}

    * 获取的设备 ID 值为: ["device@33254183","device@230441652"]

    * 第三步,关闭手机["device@33254183","device@230441652"]上指定软件com.ss.android.ugc.aweme

    * REST API 关闭指定软件的返回值为: [{"id":"device@33254183","code":200,"retval":{"status":true,"value":"make it inactive."}},{"id":"device@230441652","code":200,"retval":{"status":true,"value":"make it inactive."}}]

    (四) 不知道我要卸载的软件的软件包名怎么办?

    为了方便用户,Total Control 提供了一个REST API来帮助用户获取应用程序的包名。

    函数功能:获取设备上当前运行的软件包名

    请求方式:GET

    http://IP:8090/TotalControl/v1/devices/:device/apps?token=:token&q=foreground_app

    参数说明:

    bb667727ad4a386df2cef5ce83e24d35.png

    返回示例:

    成功,则返回:

    {

    "status": true,

    "value":"com.sigma_rt.totalcontrol"

    }

    易语言实例:获取设备上当前运行的软件包名

    代码如下:

    .版本 2

    .程序集 窗口程序集_启动窗口

    .子程序 __启动窗口_创建完毕

    .局部变量 base64, 文本型

    .局部变量 token, 文本型

    .局部变量 device, 文本型

    .局部变量 j_token, 类_json, , , 用来解析获取 token 的 json

    .局部变量 j_dev, 类_json, , , 用来解析获取设备ID 值的 json

    .局部变量 j_ret, 类_json, , , 用来解析 REST API 接口的json

    .局部变量 bool, 逻辑型

    .局部变量 bool_dev, 逻辑型

    .局部变量 bool_ret, 逻辑型

    .局部变量 status, 文本型

    base64 = 到文本 (编码_BASE64编码 (到字节集 (“sigma:3D391497”)))

    输出调试文本 (“将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: ” + base64)

    bool = j_token.解析 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/login”, 0, , , , “Authorization:” + base64, , , , , , , , , )))

    .如果 (bool)

    输出调试文本 (“第一步,获取 token,返回值为:” + j_token.取数据文本 ())

    token = j_token.取通用属性 (“['value'].token”)

    输出调试文本 (“获取的 token 值为: ” + token)

    bool_dev = j_dev.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/main?token=” + token, 0))))

    .如果 (bool_dev)

    输出调试文本 (“第二步,获取设备 ID 值,返回值为:” + j_dev.取数据文本 ())

    device = j_dev.取通用属性 (“['id']”)

    bool_ret = j_ret.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/” + device + “/apps?q=foreground_app&token=” + token, 0))))

    .如果 (bool_ret)

    输出调试文本 (“第三步,获取当前运行的软件包名,返回值为: ” + j_ret.取数据文本 ())

    status = j_ret.取属性对象 (“status”)

    .如果 (status = “true”)

    输出调试文本 (“恭喜你,成功了!”)

    .否则

    输出调试文本 (“不好意思,失败了!”)

    .如果结束

    .否则

    输出调试文本 (“该 API 执行失败”)

    .如果结束

    .否则

    输出调试文本 (“获取设备 ID 值失败”)

    .如果结束

    .否则

    输出调试文本 (“获取 token 失败”)

    .如果结束

    易语言代码运行结果:

    成功,则返回:

    * 将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: c2lnbWE6M0QzOTE0OTc=

    * 第一步,获取 token,返回值为:{"status":true,"value":{"token":"U56adwI779838M6F"}}

    * 获取的 token 值为: U56adwI779838M6F

    * 第二步,获取设备 ID 值,返回值为:{"id":"device@230441652"}

    * 第三步,获取当前运行的软件包名,返回值为: {"status":true,"value":"com.sigma_rt.totalcontrol"}

    * 恭喜你,成功了!

    707e0610c94c6c1f4a54e47f613293d6.png
    展开全文
  • 之前我分享过用JavaScript来写脚本实现电脑自动控制手机的功能。但是很多老铁说我不会用JavaScript,只会易语言、java、python等其他语言怎么办?其实很简单,用 Total Control 提供的REST API 就可以啦!Total ...

    之前我分享过用JavaScript来写脚本实现电脑自动控制手机的功能。但是很多老铁说我不会用JavaScript,只会易语言、java、python等其他语言怎么办?其实很简单,用 Total Control 提供的REST API 就可以啦!Total Control 的REST API 支持任意脚本语言。今天我来说说,怎样用易语言实现自动打开、关闭手机上的软件。

    (一) 易语言实现自动打开手机上的软件(runApp)

    函数功能:打开或运行设备上指定的软件

    请求方式:POST

    http://IP:8090/TotalControl/v1/devices/:device/apps/:packageName?state=active&token=:token

    参数说明:

    bd28c6ca8de07d66f5b74f4f824622a8.png

    易语言请求实例:打开手机上的 Total Control 软件,Total Control 软件名为 "com.sigma_rt.totalcontrol"

    代码如下:

    .版本 2

    .程序集 窗口程序集_启动窗口

    .子程序 __启动窗口_创建完毕

    .局部变量 base64, 文本型

    .局部变量 token, 文本型

    .局部变量 device, 文本型

    .局部变量 j_token, 类_json, , , 用来解析获取 token 的 json

    .局部变量 j_dev, 类_json, , , 用来解析获取设备ID 值的 json

    .局部变量 j_ret, 类_json, , , 用来解析 REST API 接口的json

    .局部变量 bool, 逻辑型

    .局部变量 bool_dev, 逻辑型

    .局部变量 bool_ret, 逻辑型

    .局部变量 AppName, 文本型

    .局部变量 status, 文本型

    base64 = 到文本 (编码_BASE64编码 (到字节集 (“sigma:3D391497”)))

    输出调试文本 (“将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: ” + base64)

    bool = j_token.解析 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/login”, 0, , , , “Authorization:” + base64, , , , , , , , , )))

    .如果 (bool)

    输出调试文本 (“第一步,获取 token,返回值为:” + j_token.取数据文本 ())

    token = j_token.取通用属性 (“['value'].token”)

    输出调试文本 (“获取的 token 值为: ” + token)

    bool_dev = j_dev.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/main?token=” + token, 0))))

    .如果 (bool_dev)

    输出调试文本 (“第二步,获取设备 ID 值,返回值为:” + j_dev.取数据文本 ())

    device = j_dev.取通用属性 (“['id']”)

    输出调试文本 (“获取的设备 ID 值为: ” + device)

    AppName = “com.sigma_rt.totalcontrol”

    bool_ret = j_ret.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/” + device + “/apps/” + AppName + “?state=active&token=” + token, 1))))

    .如果 (bool_ret)

    输出调试文本 (“第三步,运行指定软件,返回值为: ” + j_ret.取数据文本 ())

    status = j_ret.取属性对象 (“status”)

    .如果 (status = “true”)

    输出调试文本 (“恭喜你,成功了!”)

    .否则

    输出调试文本 (“不好意思,失败了!”)

    .如果结束

    .否则

    输出调试文本 (“该 API 执行失败”)

    .如果结束

    .否则

    输出调试文本 (“获取设备 ID 值失败”)

    .如果结束

    .否则

    输出调试文本 (“获取 token 失败”)

    .如果结束

    易语言代码运行结果:

    成功,则返回:

    * 将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: c2lnbWE6M0QzOTE0OTc=

    * 第一步,获取 token,返回值为:{"status":true,"value":{"token":"U56adwI779838M6F"}}

    * 获取的 token 值为: U56adwI779838M6F

    * 第二步,获取设备 ID 值,返回值为:{"id":"device@33254183"}

    * 获取的设备 ID 值为: device@33254183

    * 第三步,运行指定软件,返回值为: {"status":true,"value":"make it active."}

    * 恭喜你,成功了!

    (二) 易语言实现自动关闭手机上的软件(closeApp)

    函数功能:关闭设备上指定的软件

    请求方式:POST

    http://IP:8090/TotalControl/v1/devices/:device/apps/:packageName?state=inactive&token=:token

    参数说明:

    d139c4220257f3d9c55e37f1047795e7.png

    易语言实例:关闭手机上的 Total Control 软件,Total Control 软件名为 "com.sigma_rt.totalcontrol"

    代码如下:

    .版本 2

    .程序集 窗口程序集_启动窗口

    .子程序 __启动窗口_创建完毕

    .局部变量 base64, 文本型

    .局部变量 token, 文本型

    .局部变量 device, 文本型

    .局部变量 j_token, 类_json, , , 用来解析获取 token 的 json

    .局部变量 j_dev, 类_json, , , 用来解析获取设备ID 值的 json

    .局部变量 j_ret, 类_json, , , 用来解析 REST API 接口的json

    .局部变量 bool, 逻辑型

    .局部变量 bool_dev, 逻辑型

    .局部变量 bool_ret, 逻辑型

    .局部变量 AppName, 文本型

    base64 = 到文本 (编码_BASE64编码A (到字节集 (“sigma:3D391497”)))

    输出调试文本 (“将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: ” + base64)

    bool = j_token.解析 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/login”, 0, , , , “Authorization:” + base64, , , , , , , , , )))

    .如果 (bool)

    输出调试文本 (“第一步,获取 token,返回值为:” + j_token.取数据文本 ())

    token = j_token.取通用属性 (“['value'].token”)

    输出调试文本 (“获取的 token 值为: ” + token)

    bool_dev = j_dev.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/main?token=” + token, 0))))

    .如果 (bool_dev)

    输出调试文本 (“第二步,获取设备 ID 值,返回值为:” + j_dev.取数据文本 ())

    device = j_dev.取通用属性 (“['id']”)

    输出调试文本 (“获取的设备 ID 值为: ” + device)

    AppName = “com.sigma_rt.totalcontrol”

    bool_ret = j_ret.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/” + device + “/apps/” + AppName + “?state=inactive&token=” + token, 1))))

    .如果 (bool_ret)

    输出调试文本 (“第三步,关闭手机上指定软件,返回值为: ” + j_ret.取数据文本 ())

    .否则

    输出调试文本 (“该 API 执行失败”)

    .如果结束

    .否则

    输出调试文本 (“获取设备 ID 值失败”)

    .如果结束

    .否则

    输出调试文本 (“获取 token 失败”)

    .如果结束

    易语言代码运行结果:

    成功,则返回:

    * 将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: c2lnbWE6M0QzOTE0OTc=

    * 第一步,获取 token,返回值为:{"status":true,"value":{"token":"m195zZEgY91PMcbo"}}

    * 获取的 token 值为: m195zZEgY91PMcbo

    * 第二步,获取设备 ID 值,返回值为:{"id":"device@230441652"}

    * 获取的设备 ID 值为: device@230441652

    * 第三步,关闭手机上指定软件,返回值为: {"status":true,"value":"make it inactive."}

    * 恭喜你,成功关闭软件!

    (三) 不知道我要卸载的软件的软件包名怎么办?

    为了方便用户,Total Control 提供了一个REST API来帮助用户获取应用程序的包名。

    函数功能:获取设备上当前运行的软件包名

    请求方式:GET

    http://IP:8090/TotalControl/v1/devices/:device/apps?token=:token&q=foreground_app

    参数说明:

    10a8af7accc7091d65c4f9f4e5ef0b02.png

    返回示例:

    成功,则返回:

    {

    "status": true,

    "value":"com.sigma_rt.totalcontrol"

    }

    易语言实例:获取设备上当前运行的软件包名

    代码如下:

    .版本 2

    .程序集 窗口程序集_启动窗口

    .子程序 __启动窗口_创建完毕

    .局部变量 base64, 文本型

    .局部变量 token, 文本型

    .局部变量 device, 文本型

    .局部变量 j_token, 类_json, , , 用来解析获取 token 的 json

    .局部变量 j_dev, 类_json, , , 用来解析获取设备ID 值的 json

    .局部变量 j_ret, 类_json, , , 用来解析 REST API 接口的json

    .局部变量 bool, 逻辑型

    .局部变量 bool_dev, 逻辑型

    .局部变量 bool_ret, 逻辑型

    .局部变量 status, 文本型

    base64 = 到文本 (编码_BASE64编码 (到字节集 (“sigma:3D391497”)))

    输出调试文本 (“将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: ” + base64)

    bool = j_token.解析 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/login”, 0, , , , “Authorization:” + base64, , , , , , , , , )))

    .如果 (bool)

    输出调试文本 (“第一步,获取 token,返回值为:” + j_token.取数据文本 ())

    token = j_token.取通用属性 (“['value'].token”)

    输出调试文本 (“获取的 token 值为: ” + token)

    bool_dev = j_dev.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/main?token=” + token, 0))))

    .如果 (bool_dev)

    输出调试文本 (“第二步,获取设备 ID 值,返回值为:” + j_dev.取数据文本 ())

    device = j_dev.取通用属性 (“['id']”)

    bool_ret = j_ret.解析 (编码_utf8到gb2312 (到文本 (网页_访问_对象 (“http://localhost:8090/TotalControl/v1/devices/” + device + “/apps?q=foreground_app&token=” + token, 0))))

    .如果 (bool_ret)

    输出调试文本 (“第三步,获取当前运行的软件包名,返回值为: ” + j_ret.取数据文本 ())

    status = j_ret.取属性对象 (“status”)

    .如果 (status = “true”)

    输出调试文本 (“恭喜你,成功了!”)

    .否则

    输出调试文本 (“不好意思,失败了!”)

    .如果结束

    .否则

    输出调试文本 (“该 API 执行失败”)

    .如果结束

    .否则

    输出调试文本 (“获取设备 ID 值失败”)

    .如果结束

    .否则

    输出调试文本 (“获取 token 失败”)

    .如果结束

    易语言代码运行结果:

    成功,则返回:

    * 将用户名和密码组装成 sigma:3D391497 进行 base64 编码生成的字符串为: c2lnbWE6M0QzOTE0OTc=

    * 第一步,获取 token,返回值为:{"status":true,"value":{"token":"U56adwI779838M6F"}}

    * 获取的 token 值为: U56adwI779838M6F

    * 第二步,获取设备 ID 值,返回值为:{"id":"device@230441652"}

    * 第三步,获取当前运行的软件包名,返回值为: {"status":true,"value":"com.sigma_rt.totalcontrol"}

    * 恭喜你,成功了!

    展开全文
  • 对应功能常见的设计思路,表达能力,易混淆的概念,功能责任的分离,直至网络协议的一些特点,通过这道面试题就可以挖掘出来了。你在网上是搜不到答案的,只有我跟面试者沟通时才会这么出题。这道题会涉及以下几个...

    本文实际上是一道面试题,关于登录主题做一些探讨。

    对应功能常见的设计思路,表达能力,易混淆的概念,功能责任的分离,直至网络协议的一些特点,通过这道面试题就可以挖掘出来了。

    你在网上是搜不到答案的,只有我跟面试者沟通时才会这么出题。

    这道题会涉及以下几个方面

    用户状态保存逻辑/常见的软件应用开发中如何存储和维持用户的状态?

    更多的应聘者会提到 Token,那么

    Token 服务端的设计策略是什么

    进而细化为

    服务端如何识别用户

    回到题目如何理解状态,前后端分离大多采用 HTTP 协议通讯,HTTP 却是无状态的,而我们又要保存用户的状态,矛盾了吧

    HTTP 是无状态的,单纯的做请求响应,而业务必须是有状态的,否则业务无法流转和推进。二者是如何关联的
    账号体系如何设计的

    这样沟通下来是不是一连串的问题都引申出来了?

    理解状态

    状态的理解实际上很抽象,我们可以 理解为状态就是业务的延续性,有了状态 ,业务才能正常流转。流转实际上是数据的流动,进而状态就是在处理数据。

    对无状态的理解核心-独立,【每次请求是独立的,低耦合的】。状态实际上最终是通过数据体现的,有状态就代表着过多的数据依赖。

    接口设计最佳实践 文中有以下一句建议

    A RESTful API should be stateless

    This means that request authentication should not depend on cookies or sessions. Instead, each request should come with some sort authentication credentials.

    现在 业界最流行的状态保存维护方案就是 Token 机制。从 cookies 和 session 到 Token,就是技术的演化过程。

    思考

    客户端 (特指安卓和 iOS 的原生客户端)中有 cookies 和 session 的概念吗?如何理解和阐述

    账号系统设计第一要点 登录与退出

    既然题目中提到了退出功能,说一说账号系统的设计。

    之前产品同事在需求评审中提出一个场景:

    公众号链接业务系统登录,用户在业务系统修改密码之后,返回到微信公众号中仍然可以进入需要登录授权才可以访问的页面,没有任何重新登录的提示。

    其实原因很简单,微信公众号链接业务系统登录的体系采用的 Token 保存用户信息的两方 OAuth 协议(注意啊这里说的是业务系统本身的登录逻辑,并不是微信开发平台)。

    Token 有一个有效时长的生命周期,鉴于减少用户频繁登录的用户体验效果,微信端的 Token 时长会设置的长一些,比如一个月。当在有效时长内,用户修改密码后,实际上微信端的 Token 是感知不到的。

    为什么感知不到,从产品的完整度来说,这块是欠缺的,从技术方面来说这要从 Token 的生成和存储谈起。

    Token 生命周期由客户端登录场景发起,服务器端负责分配和管理。最常见的存储方式是在 redis 数据库中采用 key value 形式,而 key 是 token, value 是一些需要缓存的热点数据,一般以用户编号,用户名等 profile 信息为主。

    账户系统如果设计到这一步,已经可以满足大部分应用系统以云端为中心,多个客户端正常登录的情况了。 这种验证方式也是我上文提到的 宽泛的两方 OAuth 协议的应用。之前有一篇文章单独阐述了两方 OAuth 系统服务化构建-两方 OAuth

    接着继续描述,端应用拿着用户的 Token 信息,会对应查找到缓存数据。修改密码后,系统拿到的是用户编号之类的唯一标识。如果在生成 Token 时,没有做用户唯一标识与 Token 的对应关系,那么修改密码后也就关联不到用户已生效的 Token 信息。

    两个对应关系,分别是以 Token 为 key,和以用户唯一标识为 key,结合使用就可以实现 Token 的管理

    账号系统设计的第二要点 远程管理

    我们把接入账号系统的系统都抽象为应用,不管是网站,原生 APP,混合 APP,还是微信小程序。远程管理的用户有两类,一类是云端管理人员,一类是登录用户。

    云端管理人员 远程查看用户登录状态,在线统计,多设备管理,踢人,都是这方面的应用场景。

    登录用户在个人中心查看个人账号登录过哪些应用,剩余时长如何,实现登录应用退出。如图 2 Teambition 的个人中心。

    9228e8ef14b9e7283a5b7e056f6e68aa.png

    以上是开放平台授权登录的套路,只涉及到应用服务端和客户端,并没有达到 OAuth 三方角色的复杂度。

    远程账号分配,保持,注销,统计

    账号系统设计的第三要点 服务化

    基于以上两个要点设计完成之后,账号系统已经满足了独立于其它的系统的要求,可以以账号中心的身份自行运转了,其本身就是一个通行证的协调分配中心。我们试着列出如下 FetureList

    实名验证

    1 验证手机

    实现方式 通过发送验证码来验证登录身份

    2 多种登录渠道,如手机验证码,用户名密码,微信扫码(第三方账号的一种),手机与密码(用户名登录的一种)

    应用授权管理

    企业的应用分为内部应用和外部应用

    应用列表

    退出应用

    登录应用

    退出所有应用

    操作日志

    在线人数统计

    运营分析

    ...

    安全中心

    1 账号信息常规维护,密码修改,找回,登录方式选择

    1 密码修改后的登录管理 (单点登录,设备关联,退出已有登录)

    2 登录有效时长(由端应用自行控制)

    退出功能与网络支持

    回到题目中,退出功能与网络支持的产品形态是这样的:

    退出功能,请求退出登录接口,服务端注销登录凭据,客户端移除相关本地存储。 有无网络,退出接口是否成功,都以退出成功的交互引导用户,至于其它的,通过技术来实现。如服务端的自动失效等。

    常见的误区是,退出只做客户端的凭据删除,然后跳转登录页面,这样的流程过于简单了。

    end 2019年12月 公众号 图南日晟

    展开全文
  • Wiac token

    2021-01-01 07:22:45
    曾就职世界顶级的软件公司Microsoft,开发了企业和拥有百万活跃用户规模的消费类产品。 他熟悉系统基础架构的各种场景,包括服务分发,服务扩展,安全/合规性,分析和机器学习集成等...
  • 介绍 itsu-token作为SpringBoot 的starter 模块依赖SpringBoot环境。使用了hu-tool工具包作为底层开发工具包。...实现了第三方系统调用时的token校验、token注册等功能 软件架构 Spring, SpringBoot, Jquery,

    介绍

    itsu-token作为SpringBoot 的starter 模块依赖SpringBoot环境。使用了hu-tool工具包作为底层开发工具包。依赖Spring Aop进行token校验。支持token的持久化保存,目前仅支持mysql数据库。支持token的可视化构建和管理。token构建,token list页面使用bootstrap和jquery-confirm进行设计。实现了第三方系统调用时的token校验、token注册等功能

    软件架构

    Spring, SpringBoot, Jquery, Hutool, Spring Aop

    安装教程

    1. git clone https://github.com/zjwan461/itsu-token.git
    2. mvn clean install
    3. 在需要使用的项目中添加新构建的maven依赖
    <dependency>
        <groupId>com.itsu</groupId>
            <artifactId>itsu-token</artifactId>
        <version>1.0</version>
    </dependency>
    

    使用说明

    使用者可以在itsu-token-sample中查看到具体的使用案例

    一、快速上手
    1. 第一步需要导入maven依赖。

      <dependency>
      	<groupId>com.itsu</groupId>
      	<artifactId>itsu-token</artifactId>
      	<version>1.0</version>
      </dependency>
      
    2. 在application.yml或application.properties中开启itsu-token功能

      itsu-token:
        enable: true
      
    3. 在需要提供token校验的接口上添加@Token注解

      @RestController
      public class TestController {
      	@Token
      	@GetMapping("/index")
      	public String idx() {
      		return "index";
      	}
      }
      
    二、自动创建token数据库表
    1. 开启自动建表功能

    2. 提供自动建表schema.sql

      itsu-token:
        enable: true
        init:
          auto-create-table: true
          schema-location: classpath:example.sql
      

      需要留意的是,即使使用者不提供schema,itsu-token也内置了两种建表方案。他们分别是rsaSchema.sql和simpleSchema.sql,分别对应了系统内置的两种校验方式“RSA” & “SIMPLE”
      在这里插入图片描述

      通常情况下我建议直接使用内置的schema完成自动建表,如果使用者一定要使用自定义的schema建表,还需要开启custom-schema功能,并给出自定义的schema-location。并且需要在IOC容器中注入TableSample接口的实现类。并且使用特定的“表结构修饰注解”给这个类打上标记,以适配使用者在自定义schema脚本建表的表接口。请看如下一个完整的使用案例。

      我准备了一个example.sql作为自定义建表的schema文件

      CREATE TABLE IF NOT EXISTS sys_token (
          id char(32) not null primary key,
          name varchar(255) not null,
          simple_token char(32) not null
      );
      

      同时我也开启了auto-create-table和custom-schema功能,并给出了schema文件的所在位置。

      itsu-token:
        enable: true
        init:
          auto-create-table: true
          schema-location: classpath:example.sql
          custom-schema: true  #声明开启自定义schema功能
        web-register:
          enable: true
      

      此时我还需要自定义一个tableSample类,如下。使用TableDesc,TableId,SimpleToken,SysName这几个注解完成和自定义example.sql的表结构统一。另一种验证方式RSA和这种方式是一致的,只不过不再使用SimpleToken这个注解,取而代之的是PrivateKey, PublicKey这两个注解。用于表示RSA非对称加密中的“公钥”和“私钥”。

      @TableDesc("sys_token")
      public class MySimpleTableSample implements TableSample {
      	@TableId
      	private String id;
          
      	@SimpleToken("simple_token")
      	private String token;
      	
      	@SysName("name")
      	private String name;
      	
      }
      
    三、自定义Token验证规则
    1. itsu-token提供了自定义的Token校验机制。让使用者可以根据自己的需求,个性化的来定制自己所需的token校验。你需要继承一个com.itsu.itsutoken.checker.CusTokenChecker抽象类,并重写check()、getTableSample() 方法。

      public class MyCustomTokenChecker extends CusTokenChecker<MyCustomTableSample> {
      
      	@Override
      	public void check(JoinPoint joinPoint) throws TokenCheckException {
      		// do some check here
      	}
      
      	@Override
      	public MyCustomTableSample getTableSample() {
      		return new MyCustomTableSample();
      	}
      
      }
      
      
    2. 为何要重写getTableSample()方法?因为对于自定义token校验来说,使用者在数据库中存储的token信息是不明确的,也无法知道使用者需要进行那种方式的token校验。所以需要给出数据库中存储token信息的表的结构。对于这种要求,itsu-token是通过TableSample类+TableSample注解来实现的。这一点在上文中的custom-schema中也有提及。那也就意味着如果使用者使用了自动建表功能,那就需要同时给出schema-location,然后还需要定义TableSample的具体实现。当然手动建表也需要提供TableSample的具体实现。

      @TableDesc("tb_token")
      public class MyCustomTableSample implements TableSample {
      
      	@TableId
      	private String id;
      	
      	@TableField("custom_field")
      	private String token;
      }
      
      
      
    3. 工具方法

      CustomTokenChecker提供了三个基本工具方法,分别是getTableFieldNames(),getTableName(),getTableId()用来获取用户自定义TableSample的字段&表的定义。可以方便后期使用者获取Table的详细信息。我知道这样看起来多此一举,因为我大部分会用到自定义token校验的使用者都会清楚的知道表结构是什么样子的,直接写原生的sql查询数据就可以达到目标。这里只是提供一种方式。

      protected List<String> getTableFieldNames() throws TokenCheckException {
      		try {
      			return ClassUtil.getTableFieldValues(tableSample.getClass());
      		} catch (Exception e) {
      			throw new TokenCheckException(e);
      		}
      	}
      
      protected String getTableName() throws TokenCheckException {
      		try {
      			return AnnotationUtil.getAnnotationValue(tableSample.getClass(), TableDesc.class);
      		} catch (UtilException e) {
      			throw new TokenCheckException(e);
      		}
      }
      
      protected String getTableId() throws TokenCheckException {
      		try {
      			return ClassUtil.getId(tableSample.getClass());
      		} catch (Exception e) {
      			throw new TokenCheckException(e);
      		}
      }
      
      
    四、web register 功能

    ​ 目前itsu-token仅对默认支持的Token校验类型“simple”,”rsa“ 提供了web register功能。至于web register,顾名思义就是提供了集成化的非侵入式的通过web方式来向系统注册token的功能。在itsu-token中,这一功能,默认是关闭的。需要在配置文件中开启。如下是一个web-register功能的完整配置。可以看到的是除了web register的开关位,还提供了几个选项。详细的解释可以参考下文的定义。需要注意的是,web register目前暂时不支持自定义校验,也就是custom token check。

    itsu-token:
      web-register:
        enable: true
        user: admin
        password: password
        register-url: /register.html
        token-list-url: /tokenlist.html
    
    

    ​ 当你开启web register后,想要访问到tokenlist.html, 此时itsu-token会要求你先进行登录。账号和密码也就是在上述代码中所配置的。
    在这里插入图片描述
    当你完成登录后,就能访问register.html和tokenlist.html了。你可以在register页面做token的注册工作,在tokenlist.html查看已注册的token列表。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • token和id是所有有api文档功能的网站必不可少的东西,而且关乎用户财产安全。 注意,上图的token已经失效。 可以看出,“请勿泄露您的token”说明了token对于fir.im平台有多么重要。 现在,我们来实际操作获取...
  • Add Dogether token

    2020-12-26 12:57:20
    核心成员拥有超过八年互联网软件开发以及技术支持等经验,是世界上较早研究区块链技术领域的高端团队和布道者。罗志伟(Dave)在2015年在北京区块链技术交流会上首次提出多种数字货币有机结合&#...
  • Add wiac token

    2020-12-25 23:32:55
    曾就职世界顶级的软件公司Microsoft,开发了企业和拥有百万活跃用户规模的消费类产品。 他熟悉系统基础架构的各种场景,包括服务分发,服务扩展,安全/合规性,分析和机器学习集成等...
  • Token2Shell v6.1.0.zip

    2019-07-17 15:26:51
    Token2Shell是一款多功能Shell远程管理工具。目前支持多种模式,支持SSH连接广泛的运算法则和连接方式。Token2Shell支持的协议有ab://、ssh://、tel/net://、tcp://、com://、phone://等等等,是一款不可多的的软件...
  • 为您提供1Token日内交易专用版客户端下载,1Token日内交易专用版客户端是一款为专业投资私募操盘手打造的日内交易终端,不仅有丰富全面的快捷键操作及设置功能,还拥有多窗口布局,多图看行情、多标的交易功能,支持...
  • 有的同学没域名,没服务器,想要测试下公众号功能怎么办,然后在网上找了下 有好多内网穿透软件- 花生壳,ngrok, natapp什么的- 比较了下,决定售后服务 natapp,为啥,因为免费呗。首先,去https://natapp.cn/注册...
  • 转载:...它将服务端的信息和功能等所有事物统称为资源,客户端的请求实际就是对资源进行操作,它的主要特点有: – 每一个资源都会对应一个独一无二的url – 客户端通过HTTP的GET、...
  • 接口测试是针对软件对外提供服务得接口得输入输出进行得测试,验证接口功能与接口描述文档得一致性返回结果可以为字符串,json,xml等2.接口的请求方式:get,post,delete,put等3.接口测试需要的元素:url,请求方式...
  • 接口测试是针对软件对外提供服务得接口得输入输出进行得测试,验证接口功能与接口描述文档得一致性返回结果可以为字符串,json,xml等2.接口的请求方式:get,post,delete,put等3.接口测试需要的元素:url,请求方式...
  • 直播软件源码中,有些平台会更愿意开发商城功能,通过添加商品、直播短视频带货实现盈利,那么,直播软件源码添加商品功能是如何实现的呢? 上传数据时设置每一个子页面都有一个bool值来记录图片上传存储有没有成功...
  • 能够实现 VMLogin 用户配置浏览器的一些自动化控制操作,如:打开指定网页、寻找网页中指定的位置进行输入文字/点击等操作,并且可以执行用户自定义的JS脚本等功能。我们来看看测试工具的主界面:VMLogin A...
  • RESTful登录设计(基于Spring及Redis的Token鉴权) 文章目录RESTful登录设计(基于Spring及Redis的Token鉴权)什么是 REST使用 Token 进行身份鉴权交互...它将服务端的信息和功能等所有事物统称为资源,客户端的请...
  • RESTful登录设计(基于Spring及Redis的Token鉴权) 转载:http://blog.csdn.net/gebitan505/article/details/51614805   什么是REST REST(Representational State Transfer)是一种软件架构风格。它将服务端的...
  • 它将服务端的信息和功能等所有事物统称为资源,客户端的请求实际就是对资源进行操作,它的主要特点有: - 每一个资源都会对应一个独一无二的 url - 客户端通过 HTTP 的 GET、POST、PUT、DELETE 请求方法对资源进行...
  • WebAPI主要开放数据给手机APP,Pad,其他需要得知数据的系统,或者软件应用。Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能。我上次写的《Asp.Net MVC WebAPI的创建与前台Jquery ajax后台HttpClient...
  • DVWA 第一题,Brute Force,简单(low)和中等(medium)模式比较好破解,对登陆请求没有做严格的过滤,可以使用简单的爆破完成,可以使用的软件是hydra和burpsuite的intruder功能。但是困难(high)模式,登陆请求中加入...
  • 每当短视频软件端切换一个视频时,短视频APP软件把用户当前视频的观看时间通过接口发送到服务端。服务端接收后处理,会根据观看视频时长可...1 || $token=='' || $length<1 || $sign=='' ){ $rs['code'] = 10...
  • 软件建立了一个使用HIVE发布和解释交易的对等网络。 这使这些对等方可以达成共识,并选择对等方来运行任务。 以这种方式分布计算可允许大量潜在的应用程序,DeFi和oracle服务。 通过分配执行交易的权限,我们可以...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 205
精华内容 82
关键字:

token软件功能