记录技术、学习与生活。
Hello World
欢迎来到我的个人博客! 这是我的第一篇文章。 为什么选择 Hugo? Hugo 是一个静态网站生成器。 以后我只需要在 VS Code 中编写 Markdown, 然后使用 Git Push 发布即可。 代码测试 echo "Hello World!" 图片测试 以后可以将图片放入 static/images/ 目录, 然后在 Markdown 中使用:
异步函数async和await
背景 最近在回头看nfd项目 的源码,看到了使用async和await的js代码,因此想了解一下代码运行的机制。 一个例子 function SicBo() { return new Promise((resolve, reject) => { console.log("开始摇") setTimeout(() => { let n = parseInt(Math.random() * 6 + 1, 10) resolve(n) }, 1000) }) } 上述代码的执行过程如下: 立即执行 console.log("开始摇") —— ✅ 马上输出。 启动一个“1秒后执行的任务” —— 通过 setTimeout(...) 注册了一个回调,1 秒后执行。 返回一个 Promise 对象,这个 Promise 会在 1 秒后变成“完成状态”并给出点数。 如果直接调用这个函数: function test() { const result = SicBo() console.log('骰子结果:', result) } test() 调用输出如下: 开始摇 骰子结果: Promise { <pending> } 显然并不是我们想要的结果 异步函数的一般调用: SicBo().then(result => { console.log('骰子结果:', result) }) 这种写法最大的弊端是会产生回调地狱,即调用多个异步函数产生嵌套,导致代码可读性变差。 ...
TG机器人通知IP地址
背景 公网IPv4政策的收紧,包括不限于不能使用DDNS服务解析到未备案域名,因此使用TG机器人API服务,定时检测IP地址,若IP变化则自动更新 项目地址 Raspberry-Pi/shell/telegram-ip-bot.sh at master · laningya/Raspberry-Pi · GitHub 部署过程 获取ChatID API_TOKEN="YOUR_BOT_TOKEN" curl -s "https://api.telegram.org/bot$API_TOKEN/getUpdates" | jq '.result[0].message.chat.id' 脚本填入Bot的API Token,以及自行判断需要设置代理 添加crontab定时任务 */30 * * * * /bin/bash /root/telegram-ip-bot.sh > /dev/null 2>&1 & 参考文档 Telegram Bot API
Emby反代及HTTPS配置教程
Nginx配置 server { listen 443 ssl; server_name your.domain.com; # Security / XSS Mitigation Headers add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; # ssl的设置 ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; ssl_session_timeout 5m; # 禁止ip访问 if ($host ~ ^\d+\.\d+\.\d+\.\d+$) { return 404; } # 防止爬虫获取header,直接访问/就返回502,其他的路径才行,app观看不影响,不用这个 location = / { return 502; } location / { resolver 1.1.1.1 ipv6=off; if ($host != $server_name) { return 403; } proxy_pass https://www.emby.com; # ssl pass相关的设置 proxy_ssl_name www.emby.com; proxy_ssl_server_name on; proxy_set_header Host www.emby.com; set $magpiecdn "$scheme://$server_name:$server_port"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header MagpieCDN $magpiecdn; proxy_buffering off; } location /***cdn { resolver 1.1.1.1 ipv6=off; proxy_pass https://$arg_load.emby.com; # ssl pass相关的设置 proxy_ssl_name $arg_load.emby.com; proxy_ssl_server_name on; proxy_set_header Host $arg_load.emby.com; proxy_buffering on; proxy_max_temp_file_size 50m; } } 说明: ...
通过LangBot将大模型接入到Telergram
项目地址 GitHub - RockChinQ/LangBot: 😎丰富生态、🧩支持扩展、🦄多模态 - 大模型原生即时通信机器人平台 | 适配 QQ / 微信(企业微信、个人微信)/ 飞书 / 钉钉 / Discord / Telegram 等消息平台 | 支持 ChatGPT、DeepSeek、Dify、Claude、Gemini、xAI Grok、Ollama、LM Studio、阿里云百炼、火山方舟、SiliconFlow、Qwen、Moonshot、ChatGLM、SillyTraven、MCP 等 LLM 的机器人 / Agent | LLM-based instant messaging bots platform, supports Discord, Telegram, WeChat, Lark, DingTalk, QQ 部署过程 Git 克隆项目: git clone https://github.com/RockChinQ/LangBot cd LangBot 启动容器: docker compose up 在 LangBot 中填写信息并启动 将Telegram Bot的API Token 填写到platform.json中。 { "adapter": "telegram", "enable": true, "token": "xxxxxxx" }, 填写完成后启动 LangBot,若成功配置,日志中会出现[02-02 16:48:15.263] manager.py (68) - [INFO] : 初始化平台适配器 1: telegram的字样,保持 LangBot 运行。 ...
Cloudflare和阿里云DDNS的Shell实现
下一步开发计划 接入Telegram机器人,IP变化时自动通知 脚本地址 raw.githubusercontent.com/laningya/Raspberry-Pi/refs/heads/master/shell/cfddns.sh raw.githubusercontent.com/laningya/Raspberry-Pi/refs/heads/master/shell/aliddns.sh 使用说明 Cloudflare proxy=false/true,是否开始Cloudflare小黄云选项 ZONE_ID,API_TOKEN,Cloudflare 域ID和API令牌,API需对应域名的DNS编辑和读取权限 IPv4Domain,需要填写全写,如"test.yourdomain.com" 阿里云 accessKeyId,accessSecret,需要在阿里云控制台获取,并赋予DNS编辑和读取权限 与Cloudflare不同,子域名和主域名分开
使用 Telegram 作为存储后端的图床程序
项目地址 GitHub - nodeseeker/goImage: 基于 Go 开发的图片托管服务,使用 Telegram 作为存储后端。 GitHub - laningya/goImage: 基于 Go 开发的图片托管服务,使用 Telegram 作为存储后端。 部署流程 拉取Dockerfile并本地构建镜像 wget https://raw.githubusercontent.com/laningya/goImage/refs/heads/main/Dockerfile docker build -t image . 拉取docker-compose.yml文件 wget https://raw.githubusercontent.com/laningya/goImage/refs/heads/main/docker-compose.yml 拉取config.json文件 wget https://raw.githubusercontent.com/laningya/goImage/refs/heads/main/config.json config.json文件说明如下: { "telegram": { "token": "1234567890:ABCDEFG_ab1-asdfghjkl12345", "chatId": -123456789 }, "admin": { "username": "nodeseeker", "password": "nodeseeker@123456" }, "site": { "name": "NodeSeek", "maxFileSize": 10, "port": 18080, "host": "127.0.0.1" } } telegram.token:电报机器人的Bot Token telegram.chatId:频道的Chat ID admin.username:网站管理员用户名 admin.password:网站管理员密码 site.name:网站名称 site.maxFileSize:最大上传文件大小(单位:MB),建议10MB site.port:服务端口,默认18080 site.host:服务监听地址,默认127.0.0.0本地监听;如果需要调试或外网访问,可修改为0.0.0.0 以上参数获取方式: ...
基于Cloudflare Worker的Telegram传信机器人
项目原因 Telegram是很注重隐私的聊天软件,受到很多人的青睐。但是,如果经常和陌生人聊天很容易触发风控,因此一款好用的传信机器人十分有必要。 项目特色 在nfdv1项目的基础上增加提示对方ID(TG账户唯一标识) 美化输出UI,以及封禁逻辑 支持构建欺诈数据库,有不良记录的用户及时提醒 部署方法 从@BotFather获取token,并且可以发送/setjoingroups来禁止此Bot被添加到群组 从uuidgenerator获取一个随机uuid作为secret 从@username_to_id_bot获取你的用户id 登录cloudflare,创建一个worker 配置worker的变量 增加一个ENV_BOT_TOKEN变量,数值为从步骤1中获得的token 增加一个ENV_BOT_SECRET变量,数值为从步骤2中获得的secret 增加一个ENV_ADMIN_UID变量,数值为从步骤3中获得的用户id 绑定kv数据库,创建一个Namespace Name为nfd的kv数据库,在setting -> variable中设置KV Namespace Bindings:nfd -> nfd 点击Quick Edit,复制这个文件到编辑器中 通过打开https://xxx.workers.dev/registerWebhook来注册websoket 使用方法 当其他用户给bot发消息,会被转发到bot创建者 用户回复普通文字给转发的消息时,会回复到原消息发送者 用户回复/block, /unblock, /checkblock等命令会执行相关指令,不会回复到原消息发送者
服务备份与同步脚本实现
脚本地址 raw.githubusercontent.com/laningya/Raspberry-Pi/refs/heads/master/shell/back.sh raw.githubusercontent.com/laningya/Raspberry-Pi/refs/heads/master/shell/rsync.sh 使用说明 为防止服务器宕机开发,需要配合crontab等服务实现定时备份 针对采用docker-compose部署的服务编写,如为其他方式部署的服务,此脚本并不使用
Armbian/build脚本分析
1. 脚本目录检测和代码健壮性保证 1.1 程序报错退出脚本 #set -o pipefail # trace ERR through pipes - will be enabled "soon" #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled set -e set -o errtrace # trace ERR through - enabled set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled # Important, go read http://mywiki.wooledge.org/BashFAQ/105 NOW! 1.2. ./compile.sh脚本目录检测 SRC="$(dirname "$(realpath "${BASH_SOURCE[0]}")")" cd "${SRC}" || exit # check for whitespace in ${SRC} and exit for safety reasons grep -q "[[:space:]]" <<< "${SRC}" && { echo "\"${SRC}\" contains whitespace. Not supported. Aborting." >&2 exit 1 } 2. single.sh 文件加载(位于./lib) 2.1 检查bash版本是否高于5.x # The Armbian functions require Bash 5.x. if [[ "${BASH_VERSINFO:-0}" -lt 5 ]]; then echo "Armbian build scripts require Bash 5.x. Go get it..." >&2 if [[ "${OSTYPE}" == "darwin"* ]]; then echo "Armbian build scripts require brew to be installed and working on macOS. (old Bash version)" >&2 echo "Please install brew, *restart your terminal*." >&2 echo "Then run 'brew install bash coreutils git', *restart your terminal* and then try again." >&2 exit 51 fi exit 50 fi 2.2 macOS系统检查 是否以root运行脚本 Homebrew 包管理器已安装并正常工作 通过 Homebrew 的 coreutils 安装的 realpath 命令是否可用 更新 PATH 环境变量以包含由 Homebrew 安装的 GNU coreutils 二进制文件。 确保 ${SRC} 变量(应指向构建脚本的源目录)位于用户的主目录中。这对于 macOS 上的 Docker 兼容性很重要。 ...