好友
阅读权限10
听众
最后登录1970-1-1
|
.版本 2
.支持库 spec
.子程序 获取本地已登录QQ, 逻辑型, 公开, 传值返回,数组形
.参数 返回QQ数组, 文本型, 参考 数组
.参数 返回昵称数组, 文本型, 参考 数组
.参数 返回数量, 整数型, 参考
.局部变量 端口组, 整数型, , "10"
.局部变量 i, 整数型
.局部变量 本地随机Token, 文本型
.局部变量 请求URL, 文本型
.局部变量 WinHttp, 对象
.局部变量 响应文本, 文本型
.局部变量 http状态码, 整数型
.局部变量 起始位置, 整数型
.局部变量 结束位置, 整数型
.局部变量 JSON文本, 文本型
.局部变量 json, 类_json
.局部变量 成员数, 整数型
.局部变量 j, 整数型
.局部变量 QQ号, 文本型
.局部变量 昵称, 文本型
.局部变量 临时QQ数组, 文本型, , "0"
.局部变量 临时昵称数组, 文本型, , "0"
.局部变量 是否成功, 逻辑型
端口组 = { 4301, 4303, 4305, 4307, 4309, 4300, 4302, 4304, 4306, 4308 }
' 端口组 = { 4301 }
是否成功 = 假
清除数组 (临时QQ数组)
清除数组 (临时昵称数组)
调试输出 (“开始尝试获取本地已登录QQ...”)
.计次循环首 (取数组成员数 (端口组), i)
置随机数种子 ()
本地随机Token = “”
.计次循环首 (10, )
本地随机Token = 本地随机Token + 到文本 (取随机数 (0, 9))
.计次循环尾 ()
.如果 (端口组 = 4300 或 端口组 = 4302 或 端口组 = 4304 或 端口组 = 4306 或 端口组 = 4308)
请求URL = “http://localhost.ptlogin2.qq.com:” + 到文本 (端口组 ) + “/pt_get_uins?callback=ptui_getuins_CB&pt_local_tk=” + 本地随机Token
.否则
请求URL = “https://localhost.ptlogin2.qq.com:” + 到文本 (端口组 ) + “/pt_get_uins?callback=ptui_getuins_CB&pt_local_tk=” + 本地随机Token
.如果结束
WinHttp.创建 (“WinHttp.WinHttpRequest.5.1”, )
WinHttp.写属性 (“Option”, 4, 13056)
WinHttp.写属性 (“Option”, 5, 13056)
WinHttp.方法 (“Open”, “GET”, 请求URL, 假)
WinHttp.方法 (“SetRequestHeader”, “Referer”, “https://xui.ptlogin2.qq.com/”)
WinHttp.方法 (“SetRequestHeader”, “User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36”)
WinHttp.方法 (“SetRequestHeader”, “Cookie”, “pt_local_token=” + 本地随机Token + “;”)
WinHttp.方法 (“SetRequestHeader”, “Accept”, “*/*”)
WinHttp.方法 (“Send”, )
http状态码 = WinHttp.读数值属性 (“Status”, )
响应文本 = WinHttp.读文本属性 (“ResponseText”, )
WinHttp.清除 ()
.如果 (http状态码 = 200 且 响应文本 ≠ “”)
调试输出 (“【成功】端口:” + 到文本 (端口组 ) + “ 响应:” + 响应文本)
' ★★★ 修正解析逻辑:直接提取 [ 到 ] 之间的JSON数组 ★★★
起始位置 = 寻找文本 (响应文本, “[”, , 假)
结束位置 = 倒找文本 (响应文本, “]”, , 假)
.如果真 (起始位置 ≠ -1 且 结束位置 ≠ -1 且 结束位置 > 起始位置)
JSON文本 = 取文本中间 (响应文本, 起始位置, 结束位置 - 起始位置 + 1)
JSON文本 = 删首尾空 (JSON文本)
.如果真 (json.解析 (JSON文本))
成员数 = json.取属性数值 (“length”) ' 获取数组元素个数
调试输出 (“【解析】JSON数组长度:” + 到文本 (成员数))
.计次循环首 (成员数, j)
QQ号 = json.取通用属性 (“[” + 到文本 (j - 1) + “].uin”, )
昵称 = json.取通用属性 (“[” + 到文本 (j - 1) + “].nickname”, )
' 处理可能的UTF-8编码
昵称 = 编码_Utf8到Ansi (到字节集 (昵称))
.如果真 (QQ号 ≠ “” 且 QQ号 ≠ “0”)
加入成员 (临时QQ数组, QQ号)
加入成员 (临时昵称数组, 昵称)
调试输出 (“找到QQ:” + QQ号 + “ 昵称:” + 昵称)
.如果真结束
.计次循环尾 ()
.如果 (取数组成员数 (临时QQ数组) > 0)
是否成功 = 真
跳出循环 () ' 成功后不再尝试其他端口
.否则
调试输出 (“【警告】JSON数组为空或无有效QQ号”)
.如果结束
调试输出 (“【错误】JSON解析失败,提取的文本:” + JSON文本)
.如果真结束
调试输出 (“【错误】未找到JSON数组边界 [ ]”)
.如果真结束
.否则
' 请求失败时不输出(已按之前要求注释)
.如果结束
.计次循环尾 ()
.如果 (是否成功 = 真)
返回QQ数组 = 临时QQ数组
返回昵称数组 = 临时昵称数组
返回数量 = 取数组成员数 (临时QQ数组)
调试输出 (“获取成功!共获取到 ” + 到文本 (返回数量) + “ 个已登录QQ账号”)
.否则
清除数组 (返回QQ数组)
清除数组 (返回昵称数组)
返回数量 = 0
调试输出 (“获取失败!请确保:” + #换行符 + “1. 电脑版QQ已登录且在线;” + #换行符 + “2. 未使用防火墙拦截本地回环;” + #换行符 + “3. 尝试以管理员身份运行本程序;” + #换行符 + “4. 检查端口是否被占用或QQ版本是否兼容。”)
.如果结束
返回 (是否成功)
|
|