惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Heimdal Security Blog
A
Arctic Wolf
K
Kaspersky official blog
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Simon Willison's Weblog
Simon Willison's Weblog
L
LINUX DO - 热门话题
MongoDB | Blog
MongoDB | Blog
T
Threat Research - Cisco Blogs
D
Docker
爱范儿
爱范儿
T
Tenable Blog
C
Check Point Blog
B
Blog
C
Cisco Blogs
Vercel News
Vercel News
The Cloudflare Blog
T
Threatpost
NISL@THU
NISL@THU
T
Tor Project blog
V2EX - 技术
V2EX - 技术
P
Palo Alto Networks Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tailwind CSS Blog
G
GRAHAM CLULEY
P
Privacy & Cybersecurity Law Blog
SecWiki News
SecWiki News
博客园 - 司徒正美
S
Security @ Cisco Blogs
GbyAI
GbyAI
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Cloudbric
Cloudbric
Webroot Blog
Webroot Blog
N
News and Events Feed by Topic
Y
Y Combinator Blog
博客园_首页
T
Troy Hunt's Blog
The Hacker News
The Hacker News
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
U
Unit 42
AWS News Blog
AWS News Blog
PCI Perspectives
PCI Perspectives
V
Visual Studio Blog
博客园 - 聂微东
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog 对博客与笔记的思考 | Yesterday17's Blog Project Anni 之旅(3)自动化 Flutter 应用 CI/CD 上架流程 | Yesterday17's Blog AsobiStage 直接播放链接 | Yesterday17 JSON RPC 与 LSP 协议基础 | Yesterday17's Blog Grajapa Shueisha / BookEnd 加密方式调查 | Yesterday17's Blog 【2022篇+WriteUp】如何再收一个新年红包? | Yesterday17's Blog 如何将良心云的良心功能清理干净 | Yesterday17's Blog 【油猴脚本】bilibili 投稿页面返回旧版+旧版页面强制允许分P上传 | Yesterday17's Blog Cloudr1v1 授权方式分析 | Yesterday17 Typora 1.0.2 逆向实录 | Yesterday17's Blog Project Anni 之旅(2)ValueAfterTable——toml-rs的实现与限制 | Yesterday17's Blog IPv4透明代理+IPv6 Passthrough——树莓派单臂软路由折腾记 | Yesterday17's Blog Chaos; Child 汉化补丁 神秘编码探索 | Yesterday17's Blog 镣铐与舞蹈——个性与共性之迷思 | Yesterday17's Blog Go 学习笔记 02 - 找准 io 之道 | Yesterday17's Blog NAT Slipstreaming v1 原理浅析 | Yesterday17's Blog 绕过「9-nine-」的 CDKEY 验证——KrkrPlugin 正(?)向实录 | Yesterday17's Blog 静流的青春纪念册——「サクラノ刻 -櫻の森の下を歩む-」体验版感言 | Yesterday17's Blog Project Anni 之旅 01 - 从 clap-builder 到 derive | Yesterday17's Blog [Google CTF 2021] CPP WriteUp | Yesterday17's Blog 获取 アソビステージ 的实际播放链接 | Yesterday17's Blog 90 行 Rust 代码实现 AsyncTeeReader | Yesterday17's Blog 或许还算有价值一读的文章列表 | Yesterday17's Blog 从零开始的 Seedbox 之旅 | Yesterday17's Blog [随笔]技术型博客行文迷思(1) | Yesterday17's Blog 浅谈 git fetch 的工作方式 | Yesterday17's Blog 『ソーサレス*アライヴ! ~the World's End Fallen Star~』通关感想" | Yesterday17's Blog Rust std::fmt 格式语法简述 | Yesterday17's Blog 日亚修改居住国的解决方案 | Yesterday17's Blog [Windows/Linux] GC553 的 Switch 完美采集之路 | Yesterday17's Blog 【翻译】Subtyping and Variance / 子类型与变型 | Yesterday17's Blog Berd's Red Envelope 2021 WriteUp | Yesterday17's Blog 【中英对照】ALSA 音频 API 使用教程/A Tutorial on Using the ALSA Audio API | Yesterday17's Blog 从 cue_scanner.l 看 CUE Sheet 的词法单元 | Yesterday17's Blog Postman 历史记录导出的解决方案 | Yesterday17's Blog 《恋爱绮谭 不存在的夏天》通关感想 | Yesterday17's Blog [微机实验/TD-PITE] 微机接口综合实验 | Yesterday17's Blog [微机实验/TD-PITE] 键盘扫描及数码管显示实验 | Yesterday17's Blog [微机实验/TD-PITE] 数码管显示实验 | Yesterday17's Blog Airsonic Advanced+Google Drive+Caddy 部署纪实 | Yesterday17's Blog X-NUCA 2020 - hellowasm 题解 | Yesterday17's Blog [微机实验/TD-PITE] 8251 串行接口实验 | Yesterday17's Blog Node.js child_process.fork 与 env 污染 RCE | Yesterday17's Blog EP.01 「夜の向日葵」 | Yesterday17's Blog [微机实验/TD-PITE] 8254 定时/计数器实验+选做实验 | Yesterday17's Blog [JLU CTF/2020] babywasm WriteUp | Yesterday17's Blog PHP 反序列化与经典利用 | Yesterday17's Blog WebAssembly 逆向简述 | Yesterday17's Blog 『彼女、お借りします』一期完结点评 | Yesterday17's Blog [微机实验/TD-PITE] D/A 转换实验+选做实验 | Yesterday17's Blog [微机实验/TD-PITE] A/D 转换实验+选做实验 | Yesterday17's Blog 开源项目申请 JetBrains Open Source License 简单流程 | Yesterday17's Blog 微软拼音与 JetBrains 搜索快捷键冲突的解决方案 | Yesterday17's Blog [微机实验/TD-PITE] 8259 中断优先级实验+选做实验 | Yesterday17's Blog IFTTT 测试(续) | Yesterday17 IFTTT 测试 | Yesterday17's Blog [微机实验/TD-PITE] 存储器扩展实验+选做实验 | Yesterday17's Blog 新版 GCC 针对 -fdump-translation-unit 的替代方案 | Yesterday17's Blog 一次 HSTS 策略配置的排错之旅 | Yesterday17's Blog YukiNative 踩坑记——Windows 的消息队列 | Yesterday17's Blog 我是我自己——论获取 HTTPS 证书时的验证步骤 | Yesterday17's Blog 【设计文档】对 PUG 的大规模设计修订(1.1) | Yesterday17's Blog GS65 折腾记(2)加装固态,分区,Grub2 引导 Manjaro LiveCD | Yesterday17's Blog 「さくら、もゆ。」的空白字体列表——一次逆向问题定位过程实录 | Yesterday17's Blog GSuite 探索篇(1)使用 Service Account 向 Google Drive 传输文件 | Yesterday17's Blog 『サクラノ詩 -櫻の森の上を舞う-』通关感想 | Yesterday17's Blog 《ATRI -My Dear Moments-》通关感想 | Yesterday17's Blog [工具][VSCode 扩展] AegiKit——方便 Aegisub 使用的工具箱 | Yesterday17's Blog 贝塞尔曲线、字体矢量化与曲线运算 | Yesterday17's Blog NAT 类型初探 | Yesterday17's Blog
如何在后分P时代进行投稿——sswa使用详解 | Yesterday17's Blog
Yesterday17 · 2022-05-22 · via Yesterday17's Blog

大家好,好久不见,我是某昨。

众所周知,叔叔在今年的某个时间点悄悄地关闭了分P投稿的入口,目前唯一的分P投稿入口就只有投稿工具和旧版的手机客户端了。由于叔叔在去年某个时候增加的1000粉限制,普通用户本就不能投稿分P;但这次的全量化则是针对所有用户的一击重锤。

西西一哥也没有幸免
西西一哥也没有幸免

由此,sswa 诞生了。sswa 是在 biliup-rs 的基础上进行开发的,为的是符合我个人以及身边一些其他用户的投稿需求。sswa 支持的首要分区为官延区,一切与该分区投稿相关的功能均以最高优先级开发。

ToC

  • 协议相关
  • 下载
  • 登录
  • 配置文件
    • 全局配置
    • 模板配置
    • 模板解析
      • 变量
      • 去除空字符(Trim)
      • 语句
  • 简单投稿
  • 变量文件
    • 简单格式
    • JSON 格式
  • 增加分P

协议相关

biliup-rsMIT 协议开源。与之相对,sswaApache-2.0 协议开源,但其中任意涉及到与 biliup-rs 相关的部分遵循 MIT 协议。为不违反原协议,这个涉及的范围非常广泛。

后续 sswa 可能会将协议修改为 Rust 社区中更常用的 Apache-MIT 双协议。

下载

sswa 仍然处于开发阶段,因此暂时不提供 Release 包下载,但用户可以通过下载 GitHub Action 构建的 nightly 版本体验该工具的功能。

需要注意的是,下载 nightly 构建需要用户在 GitHub 已登录状态下进行。

首先,进入项目的 Actions。项目的 Actions 页为 [https://github.com/Yesterday17/sswa/actions](https://github.com/Yesterday17/sswa/actions),点击进入即可。如下图所示:

然后,点击最上方的 Workflow。例如上图就是点击 skip levels。最后将滚动条拉到页面底部,就可以看到不同平台的构建了。

所有构建均只支持 64 位操作系统,需要 32 位版本的可以手动构建。Linux 构建提供了 GLIBCMUSL 两个版本,可以按需选择。

登录

此处以 Windows 为例,以 me 的身份登录。

会提示需要打开链接登录,在对应的链接中完成登录就可以了。

配置文件

sswa 是为重复投稿设计的,因此存在配置和模板的概念。配置所处的目录可以通过以下命令获得:

这条命令会输出 sswa 使用的配置文件目录,此后对配置文件的修改都需要在该目录中进行,简称为 $HOME

全局配置

全局配置文件存储在 $HOME/config.toml,内容如下:

# 投稿线路

line = "kodo"

# 默认使用的投稿帐号

default-user = "me"

# 是否自动缩放封面(依赖 ffmpeg)

scale-cover = false

通过指定 line 参数,可以手动选择一条投稿线路,供后续使用。建议不使用该项,这样每次投稿前都会对可用的线路进行测速,并选择最优线路投稿。

通过指定 default-user,我们可以省略后续的一些参数。由于上文中登录使用的是 me,因此这里也填写 me

scale-cover 则是自动生成合适大小封面的一个参数。当设置为 true 时,sswa 会针对原图生成适合作为 bilibili 封面的图片。我个人投稿一般会打开这个选项,但它毕竟会对封面图片作一定修改,所以默认值为 false

模板配置

模板配置存储在 $HOME/templates 目录下,须命名为 模板名.toml。一个样例模板内容如下:

# 模板的默认投稿帐号

default-user = "me"

# 标题

title = "【字幕】【偶像大师百万广播{{num}}回】{{title}}【MillionRADIO】"

# 描述

description = '''片源:RabbitC

翻译:{{translators}}

校对:{{jiaodui}}

时间轴:{{subtitle}}'''

# 转载来源,该字段存在且不为空时以转载形式投稿,否则投成自制

forward-source = "765.million"

# 投稿分区

tid = 152

# 封面图片路径

# 当留空或值为 auto 时,自动从第一个视频(不包含前缀视频)中随机提取

cover = '''./

{%-if cover -%}

{{cover}}

{%- else -%}

folder

{%- endif %}/cover.png'''

# 动态文本

dynamic-text = ""

# 标签

tags = ["田所梓", "山崎遥", "麻仓桃", "偶像大师百万广播", "{{guests}}"]

# 定时投稿

display-time = "tomorrow 10:00"

# 前缀视频,在投稿时自动添加在选中视频**前面**

video-prefix = [

# 建议写绝对路径,相对路径是相对命令执行时候的 CWD

"D:\\prefix.mp4",

]

# 后缀视频,在投稿时自动添加在选中视频**后面**

video-suffix = []

# 变量对应的解释文本,在需要用户手动输入时作为提示文本展示

[variables]

translators = "翻译"

jiaodui = "校对"

subtitle = "时间轴"

guests = "嘉宾 Tag"

[variables.num]

description = "广播回数"

# 变量的默认值

default = "123"

[variables.title]

description = "标题"

default = "默认标题"

[variables.cover]

description = "封面图片目录"

# 当未提供时 变量是否必须填写

can-skip = true

模板解析

sswa 的模板功能基于 [TinyTemplate](https://github.com/bheisler/TinyTemplate) 修改而来,支持变量、条件语句等。目前除 default-user 之外的所有字段均已支持模板字符串。

变量

嵌入变量的格式为 {{变量名}}。如上文中的 {{ s7i }}sswa 自带了部分系统变量,以 $ 字符开头,如下表所示:

变量名说明
$config_rootsswa 配置文件的根目录
$file_name第一个投稿视频的文件名(包含后缀名)
$file_stem第一个投稿视频的文件名(不包含后缀名)
$file_pwd第一个投稿视频所在的目录

一个使用了较多变量的例子如下:

# 以去除扩展名的第一个文件的文件名为标题

title = "{{$file_stem}}"

description = "上传文件名:{{ss_file_name}},包含扩展名"

tid = 152

# 封面为 config 目录下的 cover.jpg

cover = "{{$config_path}}/cover.jpg"

dynamic-text = ""

video-prefix = [

# 第一个视频同目录下的 prefix.mkv

"{{$file_pwd}}/prefix.mkv",

# 重复上传一遍第一个视频(很神秘)

"{{$file_pwd}}/{{$file_name}}",

]

去除空字符(Trim)

上文中的 {{}}{%%} 旁边有一个字符 -,这个字符就是用来去除空字符的。空字符包括空格、换行、制表符等,- 字符在哪一侧,就去除哪一侧的空字符。

以下面的模板为例,假设 s7i 的内容为 s7i,则输出的内容为 s7i123。如果没有 -,输出的内容则是 s7i 123- 去除了 <空格>123 字符串中靠近 {{ s7i }} 部分的空字符。

语句

语句以 {% 开始,%} 结束。条件语句包括 {% if <condition> %}{% else %}{% endif %}

如下文中的 dynamic-text 就使用了 s7i 变量。当该变量存在时,动态的文本为 私は妻の(s7i的内容)を愛しています。

title = "Title"

description = '''Description'''

tid = 152

cover = "./cover.jpg"

dynamic-text = "{% if s7i -%} 私は妻の {{- s7i -}} を愛しています。{%- endif %}"

简单投稿

对于基本的投稿,可以通过以下命令完成。

./sswa.exe upload -t 模板名 视频1.mkv 视频2.mp4

当模板中存在变量时,sswa 会提示用户输入变量。所有变量均输入完成后,会向用户展示投稿内容,并要求用户复核。

复核通过后,sswa 会对视频和封面进行上传,之后要做的就只有等待了。

变量文件

通过命令行的提示输入变量内容固然可取,但一旦出现问题,所有的内容就需要重新输入一遍,有点麻烦。所以 sswa 支持通过变量文件的方式指定变量的内容,并通过 -f 指定变量文件的路径。

简单格式

变量文件的简单格式是以行为单位的 key=value 格式。如下例:

# 注释

num=459

title=炸红薯条与mocho认证食品

translators=名羊茨尔戈 千和铭 Yuki MochizukiShigure 悠风

jiaodui=てい

subtitle=某昨P

date=2022-04-14

cover=nagian-2.jpeg

# 开头的行是注释,不会被解析;普通的变量行则是 key=value 的形式进行解析,value 部分的 \n 会被替换成换行

参数 --quote 用于控制 value 部分单双引号的处理行为。当未指定时,value 部分的成堆引号将会被移除,以保持和旧版 env 行为的一致。

JSON 格式

当变量文件的第一个字符为 { 时,会以 JSON 格式进行解析。JSON 格式下的变量不会被作任何特殊处理。

增加分P

对使用了 sswa 投稿的视频,如果投稿用户的粉丝数量在 1000 以上,即可通过网页端添加分P。但其他情况下,分P是无法增加的。因此 sswa 提供了添加分P 的功能。命令如下:

./sswa.exe append -v <视频ID> test.mp4

其中的 <视频ID> 使用 av 号或 BV 号均可。