luciaAAAAAAAA.25.10.25

昨天晚上zzz池子出了金但又是一个一个一个waifu11啊啊啊啊啊(全恼🤔好在仅(迫真)浪费了50抽,我什么都不用做就可以随便抽出当期up,一个叫做lucia的萌妹🤔据说可以make sugoixuan great again,但我在另外一个号辅助狗狗的时候不怎么行🤔

但今天我本来也打算撸完大号或者随便一个号的版本活动🤔既然大号需要时不时抽点啥玩意,那就开始玩大号的⑧🤔这次的活动是操纵怪物打怪物(刚好lucia的技能就是各种操纵怪物),可以认为是hsr以太战线的zzz版,但它玩起来怎么那么像一款叫做vc的游戏捏(迫真🤔当然和vc系列相比它还是简化了很多的,甚至还有qte玩(完成50个qte甚至还有成就🤔

但更离谱的是剧情居然和lucia没啥太大关系,却是关于下半登场的另外一个萌妹的🤔那个萌妹据说是冰命破,但我上次投资sugoixuan失败的经验让我ptsd,这要是又来一个五星大c我又要嗯抽专武,所以我还是接着去抽lucia,至少辅助通常不怎么吃专武🤔

极其离谱的是今天几乎所有四星都是狗狗,到最后一次十连我除了抽出lucia外甚至将狗狗抽到了c6,全程可能只出过一个piperwaifu🤔这批游戏是怕我⑨折抽卡还是怎么(半恼🤔懂了(迫真),下次想抽满新四星怎么办,up五星歪一次,接下来哪怕不想要新四星也会蹭蹭送(大嘘🤔

当然在想钱想疯了这一块,zzz的功力还不如hsr十分之一甚至⑨分之一,hsr能整出来昔涟池子充2000送ml配件还是啥来着的狠活,zzz还得学习一个🤔

抽完卡接着玩活动剧情,在一段又臭又长的剧情后,终于几乎拿满了成就,甚至包括一个极其阴间的隐藏成就,不查根本不知道存在的那种🤔至于什么打完六盘挑战关卡的成就,今天没时间拿,我可以30号或者别的时间再玩,我这不还有另外几个号吗(🤔但那些号也有可能不抽lucia或者不玩这个活动,因为它们的sugoixuan没像我的大号那样投资了很多(🤔

另外一边,在换gpt codex后,hashcheck终于魔改了起来,第一次魔改后它生成的dll和原版没区别,再次魔改后才加入了保存txt的功能,保存的txt内容和文本框里的汇总信息完全一致,只不过奇怪的是选择单checksum时它居然会同时保存汇总txt🤔这个奇怪的bug不清楚怎么整进去的,反正我让它消灭力,但这样我就突然有一个想法:可不可以有一个选择除保存txt外还将所有开启了的checksum每一个保存成一个对应扩展名(但文件名和txt一样)的文件?🤔在加了一大串乱七八糟的代码后,这个功能也实现力,按理来说那个bug貌似消灭的时候很轻松,再次撸多文件时它却改了一堆东西,就很迷🤔

我还问了ai这玩意的验证checksum部分怎么判定什么时候用单线程什么时候用多线程的,它回答文件数大于1外加判断介质为ssd即可,然后我得以发现它计算checksum时也有类似判定条件,也可以开多线程🤔但吴论怎么调代码,吴论是将判定多线程的条件和验证checksum时调成一致,还是干脆不做任何检查直接强制多线程,它貌似都多不了一点(全恼🤔估计我还是得采用传统的多线程方法,开多个对话框同时算(恼🤔不过现在既然有8个文件要合并,那么我干脆撸个bash函数出来,这倒是没啥难的(确信🤔

主要是我缺乏调试这种shell扩展dll的方法,不然我可以跑个啥然后看它在走单线程还是多线程,怎么走的🤔它貌似在计算checksum时也实现了一套多线程机制,但由于它压根就没有被触发过,鬼知道它的实现有没有问题🤔这个项目貌似从16年开始就没有更新过,所以也没法问作者,就这样🤔

总之这么折腾下来,那个gpt号的每6小时用量直接干到了75%,每周用量也差不多干到了一半,这c++编程实在是蛤人🤔更别提它每次编译都要哼哼折腾一番,由于我方便调试还将生成的dll直接注册了一遍,它得每次结束explorer后才能编译,然后再重启explorer🤔

barbruh.25.10.24

今天接着撸ai编程🤔在本地我一般来说cursor用得比较习惯,所以今天尝试魔改些开源项目🤔

首先是baidupcs-go🤔我需要往它的交互式cli里面加一个类似于bash的分号机制,比如我经常做的mkdir xxx; d xxx,只要一行命令就可以做这两件事🤔接下来还可以创建一个命令两件事都干力,比如叫做md xxx,一条命令下去就能先创建文件夹然后下载它(从而查看它的创建时间🤔这两件事它都干得不错,配置好golang之后它还能每修改一次顺便编译一个exe出来🤔

接下来我需要魔改hashcheck,一个dll形式存在的shell扩展🤔我要往里面添加一个保持txt的功能,txt的内容是它多行文本框里所有的checksum值,以前我都是复制粘贴到notepad或者哪里保存的,我希望能更方便些🤔这个cursor干得就不太行力,它生成了一个改版,然后我装了一个高达6GB的vs仅包括命令行编译器的套装(什么时候msvc这么膨胀力)才能编译好它🤔安装后发现这b玩意和原版一毛一样,然后再让它修改时怎么编译都过不了一点,让它改错误也是怎么改都改不了一点,明明迫真发现了错误却修改不了文件(全恼🤔看来,这时应该换claude code或者gpt codex力(全恼🤔

nav3.25.10.22

这两天又给naughtyamerica的webapp加了点新功能,比如一个叫做nasearch的py脚本,操纵开启了调试的浏览器访问任意视频分类页面,不停点view more,直到没有这个按钮为止,然后将获取的视频链接去重排序后打印到stdout里🤔这要是cli的话接下来肯定接na2dl函数,但这是webapp,所以我要将其集成到webapp的某个框里🤔

我目前还没做整出来视频链接列表就一键批量添加进下载队列的功能,因为我还没打算,而且估计很长一段时间也不打算大规模拖它,但至少我整了多行文本框批量添加功能,大不了下下来列表后自己复制粘贴(确信🤔

具体来说为了实现列举链接和拖视频并行,整个webapp被重构了114514次,往里面加了几乎一半新代码,还由于我之前白嫖的api卡出了⑩,还中途断了好几次🤔这个重构代码的强度还橄榄了若干个中转api,所以最终我干脆上某fisch找了个gpt team的车(貌似openai帐号也没那么难注册,,,当然什么gpt3的时代它还是难搞的,要验这个验那个,但今天哪怕没有牢美ip也能随便注册),10块钱一个月,然后直接上官方版才搞定🤔

列举视频被我设置了并行度3,换句话说和拖视频不同,它可以并行跑好几个列举视频任务,尽管我也没跑过超过3个任务,能到2就算不错力🤔

除此之外我还整了一个检查是否登录的脚本,它如果没跳转的话就是已登录,如果跳转到了登录界面那就用我之前那个用户名密码登录就vans力,这个它做得不错,基本上没怎么折腾就实现了一个能用的,再将其整合进webapp里🤔到此我也不用整什么xrdp每次掉登录就连进去登,而且xrdp这玩意也不够稳定(我观测到至少一次xrdp崩导致chrome完全没法用),我让它整了另外一个迫真桌面方案,virtual x server,然后将chrome有头版跑那里,然后将chrome系统服务也整了进去🤔现在不是很清楚新机子如果上来就搞这玩意会不会导致永远登不了,因为我记得第一次登录需要完成一顿google验证?🤔

下一步整什么?考虑到chrome这逼玩意动不动卡死,导致拖一页一页一页要花十几秒,我也许需要整个重启浏览器服务的按钮,免得我每次都需要输一长串啥玩意?🤔我现在整这些乱七八糟玩意其实就是为了尽可能不打开cli(确信🤔

naevolved.25.10.20

昨天凌晨闲的寄吧蛋疼,想让codex给我已经成型的拖naughtyamerica脚本加上队列功能,省得我每次得等它拖完后才能往里面添加链接🤔它给出了一个一个一个方案,但我都不满意,所以我干脆让它写了个webapp🤔

好家伙,过了十分钟甚至⑨分钟后,它还真的写了一个能用的,我可以往里面随便添加链接,添加完后除了当前正在跑的任务外,别的任务可以随便排序,基本上符合我的要求🤔

当然它也有些小小的缺点,比如log没法像别的能够显示log的webapp一样在一个固定文本框里滚动,而是会铺满整个页面🤔比如它缺乏终止当前任务的能力🤔

所以我接下来让它做了点改进,除了修复这两点外,我还让它能够对results.txt的内容进行解析,从而将其呈现为表格形式,并在每一行后面添加了删除功能,删除某行也同时删除results.txt里的对应行🤔至于我没有提及的results.txt和它自己的数据库如何同步的问题,它貌似有了一套勉强能用的解决方案,如果它没有数据库也就是初始化阶段,它会读取一遍results.txt并将里面所有东西添加进去,之后每跑一条任务,它会在完成时读一遍result.txt然后比对缺失的行然后加进它的缓存数据库🤔

除此之外我还往里面加了一个资源监控功能,每秒更新一次,主要监控上传下载速率,来看它究竟在做什么🤔原来的拖站脚本也做了次优化,对于这b网站掉登录(或者别的什么原因)导致获取不了链接的情况,它能够返回1被webapp捕捉到,然后报错“需要重新登录”🤔

到此基本上这玩意算是整完力,这也是我十年甚至⑨年拖站生涯里第一次整了个webapp来玩拖站🤔之前也许我想写一个诸如此类的东西,来操控github actions,但我不会写py webapp(恼🤔现在有了各种黑色高级ai,我只需要提出需求就vans力🤔

接下来,我甚至还可以让它写一个一个一个一个总结性质的一键部署脚本啊啊啊啊啊,很不幸的是我的aws灵车已经涨到了15,我可不想因为要测这个重新部署脚本而再买个这玩意🤔而且更不幸的是我的hetzner号因为前几个月忘了充钱被彻底橄榄,我也没机会租个按小时付费的vps来测(全恼🤔

naughtyamerica.25.10.18

今天凌晨的某个时刻,我彻底征服了naughtyamerica🤔自从去年开始大规模拖sexart算起,我基本上已经一年多没有拖任何pornsite力(悲🤔naughtyamerica通常来说也不是我的首选项,因为在我的印象里这个站在某年(可能是23?)的改版后,下载任何一个视频都需要经过一番google验证🤔但由于某种申必原因,我六月还是哪个月买的naughtyamerica号居然还在,而czechcasting我又没买,所以我现在能拖的也就只有naughtyamerica🤔

照例打开f12视奸它的http协议流,在我对着它的视频页面的streaming preference点了下4k后,本来我以为它会像什么mofos之类的一样触发m3u8这样的流式传输,结果我发现它触发了一个完整视频文件的请求,它和(需要通过google验证后才出现的)下载链接居然长得完全一样,除了后面可能少一个&dl=1🤔如果下载该链接的话得到的文件也和下载链接至少在文件大小上完全一致(我就懒得验证它们checksum到底匹不匹配力),这说明它给streaming准备的文件至少不是劣化版🤔而且我在streaming preference里随便点,除了对应的视频文件外没有观测到任何别的xhr请求,这说明它所有的下载链接其实早就在某次请求中一次性获取力,至于这次请求在哪里,,,我甚至都没花多少时间排查,直接从第一个请求也就是html文件里就发现了所有版本的mp4视频🤔

既然如此,考虑到我有114514个各种ai的黑色高级会员,我就懒得自己去提取力,直接扔进ai里让它给个bash脚本出来,然后过滤掉我不想要的链接(比如那些带captcha的,这些很明显是理论上来说下载视频需要访问然后过google验证的),还有什么xml,剩下的链接我直接一个一个一个一个用aria2下就vans力(确信🤔

这里面我发现了一个一个一个彩蛋,它有个链接叫做https://members.naughtyamerica.com/playlist-generator.scene.33438.4k.mp4.xml,这里也能提取出一个视频链接出来,但它一次访问只能提取出一个,但我访问一次html就能提取出所有链接,所以这个彩蛋基本上没啥卵用

但接下来我遇到了另外一个一个一个一个困难,这b网站除了下载需要验证外,访问它其实也需要验证,而且无论是用原版curl还是各种魔改版curl都不好使🤔那么用吴头浏览器呢?其实也不好使,而且我用传统的聊天ai配置了十几次都没配置对🤔它这玩意貌似使用了aws的黑色高级waf,第一次请求可能不成功,然后它会触发一个challenger.js,跑完这玩意获取某申必代码后会请求第二次,此时才会给真正的html,所以只能死板访问某一个链接的吴头浏览器对付这种逆天玩意貌似比curl好不了多少(全恼🤔考虑到这个我从某申必渠道搞到的aws灵车vps居然有4GB的超大内存(对vps来说确实很大),我也许可以试试在vps上跑一个有头浏览器,比如chrome,然后开启它的调试模式,开放一个调试端口,然后在另外一个脚本里用这个端口打开我们要打开的页面并且输出html🤔从某种程度上说这甚至比用curl方便,因为除了将curl替换成操控浏览器的py脚本外,后面不用跟任何headers(确信🤔我只需要在那个有头浏览器上登录naughtyamerica一次,然后就可以不用管它力,除非它掉登录或者需要更严格的验证(确信🤔

而且更妙的是,这些东西完全不需要我自己来配置,因为现在有各种cli版本的ai agent,比如claude code和gpt codex🤔这玩意在桌面pc上怎么用怎么别扭(因为我cursor用得多),但在vps上就刚刚好(迫真🤔我刚好有这两者的api key,但cc由于某种申必原因用不了,所以我在那台vps上装了个codex,然后让它配置chrome和所谓的最小桌面系统🤔我甚至都没有提及xrdp,它也有可能装vnc server或者别的玩意(比如parsec?),但它还是装了xrdp,甚至配置成功力,我自己配置xrdp都没有配置成功过哪怕一次🤔

连上去后我按照它的说明启动了chrome,但一直没法远程调试,这里至少有两个坑,一个是root用户启动chrome要带--no-sandbox参数,另外一个是user-data-dir必须选择和默认值不一样的位置🤔我登上naughtyamerica之后让ai写了一个na.py,让它像curl一样只要后面跟上链接就能返回该链接的完整html内容,这样它就能自动完成任何验证,毕竟它跑在一个真实的有头浏览器上(确信🤔考虑到aws逆天waf的原理,它每次运行基本上五六秒才能吐出一串链接,我如果想再保存html的话就得再花五六秒(全恼🤔

我用这套玩意代替curl能吴缝跑完下载脚本,但接下来还有一个问题,如果我关掉rdp窗口后,chrome就会像没有screen的命令行窗口一样被橄榄,所以我让ai做了某种类型的持久化配置,它将chrome对应的命令行做成了系统服务,这样只要启动应该就能自动开启chrome,然后开放指定的端口🤔那么如果naughtyamerica掉登录力,该怎么办?很简单,连上rdp,然后在chrome里顶着卡顿重新登录一遍就vans力🤔那么该脚本就剩下了最后一步,将下载下来的东西上传guilded drive然后删掉本地文件,不然这个存储空间只有128GB的vps随便下几个片子就会爆🤔

如果我接下来还需要改进什么的话,可能需要给我的脚本加上队列功能,从而哪怕它在处理时我也可以给它加链接?或者整个数据库啥的保存已经处理的链接等?甚至整个web系统,免得我每次添加队列的时候都需要登vps🤔而且这些其实都可以让ai来写(确信🤔但也有可能在我有什么大规模拖naughtyamerica的计划前,我那台aws灵车vps很快就会因为哼哼雷普naughtyamerica而被橄榄,鬼知道🤔

但无论如何,这是我拖pornsite生涯中第一次几乎全程使用ai整的,感觉还行,甚至有点暗爽🤔

附录(大嘘

完整chrome启动命令

/usr/bin/google-chrome-stable --remote-debugging-port=9222 --remote-debugging-address=127.0.0.1 --remote-allow-origins=* --user-data-dir=/root/.config/google-chrome114514 --no-first-run --no-default-browser-check --no-sandbox

使用的提示词

  • “请为该系统配置一个能够启动chrome浏览器的最小环境,考虑到我没法访问该vps的vnc console,我还需要一种手段能够远程连接它的图形界面”
  • “接下来我需要启动chrome但让它可以开放一个端口供某自动化工具(比如playright)调用,我需要以什么参数启动?对应的自动化工具是否能够使用我的登录凭据?请设计某工具让它能够在该已经打开的浏览器里打开某指定页面,并返回完整html内容”
  • “请编写一个py程序,使得我在bash里面调用它,比如na.py https://members.naughtyamerica.com/scene/co-ed-nerd-jade-valentine-has-the-hots-for-her-college-professor-32869,它应该能够使用我已经打开并有那个网站登录凭据的浏览器打开该页面,并在标准输出里输出该页面的html内容”
  • “如何在我关掉rdp之后,chrome仍然保持运行?”
  • “请对root用户完成上述设置”
  • “我需要将chrome位置文件设置成$HOME/.config/google-chrome114514,请修改对应的项目”

na.py

#!/usr/bin/env python3
"""
Launches a new page inside an already running Chrome instance (started with a
remote debugging port) and prints the rendered HTML to stdout.

Example:
    ./na.py https://example.com
"""

from __future__ import annotations

import argparse
import json
import sys
import urllib.error
import urllib.request
from typing import Optional

from playwright.sync_api import sync_playwright


def fetch_ws_endpoint(debug_base_url: str) -> str:
    """Return the websocket debugger URL from the remote debugging endpoint."""
    with urllib.request.urlopen(f"{debug_base_url.rstrip('/')}/json/version", timeout=10) as resp:
        data = json.loads(resp.read().decode("utf-8"))
    ws_url = data.get("webSocketDebuggerUrl")
    if not ws_url:
        raise RuntimeError("webSocketDebuggerUrl not found in /json/version response")
    return ws_url


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="Fetch a page through an existing Chrome session.")
    parser.add_argument("url", help="Target page URL to load inside Chrome.")
    parser.add_argument(
        "--debug-url",
        default="http://127.0.0.1:9222",
        help="Base URL of Chrome's remote debugging endpoint (default: %(default)s).",
    )
    parser.add_argument(
        "--wait-until",
        default="networkidle",
        choices=["load", "domcontentloaded", "networkidle"],
        help="Event to wait for before dumping HTML (default: %(default)s).",
    )
    parser.add_argument(
        "--timeout",
        type=float,
        default=30000,
        help="Navigation timeout in milliseconds (default: %(default)s).",
    )
    return parser.parse_args()


def choose_context(browser) -> tuple:
    """
    Return (context, owned) where owned indicates whether the context was created
    by this function (and thus should be closed on exit).
    """
    contexts = browser.contexts
    if contexts:
        return contexts[0], False
    return browser.new_context(), True


def main() -> int:
    args = parse_args()

    try:
        ws_url = fetch_ws_endpoint(args.debug_url)
    except (urllib.error.URLError, RuntimeError, json.JSONDecodeError) as exc:
        print(f"Failed to obtain websocket debugger URL from {args.debug_url}: {exc}", file=sys.stderr)
        return 1

    with sync_playwright() as playwright:
        browser = playwright.chromium.connect_over_cdp(ws_url)

        context, owned = choose_context(browser)
        page = context.new_page()
        try:
            page.goto(args.url, wait_until=args.wait_until, timeout=args.timeout)
            html = page.content()
        finally:
            page.close()
            if owned:
                context.close()

        print(html)
    return 0


if __name__ == "__main__":
    try:
        sys.exit(main())
    except KeyboardInterrupt:
        sys.exit(130)

ai对此的迫真总结

这次在一台无法直接访问 VNC 控制台的 Ubuntu 22.04 VPS 上,我搭建了一个能远程使用 Chrome 浏览器的最小化图形环境,并且让自动化脚本能够复用浏览器的登录状态。首先刷新 apt 仓库,安装 xrdp 与 XFCE 轻量桌面,通过修改 /etc/xrdp/startwm.sh 让 RDP 登陆直接进入 XFCE;启动并启用 xrdp.service 后,安全组开放 TCP 3389,即可用任意 RDP 客户端连接。紧接着添加 Google 官方仓库并安装 google-chrome-stable。为了让自动化工具复用登录凭据,我用 Python 与 Playwright 编写了 na.py,脚本会连接已经开启远程调试端口的 Chrome,并在同一用户数据目录里新开标签页、加载目标网址、输出完整 HTML。最后,为了在断开 RDP 后保持浏览器运行,使用 root 用户的 systemd user 服务,将 Chrome 以 remote-debugging 模式后台常驻,数据目录换成 ~/.config/google-chrome114514,并开启 linger,这样自动化任务随时可以通过http://127.0.0.1:9222 附着到现成会话。整套流程解决了无图形控制台的远程浏览器需求,也兼顾了登录态复用与自动化。

一键脚本(迫真

有一种水字数的美,另外这个脚本我没测过,如果我这台鸡鸡暴毙的话我也许会去测?🤔

#!/usr/bin/env bash
# Sets up a minimal XFCE + XRDP environment with Chrome running in remote
# debugging mode for automation reuse. Intended to be run as root on a fresh
# Ubuntu 22.04 VPS.

set -euo pipefail

if [[ "{EUID}" -ne 0 ]]; then
  echo "This script must be run as root." >&2
  exit 1
fi

export DEBIAN_FRONTEND=noninteractive

echo "[*] Updating apt metadata..."
apt-get update

echo "[*] Installing desktop and RDP components..."
apt-get install -y \
  xrdp \
  xfce4 \
  xfce4-terminal \
  dbus-x11 \
  wget \
  gnupg \
  python3-pip

echo "[*] Ensuring XRDP launches XFCE sessions..."
cat <<'EOF' >/etc/xrdp/startwm.sh
#!/bin/sh

if test -r /etc/profile; then
    . /etc/profile
fi

if command -v startxfce4 >/dev/null 2>&1; then
    exec startxfce4
fi

test -x /etc/X11/Xsession && exec /etc/X11/Xsession
exec /bin/sh /etc/X11/Xsession
EOF
chmod +x /etc/xrdp/startwm.sh

echo "[*] Allowing XRDP to read system certificates..."
adduser xrdp ssl-cert || true

echo "[*] Enabling XRDP service..."
systemctl enable --now xrdp

echo "[*] Adding Google Chrome repository..."
install -d -m 0755 /usr/share/keyrings
wget -qO- https://dl.google.com/linux/linux_signing_key.pub \
  | gpg --dearmor >/usr/share/keyrings/google-linux-signing-keyring.gpg
cat <<'EOF' >/etc/apt/sources.list.d/google-chrome.list
deb [arch=amd64 signed-by=/usr/share/keyrings/google-linux-signing-keyring.gpg] https://dl.google.com/linux/chrome/deb/ stable main
EOF

echo "[*] Installing Google Chrome..."
apt-get update
apt-get install -y google-chrome-stable

CHROME_DATA_DIR="/root/.config/google-chrome114514"
echo "[*] Preparing Chrome data directory at{CHROME_DATA_DIR}..."
install -d -m 0700 "{CHROME_DATA_DIR}"

SYSTEMD_USER_DIR="/root/.config/systemd/user"
echo "[*] Creating Chrome systemd user service..."
install -d -m 0755 "{SYSTEMD_USER_DIR}"
cat <<'EOF' >"{SYSTEMD_USER_DIR}/chrome-remote.service"
[Unit]
Description=Chrome with remote debugging
After=default.target

[Service]
Environment=DISPLAY=:10
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus
Environment=XAUTHORITY=/root/.Xauthority
ExecStart=/usr/bin/google-chrome-stable --remote-debugging-port=9222 --remote-debugging-address=127.0.0.1 --remote-allow-origins=* --user-data-dir=/root/.config/google-chrome114514 --no-first-run --no-default-browser-check --no-sandbox
Restart=on-failure

[Install]
WantedBy=default.target
EOF

echo "[*] Enabling linger for root so the user service remains after logout..."
loginctl enable-linger root || true

export XDG_RUNTIME_DIR="/run/user/0"
if [[ ! -d "{XDG_RUNTIME_DIR}" ]]; then
  echo "[*] Creating XDG runtime directory at {XDG_RUNTIME_DIR}..."
  install -d -m 0700 "{XDG_RUNTIME_DIR}"
fi

echo "[*] Reloading user systemd daemon and starting Chrome service..."
XDG_RUNTIME_DIR=/run/user/0 systemctl --user daemon-reload
XDG_RUNTIME_DIR=/run/user/0 systemctl --user enable --now chrome-remote.service

echo "[*] Installing Python Playwright package for automation helper..."
python3 -m pip install --upgrade pip
python3 -m pip install playwright

echo "[*] Deploying na.py helper script..."
cat <<'EOF' >/root/na.py
#!/usr/bin/env python3
"""
Attach to an existing Chrome instance (started with --remote-debugging-port),
open a given URL, and print the rendered HTML to stdout.
"""

from __future__ import annotations

import argparse
import json
import sys
import urllib.error
import urllib.request

from playwright.sync_api import sync_playwright


def fetch_ws_endpoint(debug_base_url: str) -> str:
    with urllib.request.urlopen(f"{debug_base_url.rstrip('/')}/json/version", timeout=10) as resp:
        data = json.loads(resp.read().decode("utf-8"))
    ws_url = data.get("webSocketDebuggerUrl")
    if not ws_url:
        raise RuntimeError("webSocketDebuggerUrl not found in /json/version response")
    return ws_url


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="Fetch a page through an existing Chrome session.")
    parser.add_argument("url", help="Target page URL to load inside Chrome.")
    parser.add_argument(
        "--debug-url",
        default="http://127.0.0.1:9222",
        help="Base URL of Chrome's remote debugging endpoint (default: %(default)s).",
    )
    parser.add_argument(
        "--wait-until",
        default="networkidle",
        choices=["load", "domcontentloaded", "networkidle"],
        help="Event to wait for before dumping HTML (default: %(default)s).",
    )
    parser.add_argument(
        "--timeout",
        type=float,
        default=30000,
        help="Navigation timeout in milliseconds (default: %(default)s).",
    )
    return parser.parse_args()


def choose_context(browser):
    contexts = browser.contexts
    if contexts:
        return contexts[0], False
    return browser.new_context(), True


def main() -> int:
    args = parse_args()

    try:
        ws_url = fetch_ws_endpoint(args.debug_url)
    except (urllib.error.URLError, RuntimeError, json.JSONDecodeError) as exc:
        print(f"Failed to obtain websocket debugger URL from {args.debug_url}: {exc}", file=sys.stderr)
        return 1

    with sync_playwright() as playwright:
        browser = playwright.chromium.connect_over_cdp(ws_url)

        context, owned = choose_context(browser)
        page = context.new_page()
        try:
            page.goto(args.url, wait_until=args.wait_until, timeout=args.timeout)
            html = page.content()
        finally:
            page.close()
            if owned:
                context.close()

        print(html)
    return 0


if __name__ == "__main__":
    try:
        sys.exit(main())
    except KeyboardInterrupt:
        sys.exit(130)
EOF
chmod +x /root/na.py

echo
echo "Setup complete."
echo "Summary:"
echo "  - XRDP is running on TCP 3389 with XFCE desktop."
echo "  - Chrome runs headless via systemd user service using profile ${CHROME_DATA_DIR}."
echo "  - Remote debugging available on 127.0.0.1:9222 (tunnel or firewall accordingly)."
echo "  - Use /root/na.py <URL> to open pages in the logged-in Chrome session and dump HTML."
echo
echo "Reminder: allow TCP 3389 in your VPS firewall/security group and tunnel port 9222 securely."

这是ai写的使用说明:

Script Details

  • Added setup_chrome_xrdp.sh to automate the entire environment setup for another VPS (setup_chrome_xrdp.sh:1). It installs XRDP + XFCE, configures /etc/xrdp/startwm.sh, adds the Google Chrome repo, installs Chrome, creates /root/.config/google-chrome114514, and deploys a root user systemd service that keeps Chrome running with remote debugging even after RDP disconnects. The script also installs Playwright and drops the reusable na.py helper (setup_chrome_xrdp.sh:82, /root/na.py:1).

How to Use

  • On the new VPS, copy the script and run bash setup_chrome_xrdp.sh as root. Wait for the “Setup complete.” message.
  • Open port 3389 in the server firewall/security group for RDP; keep 9222 restricted (e.g., SSH tunnel) since it exposes your Chrome session.
  • Connect via RDP, log in, and either browse manually or run ./na.py to fetch a page’s HTML through the already-authenticated Chrome instance.
  • Chrome now runs persistently via systemctl --user status chrome-remote (XDG_RUNTIME_DIR=/run/user/0 when checking from root).

Next Steps

  1. On the target VPS, execute the script and verify curl http://127.0.0.1:9222/json/version returns a WebSocket URL.
  2. If you need a different display number or profile path, edit the service in ~/.config/systemd/user/chrome-remote.service before re-running systemctl --user daemon-reload && systemctl --user restart chrome-remote.

evernightAAAAAAAA.25.10.10

今天突发奇想给我的几个hsr号抽red eyes waifu7,反正它们也到了差不多该出金的程度(确信🤔大号一顿十连下去,居然没歪🤔某自从waifufly之后一发都没抽的号,被我一天一个十连,到五号就已经抽到力,那么现在还剩下一个号,晚上再抽🤔

除此之外我还领了一系列waifu impact号的邮件,常驻池兑换了mizuki,给大号的sugoiuma刷了顿boss材料(与此同时,我的skk和escoffier到今天还没拉满),还有zzz三个号里两个号的限定道具🤔但由于某种申必原因,大号只完成了邦布塔防,还有两个活动完全没打🤔

所以我花了一个下午加晚上才撸完剩下这点,主要是合影impact环节实在是多到烦,尤其是某拍照任务,居然有十段甚至⑨段之多,每一段完成后某邦布的摊位就会多出来一个玩具,那么差不多意味着我需要拍十次甚至⑨次(全恼🤔

这部分整完后我便开始对最后一个hsr号开始抽卡,很不幸的是它歪了一个一个一个一个himeko啊啊啊啊啊(悲🤔它甚至都不是waifuxuan🤔这下尴尬力,尽管它有51419抽卡材料,但我再抽个金也不是,,,也不是⑧行,光速抽了70多发终于整出来力,现在还剩37xxx🤔目测这个号下个版本还能整个昔涟玩玩,但也许补不了hsr barbruh,鬼知道🤔另外一个小号抽完red eyes waifu7居然还剩6xxxx,按照我的迫真算法来算,搞不好暇蝶战舰的剩下三个都能补,但我也有可能只抽一个hsr barbruh🤔

离今天结束貌似还有一小时,我开始对这三个hsr号打差分宇宙🤔最终在今天结束前5分钟时,三个号的差分宇宙也撸完力,整了一个一个一个不清楚有什么卵用的存档啊啊啊啊啊🤔

在差分宇宙里所有撅色都能获得自动升级天赋,所以我们可以测试下3/4暇蝶战舰到底有多屌🤔red eyes waifu7有一个天赋是,如果队伍里有一个一个一个一个记忆撅色啊啊啊啊啊,增加暴击伤害65%🤔哪怕只有一个一个一个,也有50%🤔这看起来像是隔壁escoffier的天赋,但又没锁那么死,比如四号位如果不上昔涟的话也可以上waifumei或者hsr waifuhida,不上hsr barbruh的话也可以上别的奶甚至waifuxuan(迫真🤔但如果队伍里只有red eyes waifu7和暇蝶的话,很明显伤害是会亏很多的(确信🤔

不过从某种程度上说,暇蝶先不说别的和hsr barbruh基本上绑死(如果不是拿去给waifuliu用,其实hsr barbruh也不是那么刚需专武),再加个red eyes waifu7就已经够用力(确信🤔差分宇宙内外我测过各种四号位人选,最终发现记忆主撅才是最合适的,至少在昔涟出来之前(确信🤔问题就在于那两个号甚至都没玩3.0主线剧情,所以压根就没有记忆主撅,然后它们都没有hsr barbruh,有的甚至连暇蝶都没抽,就很麻🤔某个号目前只能拿red eyes waifu7当主c用,随便找几个辅助,比如pelawaifu据说可以替代hsr waifuhida,大刻晴可以替代,,,记忆主撅?然后要么从我的大号里拉个hsr barbruh助力,要么从waifufly队伍里拿个奶过来🤔总体而言,这个b队伍至少伤害比archer高🤔