3 Commits 6091a05704 ... ccd1c31d0b

Auteur SHA1 Message Date
  git ccd1c31d0b 1 il y a 4 mois
  git 7aeca20691 1 il y a 4 mois
  git 48c6126c6e 1 il y a 4 mois

+ 99 - 0
src/main/kotlin/cn/qqck/kotlin/tools/Android.kt

@@ -0,0 +1,99 @@
+package cn.qqck.kotlin.tools
+
+object Android {
+    data class Info(
+        /**
+         * 手机正式名称、手机品牌
+         * - ro.product.name
+         * - cmi
+         */
+        val name: String,
+        /**
+         * 手机品牌
+         * - ro.product.brand
+         * - Xiaomi
+         */
+        val brand: String,
+        /**
+         * 手机型号
+         * - ro.product.model
+         * - M2001J1E
+         */
+        val model: String,
+        /**
+         * 设备名
+         * - ro.product.device
+         * - cmi
+         */
+        val device: String,
+        /**
+         * 制造商
+         * - ro.product.manufacturer
+         * - Xiaomi
+         */
+        val manufacturer: String,
+        /**
+         * 系统版本
+         * - Build.VERSION.RELEASE
+         * - 10、11
+         */
+        val version: String,
+        /**
+         * 设备首次使用的 API 级别(Android 版本)
+         * - ro.product.firstApiLevel
+         * - Android(29、32、33)
+         */
+        val firstApiLevel: String,
+        /**
+         * GPU 供应商
+         * - ro.gpu.vendor
+         * - Qualcomm
+         */
+        val gpu_vendor: String,
+        /**
+         * GPU 型号
+         * - ro.gpu.renderer
+         * - Adreno (TM) 650
+         */
+        val gpu_renderer: String,
+        /**
+         * 运行内存
+         * - 8、12
+         */
+        val ram: Int,
+        /**
+         * 手机平台信息
+         * - Linux aarch64、Linux armv8l
+         */
+        val platfrom: String,
+    )
+
+    private val array = arrayOf(
+        Info(
+            "cmi", "Xiaomi", "M2001J1E", "cmi", "Xiaomi", "10", "29",
+            "Qualcomm", "Adreno (TM) 650", 8, "Linux aarch64",
+        ),
+        Info(
+            "cmi", "Xiaomi", "M2001J1E", "cmi", "Xiaomi", "10", "29",
+            "Qualcomm", "Adreno (TM) 650", 12, "Linux aarch64",
+        ),
+        Info(
+            "nuwa", "Xiaomi", "2210132C", "nuwa", "Xiaomi", "13", "33",
+            "Qualcomm", "Adreno (TM) 740", 8, "Linux aarch64",
+        ),
+        Info(
+            "nuwa", "Xiaomi", "2210132C", "nuwa", "Xiaomi", "13", "33",
+            "Qualcomm", "Adreno (TM) 740", 12, "Linux aarch64",
+        ),
+        Info(
+            "shennong", "Xiaomi", "23116PN5BC", "shennong", "Xiaomi", "13", "33",
+            "Qualcomm", "Adreno (TM) 750", 12, "Linux aarch64",
+        ),
+        Info(
+            "shennong", "Xiaomi", "23116PN5BC", "shennong", "Xiaomi", "13", "33",
+            "Qualcomm", "Adreno (TM) 750", 16, "Linux aarch64",
+        ),
+    )
+
+    fun random(): Info = array.random()
+}

+ 14 - 14
src/main/kotlin/cn/qqck/kotlin/tools/Files.kt

@@ -7,25 +7,25 @@ import java.nio.file.Paths
 import java.nio.file.StandardOpenOption
 
 /**
- * 将字符串内容写入文件。
+ * 将字符串数据写入指定路径的文件。
  *
- * @param name 文件名称
- * @param dir 文件路径,默认为空,表示当前路径
- * @param append 是否以追加模式写入,默认为 false 表示覆盖写入
- * @return 写入是否成功,成功返回 true,否则返回 false
+ * @param data 待写入的字符串数据
+ * @param dir 文件保存的目录路径,可选参数,默认为 `null`(当前路径下操作)
+ * @param append 是否以追加的方式写入文件,默认为 `false`(覆盖模式写入)
+ * @return 如果写入成功返回 `true`;否则返回 `false`
  */
-fun String.fset(name: String, dir: String? = null, append: Boolean = false): Boolean = this.toByteArray().fset(name, dir, append)
+fun String.fset(data: String, dir: String? = null, append: Boolean = false): Boolean = this.fset(data.toByteArray(), dir, append)
 
 /**
- * 将当前 ByteArray 的内容写入到指定文件。
+ * 将二进制数据写入指定路径的文件。
  *
- * @param name 文件名,当提供 `dir` 参数时,此参数作为文件的相对路径或者文件名;如果 `dir` 未指定,则此参数为完整的文件路径
- * @param dir 可选的目录路径。如果指定,将 `name` 作为子路径结合形成完整文件路径
- * @param append 如果为 `true`,数据将追加到文件末尾;如果为 `false`,将覆盖文件内容
- * @return 返回布尔值,表示文件写入操作是否成功
+ * @param data 待写入的字节数组
+ * @param dir  文件保存的目录路径,可选参数,默认为 `null`(当前路径下操作)
+ * @param append 是否以追加的方式写入文件,默认为 `false`(覆盖模式写入)
+ * @return 如果写入成功返回 `true`;否则返回 `false`
  */
-fun ByteArray.fset(name: String, dir: String? = null, append: Boolean = false): Boolean {
-    val j_name = if (dir == null) Paths.get(name) else Paths.get(dir, name)
+fun String.fset(data: ByteArray, dir: String? = null, append: Boolean = false): Boolean {
+    val j_name = if (dir == null) Paths.get(this) else Paths.get(dir, this)
     do {
         try {
             val j_c = FileChannel.open(j_name, StandardOpenOption.CREATE, if (append) StandardOpenOption.APPEND else StandardOpenOption.WRITE)
@@ -33,7 +33,7 @@ fun ByteArray.fset(name: String, dir: String? = null, append: Boolean = false):
                 try {
                     val j_lock = j_c.lock()
                     try {
-                        j_c.write(ByteBuffer.wrap(this))
+                        j_c.write(ByteBuffer.wrap(data))
                         if (!append) j_c.truncate(j_c.position())
                         return true
                     } catch (_: Exception) {

+ 12 - 7
src/main/kotlin/cn/qqck/kotlin/tools/String.kt

@@ -175,20 +175,25 @@ fun String?.isIpv6(): Boolean {
 }
 
 /**
- * 隐藏字符串中间一部分字符,用于部分信息的脱敏显示
+ * 隐藏字符串的中间部分字符,保持前后指定长度字符的可见性
  *
- * @param hs 替代被隐藏字符的字符,默认为 '*'。
- * @param pre_len 保留的前缀字符个数,默认为 2。
- * @param suf_len 保留的后缀字符个数,默认为 2。
- * @return 隐藏中间部分字符后的字符串。当字符串长度小于等于前缀长度和后缀长度之和时,原样返回字符串。
+ * @param hs 用于替代隐藏字符部分的字符,默认为 '*'。
+ * @param pre_len 前缀保留的可见字符数,默认为2。
+ * @param suf_len 后缀保留的可见字符数,默认为2。
+ * @param hs_max 最大隐藏字符数目,若为null,则默认隐藏中间所有指定部分字符。
+ * @return 返回处理后的字符串,包含可见的前后缀字符与隐藏字符部分。
  */
-fun String.hide(hs: Char = '*', pre_len: Int = 2, suf_len: Int = 2): String {
+fun String.hide(hs: Char = '*', pre_len: Int = 2, suf_len: Int = 2, hs_max: Int?): String {
     val j_slen = this.length
     if (j_slen <= pre_len + suf_len) return this
     val j_midlen = j_slen - pre_len - suf_len
     val j_shide = CharArray(j_slen)
     for (j_i in 0 until pre_len) j_shide[j_i] = this[j_i]
-    for (j_i in pre_len until pre_len + j_midlen) j_shide[j_i] = hs
+    if (hs_max == null || j_midlen < hs_max) {
+        for (j_i in pre_len until pre_len + j_midlen) j_shide[j_i] = hs
+    } else {
+        for (j_i in pre_len until pre_len + hs_max) j_shide[j_i] = hs
+    }
     for (j_i in j_slen - suf_len until j_slen) j_shide[j_i] = this[j_i]
     return String(j_shide)
 }

+ 39 - 52
src/test/kotlin/Main.kt

@@ -1,59 +1,46 @@
-import cn.qqck.kotlin.tools.*
-import dev.botta.json.values.JsonValue
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.RequestBody.Companion.toRequestBody
+import cn.qqck.kotlin.tools.Rand
+import cn.qqck.kotlin.tools.fget
+import cn.qqck.kotlin.tools.fset
+import cn.qqck.kotlin.tools.string
 
 fun main() {
-    println(Date.day(1))
-    println("192.168.1.1".isIpv4())
-    println("2409:8c1e:75b0:1120::16".isIpv6())
-    println("fe80::1ff:fe23:4567:890a".isIpv6())
+    // println("Date.day(1)".toIntOrNull())
+    // println("192.168.1.1".isIpv4())
+    // println("2409:8c1e:75b0:1120::16".isIpv6())
+    // println("fe80::1ff:fe23:4567:890a".isIpv6())
+    // println(Android.random())
     // println(register_queue.isNet())
     // register_queue.get()
+    ggcz_用户()
 }
 
-fun ggcz(): JsonValue? {
-
-    val proxy = Proxy.Info("39.101.128.132", 801, "tx004", "110110")
-
-    val j_serverip = "1.13.162.140"
-    val j_uid = "3X6W6rkeRhS7GauNNeu5As8E7t2NORlVu4y4J58X4d16WosyvZuLU9dhcPd4xRBE98m9"
-    val j_post = "aid=2031242339&代理地址=${"${proxy.addr}:${proxy.port}"}&代理类型=${
-        when (proxy.type) {
-            Proxy.Type.Http -> 0
-            Proxy.Type.Socks5 -> 1
-            else -> 0
-        }
-    }&代理账号=${proxy.user}&代理密码=${proxy.pass}".toRequestBody("application/x-www-form-urlencoded".toMediaType())
-    for (j_i in 0..2) {
-        var j_url = "http://${j_serverip}/api/腾讯QQ/图形验证码/任务列表/创建任务?token=${j_uid}"
-        val j_data = Okhttp.call(j_url) { it.post(j_post) }?.body?.json() ?: continue
-        println("ggcz -> data:${j_data}")
-        if (j_data.path("code")?.asInt() != 1) continue
-        val j_id = j_data.path("data.id")?.asString() ?: continue
-        Thread.sleep(5000)
-        j_url = "http://${j_serverip}/api/腾讯QQ/图形验证码/任务列表/查询状态?token=${j_uid}"
-        val j_postc = "id=${j_id}".toRequestBody("application/x-www-form-urlencoded".toMediaType())
-        for (j_i in 0..180) {
-            Thread.sleep(1000)
-            val j_result = Okhttp.call(j_url) { it.post(j_postc) }?.body?.json() ?: continue
-            println("ggcz -> result:${j_result}")
-            if (j_result.path("code")?.asInt() != 1) break
-            // 等待处理= 0
-            // 开始处理= 1
-            // 提交信息= 2
-            // 未完成= 100
-            // 成功= 10000
-            // 类型不支持= 10001
-            // 识别错误= 10002
-            // 网络错误= 10003
-            // 返回错误= 10004
-            // 执行错误= 10005
-            val j_状态 = j_result.path("data.状态")?.asInt() ?: break
-            if (j_状态 < 100) continue
-            if (j_状态 == 10000) return j_result.path("data.处理结果")
-            break
-        }
+fun ggcz_用户() {
+    val j_索引 = mutableMapOf<String, String>()
+    j_索引["1"] = "admin"
+    "C:\\Users\\Administrator\\Desktop\\用户.sql".fget()?.string()?.split("\n")?.forEach {
+        val j_item = it.split("----")
+        if (j_item.size != 10) return@forEach
+        j_索引[j_item[0]] = j_item[2]
     }
-    return null
-}
+    "C:\\Users\\Administrator\\Desktop\\用户.sql".fget()?.string()?.split("\n")?.forEach {
+        val j_item = it.split("----")
+        if (j_item.size != 10) return@forEach
+        val j_id = j_item[0]
+        val j_uid = j_item[1]
+        val j_账号 = j_item[2]
+        val j_密码 = j_item[3]
+        var j_昵称 = j_item[4]
+        var j_备注 = j_item[5]
+        var j_权限 = j_item[6]
+        val j_状态 = j_item[7]
+        val j_上级id = j_item[8]
+        val j_下级数 = j_item[9]
+        if (j_昵称 == "\"\"") j_昵称 = ""
+        if (j_备注 == "\"\"") j_备注 = ""
+        if (j_权限.startsWith("\"")) j_权限 = j_权限.removePrefix("\"").removeSuffix("\"")
+        val j_sql =
+            "INSERT INTO ggcz_用户 (uid, 账号, 密码, 昵称, 备注, 权限, 状态, 上级id) VALUES ('${Rand.str.num_aZ(68)}','${j_账号}','${j_密码}','${j_昵称}','${j_备注}','${j_权限}','${j_状态}',(SELECT id FROM ggcz_用户 WHERE 账号 = '${j_索引[j_上级id]}'));\n"
+        "C:\\Users\\Administrator\\Desktop\\用户2.sql".fset(j_sql, append = true)
+        print(j_sql)
+    }
+}