都市探訪少女-凛ver- #7
状态
文章总数
61篇 总字数
8.3万 运营时长
2年8个月分类
标签
AI Arch BF CLI CSS Fuwari Giscus GTK HEO Hyprland JS KDE K签 Linux Lisp LLM Path Pypi Python RSS Textual TUI 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/


如果此时间过长,文中的信息可能会失去时效性,甚至不再准确。

