赞
踩
提前说明,我这里不提供下载地址,只提供源码,供大家学习和研究使用,是易语言开发的,可以提取快手直播间的用户信息,然后可批量导出到本地,仅供学习研究。
下面是源码:【仅供学习】
==============================================================
.版本 2
.支持库 e2ee
.支持库 iext2
.支持库 iext
.支持库 spec
.支持库 EThread
.程序集 窗口程序集_启动窗口
.程序集变量 WSS, WebSocket客户端
.程序集变量 cookie, 文本型
.程序集变量 liveStreamId, 文本型
.程序集变量 弹幕数量, 整数型
.程序集变量 a, 字符格式
.子程序 __启动窗口_创建完毕
写到文件 (取运行目录 () + “\gzip.dll”, #gzip)
WSS.初始化 (&WSS客户端_收到消息, &WSS客户端_连接成功, &WSS客户端_连接失败, &WSS客户端_断开连接)
.子程序 连接
.局部变量 是否成功, 逻辑型
.局部变量 token十六进制, 文本型
.局部变量 liveStreamId十六进制, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型
.局部变量 直播间链接, 文本型
.局部变量 返回Cookie, 文本型
.局部变量 局_提交数据, 文本型
.局部变量 json, 类_json
.局部变量 token, 文本型
.局部变量 webSocketUrls, 文本型
cookie = 编辑框1.内容
直播间链接 = 编辑框_直播间地址.内容
.如果真 (直播间链接 = “”)
信息框 (“请输入直播间链接”, 0, “提示”, _启动窗口.取窗口句柄 ())
按钮_连接.禁止 = 假
按钮_断开.禁止 = 假
返回 ()
.如果真结束
局_返回 = 编码_Utf8到Ansi (网页_GZIP解压 (网页_访问_对象 (直播间链接, 0, , , 返回Cookie, #协议头, , , , , , , , , , , , , )))
liveStreamId = 文本_取出中间文本 (局_返回, #常量2, #常量3, , )
.如果真 (liveStreamId = “”)
信息框 (“你输入的直播间链接不存在或无法访问或检查cookie是否失效或不可用”, 16, “提示”, _启动窗口.取窗口句柄 ())
按钮_连接.禁止 = 假
按钮_断开.禁止 = 假
返回 ()
.如果真结束
局_返回 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/liveroom/websocketinfo?liveStreamId=” + liveStreamId, 0, , cookie, , #协议头, , , , , , , , , , , , , ))
json.解析 (局_返回)
token = json.取通用属性 (“data.token”)
webSocketUrls = json.取通用属性 (“data.websocketUrls[0]”)
json.清除 ()
.如果真 (token = “”)
信息框 (“获取token失败”, 16, “提示”, _启动窗口.取窗口句柄 ())
按钮_连接.禁止 = 假
按钮_断开.禁止 = 假
返回 ()
.如果真结束
是否成功 = WSS.连接 (webSocketUrls, 真, )
token十六进制 = 字节集_字节集到十六进制 (到字节集 (token))
liveStreamId十六进制 = 字节集_字节集到十六进制 (到字节集 (liveStreamId))
.判断开始 (是否成功 = 真)
WSS.发送字节集 (字节集_十六进制到字节集 (“08C8011ADC010AAC01” + token十六进制 + “120b” + liveStreamId十六进制 + “3a1e4a334c6f3455367a37556a4967676e345f31363830373137333030373036”))
时钟1.时钟周期 = 20000
按钮_断开.禁止 = 假
.默认
信息框 (“WSS进房失败”, 16, “提示”, _启动窗口.取窗口句柄 ())
按钮_断开.禁止 = 假
.判断结束
.子程序 WSS客户端_收到消息
.参数 消息类型, 整数型
.参数 消息句柄, 整数型
.局部变量 索引, 整数型
.局部变量 消息数据, 字节集
.局部变量 消息文本, 文本型
.局部变量 Protobuf, _UnProtobuf
.局部变量 是否解析成功, 整数型
.局部变量 i, 整数型
.局部变量 key数量, 整数型
.局部变量 用户信息, 个人信息
消息数据 = WSS.取回消息数据 (消息句柄)
Protobuf.解析 (消息数据)
key数量 = Protobuf.getCount (“3.5”)
a.字体大小 = 9
a.字体名称 = “微软雅黑”
.如果真 (key数量 > 0) ' 弹幕
.计次循环首 (key数量, i)
弹幕数量 = 弹幕数量 + 1
用户信息.英文ID = Protobuf.getText (“3.5.2.1”, i)
用户信息.昵称 = Protobuf.getText (“3.5.2.2”, i)
用户信息.操作描述 = Protobuf.getText (“3.5.3”, i)
用户信息.头像 = 子_取头像 (用户信息.英文ID)
' 超级列表框1.置标题 (索引, 0, 用户信息.昵称) ' 昵称
' 超级列表框1.置标题 (索引, 1, 用户信息.英文ID) ' ID
' 超级列表框1.置标题 (索引, 2, 用户信息.操作描述) ' 弹幕
' 超级列表框1.置标题 (索引, 3, 用户信息.头像) ' 头像
' 超级列表框1.保证显示 (索引)
' 标题 = 到文本 (弹幕数量)
索引 = 超级列表框2.插入表项 (, , , , , )
超级列表框2.置标题 (索引, 0, 用户信息.昵称)
超级列表框2.置标题 (索引, 1, 用户信息.英文ID)
编辑框2.加入文本 (用户信息.英文ID + #换行符)
超级编辑框1.起始选择位置 = 取文本长度 (超级编辑框1.内容)
a.文本颜色 = 2155752
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = 用户信息.昵称 + “”
a.文本颜色 = 13735843
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = “ : ”
a.文本颜色 = #白色
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = 用户信息.操作描述
a.文本颜色 = #灰色
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = “ ” + 时间_格式化 (取现行时间 (), , “ hh:mm:ss”, 真) + #换行符
超级编辑框1.滚动 (超级编辑框1.取行数 ())
.计次循环尾 ()
.如果真结束
key数量 = Protobuf.getCount (“3.2”)
.如果真 (key数量 ≠ 0)
标签1.标题 = “在线观众:” + Protobuf.getText (“3.1”)
.如果真结束
key数量 = Protobuf.getCount (“3.8”)
.如果真 (key数量 > 0)
.计次循环首 (key数量, i)
弹幕数量 = 弹幕数量 + 1
用户信息.昵称 = Protobuf.getText (“3.8.2.2”, i)
用户信息.英文ID = Protobuf.getText (“3.8.2.1”, i)
用户信息.操作描述 = “点亮了爱心” + “ ”
用户信息.头像 = 子_取头像 (用户信息.英文ID)
超级编辑框1.起始选择位置 = 取文本长度 (超级编辑框1.内容)
a.文本颜色 = 2155752
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = 用户信息.昵称 + “”
a.文本颜色 = 13735843
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = “ : ”
a.文本颜色 = #红色
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = 用户信息.操作描述
a.文本颜色 = #灰色
超级编辑框1.置选择区字符格式 (a)
超级编辑框1.被选择文本 = “ ” + 时间_格式化 (取现行时间 (), , “ hh:mm:ss”, 真) + #换行符
超级编辑框1.滚动 (超级编辑框1.取行数 ())
索引 = 超级列表框1.插入表项 (, , , , , )
超级列表框1.置标题 (索引, 2, 用户信息.昵称)
超级列表框1.置标题 (索引, 0, Protobuf.getText (“3.5.3”, i))
索引 = 超级列表框2.插入表项 (, , , , , )
超级列表框2.置标题 (索引, 0, 用户信息.昵称)
超级列表框2.置标题 (索引, 1, 用户信息.英文ID)
编辑框2.加入文本 (用户信息.英文ID + #换行符)
.计次循环尾 ()
.如果真结束
.子程序 WSS客户端_连接成功
调试输出 (“WSS_连接成功”)
按钮_连接.标题 = “连接成功”
.子程序 WSS客户端_连接失败
调试输出 (“WSS_连接失败”)
按钮_连接.标题 = “连接失败”
.子程序 WSS客户端_断开连接
时钟1.时钟周期 = 0
调试输出 (“WSS_断开连接”)
按钮_连接.标题 = “重新连接”
.子程序 _按钮_连接_被单击
按钮_连接.禁止 = 真
按钮_断开.禁止 = 真
启动线程 (&连接, , )
.子程序 _按钮_断开_被单击
WSS.断开 ()
按钮_连接.禁止 = 假
按钮_连接.标题 = “连接”
.子程序 用户ID取头像, 文本型
.参数 ID, 文本型
.局部变量 头像地址, 文本型
.局部变量 json, 类_json
头像地址 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/baseuser/userinfo/byid?principalId=” + ID, , , cookie, , #协议头))
json.解析 (头像地址)
返回 (json.取通用属性 (“data.userInfo.avatar”))
.子程序 _时钟1_周期事件
WSS.发送字节集 (字节集_十六进制到字节集 (“08011a0708afb4c294f530”))
.子程序 _超级列表框1_左键单击表项
.局部变量 返回内容, 文本型
.局部变量 英文ID, 文本型
.局部变量 json, 类_json
.局部变量 用户信息, 个人信息
' 英文ID = 超级列表框1.取标题 (超级列表框1.现行选中项, 1)
查询资料_1 (英文ID)
.子程序 查询资料_1, , , 个人中心
.参数 英文ID, 文本型
.局部变量 返回内容, 文本型
.局部变量 json, 类_json
.局部变量 用户信息, 个人信息
返回内容 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/baseuser/userinfo/sensitive?principalId=” + 英文ID, , , cookie, , #协议头))
json.解析 (返回内容)
用户信息.英文ID = 英文ID
用户信息.头像 = json.取通用属性 (“data.sensitiveUserInfo.avatar”)
用户信息.昵称 = json.取通用属性 (“data.sensitiveUserInfo.name”)
用户信息.数字ID = json.取属性 (“data.sensitiveUserInfo.originUserId”).取数据文本 ()
用户信息.签名 = json.取通用属性 (“data.sensitiveUserInfo.description”)
用户信息.地区 = json.取通用属性 (“data.sensitiveUserInfo.cityName”)
用户信息.性别 = json.取通用属性 (“data.userInfo.sex”)
.判断开始 (用户信息.性别 = “F”)
用户信息.性别 = “女”
.判断 (用户信息.性别 = “M”)
用户信息.性别 = “男”
.默认
用户信息.性别 = “保密”
.判断结束
.子程序 查询资料_2, , , 直播名片
.参数 英文ID, 文本型
.局部变量 返回内容, 文本型
.局部变量 json, 类_json
.局部变量 用户信息, 个人信息
返回内容 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/baseuser/userinfo/byid?principalId=” + 英文ID, , , cookie, , #协议头))
json.解析 (返回内容)
用户信息.英文ID = 英文ID
用户信息.头像 = json.取通用属性 (“data.userInfo.avatar”)
用户信息.昵称 = json.取通用属性 (“data.userInfo.name”)
用户信息.数字ID = json.取属性 (“data.userInfo.originUserId”).取数据文本 ()
用户信息.签名 = json.取通用属性 (“data.userInfo.description”)
用户信息.地区 = json.取通用属性 (“data.userInfo.cityName”)
用户信息.性别 = json.取通用属性 (“data.userInfo.sex”)
.判断开始 (用户信息.性别 = “F”)
用户信息.性别 = “女”
.判断 (用户信息.性别 = “M”)
用户信息.性别 = “男”
.默认
用户信息.性别 = “保密”
.判断结束
.子程序 点心, 逻辑型
.局部变量 data, 文本型
.局部变量 返回内容, 文本型
data = 子文本替换 (#点心, “[ID]”, liveStreamId, , , 真)
返回内容 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/liveroom/like”, 1, data, cookie, , #协议头, , , , 编码_Ansi到Utf8 (data)))
.如果 (返回内容 = “{” + #引号 + “data” + #引号 + “:true}”)
返回 (真)
.否则
返回 (假)
.如果结束
.子程序 网页_取头像1, 文本型
.参数 英文ID, 文本型
.局部变量 局_网址, 文本型
.局部变量 局_提交数据, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型
.局部变量 json, 类_json
调试输出 (1)
局_网址 = “https://www.kuaishou.com/graphql”
局_提交数据 = “{” + #引号 + “operationName” + #引号 + “:” + #引号 + “visionProfile” + #引号 + “,” + #引号 + “variables” + #引号 + “:{” + #引号 + “userId” + #引号 + “:” + #引号 + 英文ID + #引号 + “},” + #引号 + “query” + #引号 + “:” + #引号 + “query visionProfile($userId: String) {\n visionProfile(userId: $userId) {\n result\n hostName\n userProfile {\n ownerCount {\n fan\n photo\n follow\n photo_public\n __typename\n }\n profile {\n gender\n user_name\n user_id\n headurl\n user_text\n user_profile_bg_url\n __typename\n }\n isFollowing\n __typename\n }\n __typename\n }\n}\n” + #引号 + “}”
局_提交数据 = 编码_gb2312到utf8 (局_提交数据)
ADD_协议头.添加 (“Host”, “www.kuaishou.com”)
ADD_协议头.添加 (“Connection”, “keep-alive”)
ADD_协议头.添加 (“accept”, “*/*”)
ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36”)
ADD_协议头.添加 (“content-type”, “application/json”)
ADD_协议头.添加 (“Origin”, “https://www.kuaishou.com”)
ADD_协议头.添加 (“Sec-Fetch-Site”, “same-origin”)
ADD_协议头.添加 (“Sec-Fetch-Mode”, “cors”)
ADD_协议头.添加 (“Sec-Fetch-Dest”, “empty”)
ADD_协议头.添加 (“Referer”, “https://www.kuaishou.com/profile/3xi9cj4qnixaaug”)
ADD_协议头.添加 (“Accept-Language”, “zh-CN,zh;q=0.9”)
局_提交协议头 = ADD_协议头.获取协议头数据 ()
局_结果 = 网页_访问_对象 (局_网址, 1, , cookie, , 局_提交协议头, , , , 到字节集 (局_提交数据), , , , , , , )
局_返回 = 到文本 (编码_编码转换对象 (局_结果))
json.解析 (局_返回)
返回 (json.取通用属性 (“data.visionProfile.userProfile.profile.headurl”))
.子程序 网页_取头像2, 文本型
.参数 英文ID, 文本型
.局部变量 返回内容, 文本型
.局部变量 json, 类_json
.局部变量 用户信息, 个人信息
调试输出 (2)
返回内容 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/baseuser/userinfo/byid?principalId=” + 英文ID, , , cookie, , #协议头))
json.解析 (返回内容)
用户信息.头像 = json.取通用属性 (“data.userInfo.avatar”)
返回 (用户信息.头像)
.子程序 网页_取头像3, 文本型
.参数 英文ID, 文本型
.局部变量 返回内容, 文本型
.局部变量 json, 类_json
.局部变量 用户信息, 个人信息
调试输出 (3)
返回内容 = 编码_Utf8到Ansi (网页_访问_对象 (“https://live.kuaishou.com/live_api/baseuser/userinfo/sensitive?principalId=” + 英文ID, , , cookie, , #协议头))
json.解析 (返回内容)
用户信息.头像 = json.取通用属性 (“data.sensitiveUserInfo.avatar”)
返回 (用户信息.头像)
.子程序 网页_取头像4, 文本型
.参数 英文ID, 文本型
.局部变量 局_网址, 文本型
.局部变量 局_提交cookie, 文本型
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型
调试输出 (4)
局_网址 = “https://www.kuaishou.com/profile/” + 英文ID
局_提交协议头 = “Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9” + #换行符 + “Accept-Encoding: gzip, deflate, br” + #换行符 + “Accept-Language: zh-CN,zh;q=0.9” + #换行符 + “Cache-Control: max-age=0” + #换行符 + “Connection: keep-alive” + #换行符 + “Host: www.kuaishou.com” + #换行符 + “Sec-Fetch-Dest: document” + #换行符 + “Sec-Fetch-Mode: navigate” + #换行符 + “Sec-Fetch-Site: none” + #换行符 + “Sec-Fetch-User: ?1” + #换行符 + “Upgrade-Insecure-Requests: 1” + #换行符 + “User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36”
网页_访问S (局_网址, 0, , cookie, , 局_提交协议头, , , , , , , , , , , 局_结果, , , , )
局_结果 = 网页_GZIP解压 (局_结果)
局_返回 = 编码_Utf8到Ansi (局_结果)
局_返回 = 文本_取出中间文本 (局_返回, “<img src=#引号”, “#引号 class=”)
返回 (局_返回)
.子程序 子_取头像, 文本型
.参数 参_英文ID, 文本型
.局部变量 返回信息, 文本型
返回信息 = 网页_取头像1 (参_英文ID)
.如果真 (返回信息 = “”)
返回信息 = 网页_取头像2 (参_英文ID)
.如果真结束
.如果真 (返回信息 = “”)
返回信息 = 网页_取头像3 (参_英文ID)
.如果真结束
.如果真 (返回信息 = “”)
返回信息 = 网页_取头像4 (参_英文ID)
.如果真结束
返回 (返回信息)
.子程序 _按钮_断开1_被单击
编辑框1.可视 = 取反 (编辑框1.可视)
.子程序 _按钮1_被单击
.局部变量 z, 整数型
_按钮_断开_被单击 ()
写到文件 (取运行目录 () + “/导出的数据.txt”, 到字节集 (编辑框2.内容))
.子程序 _超级列表框2_当前表项被改变
=========================================================
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。