Luca Bravo
状态
文章总数
55篇 总字数
6.9万 运营时长
2年6个月分类
标签
AI Arch BF CLI CSS Fuwari Giscus GTK HEO Hyprland JS KDE K签 Linux Lisp LLM Path Pypi Python RSS Vim VTB VUP Whl WP 上海 专业 主题 云朵 享乐 优化 伦理 便利店 俄国 光标 内耗 函数式 分析 创伤 创意 判断 前端 北京 参观 哲学 商业 国庆 壁纸 天津 姐妹 字典 安装 实用 对话 度假 开发环境 开源 归档 微风 心理 意义 技校 抚远 拥抱 推荐 插件 摄影 政策 故障排查 效果 散文 文件 文化 旅游 日本 显卡 样式 模糊 治愈 浏览器 浦东 浦西 热力图 特效 猫猫 玩具 环境 甘城 生态 病毒 直播 社会 社团 视奸 秋游 科幻 移民 窗口 系统 终端 经济 美化 美缝 耳机 脑操 自动驾驶 苏州 茅山 萌系 补档 解释器 设计 评论 话术 谷子 走路 轮子 辍学 迁移 运维 重构 随机 静安 音频 颜文字 颜色 首都 麦金塔 鼠标
831 字
4 分钟
👁请你视奸我👁
省流
👁缘起👁
有一天,群友晓夜给自己的主页加上了一个新颖的功能,可以实时显示自己活动窗口的名称,如图:
我便好奇问他原理是什么:
感觉以我的技术水平还是写的出来的,于是我便尝试了一下。
👁理论👁
我准备分成两个端:服务端和客户端,其中客户端每10秒采集一次活动窗口标题,然后发送到部署在服务器的服务端的特殊路由,服务端获取到请求则更新内部变量,当有人访问服务端的根路由时,内部变量会写入HTML模板,这样就能公开了。
对于安全性,可以在发送的请求里连带上密码,然后服务端验证密码是否与服务端一致,也许能保证请求来自正确的客户端。
你应该注意到了,与晓夜不同,我进一步简化了原理,去除了WebSocket:这应该是用来实现页面无感更新的,但是去除掉这个而直接使用服务端渲染依然能达到视奸的效果,只是没有无感更新的效果。
理论存在,实践开始。
👁客户端👁
我使用Python来写客户端,在AI的指导下,我很快整理出来了一个用于采集活动窗口标题的办法,居然只需要4行代码就能完成:
import subprocess
def get_active_window_title():
output = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"], text=True).split()[-1]
if output == "0x0": return "似了(窗口编号为0x0)"
output = subprocess.check_output(["xprop", "-id", output, "WM_NAME"], text=True).strip('\n').split('=')[-1]
return output
实际上,只是执行了xprop
命令,手动在终端输入也有同样的效果:
$ xprop -root _NET_ACTIVE_WINDOW
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x2e001a9
$ xprop -id 0x2e001a9 WM_NAME
WM_NAME(UTF8_STRING) = "fish - Pinpe-top - Visual Studio Code"
NOTE这个只支持Linux,不跨平台,Windows不能用,而且似乎不能采集KDE应用。
然后,在往外面加一点点细节,客户端就完成了:
import subprocess
import requests
import time
def get_active_window_title():
output = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"], text=True).split()[-1]
if output == "0x0": return "似了(窗口编号为0x0)"
output = subprocess.check_output(["xprop", "-id", output, "WM_NAME"], text=True).strip('\n').split('=')[-1]
return output
if __name__ == '__main__':
while True:
request_obj = requests.get(f'https://your-domain/update/{get_active_window_title()}/your-password'.strip('/'))
if request_obj.status_code == 200:
print(request_obj.text)
else:
print(f'出现了不正常的状态码:{request_obj.status_code}')
time.sleep(10)
👁服务端👁
按照我的尿性,我还用Python写服务端,配合Flask框架,就这么轻松地做好了:
from flask import *
import hashlib
app = Flask(__name__)
name_date = '似了(没有收到数据)'
@app.route('/')
def main():
return f'''
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" />
<style>
*{{
background-color: black;
color: aliceblue;
text-align: center;
}}
</style>
<h1>请你视奸我</h1>
<p>这是一个创意项目,你可以在这里看到我电脑上激活窗口的标题,每10秒上传一次,有关此项目的博文:https://pinpe.top</p>
<h2>{ name_date }</h2>
'''
# 传输数据需要使用POST方式,这里为了省事而使用如此邪路,好孩子别学我!
@app.route('/update/<name>/<passwd>')
def update(name, passwd):
# 这里只是简陋地哈希了一下,正规存储密码需要强哈希+加盐,并存储在环境变量里,好孩子别学我!
if hashlib.sha256(str(passwd).encode()).hexdigest() == 'your-password-hash':
global name_date
name_date = name
return f'服务器:已收到请求({name_date})'
else:
return '服务器:密码错误'
if __name__ == '__main__':
app.run()
👁开始视奸👁
现在就可以狠狠地视奸我了!https://monitor.nekoqwq.space/