update tags

This commit is contained in:
Nofated095 2023-01-22 02:43:00 +08:00
parent dbf37cf21b
commit aac93b3970
5 changed files with 28 additions and 331 deletions

View File

@ -27,13 +27,13 @@ toc: true
最后还是郑老师出的招,人工收集帖子然后发到他小号朋友圈。一开始我不是很喜欢这个方法,但是确实没有什么自动化的功能,考虑到那时候我觉得可能树洞项目会和我的博客评论一样冷清,于是便麻烦郑老师去手动转。
# 前端设计
## 前端设计
后端是采用的 *Waline*,在事后的角度出发,当时选择他切切实实是没错的。但是前端设计将会怎样呢?
最开始我想的是直接用 *Waline Example*,也就是他部署完在根目录默认会提供的一个评论区示例。这个方法使用了一段时间我的眼睛就受不了了,又是默认英文,还有各种不顺眼的地方,而且空空荡荡,过于简洁,无法自定义其他内容,属实令人难蚌。
![]()
![Waline Example]()
所以到最后,还是我出手写了前端,也不能算前端吧,就是一个 HTML 5 的页面,这样通过引入就可以实现固定内容 + 评论区这样的排版了。
@ -45,210 +45,28 @@ toc: true
有意思的是, 20 号夜里郑老师在动漫社微信群里水了一下树洞的开发情况,说明了要大年初一上线后,一大群同学们听说~~表白墙~~搞完了,纷纷提出要~~内测资格~~。而且真的想体验的人还很多,于是乎,~~迫于无奈,~~ 郑老师官宣了树洞的网址,大家可以在微信里内置浏览器里直接发帖。
## 分析与修改代码
## 非同凡响的热度
[Clansty/Q2TG](https://github.com/Clansty/Q2TG) 的最新版本 `v3`,也就是 `rainbowcat` 是基于 *TypeScript* 开发的。那就开始吧!但是从哪里开始呢?在随意翻看了几个文件后,我将视线锁定在了 `tgUser` 这个变量上。~~因为写的真的太明显了,简直就是一眼丁真。~~
在地址开放之后,好多同学纷纷来到树洞~~来测试、表白、发癫~~。在写前端的时候,我在上方的说明部分添加了一个统计信息的栏,来统计访问次数和评论数量,这样能很直观地看到访问量相关的数据。
于是我尝试在 GitHub 搜索了一下,没想到就可以直接开始肝了(
>确实是“非同凡响”,为之震撼的使用量。
![](https://imgsrc.baidu.com/super/pic/item/377adab44aed2e739f6b04e9c201a18b86d6fa71.jpg)
非同凡响可能有点偏主观,但是我盯着树洞前端刷新了几次,评论数量和访问量真的是增长的很快,这是最开始开放时同学们表达的最强烈的时候。
### ❌ 脑瘫思路 —— Undefined
当天晚上,评论就已经有 150 多条了,因为我基本上不需要再做什么调整,所以满怀着激动,安心了下来。
分析了一下之后,我就打算开始着手删掉 `tgUser` 相关的内容。但在删到快一半的时候,我突然~~脑溢血地~~想到,如果我们在功能实现的部分保留所有的 `tgUser`,但是我们让他 `Undefined`,会不会就能直接非常方便地 disable 掉 User Bot 呢?(逃
![数据库统计的上线当天的评论总数]()
然后我就真的大智若愚(大若智)地去试了
令人捧腹的是,因为评论的数量太多,亲爱的郑老师非常崩溃地复制粘贴,工作量巨大。并且因为是一条评论一个朋友圈,所以他小号还顺便朋友圈刷屏了(笑
很容易猜到 `tgUser` 应该是在机器人第一次配置的时候就被定义了,所以我就打算去 `SetupControlers.ts` 看看能不能在这里动动手脚,跳过里面地 User Bot 登录过程。
![郑老师崩溃瞬间(乐]()
```ts SetupControlers.ts>folded
import Telegram from '../client/Telegram';
import SetupService from '../services/SetupService';
import { Api } from 'telegram';
import { getLogger, Logger } from 'log4js';
import { Button } from 'telegram/tl/custom/button';
import setupHelper from '../helpers/setupHelper';
import commands from '../constants/commands';
import { WorkMode } from '../types/definitions';
import OicqClient from '../client/OicqClient';
import { md5Hex } from '../utils/hashing';
import Instance from '../models/Instance';
import db from '../models/db';
## 评论监测与审核
export default class SetupController {
private readonly setupService: SetupService;
private readonly log: Logger;
private isInProgress = false;
private waitForFinishCallbacks: Array<(ret: { tgUser: Telegram, oicq: OicqClient }) => unknown> = [];
// 创建的 UserBot
private tgUser: Telegram;
private oicq: OicqClient;
由于树洞的特殊性,只是排除黄赌毒的内容并不够,需要再排除各种开盒、水贴、不尊重老师的内容。这个时候单靠自动审核(其实也没有)就远远达不到目的,必须引入人工审核。
constructor(private readonly instance: Instance,
private readonly tgBot: Telegram) {
this.log = getLogger(`SetupController - ${instance.id}`);
this.setupService = new SetupService(this.instance, tgBot);
tgBot.addNewMessageEventHandler(this.handleMessage);
tgBot.setCommands(commands.preSetupCommands, new Api.BotCommandScopeUsers());
}
最开始所有网页端的评论都是我审核、删除,郑老师把控微信朋友圈那边的。流量不大,我审核起来也很轻松。后来又有两个好朋友过来,想要帮忙审核,我就让他们注册账号,提拔他们为管理员权限,他们就也来帮我审核了,也很轻松,因为 *Waline* 前端写的很容易操作。
private handleMessage = async (message: Api.Message) => {
if (this.isInProgress || !message.isPrivate) {
return false;
}
似乎我的工作到这里就完了,~~只要看着数据库会不会爆炸就行了。~~但实际上并没有完。因为很快便有用户提出了新的问题。
if (message.text === '/setup' || message.text === '/start setup') {
this.isInProgress = true;
await this.doSetup(Number(message.sender.id));
await this.finishSetup();
return true;
}
return false;
};
private async doSetup(ownerId: number) {
// 设置 owner
try {
await this.setupService.claimOwner(ownerId);
}
catch (e) {
this.log.error('Claim Owner 失败', e);
this.isInProgress = false;
throw e;
}
// 设置工作模式
let workMode: WorkMode | '' = '';
try {
while (!workMode) {
const workModeText = await this.setupService.waitForOwnerInput('欢迎使用 Q2TG v2\n' +
'请选择工作模式,关于工作模式的区别请查看<a href="https://github.com/Clansty/Q2TG#%E5%85%B3%E4%BA%8E%E6%A8%A1%E5%BC%8F">这里</a>', [
[Button.text('个人模式', true, true)],
[Button.text('群组模式', true, true)],
]);
workMode = setupHelper.convertTextToWorkMode(workModeText);
}
this.setupService.setWorkMode(workMode);
}
catch (e) {
this.log.error('设置工作模式失败', e);
this.isInProgress = false;
throw e;
}
// 登录 oicq
try {
let uin = NaN;
while (isNaN(uin)) {
uin = Number(await this.setupService.waitForOwnerInput('请输入要登录 QQ 号'));
}
const platformText = await this.setupService.waitForOwnerInput('请选择登录协议', [
[Button.text('安卓手机', true, true)],
[Button.text('安卓平板', true, true)],
[Button.text('iPad', true, true)],
[Button.text('macOS', true, true)],
]);
const platform = setupHelper.convertTextToPlatform(platformText);
let password = await this.setupService.waitForOwnerInput('请输入密码', undefined, true);
password = md5Hex(password);
this.oicq = await this.setupService.createOicq(uin, password, platform);
this.instance.qqBotId = this.oicq.id;
await this.setupService.informOwner(`登录成功`);
}
catch (e) {
this.log.error('登录 OICQ 失败', e);
this.isInProgress = false;
throw e;
}
// 登录 tg UserBot
if (this.instance.userSessionId) {
await this.setupService.informOwner('userSessionId 已经存在,跳过');
}
else
try {
const phoneNumber = await this.setupService.waitForOwnerInput('创建 Telegram UserBot请输入你的手机号码需要带国家区号例如+86');
await this.setupService.informOwner('正在登录,请稍候…');
this.tgUser = await this.setupService.createUserBot(phoneNumber);
this.instance.userSessionId = this.tgUser.sessionId;
await this.setupService.informOwner(`登录成功`);
}
catch (e) {
this.log.error('创建 UserBot 失败', e);
this.isInProgress = false;
throw e;
}
}
private async finishSetup() {
this.tgBot.removeNewMessageEventHandler(this.handleMessage);
this.isInProgress = false;
await this.setupService.finishConfig();
this.waitForFinishCallbacks.forEach(e => e({
tgUser: this.tgUser,
oicq: this.oicq,
}));
}
public waitForFinish() {
return new Promise<{ tgUser: Telegram, oicq: OicqClient }>(resolve => {
this.waitForFinishCallbacks.push(resolve);
});
}
}
```
可以很清楚看到 *99 - 144* 行是注册 Telegram User Bot 的部分,那我们简单修改一下。
```diff 99 - 144
// 登录 tg UserBot
if (this.instance.userSessionId) {
await this.setupService.informOwner('userSessionId 已经存在,跳过');
}
- else
- try {
- const phoneNumber = await this.setupService.waitForOwnerInput('创建 Telegram UserBot请输入你的手机号码需要带国家区号例如+86');
- await this.setupService.informOwner('正在登录,请稍候…');
- this.tgUser = await this.setupService.createUserBot(phoneNumber);
- this.instance.userSessionId = this.tgUser.sessionId;
- await this.setupService.informOwner(`登录成功`);
- }
+ else {
+ await this.setupService.informOwner('Telegram User Bot 创建过程跳过');
+ }
catch (e) {
this.log.error('创建 UserBot 失败', e);
this.isInProgress = false;
throw e;
}
```
非常好,不是吗?于是我就乐呵的跑了 GitHub Actions 构建 Docker Image然后发现居然还真构建成功了于是我就更乐呵的去 `/setup` 我的机器人,没想到也正常跳过了!
当然这么改别的肯定是寄的,测试了一下转发功能完全废的。为什么相比也很清楚。~~你 `Undefined` 别的文件肯定不服会罢工啊!~~
### ✔️ 正确的打开方式 —— 扬了 tgUser
在经历了全程脑瘫的过程后,我终于稍微清醒和安分了一点,开始着手去删 `tgUser` 和与其相关的部分。
当然这里要非常感谢 [凌莞](https://github.com/Clansty),看着亲爱的代码真是赏心悦目,如看代码眼暂冥,~~简直就是天籁~~。
在修改时,我发现 `personal` 代表个人模式,再结合 `tgUser` 的分布情况,可以很轻松的注释掉大部分有关代码,遇到与个人模式有关的部分都可以直接注释掉,只要符合语法就不会对群组模式产生奇奇怪怪的影响。
你可以在 [这里](https://github.com/Clansty/Q2TG/compare/rainbowcat...Nofated095:Q2TG:rainbowcat?expand=1) 找到我对 *Q2TG* 所有的修改。
## 功能测试
在构建 Image 完成后,我激动地~~关掉了 `v1` 的 Container~~ 在服务器上拉取并部署。
![部署过程](https://imgsrc.baidu.com/super/pic/item/b58f8c5494eef01fa2599500a5fe9925bd317da2.jpg)
![正常工作的瞬间](https://imgsrc.baidu.com/super/pic/item/4e4a20a4462309f7af2920d7370e0cf3d6cad6b5.jpg)
~~真是感动到让人落泪~~。
![文件转发](https://imgsrc.baidu.com/super/pic/item/2cf5e0fe9925bc31c1e08c5d1bdf8db1ca1370b2.jpg)
## 后记
这篇文章写于部署成功后的几天。经过了几天的功能测试,除了机器人无法检测 *Telegram* 删除的消息,需要用户对发出的消息编辑或回复 `/rm` 才能删除和撤回消息,但整体来看功能都是正常可以使用的,而且完全去除了 User Bot。
需要注意的是,去除了 User Bot 后,个人模式几乎无法工作。更多关于去 User Bot 的 Q2TG 项目的内容(包括部署方法、注意事项等)请查看 [Nofated095/Q2TG](https://github.com/Nofated095/Q2TG)。
## 用户反馈与优化

View File

@ -1,121 +0,0 @@
---
title: Gridea 魔改使其支持 Gitee Pages
cover: https://pic.rmb.bdstatic.com/bjh/0d9eb92f67ba93b514f2555a70eacebe.png
date: 2020-05-09
tags:
- Gridea
- 博客
categories:
- 写 BUG 日常
- 野生技术协会
---
Gridea 是一款很好用的博客写作软件。它功能全面但可惜部署不支持国内的 Gitee 代码储存仓库。本篇文章将对 Gridea 进行源码上的修改使其支持 Gitee Pages。
<!--more-->
{% raw %}<article class="message is-info"><div class="message-body">{% endraw %}
这篇文章中对 Gridea 的修改已经合并到 Gridea 再 GitHub 仓库的主分支,所以没有必要再进行下面的处理。
你可以去 Gridea 的 [Releses](https://github.com/getgridea/gridea/releases/latest) 中下载 Gridea 的最新构建。
Gitee Pages 的支持在 [v0.9.3](https://github.com/getgridea/gridea/releases/tag/v0.9.3) 中被加入。
{% raw %}</div></article>{% endraw %}
## 教程
### 克隆源代码
```
# Github 官方
git clone https:/github.com/getgridea/gridea.git
# Gitee 镜像
git clone https://gitee.com/mirrors/gridea.git
# Gitee
git clone https://gitee.com/fehey/gridea.git
```
以上四个仓库都是可以的。你可以自行选择。
```
# 进入 Gridea 的目录
cd gridea
```
## 修改源码
``` diff src/server/deploy.ts >folded
this.platformAddress = ({ // 18行
github: 'github.com',
coding: 'e.coding.net',
+ gitee: 'gitee.com',
} as any)[setting.platform || 'github']
const preUrl = ({
github: `${setting.username}:${setting.token}`,
coding: `${setting.tokenUsername}:${setting.token}`,
+ gitee: `${setting.username}:${setting.token}`,
} as any)[setting.platform || 'github']
this.remoteUrl = `https://${preUrl}@${this.platformAddress}/${setting.username}/${setting.repository}.git`
```
``` diff src/server/events/deploy.ts>folded
ipcMain.removeAllListeners('remote-detected') // 17行
ipcMain.on('site-publish', async (event: IpcMainEvent, params: any) => {
+ console.log(platform)
const client = ({
'github': deploy,
'coding': deploy,
+ 'gitee': deploy,
'sftp': sftp,
} as any)[platform]
const client = ({ // 38行
'github': deploy,
'coding': deploy,
+ 'gitee': deploy,
'sftp': sftp,
} as any)[platform]
const result = await client.remoteDetect()
event.sender.send('remote-detected', result)
})
```
``` diff src/views/setting/includes/BasicSetting.vue >folded
<a-radio-group name="platform" v-model="form.platform"> // 5行
<a-radio value="github">Github Pages</a-radio>
<a-radio value="coding">Coding Pages</a-radio>
+ <a-radio value="gitee">Gitee Pages</a-radio>
<a-radio value="sftp">SFTP</a-radio>
</a-radio-group>
</a-form-item>
<a-input v-model="form.domain" placeholder="mydomain.com" style="width: calc(100% - 96px);" />
</a-input-group>
</a-form-item>
- <template v-if="['github', 'coding'].includes(form.platform)">
+ <template v-if="['github', 'coding', 'gitee'].includes(form.platform)">
<a-form-item :label="$t('repository')" :labelCol="formLayout.label" :wrapperCol="formLayout.wrapper" :colon="false">
<a-input v-model="form.repository" />
</a-form-item>
export default class BasicSetting extends Vue {
&& form.branch // 134行
&& form.username
&& form.token
- const pagesPlatfomValid = baseValid && (form.platform === 'github' || (form.platform === 'coding' && form.tokenUsername))
+ const pagesPlatfomValid = baseValid && (form.platform === 'gitee' || form.platform === 'github' || (form.platform === 'coding' && form.tokenUsername))
const sftpPlatformValid = ['sftp'].includes(form.platform)
&& form.port
```
## 测试与编译
``` 需要安装 yarn 和 electron
yarn
# 测试
yarn electron:serve
# 生成
yarn electron:build
```

View File

@ -1,9 +1,10 @@
---
title: 开发树洞有感
title: 记一次探索班级小管家 API 的过程
date: 2023-01-22
cover: https://pic.rmb.bdstatic.com/bjh/a5a79c32320475bd69aed54f5371065a.png
tags:
- 总结
- 网络
- API
categories:
- [写 BUG 日常, 野生技术协会]
- [日常生活, 学业, 高中]

View File

@ -3,8 +3,8 @@ title: B 站外嵌视频播放器防踩坑
date: 2020-09-21
cover: https://pic.rmb.bdstatic.com/bjh/c6d5d344aef87ec4511ff2521dd304bd.jpeg
tags:
- HTML5
- Bilibili
- 网络
- API
categories:
- 写 BUG 日常
- 野生技术协会

View File

@ -4,32 +4,31 @@ date: 2022-03-13
cover: https://pic.rmb.bdstatic.com/bjh/b091de2c1d546bbf6311fe5ca744014a.png
tags:
- Windows
- WinToGo
- 总结
categories:
- 写 BUG 日常
- 野生技术协会
toc: true
---
折腾 WinToGo 路上踩过的坑。
折腾 Windows To Go 路上踩过的坑。
<!--more-->
> 为了方便,这篇文章中的 Windows To Go 将统一表示为 WinToGo。本人为 WinToGo 轻度使用用户,也不是折腾类型的人,下面内容仅供参考。
> 本人为 Windows To Go 轻度使用用户,也不是折腾类型的人,下面内容仅供参考。
## 硬盘
我觉得 WinToGo 最重要的部分就是硬盘的选择,并不是所有的储存设备都能跑 WinToGo。如果你没有读写效率比较高的固态盘那我并不建议你去制作并使用 WinToGo——卡得不成样子非常让人难受所以不要指望你那小小的移动硬盘能用柔弱的身躯带 WinToGo。比如我目前使用的是联想thinkplus移动固态闪存优盘系统整体使用感觉非常好制作起来也很快很方便。
我觉得 Windows To Go 最重要的部分就是硬盘的选择,并不是所有的储存设备都能跑 Windows To Go。如果你没有读写效率比较高的固态盘那我并不建议你去制作并使用 Windows To Go——卡得不成样子非常让人难受所以不要指望你那小小的移动硬盘能用柔弱的身躯带 Windows To Go。比如我目前使用的是联想thinkplus移动固态闪存优盘系统整体使用感觉非常好制作起来也很快很方便。
## 系统
这也是 WinToGo 相当重要的一部分。一般来说,我会推荐 Windows 21H2 LTSC 版本。企业版带给人清爽、愉快的操作系统使用体验。并且镜像体积略小于 Windows 10 / 11 的零售版,可能如果 U 盘体积小的可以考虑。
那 Windows 7 / 8.1 是否合适去制作 WinToGo 呢我认为并不合适。虽然这两个系统带来了光辉岁月但他们已经比较过时了。Windows 7 本质上不支持 UEFI 的安全启动,而且硬件厂商正在缩小这些老系统的存活率,这些老系统在一些老机子上跑肯定是没问题的,但放在技术不断发展的今天,用老系统制作 WinToGo 并不是一个合理的选择。
这也是 Windows To Go 相当重要的一部分。一般来说,我会推荐 Windows 21H2 LTSC 版本。企业版带给人清爽、愉快的操作系统使用体验。并且镜像体积略小于 Windows 10 / 11 的零售版,可能如果 U 盘体积小的可以考虑。
那 Windows 7 / 8.1 是否合适去制作 Windows To Go 呢我认为并不合适。虽然这两个系统带来了光辉岁月但他们已经比较过时了。Windows 7 本质上不支持 UEFI 的安全启动,而且硬件厂商正在缩小这些老系统的存活率,这些老系统在一些老机子上跑肯定是没问题的,但放在技术不断发展的今天,用老系统制作 Windows To Go 并不是一个合理的选择。
## 制作软件
市面上可选的 WinToGo 制作软件并不少DISM++Refus 等等都是不错的选择。但我认为最好的是萝卜头IT论坛里的 WTGA因为它操作起来相当简洁和其他许多软件一样它也适用系统自带的 DISM 镜像部署功能。并且可自定义度高,也很绿色无公害。并且许多软件并不把我的固态 U 盘当作 U 盘,只有 WTGA 没有这个毛病。
市面上可选的 Windows To Go 制作软件并不少DISM++Refus 等等都是不错的选择。但我认为最好的是萝卜头IT论坛里的 WTGA因为它操作起来相当简洁和其他许多软件一样它也适用系统自带的 DISM 镜像部署功能。并且可自定义度高,也很绿色无公害。并且许多软件并不把我的固态 U 盘当作 U 盘,只有 WTGA 没有这个毛病。
顺便提一句,现在 Legacy 启动的主板越来越少,制作 UEFI 单启动也是一个合理的选择。当然,对于接触不同型号电脑比较多的我还是选择 Legacy + UEFI 双启动的模式。
## 系统使用体验
往往制作 WinToGo 并不难,给不同电脑打补丁往往才是最蛋疼的部分。往往 Windows Update 可以解决这个问题但请注意Windows Update 往往也有固件方面的更新,请谨慎进行更新和升级,以免刷坏固件,这样可就不好玩了。
不同人使用 WinToGo 有不同的意图。比如我主要以打游戏、写程序和更新文章为主。所以 Office 啥的我都不需要,主要是为了给并不充裕的空间留下更多的地方来以备不时之需。对系统空间使用要尽可能把握好,尽量不要留下一些可有可无的冗余软件。
往往制作 Windows To Go 并不难,给不同电脑打补丁往往才是最蛋疼的部分。往往 Windows Update 可以解决这个问题但请注意Windows Update 往往也有固件方面的更新,请谨慎进行更新和升级,以免刷坏固件,这样可就不好玩了。
不同人使用 Windows To Go 有不同的意图。比如我主要以打游戏、写程序和更新文章为主。所以 Office 啥的我都不需要,主要是为了给并不充裕的空间留下更多的地方来以备不时之需。对系统空间使用要尽可能把握好,尽量不要留下一些可有可无的冗余软件。