docker 中使用 pywpsrpc

一般如果使用带桌面环境的 docker,比如 dorowu/ubuntu-desktop-lxde-vnc,然后安装 wps 后,使用 https://github.com/timxx/pywpsrpc 是没啥问题的,需要注意的是 wps 第一次打开后,需要同意 EULA,然后按照 https://github.com/timxx/pywpsrpc/issues/44#issuecomment-1032304847 中提到的改为 multi-module mode,然后就可以愉快使用了,但是对于无图形环境的 docker,似乎是连 wps 都无法启动 解决WPS无法启动的问题 wps安装之前需要安装一些依赖环境,这个后文给出完整的安装流程,此处主要解决 wps 安装完成后,启动无输出,直接闪退的问题 此处安装 https://github.com/timxx/pywpsrpc/wiki/Run-on-Server 配置了环境,但是wps依旧闪退 首先执行 whereis wps ,我们找到 wps 的执行文件路径,一般位于 /usr/bin/wps 然后我们编辑该文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function run() { oldPwd="${PWD}" if [ -e "${gInstallPath}/office6/${gApp}" ] ; then if [ 1 -eq ${gDaemon} ]; then nohup ${gInstallPath}/office6/${gApp} ${gOpt} > /dev/null 2>&1 & elif [ 1 -eq ${gIsUrl} ]; then { ${gInstallPath}/office6/${gApp} ${gOptExt} ${gOpt} "${gFilePaths[@]}"; } > /dev/null 2>&1 elif [ 1 -eq ${gIsFushion} ] && [ "$1" != "/prometheus" ]; then { unset GIO_LAUNCHED_DESKTOP_FILE && ${gInstallPath}/office6/${gApp} /prometheus ${gOptExt} ${gOpt} "$@"; } > /dev/null 2>&1 else { ${gInstallPath}/office6/${gApp} ${gOptExt} ${gOpt} "$@"; } fi else echo "${gApp} does not exist!" fi } 将最后一个 else 的输出重定向去除,此时我们再运行 wps 就有报错输出了 ...

八月 2, 2023 · 2 分钟 · 

photoprism+rclone搭建

vps空间小,所以使用onedrive为例作为存储来搭建 photoprism 主要分为以下几步: 使用rclone挂载onedrive 部署photoprism 获得rclone.conf 首先在本地电脑上安装rclone 然后运行 rclone config 参照 https://rclone.org/onedrive/ 进行远程配置 然后配置完成后,~/.config/rclone/rclone.conf 内容类似 1 2 3 4 5 [onedrive] type = myonedrive token = {"access_token":"EwCAA8l6BA1","token_type":"Bearer","refresh_token":"M.C106eExJ7edYrxNdb3","expiry":"2023-06-03T16:20:11.7705715+08:00"} drive_id = 19fe142286d457 drive_type = personal docker plugin rclone配置 可按照下面,或者参见 https://rclone.org/docker/ 首先创建两个文件夹 1 2 sudo mkdir -p /var/lib/docker-plugins/rclone/config sudo mkdir -p /var/lib/docker-plugins/rclone/cache 然后安装 docker 插件 rclone ...

六月 4, 2023 · 5 分钟 · 

钉钉直播回放下载

更新 20230221 现在抓包已经抓不到这个链接了,不过在打开回放时会有一个请求 /group-live-share/index.htm?liveUuid=xxx 把这个请求拼接上去到下面的链接依旧可以打开网页版 不过获取到的 m3u8 链接依旧是无法直接下载的 写了个脚本来自动化该流程,可在 https://github.com/akkuman/ding_playback_downloader 获取 原始记录 20220907 想下载钉钉直播回放,管理员设置了禁止下载 找到了这篇文章 [[原创]钉钉如何下载管理员禁止的直播回放(抓包分析)-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com](https://bbs.pediy.com/thread-274002.htm) 打开burp,配置好burp证书,然后使用proxifier将钉钉主程序 DingTalk.exe 的流量全部转发到 burp 代理端口。打开直播回放,点开直播 按照文章中的寻找,只找到了下面这个链接 解码出来获取到了 其中有个 publicLandingUrl https://h5.dingtalk.com/group-live-share/index.htm?type=2&liveFromType=6&liveUuid=xxxx&bizType=dingtalk&dd_nav_bgcolor=FF2C2D2F#/union 浏览器打开这个链接,可以看到直播回放 播放视频,打开f12进行抓包,可以看到一个链接 https://dtliving-sh.dingtalk.com/live_hp/xxxx_merge.m3u8?auth_key=xxxxxx 这个链接中,xxxx是上面liveUuid,然后会看到一个m3u8,然后使用其他的工具下载并合并m3u8即可 其实上面的json中的 liveUrlHls ****中的auth_key可以用在拼接m3u8链接上,但是发现下载 liveUrlHls 需要单点登录(不知道这是不是我们公司的配置),而下载上面m3u8链接需要网页登录后cookie中PC_SESSION值 所以还是直接打开网页后使用idm之类的软件进行下载吧。 给出一份mitmproxy的脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 from mitmproxy import http from mitmproxy import ctx import re import json pattern = re.compile(r'\[live\-playback\-room\].+?\[response\](\{.+\})') def request(flow: http.HTTPFlow) -> None: # if flow.request.pretty_host != 'retcode.taobao.com': # return if not flow.request.path.startswith('/r.png'): return msg = flow.request.query.get('msg') if not msg: return if not pattern.match(msg): return data = pattern.search(msg)[1] try: data = json.loads(data) except Exception: return live_info = data.get('liveInfo') if not live_info: return live_uuid = live_info.get('liveUuid') ctx.log.info(f'获取到 liveUuid {live_uuid}') live_url_hls = live_info.get('liveUrlHls') ctx.log.info(f'获取到 liveUrlHls {live_url_hls}') ctx.log.inof(f"请打开网页使用IDM进行下载: {live_info.get('publicLandingUrl')}") 自动化的方案,之后再花时间研究 ...

二月 21, 2023 · 1 分钟 · 

使用zig在linux上交叉编译cgo

使用zig在linux上交叉编译cgo 的 github action,此处不做解释了,自己可以看注释进行实验 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 name: build on: push: tags: - '*' jobs: build-rotateproxy: runs-on: ubuntu-18.04 steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Zig uses: goto-bus-stop/setup-zig@v1 with: version: 0.9.1 - name: Setup Golang uses: actions/setup-go@v2 with: go-version: 1.17 - name: Build RotateProxy run: | # download macos sysroot git clone --depth=1 https://github.com/hexops/sdk-macos-12.0.git "$HOME/macos-SDK" # create zig script mkdir -p "$HOME/.bin" export PATH=$PATH:"$HOME/.bin" touch "$HOME/.bin/zcc" && touch "$HOME/.bin/zxx" chmod +x "$HOME/.bin/zcc" && chmod +x "$HOME/.bin/zxx" mkdir -p build cd cmd/rotateproxy configs=( 'linux amd64 x86_64-linux-musl' 'linux 386 i386-linux-musl' 'windows amd64 x86_64-windows-gnu' 'windows 386 i386-windows-gnu' 'darwin amd64 x86_64-macos-gnu' ) IFS=$'\n' for i in ${configs[@]} do IFS=$' ' config=($i) goos=${config[0]} goarch=${config[1]} libc=${config[2]} ext='' if [ "${goos}" = "windows" ];then ext='.exe' fi # ref: https://dev.to/kristoff/zig-makes-go-cross-compilation-just-work-29ho echo "goos: ${goos} goarch: ${goarch} libc: ${libc}" echo '#!/bin/sh' > "$HOME/.bin/zcc" echo '#!/bin/sh' > "$HOME/.bin/zxx" # ref: https://github.com/ziglang/zig/issues/10660 # ref: https://github.com/ziglang/zig/issues/1349 # ref: https://github.com/ziglang/zig/issues/10299#issuecomment-989153750 if [ "${goos}" = "darwin" ];then # zig 0.10.0关于sysroot的行为有变更,参见 https://github.com/ziglang/zig/issues/10790#issuecomment-1030712395 echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig cc -target '${libc}' --sysroot="$HOME/macos-SDK/root" -I"$HOME/macos-SDK/root/usr/include" -L"$HOME/macos-SDK/root/usr/lib" -F"$HOME/macos-SDK/root/System/Library/Frameworks" $@' >> "$HOME/.bin/zcc" echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig c++ -target '${libc}' --sysroot="$HOME/macos-SDK/root" -I"$HOME/macos-SDK/root/usr/include" -L"$HOME/macos-SDK/root/usr/lib" -F"$HOME/macos-SDK/root/System/Library/Frameworks" $@' >> "$HOME/.bin/zxx" # zig cc 调用clang,clang更新后默认加了一些参数,见 https://github.com/golang/go/issues/38876 https://stackoverflow.com/questions/42074035 # 经过测试最基本需要 -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-availability export CGO_CPPFLAGS="-Wno-error -Wno-nullability-completeness -Wno-expansion-to-defined -Wno-builtin-requires-header -Wno-availability" else echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig cc -target '${libc}' $@' >> "$HOME/.bin/zcc" echo 'ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig c++ -target '${libc}' $@' >> "$HOME/.bin/zxx" fi cat "$HOME/.bin/zxx" cat "$HOME/.bin/zcc" CGO_ENABLED=1 GOOS="${goos}" GOARCH="${goarch}" CC="zcc" CXX="zxx" go build -o "../../build/rotateproxy-${goos}-${goarch}${ext}" -trimpath -ldflags="-linkmode=external -extldflags=-static -s -w" done - name: Run GoReleaser uses: goreleaser/goreleaser-action@v2 with: version: latest args: release --rm-dist env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

二月 13, 2023 · 2 分钟 · 

xp 兼容的 go-sciter

现在的 https://github.com/sciter-sdk/go-sciter 项目想要兼容 xp 已经十分困难 我写了一个例子,地址在 https://github.com/akkuman/go-sciter-xp, 旨在提供一个兼容 xp 的 go-sciter 样例。 感兴趣的可以将项目克隆下来后进行自己的开发 环境依赖 go 1.10 https://github.com/golang/dep 工具 sciter-sdk 4.4.4.7 关于环境的说明 上面几个环境务必保持相同 sciter-sdk 为什么使用 4.4.4.7 版本 我使用 rundll32 在 xp 上调用 sciter.dll,最高只能支持到这个版本 我已经将这个版本的 dll 放到本仓库了 sciter-4.4.4.7-normal.dll 来自 https://github.com/c-smile/sciter-sdk/tree/c7d48627e8716bb803bebf2c74f54ab2dd0d7c51/bin.win/x32 sciter-4.4.4.7-skia.dll 来自 https://github.com/c-smile/sciter-sdk/tree/c7d48627e8716bb803bebf2c74f54ab2dd0d7c51/bin.win/x32skia 这两个版本的区别是,skia 使用 skia 进行渲染,并且体积大一些 为什么使用 go1.10 根据 https://github.com/golang/go/issues/23380 ,golang version 1.10 是最后一个支持xp的版本,后续的版本不对兼容性做保证 关于gui库 govcl: go ver>=1.9.2 : 优势: 可以使用lazarus或delphi等界面设计软件直接画界面 go-sciter: go ver>=1.10:优势:使用了完整的web技术栈,但是肯定不能与浏览器的兼容性相比,不过写界面应该是够了,目前使用sciter的明星产品:rustdesk gotk3:go ver>=1.8 gtk绑定 qt:支持1.10,但是安装较为复杂 考虑到美观和兼容的问题,建议使用 go-sciter 注意,go1.10不支持go module,需要使用gopath的模式 为什么使用dep dep 已经是一个不再维护的东西,已经被 go module 取代,但是 module 到 go1.13 才有支持,所以我们使用 dep ...

九月 19, 2022 · 2 分钟 ·