梦想走过的地方 https://blog.asbid.cn/ zh-CN 一起来吃黑苹果 Sat, 07 Sep 2024 10:41:00 +0800 Sat, 07 Sep 2024 10:41:00 +0800 <span style="color:red">[置顶]</span>Bear - Typecho 主题 https://blog.asbid.cn/post/583.html https://blog.asbid.cn/post/583.html Sat, 06 Jul 2024 08:47:00 +0800 老孙 介绍

看到bearblog 这个简洁的只剩下css的皮
移植而来

演示

https://b.imsun.org

下载

bear.zip

]]>
0 https://blog.asbid.cn/post/583.html#comments https://blog.asbid.cn/feed/
通过QQ机器人转发到Memos https://blog.asbid.cn/post/592.html https://blog.asbid.cn/post/592.html Sat, 07 Sep 2024 10:41:00 +0800 老孙 最近发现了一个方便自己部署的基于QQNT的QQ机器人项目.
于是有了该文章

项目地址

https://github.com/super1207/install_llob/releases

使用步骤

  1. 下载llob_install.exe
  2. 下载最新版本的QQ
  3. 安装llob_install.exe,重启QQ

参照文档安装NONEBOT
需要准备
Python3.11以上版本

安装脚手架​

安装 pipx

python -m pip install --user pipx
python -m pipx ensurepath

安装脚手架

pipx install nb-cli

创建项目​

nb create

按照提示操作

  1. 项目模板[?] 选择一个要使用的模板: bootstrap (初学者或用户)
  2. 项目名称[?] 项目名称: memos
  3. 其他选项 请注意,多选项使用空格选中或取消,回车确认。 [?] 要使用哪些驱动器? FastAPI (FastAPI 驱动器)
    [?] 要使用哪些适配器? Console (基于终端的交互式适配器)
    [?] 立即安装依赖? (Y/n) Yes
    [?] 创建虚拟环境? (Y/n) Yes
  4. 选择内置插件[?] 要使用哪些内置插件? echo

运行项目​

在项目创建完成后,你可以在项目目录中使用以下命令来运行项目:

nb run

设置反向WS

ws://127.0.0.1:8080/onebot/v11/ws

m0rhmj15.png

保存.即可
此处参照文档 https://llonebot.github.io/zh-CN/guide/configuration

插件

给QQ机器人增加发送到memos 的功能
在nonebot的项目memos下

新建bot.py

内容为

import nonebot
from nonebot.adapters.onebot.v11 import Adapter as ONEBOT_V11Adapter

# 初始化 NoneBot
nonebot.init()

# 注册适配器
driver = nonebot.get_driver()
driver.register_adapter(ONEBOT_V11Adapter)

# 在这里加载插件
nonebot.load_builtin_plugins("echo")  # 加载内置插件
nonebot.load_from_toml("pyproject.toml")  # 从 toml 文件加载插件

# 如果有额外的插件目录,可以这样加载
# nonebot.load_plugins("src/plugins")

if __name__ == "__main__":
    nonebot.run()

pyproject.toml中加入

plugins = []
plugin_dirs = ["memos/plugins"]

在项目目录下创建memos/plugins文件夹,在其下创建qq_to_memos.py
内容为

from nonebot import on_command, on_message, get_driver
from nonebot.rule import to_me
from nonebot.adapters.onebot.v11 import Bot, Event, Message
from nonebot.params import CommandArg
import json
import os
import httpx
from typing import Dict, Any
import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='memos_bot.log',
    filemode='a'
)
logger = logging.getLogger(__name__)

# 文件路径
JSON_FILE = "users_data.json"

# 读取 JSON 数据
def read_json() -> Dict[str, Any]:
    if os.path.exists(JSON_FILE):
        with open(JSON_FILE, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {}

# 写入 JSON 数据
def write_json(data: Dict[str, Any]):
    with open(JSON_FILE, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

# 初始化函数
async def init():
    if not os.path.exists(JSON_FILE):
        write_json({})
        logger.info(f"Created new JSON file: {JSON_FILE}")

# 注册命令
start = on_command("start", rule=to_me(), priority=5)

@start.handle()
async def handle_start(bot: Bot, event: Event, args: Message = CommandArg()):
    user_id = event.get_user_id()
    token = args.extract_plain_text().strip()
    if not token:
        await start.finish("请提供 Token,格式:/start <token>")
        logger.warning(f"User {user_id} failed to start due to missing token")
        return

    users_data = read_json()
    users_data[user_id] = {"token": token}
    write_json(users_data)

    logger.info(f"User {user_id} started successfully")
    await start.finish("绑定成功!现在您可以直接发送消息,我会将其保存到 Memos。")

# 处理所有消息
memo = on_message(priority=5)

@memo.handle()
async def handle_memo(bot: Bot, event: Event):
    user_id = event.get_user_id()
    message = event.get_message()

    users_data = read_json()
    user_info = users_data.get(user_id)

    if not user_info:
        await memo.finish("您还未绑定,请先使用 /start <token> 命令绑定。")
        logger.warning(f"Unstarted user {user_id} attempted to send a memo")
        return

    token = user_info["token"]

    text_content = message.extract_plain_text()

    # 如果消息为空,不处理
    if not text_content.strip():
        return

    # 发送到 Memos
    async with httpx.AsyncClient() as client:
        try:
            payload = {
                "content": text_content.strip(),
                "visibility": "PUBLIC"
            }
            response = await client.post(
                "https://memos.ee/api/v1/memos",
                json=payload,
                headers={"Authorization": f"Bearer {token}"}
            )
            response.raise_for_status()
            logger.info(f"Memo sent successfully for user {user_id}")

        except httpx.HTTPStatusError as e:
            logger.error(f"HTTP error occurred for user {user_id}: {e}")
            logger.error(f"Response content: {e.response.text}")
            await memo.finish(f"发送失败,错误代码:{e.response.status_code},请检查您的 Token 和网络连接。")
            return
        except Exception as e:
            logger.error(f"Unexpected error occurred for user {user_id}: {e}")
            await memo.finish("发送过程中发生意外错误,请稍后重试。")
            return

    await memo.finish("已成功发送到 Memos!")

# 获取驱动器并注册启动事件
driver = get_driver()
driver.on_startup(init)

logger.info("Memos bot plugin initialized")

API端点按自己需求更改即可.

运行机器人

nb run

此时QQ机器人已经正常启动了.

使用机器人

在聊天界面 使用命令

/start token

{message type="success" content="token和/start之间有空格隔开"/}
显示绑定成功
m0ri3bx6.png

此时发送消息即可转发到memos.且默认为公开的memos.

如需默认为其他状态 需修改 "visibility" 的 值 .

成功演示 https://memos.ee/m/oEBkwymeQTb6fRUeEcA9m5
m0ri6csq.png

如果你想尝试一下此功能可以添加QQ机器人

122790336

需添加为好友且 在 https://memos.ee 注册获取token才可以使用.

]]>
0 https://blog.asbid.cn/post/592.html#comments https://blog.asbid.cn/feed/
黑群晖DSM7.2激活Active Backup for Business(ABB)套件的方法 https://blog.asbid.cn/post/591.html https://blog.asbid.cn/post/591.html Fri, 23 Aug 2024 14:54:00 +0800 老孙 具体步骤

安装套件

安装 ABB 套件 打开 关闭

访问

依次在浏览器输入

http://IP地址:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=管理员用户名&passwd=管理员用户密码&format= cookie

返回

{"data":{"did":"jqsoZU8SFKoZXsTCKt_n_xOpePvLONWzkP_W8cogbfnfRTDY-7juADOxNGw1mvPJLPNFfVwr-QjRbjVVoIageQ","sid":"6NeenURwdyzkUH9Q8kxwi3MqjLSpXOI_lHj09vTd0Cco2Cfc5Z24Gi635ZTelDvL5tmlfMkr-kdHCwKS2QNMeM"},"success":true}
http://ip:5000/webapi/entry.cgi?api=SYNO.ActiveBackup.Activation&method=set&version=1&activated=true&serial_number=%22序列号%22

返回

{"data":{"activated":true},"success":true}
]]>
0 https://blog.asbid.cn/post/591.html#comments https://blog.asbid.cn/feed/
通过取子集的方式压缩霞鹜文楷字体 https://blog.asbid.cn/post/590.html https://blog.asbid.cn/post/590.html Thu, 22 Aug 2024 16:49:00 +0800 老孙 使用python

这里使用到的是Python 的库:fonttools

使用最新版 Python 的 pip 命令安装即可在 Shell 中使用:

pip install fonttools

常用汉字大约有3500字
我使用的是这个现代汉语常用 3500 字.txt
中文常用字库项目https://github.com/DavidSheh/CommonChineseCharacter

取子集

使用以下命令即可对字体文件取子集

fonttools subset "$input_file" --text-file="$text_file" --output-file="$output_file"

其中
$input_file:输入的字体文件。
$text_file:定义保留字符的纯文本文件路径。
$output_file:输出的字体文件路径。

取完子集完成之后字体从11M压缩到1.7M左右

压缩

安装模块brotli

pip install brotli

使用命令

fonttools ttLib.woff2 compress "$input_file" -o "$output_file"

其中
$input_file:输入的字体文件。
$output_file:输出的字体文件路径。

再次压缩为 woff2 字体格式 大约840kb

]]>
0 https://blog.asbid.cn/post/590.html#comments https://blog.asbid.cn/feed/
bear 主题 之 自定义评论 https://blog.asbid.cn/post/586.html https://blog.asbid.cn/post/586.html Thu, 18 Jul 2024 10:32:43 +0800 老孙 bear 主题 可以使用Twikoo Artalk 等评论系统

Artalk为例

输入

<link href="https://artalk.loliko.cn/dist/Artalk.css" rel="stylesheet">
<script src="https://artalk.loliko.cn//dist/Artalk.js"></script>
<div id="Comments"></div>
<script>
  Artalk.init({
    el:        '#Comments', 
    server:    'https://artalk.loliko.cn/', 
    site:      'blog', 
  })
</script>

即可

如需使用页面浏览 和 评论数的功能
则在拓展中输入

浏览量:<span class="artalk-pv-count"></span> · 
评论数:<span class="artalk-comment-count"></span>

即可,此功能依赖于评论系统

]]>
0 https://blog.asbid.cn/post/586.html#comments https://blog.asbid.cn/feed/
bear 主题 之 自定义CSS https://blog.asbid.cn/post/585.html https://blog.asbid.cn/post/585.html Thu, 18 Jul 2024 10:22:02 +0800 老孙 在自定义CSS中可以自定义背景

body::before {
    content: '';
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: -520;
    pointer-events: none;
}
body::before {
    background: linear-gradient( 90deg, rgba(247, 149, 51, .1), rgba(243, 112, 85, .1) 15%, rgba(239, 78, 123, .1) 30%, rgba(161, 102, 171, .1) 44%, rgba(80, 115, 184, .1) 58%, rgba(16, 152, 173, .1) 72%, rgba(7, 179, 155, .1) 86%, rgba(109, 186, 130, .1)); /*背景颜色*/
    background-size: 500%;
    animation: bgAnimation 15s linear infinite; /*执行动画*/
}
@keyframes bgAnimation{
    0%{
        background-position: 0% 50%;
    }
    50%{
        background-position: 100% 50%;
    }
    100%{
        background-position: 0% 50%;
    }
}

加入一个渐变色的背景

]]>
0 https://blog.asbid.cn/post/585.html#comments https://blog.asbid.cn/feed/
Moments:一个仿微信朋友圈的极简朋友圈 https://blog.asbid.cn/post/580.html https://blog.asbid.cn/post/580.html Sat, 04 May 2024 19:15:55 +0800 老孙 项目简介

本项目是由mblog的作者最新开发的仿微信朋友圈的微博,基于NEXTJS+SQLITE3.
目前正在快速迭代更新中..

  • 支持匿名评论/点赞
  • 支持引入网易云音乐,b站视频,插入链接等
  • 支持自定义头图,个人头像,网站标题等
  • 支持上传图片到S3兼容的云存储,支持本地存储
  • 适配手机
  • 支持暗黑模式
  • 数据库采用sqlite,可随时备份
  • 支持引入豆瓣读书/豆瓣电影,样式来源于这里

项目地址

https://github.com/kingwrcy/moments

预览

请输入图片描述

部署步骤

建议使用Docker Compose方式部署

mkdir /home/moments
cd /home/moments
mkdir docker-compose.yaml
nano docker-compose.yaml

复制以下内容粘贴

version: '3'
services:
  moments:
    image: kingwrcy/moments:latest
    ports:
      - "3000:3000"
    volumes:
      - ./data:/app/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./config.properties:/app/data/config.properties:ro

然后

nano config.properties

把以下内容复制粘贴

# 站点url包括http/https
NUXT_PUBLIC_SITE_URL=
#是否启用评论
NUXT_PUBLIC_MOMENTS_COMMENT_ENABLE=true
#是否显示评论
NUXT_PUBLIC_MOMENTS_SHOW_COMMENT=true
#评论最大字数
NUXT_PUBLIC_MOMENTS_COMMENT_MAX_LENGTH=120
#评论的显示顺序,desc:倒序,asc:顺序
NUXT_PUBLIC_MOMENTS_COMMENT_ORDER_BY=desc
#是否显示引入豆瓣读书/视频按钮
NUXT_PUBLIC_MOMENTS_TOOLBAR_ENABLE_DOUBAN=true
#是否显示引入网易云音乐按钮
NUXT_PUBLIC_MOMENTS_TOOLBAR_ENABLE_MUSIC163=true
#是否显示引入youtube,b站,在线视频按钮
NUXT_PUBLIC_MOMENTS_TOOLBAR_ENABLE_VIDEO=true
#单条发言最大行数,最大10行
NUXT_PUBLIC_MOMENTS_MAX_LINE=4
#recaptchaV3代码中使用此网站密钥
NUXT_PUBLIC_GOOGLE_RECAPTCHA_SITE_KEY=
#分页大小
NUXT_PUBLIC_PAGE_SIZE=10

#private
#recaptchaV3通信密钥
NUXT_GOOGLE_RECAPTCHA_SECRET_KEY=

#是否启用评论通知
NUXT_PUBLIC_NOTIFY_BY_EMAIL_ENABLE=false
#管理员邮箱
NUXT_NOTIFY_MAIL=
#邮局服务器地址
NUXT_MAIL_HOST=
#邮局服务器端口465端口一般是加密的,587端口一般是不加密的
NUXT_MAIL_PORT=587
#邮局安全连接true/false
NUXT_MAIL_SECURE=false
#邮箱用户名
NUXT_MAIL_NAME=
#邮箱密码
NUXT_MAIL_PASSWORD=
#邮箱发件人
NUXT_MAIL_FROM=
#邮箱发件人名称
NUXT_MAIL_FROM_NAME=

#是否启用阿里云文本审核(只针对评论)
NUXT_PUBLIC_ALIYUN_TEXT_JUDGE_ENABLE=false
#阿里云AccessKey ID
NUXT_ALIYUN_ACCESS_KEY_ID=
#阿里云AccessKey Secret
NUXT_ALIYUN_ACCESS_KEY_SECRET=

根据注释内容修改参数

如不需要则保持默认即可

启动容器

运行

docker-compose up -d

反向代理

反向代理端口 3000 即可

演示地址

https://wenxs.cn

]]>
0 https://blog.asbid.cn/post/580.html#comments https://blog.asbid.cn/feed/
一种论调 https://blog.asbid.cn/post/579.html https://blog.asbid.cn/post/579.html Mon, 04 Mar 2024 19:12:00 +0800 老孙 在别处

看到的一种论调.
写博客必须言之有物,必须有自己的思考.

我的观点

每个人想必都会有一些思考,但不是所有人都会诉诸于笔端,能够言之有物的记录下来.
相比之下我们更喜欢记录生活中的有意思的事情,
好吃的,好玩的,与谁一起度过的那些瞬间.
如果你想留下什么思想,并和志趣相投的人产生思想上的碰撞,你可以写博客.
如果你想非常单纯的记录日常的生活,你可以写博客.
并没有人规定博客应该写什么.
在博客最火热的时候大概也就是QQ空间,新浪博客大火的时候,每个人都可以用来做一些自己觉得很酷的事情.
写上一些火星文或者一些四十五度角仰望天空的悲伤的文字.
那时候的作家和明星也同样会写一些日常的琐事.与网民狂欢.

在我的浅薄的认知里,博客就是一个工具一个载体.
任何人可以随便使用它.
你可以有自己的喜恶,但不能随意指摘别人的爱好.
理解并尊重.

其他

微博客这种东西在时代的进程中虽说 取代了博客的地位.但是口碑和其更深的情怀却不曾留下.变成了更加商品化的东西.
畅所欲言的时代也不复存在了.

]]>
0 https://blog.asbid.cn/post/579.html#comments https://blog.asbid.cn/feed/
宝塔面板出现&quot;您添加的域名已存在&quot; 的解决办法 https://blog.asbid.cn/post/578.html https://blog.asbid.cn/post/578.html Mon, 05 Feb 2024 09:43:37 +0800 老孙 执行完以前三步即可解决

1.在宝塔面板的www文件下搜索所有的关于该域名的一切文件,删除
2.用sqlite管理工具打开/www/server/panel/data/default.db并删除相关域名
3.打开/www/server/panel/data/db下的site.db文件,并删除相关域名

]]>
0 https://blog.asbid.cn/post/578.html#comments https://blog.asbid.cn/feed/
黑群晖一键修复AME https://blog.asbid.cn/post/577.html https://blog.asbid.cn/post/577.html Tue, 02 Jan 2024 09:22:00 +0800 老孙 修复AME免登陆

下载官方解码包

ssh连接群晖 使用root权限执行以下命令

DSM7.1 AME版本3.0.1-2004

curl http://code.imnks.com/ame3patch/ame71-2004.py | python

DSM7.2 AME版本3.1.0-3005

curl http://code.imnks.com/ame3patch/ame72-3005.py | python

修复显示CPU型号

全自动运行修改版本,无需再选择,执行完毕立即生效,去刷新几次浏览器

curl http://code.imnks.com/ch_cpuinfo/ch_cpuinfo_cn.sh | bash
]]>
0 https://blog.asbid.cn/post/577.html#comments https://blog.asbid.cn/feed/
青龙面板扫码自动添加京东COOKIE https://blog.asbid.cn/post/576.html https://blog.asbid.cn/post/576.html Sat, 30 Dec 2023 13:38:26 +0800 老孙 扫码自动添加COOKIE

请先安装 wget 和 unzip

请按照你的 cpu 架构进行下载

//如果你是amd64架构(服务器,PC等)

wget https://down.asbid.cn/Linux/JDC/AMD64.zip && unzip AMD64.zip

//如果你是arm架构(N1,路由器,树莓派等)

wget https://down.asbid.cn/Linux/JDC/ARM.zip && unzip ARM.zip

其他架构或系统请自行编译

开始使用

chmod 777 JDC
./JDC

第一次运行,自动生成配置文件并且程序会自动退出。如果你没有修改过青龙面板的端口,可直接执行下一步。

如果不为默认端口,请自行修改 config.toml文件

然后执行下面步骤

nohup ./JDC &

开始后台运行程序。程序默认端口为 5701。
打开 http://ip:5701 即可看到面板

如果无法打开请检查端口是否放行。

更新教程

如果你已经安装了旧版程序更新时如下操作。

首先 kill 掉原来的程序。

//查看原程序PID,第一行第二列为程序的PID

ps -ajx|grep JDC

//结束程序(*改为你的PID)

kill -9 *****

然后删除原来的程序和 config.toml 文件

rm -rf JDC config.toml
]]>
2 https://blog.asbid.cn/post/576.html#comments https://blog.asbid.cn/feed/
debian 11 apt update失败 https://blog.asbid.cn/post/575.html https://blog.asbid.cn/post/575.html Fri, 29 Dec 2023 14:08:00 +0800 老孙 起因

debian 11 执行更新时提示404

问题出现的原因

从2023年4月23日起,debian的源包地址更换至新地址。

解决办法

执行

nano  /etc/apt/sources.list

用一下内容替换

deb http://archive.debian.org/debian/ stretch main contrib non-free
deb-src http://archive.debian.org/debian/ stretch main contrib non-free
deb http://archive.debian.org/debian-security/ stretch/updates main contrib non-free
deb-src http://archive.debian.org/debian-security/ stretch/updates main contrib non-free
deb http://archive.debian.org/debian/ stretch-backports main contrib non-free

然后执行

apt update

更换国内清华源

deb https://mirrors.tuna.tsinghua.edu.cn/debian-multimedia/ bullseye main non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-multimedia/ bullseye main non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-multimedia/ bullseye-backports main
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-multimedia/ bullseye-backports main

更改完 sources.list 文件后请导入 deb-multimedia-keyring ,然后更新索引以生效。

wget https://mirrors.tuna.tsinghua.edu.cn/debian-multimedia/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.8.1_all.deb
dpkg -i deb-multimedia-keyring_2016.8.1_all.deb
apt-get update
]]>
0 https://blog.asbid.cn/post/575.html#comments https://blog.asbid.cn/feed/
typecho全站静态化方案 https://blog.asbid.cn/post/574.html https://blog.asbid.cn/post/574.html Wed, 20 Dec 2023 20:01:00 +0800 老孙 实现

利用wget全站保存为html,然后再修改文件中的链接

步骤

把以下代码保存为html.php

<?php
$url = 'https://blog.asbid.cn'; //网址,不能以"/"结尾
$rurl=''; //要替换成路径或网址,可为空,不能以"/"结尾
$dir = __DIR__ . "/" . str_replace('https://', '', str_replace('http://', "", $url));
exec("clear",$clc);
echo $clc[0];
echo "开始下载文件\r\n";
exec("rm -rf {$dir}",$return);
exec("wget -r -p -np {$url}",$return);

$dirs = get_filenamesbydir($dir);

//不处理非html文件
for ($i = 0; $i < count($dirs); $i++) {
    $file=str_replace(__DIR__, "", $dirs[$i]['file']);

    if (!preg_match("/html/",$file)  ) {
        //删除对应的元素
        unset($dirs[$i]);
    
    }
  
}
array_filter($dirs);
sort($dirs);//重新生成索引下标

//网址处理
$count=count($dirs);
for ($i = 0; $i < $count; $i++) {
    $content=str_replace($url,$rurl,file_get_contents($dirs[$i]['file']));
    file_put_contents($dirs[$i]['file'],$content);
    $n=$i+1;
    exec("clear",$clc);
    echo $clc[0];
    echo "文件下载完毕\r\n";
    echo "开始处理文件,共{$count}个文件需要处理,已处理{$n}个\r\n";

}
echo "处理完毕,文件目录:{$dir}\r\n";


function get_allfiles($path, &$files)
{
    if (is_dir($path)) {
        $dp = dir($path);
        while ($file = $dp->read()) {
            if ($file !== "." && $file !== "..") {
                get_allfiles($path . "/" . $file, $files);
            }
        }
        $dp->close();
    }
    if (is_file($path)) {
        $files[] = ['file' => $path];
    }
}
function get_filenamesbydir($dir)
{
    $files = array();
    get_allfiles($dir, $files);
    return $files;
}

然后执行

php html.php
]]>
0 https://blog.asbid.cn/post/574.html#comments https://blog.asbid.cn/feed/