2026-04-15

04月15日

一、今日完成情况

  • 邮局任务完成,让我可以正常登录[[#四、邮局项目说明书]]
  • 完成whisper代码架构的梳理 –未完成
  • 域名备案已经完成,我要完成网站的装修。 [[#五、网址自动action同步笔记]]
  • 开会,交流2小时,打通项目议题方向环节 [[#六、梳理营销比赛共识]]

二、今日感悟

  • 核心业务数据​:
    • 邮局打通链路了,算是一个demo简单落地了,可是要服务于生产还是需要继续琢磨,接下来继续落地把,今天我要实现一些别的项目了。
    • 域名装修,已经选好模板,在笔记自动化同步方面遇到了一点小麻烦,步子迈大了,容易扯着蛋。
  • ​今日工作总结:​
    • 在推进项目方面,今天又有了新的收获,团队协作各自提出问题,并且协调最终达成共识,这是我们努力的方向,就是应该这种比赛多参加,才能让我未来的工作1+1大于2,不然我永远学不会合作。
    • 域名网址装修遇到了问题,倒是当前我选择到的模板挺符合我的审美的,主要是很可爱。今天遇到点问题,关于笔记拉取github同步,我应该了解理解项目的原理然后才可以执行,不然遇到问题我都不知道怎么解决,不能什么都不会,最基本的原理还是要理解的,这样我才可以泛化到其他实践的领域,很多事情的智慧是共同的,我们不能买椟还珠。
    • 邮局任务完成,可以使用,未来验证码识别是一个问题。
  • ​明日工作计划:
    • 完成域名的项目装修,实现笔记特定文件夹同步的效果,PPT在线展示的效果
    • 完成校企同行参观,我需要计划好自己的目的,带着任务去,效率高一点,毕竟我的时间是很宝贵的,去了就一定要打听点什么东西出来。
  • ​今日学习成长:​
    • 还是系统化太难了,进入工作状态就需要时间,真正沉下心来干点事情的时间少之又少,时间被分割的比较多,如果生活规律,兼顾娱乐,运动的话,自我提高的时间非常少哦。

三、备注

四、邮局项目说明书

https://email.easytake.work/

tm-otp 是一个独立的 Python CLI/库,只调用你现有的 Temp Mail Worker API(不改前后端),实现:

  • 批量创建邮箱地址(管理员口令)
  • 轮询收信并从 raw RFC822 中提取 4-8 位数字验证码
  • 可选:拿到验证码后自动销毁邮箱地址

依赖的现有 API(你现在就有)

  • POST /admin/new_addressx-admin-auth)创建邮箱,返回 jwt(地址JWT)
  • GET /api/mails?limit&offsetAuthorization: Bearer <地址JWT>)拉取邮件列表({results,count}
  • DELETE /admin/delete_address/{address_id}x-admin-auth)删除邮箱地址

安装(本地)

在项目目录:

cd cftemail-automation-release
python3 -m venv .venv && . .venv/bin/activate
pip install -e .

环境变量

export TM_API_BASE='https://email-api.easytake.work'
export TM_ADMIN_AUTH='<你的管理员密码>'

# 如果你开启了私有站点密码(可选)
export TM_CUSTOM_AUTH='<你的 x-custom-auth>'

可调参数(可选):

export TM_TIMEOUT_S=120
export TM_POLL_INTERVAL_S=2
export TM_POLL_INTERVAL_MAX_S=5
export TM_MAIL_LIMIT=20

用法

1) 创建一个邮箱地址

tm-otp addr-new --name ldh002 --domain easytake.work

输出 JSON(包含一键打开 UI 的链接 ui_login_url)。

2) 等待验证码(已有地址 JWT)

tm-otp otp-wait --address ldh002@easytake.work --jwt '<地址JWT>'

返回形如:

{"address":"...","code":"123456","mail_id":1,"created_at":"..."}

3) 一条命令:创建邮箱 → 等码 → 自动销毁

tm-otp otp-lease --name ldh002 --domain easytake.work --destroy

作为库导入

from tm_otp.http_client import AdminAPI, AddressAPI
from tm_otp.workflow.poller import WaitOptions, wait_for_otp
from tm_otp.workflow.lease import lease_and_wait

admin = AdminAPI("https://email-api.easytake.work", admin_auth="ADMIN_PASSWORD")
addr_api = AddressAPI("https://email-api.easytake.work")

res = admin.new_address(name="bot001", domain="easytake.work", enable_prefix=True)
otp = wait_for_otp(
    api=addr_api,
    address=res.address,
    address_jwt=res.jwt,
    options=WaitOptions(timeout_s=120, poll_interval_s=2, poll_interval_max_s=5, limit=20),
)
print(res.address, otp.code)

解析策略(重要)

  • /api/mails 返回 raw_mailsraw(RFC822)内容。\n+- 程序使用标准库 email 解析 subject/text/plain/text/html,再用正则 \\b\\d{4,8}\\b 提取。\n+- 去重策略:优先使用 mail.id;没有则使用 sha256(raw[:8192])。\n+
from tm_otp.http_client import AdminAPI, AddressAPI
from tm_otp.workflow.poller import WaitOptions, wait_for_otp
from tm_otp.workflow.lease import lease_and_wait

admin = AdminAPI("https://email-api.easytake.work", admin_auth="vEESw83LGsb7Az9G6Ev2pMq0")
addr_api = AddressAPI("https://email-api.easytake.work")

res = admin.new_address(name="bot001", domain="easytake.work", enable_prefix=True)
ui_login_url = f"https://email.easytake.work/?jwt={res.jwt}"
print("address:", res.address)
print("ui_login_url:", ui_login_url)
print("send a test mail to the address, then waiting for OTP...")

otp = wait_for_otp(
    api=addr_api,
    address=res.address,
    address_jwt=res.jwt,
    options=WaitOptions(timeout_s=120, poll_interval_s=2, poll_interval_max_s=5, limit=20),
)
print("otp:", otp.code)

脚本测试,自动生成邮箱并且自动接受验证码,打通了邮局的整个过程,不过要投入使用批量注册账号还任重道远,需要有好的IP,并且服务器发送验证码到平台进行自动话验证,最后还要人机验证。

我算是知道这个人机验证是防什么了,防的就是我这种人,防的就是这批薅羊毛的人。

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

五、网址自动action同步笔记

本文记录本仓库当前 GitHub Actions 的设计目标、触发链路、关键参数与常见故障排查,便于后续复用与维护。

总体目标

  • 站点构建与部署:在 GitHub Actions 里执行 Hexo 构建,生成 public/,并通过 SCP 同步到腾讯云服务器指定目录,再 reload Nginx。
  • Obsidian 笔记同步:把独立的 Obsidian 笔记仓库内容自动同步进本站 source/obsidian/notes/,提交到站点仓库,触发后续构建/部署。

仓库内相关文件:

  • /.github/workflows/deploy.yml:构建并 SCP 部署到服务器
  • /.github/workflows/sync-obsidian.yml:同步 Obsidian 仓库内容到本站源码

工作流 1:构建并部署(deploy.yml)

文件:/.github/workflows/deploy.yml

触发方式

  • push 触发:推送到 mainmaster 时触发
  • 手动触发:在 GitHub Actions 页面点击 Run workflow

执行步骤与原理

  1. Checkout 代码

    • 使用 actions/checkout@v4 将仓库拉到 runner。
  2. 准备 Node 环境

    • 使用 actions/setup-node@v4,固定 node-version: '18'
    • 启用 cache: 'npm',加速依赖安装。
  3. 安装依赖(可复现构建)

    • 使用 npm ci:严格按照 package-lock.json 安装,保证 CI 和本地依赖一致。
  4. 构建站点

    • 使用 npx hexo cleannpx hexo generate
      • npx 强制使用项目本地的 node_modules/.bin/hexo,避免全局 hexo-cli 版本漂移。
      • 生成静态产物到 public/
  5. SCP 上传到服务器

    • 使用 appleboy/scp-action@master
      • source: "public/**":上传整个 public 目录结构(包含子目录 tags/categories/ 等)。
      • target: "/home/ubuntu/code/project":服务器上的站点根目录。
      • rm: true:上传前删除目标目录内容,避免旧文件残留。
  6. Reload Nginx

    • 使用 appleboy/ssh-action@master 执行:
      • sudo systemctl reload nginx

常见问题与排查

1) tags/index.htmlcategories/index.html 变成 0 字节

现象:

  • 服务器上 .../tags/index.html 存在但大小为 0,访问 /tags//categories/ 报:
    • directory index of ".../tags/" is forbidden

原因(常见):

  • SCP 上传方式不正确(例如只传 public/*、错误 strip_components、或打包解包异常)导致文件被截断/空文件。

解决思路:

  • source: "public/**" 上传完整目录结构
  • 去掉 strip_components
  • 确认服务器目标目录权限与磁盘空间
2) 权限问题导致 SCP 失败

现象:

  • Action 上传失败,或服务器上手动 touch /home/ubuntu/code/project/_write_testPermission denied

原因:

  • 目录 owner/group 不是 SSH 用户(如 www-data:www-data),SCP 用 ubuntu 写入失败。

解决思路(示例):

  • sudo chown -R ubuntu:ubuntu /home/ubuntu/code/project
  • 或让 ubuntu 加入 www-data 组并给组写权限(更复杂)

工作流 2:同步 Obsidian 笔记(sync-obsidian.yml)

文件:/.github/workflows/sync-obsidian.yml

触发方式

  • 手动触发workflow_dispatch
  • 定时触发:每 6 小时 cron: "0 */6 * * *"
  • 事件钩子触发repository_dispatchevent_type: obsidian_updated

执行步骤与原理

  1. Checkout 站点仓库

    • 拉取站点代码,保证能提交同步结果。
  2. Checkout Obsidian 仓库

    • 使用同一个 actions/checkout@v4 拉取 另一个仓库_obsidian_repo/
    • 关键配置:
      • vars.OBSIDIAN_REPO:形如 owner/repo 的仓库名
      • secrets.OBSIDIAN_TOKEN:访问 Obsidian 仓库的 token(私有仓库必需)
  3. rsync 同步到 source/obsidian/notes/

    • rsync -a --delete:把 Obsidian 仓库内容镜像到目标目录,并删除目标中多余文件,保证一致性。
    • 排除 .git/.github/
  4. 保证入口页存在

    • source/obsidian/index.md 不存在则自动创建,避免只同步 notes 后入口缺失。
  5. 提交并推送

    • git add source/obsidian/notes
    • git commit ...
    • git push

注意:一旦 sync-obsidian.yml 把变更推回站点仓库,通常会触发 deploy.yml(因为是对 main 的 push),从而自动构建并部署。

“钩子”是怎么做到 push 即同步的

推荐链路:

  1. 你本地 Obsidian 笔记仓库 git push 到 GitHub
  2. Obsidian 仓库的 workflow(notify-site.yml)调用 GitHub API:
    • POST /repos/<owner>/litearch/dispatches
    • body:{\"event_type\":\"obsidian_updated\"}
  3. 站点仓库触发 sync-obsidian.ymlrepository_dispatch
  4. sync-obsidian.yml 同步笔记并 push 回站点仓库
  5. 站点仓库 push 触发 deploy.yml,构建并部署到服务器

本地 Obsidian 用 git 同步的推荐习惯

在你的 Obsidian 仓库目录(本地):

git status
git add .
git commit -m "notes: update"
git push

推送成功后,按上面的钩子链路,会自动把内容同步到站点并部署。

关键配置清单(需要在 GitHub 仓库 Settings 里配置)

站点仓库(litearch)

  • Secrets
    • TENCENT_HOST:服务器 IP/域名
    • TENCENT_USER:SSH 用户(如 ubuntu
    • TENCENT_SSH_KEY:SSH 私钥(对应服务器公钥)
    • OBSIDIAN_TOKEN:读取 Obsidian 仓库的 token(如果 Obsidian 仓库私有)
  • Variables
    • OBSIDIAN_REPOowner/repo

Obsidian 笔记仓库

  • Secrets
  • SITE_REPO_TOKEN:能对站点仓库发 repository_dispatch 的 token

六、梳理营销比赛共识

1、开始

我们分别汇报了这两天寻找的关于中兴业务的资料,主要方向是教育方向。我提出了自己的疑问,指出了我们上次达成的关于教育方向的共识有待再次讨论,因为我们忽视了材料当中前面两个线索,就是公司市场份额、公司转型方向、未来盈利模式。

我提出了三个建议,关于线索1和线索2的解读,分别是:

  • 中兴未来算力是新的布局方向
  • 中兴未来需要优化人力成本,让AI降本增效
  • 中兴未来的商业模式需要从管道式、基础设施式,转向生态搭建的模式

中兴国外的主要合作国家地域方面,有南美、中东、非洲、东南亚,分别都有各自的市场份额,这是我们需要重点讨论的。

我提出,公司举办这个比赛的目的,一方面是为了让同学们的一些点子和建议可以作为中兴业务模式优化的方向,另一方面当然就是为了招聘优秀的同学,因此我们在选择主题的时候要充分考虑公司的战略发展方向。

张珈赫同学提出了公司在不同领域的发展基础,尤其在互联网领域、金融领域有非常好的基础,可是在教育领域的投入一般,不算公司的重点考察方向。

2、疑问

我们分别对于上次主题的方向提出了疑问,关于上次主题确定的可行性进行了充分讨论,达成了新的共识–我们需要侧重于商业领域,在营销方面需要侧重于模式更加有创意的领域。

最后我们在经过了2小时的讨论之后,选择了第二个方向即:

2. 固定接入网 AI赋能FTTx:体验、场景、商业模式升级 方向1(网络升级)
方向3(生态转型)
方向4(家宽份额)
⭐⭐⭐⭐⭐ 极高。家宽市场份额目标明确(从57%继续扩大),且CMO强调智慧家庭生态,该议题是“网络能力+商业模式”双轮驱动的绝佳落脚点。

这个方案是一定正确的,不会因为赛题选择得到减分的,我们只需要关注具体的落地方案即可。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com
Obsidian