首先祭出官方指南

翻译&笔记

第一步,确认系统是Windows 10,版本号不低于1809,系统版本不低于17763

第二步,安装Visual Studio 2019, version 16.10 Preview,或者更新版本的Visual Studio

2021-04-10T07:22:01.png

选择以下工作负载(注意磁盘空间是否充足)

  • .NET桌面开发
  • 通用Windows平台开发

2021-04-10T06:29:44.png

同时请确认单个组件中,Windows 10 SDK (10.0.19041.0)已经勾选

2021-04-10T06:33:14.png

于我来说C++是用不到的,所以选择好上面的配置就可以开始安装了

2021-04-10T06:40:34.png

第三步,如果之前安装过WinUI 3 Preview extension for Visual Studio,请卸载掉

选择一个主题

2021-04-10T06:48:12.png

选择继续但无需代码

2021-04-10T06:51:19.png

第四步,配置NuGet程序包源,工具——NuGet包管理器——程序包管理器设置

2021-04-10T06:52:20.png

在打开的选项窗口中,点击NuGet包管理器——程序包源,确认nuget.org的地址是https://api.nuget.org/v3/index.json

2021-04-10T06:54:43.png

不过新安装的话,默认就是这个,不用担心

第五步,安装Project Reunion 0.5 extension for Visual Studio,打开扩展——管理扩展

2021-04-10T06:59:06.png

搜索Project Reunion,下载安装,注意关闭重开Visual Studio生效

2021-04-10T07:01:32.png

如果要在UWP应用中使用Project Reunion,那需要安装Project Reunion 0.5 Preview extension

不过我不需要,就跳过了

如果还需要开启Live Visual Tree, Hot Reload, Live Property Explorer这些功能

那需要在工具——选项——环境——预览功能-勾选Enable UI Debugging Tooling for WinUI 3 Projects

2021-04-10T07:08:03.png

关闭后会安装Project Reunion

2021-04-10T07:21:08.png

至此,WinUI 3开发环境配置完成

切换到PySide6,感觉之前的AA_EnableHighDpiScaling不起作用了

经过一番查询,在官方的github找到了一点说明,Class/Function Deprecations

The High DPI scaling attributes Qt.AA_EnableHighDpiScaling, Qt.AA_DisableHighDpiScaling and Qt.AA_UseHighDpiPixmaps are deprecated. High DPI is by default enabled in Qt 6 and cannot be turned off.

也就是说从6开始,这三个高分屏缩放的API都无了,默认强制开启以及不能关闭,不过问题是并没有感觉到它缩放ORZ

最后在文档中查询到有API是可以调整缩放策略的,搜索HighDpiScaleFactorRoundingPolicy就能找到

  • Qt.HighDpiScaleFactorRoundingPolicy.Round 设备像素比0.5及以上的,进行缩放
  • Qt.HighDpiScaleFactorRoundingPolicy.Ceil 始终缩放
  • Qt.HighDpiScaleFactorRoundingPolicy.Floor 始终不缩放
  • Qt.HighDpiScaleFactorRoundingPolicy.RoundPreferFloor 设备像素比0.75及以上的,进行缩放
  • Qt.HighDpiScaleFactorRoundingPolicy.PassThrough 不缩放

也许你看完可能还是有些不明白,一开始我也是

然后找到官方widgetgallery.py这个案例,取了部分代码,如下,可以配合这个运行你的GUI,看看各个情况的效果

def format_geometry(rect):
    """Format a geometry as a X11 geometry specification"""
    return "{}x{}{:+d}{:+d}".format(rect.width(), rect.height(), rect.x(), rect.y())


def screen_info(widget):
    """Format information on the screens"""
    policy = QGuiApplication.highDpiScaleFactorRoundingPolicy()
    policy_string = str(policy).split('.')[-1]
    result = "<p>High DPI scale factor rounding policy: {}</p><ol>".format(policy_string)
    for screen in QGuiApplication.screens():
        current = screen == widget.screen()
        result += "<li>"
        if current:
            result += "<i>"
        result += '"{}" {} {}DPI, DPR={}'.format(screen.name(), format_geometry(screen.geometry()), int(screen.logicalDotsPerInchX()), screen.devicePixelRatio())
        if current:
            result += "</i>"
        result += "</li>"
    result += "</ol>"
    return result

用这里得到的结果,显示策略是PassThrough,难怪没感觉到缩放(4K+win10+150%)

<p>High DPI scale factor rounding policy: PassThrough</p><ol><li><i>"\\.\DISPLAY1" 2560x1440+0+0 96DPI, DPR=1.5</i></li></ol>

最终我选择了始终缩放的策略,通过下面的代码即可设定,注意代码应该放到gui界面实例化之前

QGuiApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.Ceil)

本文是在Windows下已经安装Git为前提


在网上可以找到让git clone走socks5的方法

但是都是讲用nc命令,windows没有而且还不想安装怎么办?当然是有办法的~

简单来说就是在~/.ssh/config中添加下面这样的配置即可

Host github.com
    ProxyCommand connect -S 127.0.0.1:1080 %h %p

然后,在git bash中使用git clone xxx的时候,就会走代理

这个方法最早在 https://www.v2ex.com/t/423121 看到

但是我尝试也这样配置,然后试图让ssh也走socks5,但是各种写法都试了,没用.exe

最终发现connect应该写成完整路径才行

https://serverfault.com/questions/956613/windows-10-ssh-proxycommand-posix-spawn-no-such-file-or-directory 下面的回答中,提到ssh要用完整路径

于是我把ssh写了完成路径,然后折腾了很久都不行

因为里面提到的是ssh完整路径,就被误导了

最终意识到应该是connect写完整路径hhh,折腾了好几个小时

现在~/.ssh/config中增加下面的配置

  • 其中id_rsa这个可以通过ssh-keygen生成,可以自定义路径和文件名,记得将公钥上传服务端
  • remoteserver就是个别名,这个配置好了之后,直接ssh remoteserver就可以连接了
  • User就是用户名,Port就是ssh的端口,可以不写,默认是22
  • ProxyCommand就是下面的形式了,最最重要的就是connect.exe必须是完整路径,这个exe在git的安装目录下
Host remoteserver
    HostName 1.2.3.4
    User root
    Port 22
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand C:\Program Files\Git\mingw64\bin\connect.exe -S 127.0.0.1:1080 %h %p

然后给Terminal添加一个配置,现在直接一键连接~

{
    // ssh profile.
    "guid": "{8caa0dad-35be-5776-a8ff-afceeeaa6101}",
    "name": "remoteserver",
    "commandline": "cmd.exe /K ssh remoteserver",
    "hidden": false
},

2021-03-28T09:34:59.png

补充一点,connect.exe的全路径,git bash的配置的话,需要加引号。

为了可以自由下断点,针对特定位置代码进行调试,通常选择直接格式化代码来操作。

但是js的分析往往是复杂的,直接下断点调试不能应付复杂的需求。

通过fiddler等抓包软件来替换为修改后的js文件,也还是不够灵活,而且抓包过程往往会影响请求速度(对于性能稍差的电脑)

之前一直使用插件重定向+本地server的方式进行js的调试和分析,但是还是不够灵活

于是终于寻找到下面这样的方案,可以适应我的需求,方便的调试网页js

优点:

  • 本地实时修改,实时变化
  • 在chrome中直接编辑
  • 隐身模式下仍然可以使用
  • 不用关心代理的影响

基于Chrome Overrides功能映射本地文件

首先新建一个文件夹,我这里就是本教程的文件夹

然后在文件夹下新建一个名字为要替换的内容对应链接的域名的文件夹

最后按照链接路径新建文件夹和文件

例如

  • https://player.polyv.net/script/polyvplayer.min.js
  • 对应的结构如下
\---player.polyv.net
    \---script
            polyvplayer.min.js

对应js的内容,我们可以在Network找到对应的链接下载,或者直接复制粘贴格式化后的内容

用格式化后主要是方面查看、分析和下断点

这里建议直接复制Preview中的内容

如果文件太大,可以将文件下载后/Response中复制,在SourcesSnippets中新建一个临时脚本进行格式化

完成文件(夹)的新建后,将根文件夹(也就是各个域名文件夹所在文件夹)添加到映射

基于Chrome Initiator功能快速定位加密内容解密算法

在将js映射到本地文件后,我们在js最开始加上两句日志输出

打开在线地址,打开Console,然后发现player.js没有输出我们期望的日志

观察它的地址(↓)可以发现后面是一个变化的时间戳

  • https://player.polyv.net/script/player.js?_=1612149481625

而本地的文件名是没有这个的,就算改了文件名,你也不知道下一次时间戳是多少

为了方便分析,那必须得定向到本地的js

Initiator翻译是启动器,我认为可以直接理解为这个产生这个请求的调用链

而如果一个请求是另外一个js产生的,那么Initiator还会有Request call stack,也就是请求调用栈

那么我们可以查看player.js请求的Initiator请求调用栈,定位请求部分

然后把请求后面的时间戳去掉,这样就能分析加密内容在player.js中的解密过程了(也可能不在这个js)

很快就定位到send关键函数,在if前下一个debugger

刷新浏览器,等待断在debugger

这里注意到p的链接内容没有时间戳,而g.url却已经有了时间戳

说明p = g.urldebugger之间就完成了时间戳的生成

查看代码,简单分析,一下就看到了

我们将这行代码复制,新建一行,把时间戳部分去掉

现在刷新,就能看到期望的日志输出了

参考链接