剧透......
直入主题 数据取前43000名 目前来看科创有103229位用户(数据来源后面会说) 实际KCB需/100
富豪榜前20名
KCB:28587152---ID:5805--NAME:科创人民很行 KCB:6822880---ID:10--NAME:虎哥 KCB:115837---ID:2970--NAME:科创网 KCB:106389---ID:3815--NAME:用户已注销 KCB:75897---ID:138--NAME:hamdad KCB:74914---ID:161--NAME:mass_lynnxy KCB:48651---ID:2998--NAME:power_rdx KCB:48494---ID:6862--NAME:马小甲 KCB:29040---ID:26--NAME:1211 KCB:24615---ID:263--NAME:LED KCB:22909---ID:38343--NAME:xiaotian99 KCB:20316---ID:3655--NAME:west_0830 KCB:17592---ID:1783--NAME:dracula1429 KCB:17111---ID:38310--NAME:Ma3.02的守望 KCB:16981---ID:5097--NAME:novakon KCB:15574---ID:9510--NAME:justinpiggy KCB:12706---ID:34961--NAME:佛面 KCB:12684---ID:99--NAME:Johnny-Wei KCB:11051---ID:19099--NAME:张静茹 KCB:10897---ID:3060--NAME:新黑火药
负豪榜前20名
KCB:-3960---ID:22050--NAME:kechuangbbs KCB:-3979---ID:31983--NAME:20120504 KCB:-5960---ID:10335--NAME:窗外的晓鱼 KCB:-7872---ID:16316--NAME:partner KCB:-7877---ID:12572--NAME:破93 KCB:-7918---ID:10067--NAME:mako KCB:-11834---ID:9859--NAME:梦里是故乡 KCB:-11920---ID:10624--NAME:69138657a KCB:-11920---ID:9806--NAME:水月 KCB:-13920---ID:10021--NAME:haikou_01 KCB:-16000---ID:10323--NAME:清风舟客 KCB:-16032---ID:10242--NAME:wlwy55 KCB:-16268---ID:10480--NAME:fxhg999 KCB:-16358---ID:9796--NAME:wsc123 KCB:-19760---ID:10175--NAME:那天春暖 KCB:-19807---ID:9949--NAME:challen KCB:-28038---ID:13153--NAME:化学diy KCB:-31760---ID:10261--NAME:yyn-nny KCB:-44079---ID:10208--NAME:潇潇王 KCB:-79906---ID:14454--NAME:xing2
(做这个脚本其实是顺带的事情,还有些更好玩的)
实现步骤:
首先你点击某人主页 例如:虎哥的主页 (XXXXXXXXXXXX)
你会发现 科创币搁那呢,这也没有啊
这时点击F12 打开开发人员工具,重新刷新一下页面,抛去那些js,css,图片 你就能看见几个很重要的链接
XXXXXXXXXXXXXXXXXXXXXXXX/column/getColumn (自己的数据)
XXXXXXXXXXXXXXXXXXXXXXXX/u/10/profile
XXXXXXXXXXXXXXXXXXXXXXXX/u/10/userPanel
XXXXXXXXXXXXXXXXXXXXXXXX/u/10/profile/manageData
XXXXXXXXXXXXXXXXXXXXXXXX/u/10/profile/timelineData
(以上都无法直接访问,需修改协议头,后面会说)
找到一个返回数据比较短的但是含有我们需要的科创币数量的链接 (最短也有2368行 94786个字符 ,极大部分都是 operationsId 贡献的)
XXXXXXXXXXXXXXXXXXXXXXXX/u/10/profile/manageData
可以很明显的看出 targetUser User 代表着什么 ,我们取出targetUser进行分析
targetUser:
{ "destroyed": false, "kcb": 6822890, "oldKcb": 334033, "xsf": 39, "disabledPostsCount": 74, "disabledThreadsCount": 48, "postCount": 12998, "threadCount": 1576, "recCount": 111, "toppedThreadsCount": 5, "digestThreadsCount": 87, "digestPostsCount": 2, "dailyLoginCount": 2024, "violationCount": 3, "score": 29531.815653752852, "username": "虎哥", "usernameLowerCase": "虎哥", "cart": [], "description": "## 刘 虎 \n创新工程局主席", "color": "#333333", "certs": [ "moderator", "editor", "examinated", "kccd", "kclz" ], "hidden": false, "volumeA": true, "volumeB": true, "online": "", "avatar": "6367ea57b9b8d84ca8738845", "banner": "5f0d655f351a5f1468796007", "homeBanner": "", "voteUpCount": 2, "voteDownCount": 1, "_id": "5a54f831c77f9012f43e0979", "uid": "10", "postSign": "欢迎大家一起来度量客观世界。", "lastVisitSelf": "2018-02-17T15:03:01.834Z", "tlv": "2024-02-08T05:27:34.661Z", "toc": "2005-08-24T13:16:00.000Z", "__v": 1153, "onlineType": "phone", "draftCount": 4116, "zoneThreadCount": 1, "timelineCount": 14609, "disabledZoneThreadCount": 0, "commentCount": 12, "momentCount": 30, "columnThreadCount": 205, "disabledColumnThreadCount": 0, "roles": [ { "postToForum": { "countLimit": { "unlimited": false, "num": 100 }, "timeLimit": { "unlimited": false, "num": 1 } }, "postToThread": { "countLimit": { "unlimited": false, "num": 500 }, "timeLimit": { "unlimited": false, "num": 0.1 } }, "hasIcon": false, "hidden": false, "operationsId": [ //太长了 ], "description": "社区主编", "color": "#aaaaaa", "modifyPostTimeLimit": -1, "messagePersonCountLimit": 100, "messageCountLimit": 10000, "postToThreadCountLimit": 500, "postToThreadTimeLimit": 0.1, "postToForumTimeLimit": 1, "postToForumCountLimit": 10, "defaultRole": false, "_id": "editor", "tlm": "2018-06-14T03:27:03.648Z", "displayName": "编辑", "abbr": "编", "toc": "2018-06-14T03:27:03.648Z", "__v": 0, "type": "management" }, { "postToForum": { "countLimit": { "unlimited": false, "num": 100 }, "timeLimit": { "unlimited": false, "num": 1 } }, "postToThread": { "countLimit": { "unlimited": false, "num": 500 }, "timeLimit": { "unlimited": false, "num": 0.1 } }, "hasIcon": false, "hidden": false, "operationsId": [ //太长了 ], "description": "通过B卷考试以后颁发的证书,可以进入A类特种科技专业。", "color": "#aaaaaa", "modifyPostTimeLimit": 8760, "messagePersonCountLimit": 20, "messageCountLimit": 1000, "postToThreadCountLimit": 200, "postToThreadTimeLimit": 0.1, "postToForumTimeLimit": 1, "postToForumCountLimit": 10, "defaultRole": false, "_id": "examinated", "tlm": "2018-06-14T03:28:51.425Z", "displayName": "进士", "abbr": "进", "toc": "2018-06-14T03:28:51.425Z", "__v": 0, "type": "common" }, { "postToForum": { "countLimit": { "unlimited": true, "num": 0 }, "timeLimit": { "unlimited": false, "num": 1 } }, "postToThread": { "countLimit": { "unlimited": false, "num": 500 }, "timeLimit": { "unlimited": false, "num": 0.1 } }, "hasIcon": false, "hidden": true, "operationsId": [], "description": "科创仪表局在职人员", "color": "#aaaaaa", "modifyPostTimeLimit": 26280, "messagePersonCountLimit": 20, "messageCountLimit": 2000, "postToThreadCountLimit": 0, "postToThreadTimeLimit": 0, "postToForumTimeLimit": 0, "postToForumCountLimit": 0, "defaultRole": false, "_id": "kccd", "tlm": "2019-08-30T07:54:18.557Z", "displayName": "仪表局", "type": "common", "toc": "2019-08-30T07:54:18.557Z", "__v": 0 }, { "postToForum": { "countLimit": { "unlimited": true, "num": 0 }, "timeLimit": { "unlimited": true, "num": 0 } }, "postToThread": { "countLimit": { "unlimited": true, "num": 0 }, "timeLimit": { "unlimited": true, "num": 0 } }, "hasIcon": false, "hidden": true, "operationsId": [], "description": "科创研究院总部人员", "color": "#aaaaaa", "modifyPostTimeLimit": 26280, "messagePersonCountLimit": 20, "messageCountLimit": 1000, "postToThreadCountLimit": 0, "postToThreadTimeLimit": 0, "postToForumTimeLimit": 0, "postToForumCountLimit": 0, "defaultRole": false, "_id": "kclz", "displayName": "院总部", "type": "common", "toc": "2022-04-04T10:32:18.593Z", "tlm": "2022-04-04T10:32:18.593Z", "__v": 0 }, { "postToForum": { "countLimit": { "unlimited": false, "num": 100 }, "timeLimit": { "unlimited": false, "num": 1 } }, "postToThread": { "countLimit": { "unlimited": false, "num": 500 }, "timeLimit": { "unlimited": false, "num": 0.1 } }, "hasIcon": false, "hidden": false, "operationsId": [ //太长了 ], "description": "1学术分以上用户自动颁发本证书", "color": "#aaaaaa", "modifyPostTimeLimit": 26280, "messagePersonCountLimit": 20, "messageCountLimit": 2000, "postToThreadCountLimit": 500, "postToThreadTimeLimit": 0.1, "postToForumTimeLimit": 1, "postToForumCountLimit": 10, "defaultRole": false, "_id": "scholar", "tlm": "2018-06-14T03:28:02.877Z", "displayName": "学者", "abbr": "s", "toc": "2018-06-14T03:28:02.877Z", "__v": 0, "type": "system" }, { "postToForum": { "countLimit": { "unlimited": false, "num": 5 }, "timeLimit": { "unlimited": false, "num": 1 } }, "postToThread": { "countLimit": { "unlimited": false, "num": 50 }, "timeLimit": { "unlimited": false, "num": 0.1 } }, "hasIcon": false, "hidden": true, "operationsId": [ //太长了 ], "description": "普通用户默认证书", "color": "#234233", "modifyPostTimeLimit": 8760, "messagePersonCountLimit": 2, "messageCountLimit": 100, "postToThreadCountLimit": 50, "postToThreadTimeLimit": 0.1, "postToForumTimeLimit": 1, "postToForumCountLimit": 2, "defaultRole": true, "_id": "default", "tlm": "2018-06-13T09:31:03.633Z", "abbr": "普", "displayName": "会员", "toc": "2018-06-13T09:31:03.633Z", "__v": 0, "type": "system", "c": { "operationsId": [ "topPost" ] } } ], "column": { "_id": 100002, "name": "正能量研究", "banner": "5f0d6545ac52e31384d399a5", "avatar": "5f0d653d30fe61241828f49f", "abbr": "智商税研究中心", "subCount": 60, "closed": false }, "grade": { "postToForum": { "countLimit": { "unlimited": false, "num": 50 }, "timeLimit": { "unlimited": false, "num": 1 } }, "postToThread": { "countLimit": { "unlimited": false, "num": 500 }, "timeLimit": { "unlimited": false, "num": 0.1 } }, "description": "领袖", "color": "#aaaaaa", "operationsId": [], "messagePersonCountLimit": 20, "messageCountLimit": 10000, "postToThreadCountLimit": 500, "postToThreadTimeLimit": 0.1, "postToForumTimeLimit": 1, "postToForumCountLimit": 10, "_id": 7, "displayName": "盖世豪杰", "score": 20000, "__v": 0, "iconUrl": "/statics/grade_icon/v7l.png" }, "info": { "certsName": "专家 进士 学者 机友 笔友" }, "id": "5a54f831c77f9012f43e0979" }
依然可以很明显的看出 kcb oldKcb xsf 代表着什么 ,至于其他的有意思的数据可以通过"经验" "翻译" 得知大概含义,不过突然想到chatgpt也很适合语言方面的,直接丢给他让他分析分析
chatgpt:
这是一个包含用户详细信息的 JSON 对象。以下是其中一些关键字段的详细解释: "destroyed": 布尔值,表示用户是否被删除。 "kcb": 用户的 KCB(科创币)值,代表用户在系统内的虚拟货币。 "oldKcb": 用户的旧 KCB 值。 "xsf": 用户的学术分值,可能代表用户在学术方面的活跃度或贡献度。 "disabledPostsCount": 用户被禁用的帖子数量。 "disabledThreadsCount": 用户被禁用的主题(帖子)数量。 "postCount": 用户发布的帖子数量。 "threadCount": 用户创建的主题(帖子)数量。 "recCount": 用户的推荐数量。 "toppedThreadsCount": 用户置顶的主题数量。 "digestThreadsCount": 用户精华主题数量。 "digestPostsCount": 用户精华帖子数量。 "dailyLoginCount": 用户每日登录次数。 "violationCount": 用户违规次数。 "score": 用户的得分,可能代表用户在社区中的活跃度和贡献度。 "username": 用户名。 "usernameLowerCase": 用户名的小写形式。 "cart": 用户的购物车信息,这里是一个空数组。 "description": 用户的描述信息,包含在 "##" 标记中。 "color": 用户在社区中显示的颜色。 "certs": 用户拥有的证书列表,表示用户在社区中具有的特殊身份或权限。 "hidden": 布尔值,表示用户是否隐藏。 "volumeA" 和 "volumeB": 布尔值,表示用户是否有 A 卷和 B 卷的权限。 "online": 用户在线状态。 "avatar": 用户的头像。 "banner": 用户的横幅(banner)。 "homeBanner": 用户主页的横幅。 "voteUpCount" 和 "voteDownCount": 用户的点赞和踩的数量。 "_id" 和 "uid": 用户的唯一标识符。 "postSign": 用户在帖子中显示的签名。 "lastVisitSelf": 用户最后一次访问自己的时间。 "tlv": 用户的 TLV(Time Last Visit) 时间。 "toc": 用户的 TOC(Time of Creation) 时间。 "__v": 版本号,通常表示数据结构的版本。 "onlineType": 用户在线的类型,这里是 "phone"。 "draftCount": 草稿数量。 "zoneThreadCount": 用户在特定区域的主题数量。 "timelineCount": 用户的时间线数量。 "disabledZoneThreadCount": 禁用的区域主题数量。 "commentCount": 评论数量。 "momentCount": 用户的时刻数量。 "columnThreadCount": 用户在专栏的主题数量。 "disabledColumnThreadCount": 禁用的专栏主题数量。 "roles": 包含用户角色信息的数组,每个角色都有详细的权限和限制。 "column": 用户所属专栏的信息。 "grade": 用户的等级信息,包括权限限制和得分。 "info": 一些额外的用户信息,包括拥有的证书类型。 这个 JSON 对象包含了用户在社区中的广泛信息,包括活动、权限、等级、草稿等方面的数据。
嗯几乎完全合理
回归正题
知道kcb从哪获取了,接下来毫无疑问就是写代码了
继续让chatgpt帮我们写个大致框架
python 怎么解析json 获取 targetUser.kcb 的数值
(正确)
https://www.kechuang.org/u/10/profile/manageData 访问这个就会返回json数据 帮我写一个 多线程 批量获取json数据的python代码 https://www.kechuang.org/u/*/profile/manageData 这个*就是数字 一直遍历到99999
(from concurrent.futures import ThreadPoolExecutor , 不止需要import这一个 可以直接修改为
import concurrent.futures 要不然会报错,不过你可以直接把报错信息发给chatgpt,chatgpt会帮你改正确)
然后继续一通修改,把修改完的代码丢给chatpgt让他帮忙把变量改规范,加注释,多线程全自动批量爬取科创用户数据脚本就此诞生了
import json import requests import concurrent.futures import threading import sys # 使用线程锁确保多线程操作时的数据一致性 lock = threading.Lock() # 请求头信息 headers = { 'Content-Type': 'application/json', 'Cookie': 'xxxxx', 'From': 'nkcAPI', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36' } # 从文件中读取数据并进行排序 def sort_data(): with open('KC.txt', 'r') as file: data = file.readlines() # 提取KCB值和索引信息 kcb_values = [int(item.split("---")[0].split(":")[1]) for item in data] indices = list(range(len(data))) # 根据KCB值对索引进行排序 sorted_indices = sorted(indices, key=lambda x: kcb_values[x], reverse=True) # 根据排序后的索引获取排序后的数据 sorted_data = [data[i] for i in sorted_indices] # 将排序后的数据写入文件 for item in sorted_data: with open('KC_sorted.txt', 'a') as outFile: outFile.write(item) # 获取JSON数据并处理 def fetch_json_data(user_id): url = f'https://www.kechuang.org/u/{user_id}/profile/manageData' try: # 发送GET请求获取数据 response = requests.get(url, headers=headers, timeout=60) if response.status_code == 429: print("已触发限制需调低线程") elif response.status_code == 200: json_data = response.text try: # 解析JSON数据 data = json.loads(json_data) kcb_value = data.get('targetUser', {}).get('kcb') username_value = data.get('targetUser', {}).get('username') print(f"用户ID: {user_id}, 结果: {kcb_value}, 用户名: {username_value}") # 获取锁,确保数据写入的线程安全 lock.acquire() with open('KC.txt', 'a') as outFile: outFile.write(f"KCB:{kcb_value}---ID:{user_id}--NAME:{username_value}\n") return user_id, json_data except Exception as e: print(f"用户ID: {user_id}, 错误: {e}") finally: lock.release() except requests.exceptions.RequestException as e: try: # 再次尝试发送请求 response = requests.get(url, headers=headers, timeout=60) if response.status_code == 200: json_data = response.text try: # 解析JSON数据 data = json.loads(json_data) kcb_value = data.get('targetUser', {}).get('kcb') username_value = data.get('targetUser', {}).get('username') print(f"用户ID: {user_id}, 结果: {kcb_value}, 用户名: {username_value}") # 获取锁,确保数据写入的线程安全 lock.acquire() with open('KC.txt', 'a') as outFile: outFile.write(f"KCB:{kcb_value}---ID:{user_id}--NAME:{username_value}\n") lock.release() return user_id, json_data except Exception as e: print(f"用户ID: {user_id}, 错误: {e}") lock.release() finally: lock.release() except: pass def get(): start_user_id = 11000 end_user_id = 103228 with concurrent.futures.ThreadPoolExecutor(max_workers=15) as executor: # 提交任务给线程池执行,并传递user_id参数 future_to_user_id = {executor.submit(fetch_json_data, user_id): user_id for user_id in range(start_user_id, end_user_id + 1)} # 主函数,根据命令执行不同的操作 if __name__ == "__main__": if len(sys.argv) != 2: print("用法: python script.py [get/sort]") sys.exit(1) command = sys.argv[1] if command == "get": get() elif command == "sort": sort_data() else: print("无效命令。使用 'get' 或 'sort'。")
协议头需要添加什么对方才会返回正确的数据回来得看对方怎么设置的条件
不过按照"经验" 就是这样 ,需万无一失就把请求协议头完全复制一份到python上
(实际这个只需要'From': 'nkcAPI'| timeout一般为5-15秒|可添加verify=False 意思为 "在请求的时候不验证网站的ca证书" 减少由于https证书导致的一些问题 , 不过后果就是内容被劫持,修改了也全然不知)
使用方法为
python 脚本文件名 get(爬取数据)
python 脚本文件名 sort (排序)
运行截图
(未来可能会发布 以科创管理员视角浏览科创论坛是什么样的体验| 科创的一些有点意思的漏洞)
对了,我是如何知晓现在的用户ID最大数值是什么
看考试记录你就知道了
[修改于 9个月17天前 - 2024/02/08 16:33:42]
好家伙,哥们你这直接钻论坛漏洞啊,这不收编?
其实这只是改了一下前端网页,后端有权限验证,提交会提示权限不足,涉及"写"的基本上都有权限验证,不过涉及"读"的,有很多操作空间,未授权读任意文章标题,未授权读任意文章,评论内容
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。