From aac93b397019af1a19724565283568f19d8317cb Mon Sep 17 00:00:00 2001 From: Nofated095 Date: Sun, 22 Jan 2023 02:43:00 +0800 Subject: [PATCH] update tags --- source/_drafts/bjwz-tree-hole.md | 212 +++---------------------------- source/_drafts/gridea-gitee.md | 121 ------------------ source/_drafts/xiaoguanjiaapi.md | 5 +- source/_posts/bilibili-player.md | 4 +- source/_posts/windows-to-go.md | 17 ++- 5 files changed, 28 insertions(+), 331 deletions(-) delete mode 100644 source/_drafts/gridea-gitee.md diff --git a/source/_drafts/bjwz-tree-hole.md b/source/_drafts/bjwz-tree-hole.md index a7c1a99..9db0d43 100644 --- a/source/_drafts/bjwz-tree-hole.md +++ b/source/_drafts/bjwz-tree-hole.md @@ -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' + - '请选择工作模式,关于工作模式的区别请查看这里', [ - [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)。 +## 用户反馈与优化 diff --git a/source/_drafts/gridea-gitee.md b/source/_drafts/gridea-gitee.md deleted file mode 100644 index aa5a461..0000000 --- a/source/_drafts/gridea-gitee.md +++ /dev/null @@ -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。 - -{% raw %}
{% 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 %}
{% 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 - // 5行 - Github Pages - Coding Pages -+ Gitee Pages - SFTP - - - - - --