body="恭喜，你的项目跑起来了!!!"查找到 url 后，后面加 help这样不知道是否是移动的原因，很多不能观看，在筛选一遍。/1000000004000011651/ystenlive/index.m3u8$20M2160_易视腾在所有选项后面加上这个，再使用iptv检测软件，筛选一遍。筛选之后的结果，点击可用的，然后保存m3u，再使用sublime text 来提取出来。.*(http:\/\/[^\s]+)先查找所有的，内容，然后替换\1复制所有的值，然后ctrl+shift+L，然后删掉多余的，或者直接替换成空白。
安装软件更新更新软件库apt update -y && apt upgrade -y更新、安装必备软件apt install sudo curl wget nano校正系统时间将时区改为改成上海sudo timedatectl set-timezone Asia/Shanghai查看当前时区：timedatectl列出所有时区：timedatectl list-timezones安装其他安装 docker 和 1 panel 之类的，有一键脚本curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.shfail2banSupervisorUfw设置备份账户, 如果是云，设置对象存储，否则设置 onedrive
安装 warp 获取 ipv 4 地址之前的很多教程已经无法使用，warp 现在不支持 add-excluded-route :: 0/0 参数现在只发现一个脚本可以直接运行wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh这个脚本不知道是不是用的老版本的 warp，但是确实可以用选择 ipv4选择全局模式脚本详细说明如果设置错误，似乎可以 bash menu.sh 4 直接修改这样应该就可以了接下来直接安装探针，装好后选择修改 agent 配置
OBS 对象存储介绍存储容量费用： 这是您在 OBS 中存储的数据量所产生的费用，比如您提到的 40GB 硬盘。公网流量费用： 这是通过公网访问 OBS 时产生的流量费用，内网访问不会产生这部分费用。请求次数费用： 这是您对 OBS 发起的请求次数所产生的费用，比如上传、下载、删除等操作。OBS 对象存储有以上三个费用，使用华为的 ECS 主机来内网访问的时候，没有公网流量费用，只有存储容量和请求费用，存储是一次性买断的，请求个人用很少能用超。查看这个教程直接挂载 OBS 在 ECS 主机，当成本地硬盘使用。s3fs挂载S3对象桶-阿里云开发者社区访问密钥获取OBS 挂载必须使用 AK/SK 来访问，直接使用 admin 账户来访问容易造成泄漏，后果太严重。使用统一身份认证来创建一个新的用户，然后新建一个用户组，权限里设置这个用户组只有 OBS 权限。[[Z-assets/8eb7248a07ba083c8a7dfd496d4cd661_MD5.jpeg|Open: Pasted image 20250106143540.png]]这里可以只让用户 AK/SK 访问。具体的的是否真的内网传输还得看下月账单。
location / { proxy_ssl_name $server; proxy_ssl_server_name on; proxy_pass $forward_scheme://$server:$port; }这个问题在于 misakaf 的反代不是登录网址，它还有一个媒体播放网址 stream1.misakaf.org这样就必须先反代 stream1.misakaf.org，然后在配置加一项替换。location / { proxy_ssl_name $server; proxy_ssl_server_name on; proxy_pass $forward_scheme://$server:$port; sub_filter 'stream1.misakaf.org' '.xyz'; proxy_redirect https://stream1.misakaf.org/ https://s.788885.xyz/; sub_filter_once off; sub_filter_types text/html application/javascript text/css; proxy_set_header Accept-Encoding ""; }上面方法不对，后方媒体播放网址有多个，stream1-stream4，需要4个子域名反代。反代登录网址代码client_max_body_size 20M; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; location / { # 你需要反代的emby服务器域名 proxy_pass https://emby.aca.best; # 你需要反代的emby推流地址 proxy_redirect https://stream1.misakaf.org/ https://s1.a.xyz/; proxy_redirect https://stream2.misakaf.org/ https://s2.a.xyz/; proxy_redirect https://stream3.misakaf.org/ https://s3.a.xyz/; proxy_redirect https://stream4.misakaf.org/ https://s4.a.xyz/; # 你需要反代的emby服务器主页 proxy_set_header Referer "https://emby.aca.best/web/index.html"; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $proxy_host; proxy_ssl_server_name on; proxy_http_version 1.1; proxy_set_header Connection "upgrade"; }
status_code="301" && header="https://pixman.io/topics/17" && server="gunicorn"在 ALIST-TVBOX 里面/0 这个订阅，增加定制。{ "lives": [ { "name": "v4v1", "type": 0, "url": "http://0/itv_proxy.m3u", "playerType": 1, "epg": "http://epg.112114.xyz/?ch={name}&date={date}", "logo": "https://epg.112114.xyz/logo/{name}.png" }, { "name": "v4v3", "type": 0, "url": "http://050/itv_proxy.m3u", "playerType": 1, "epg": "http://epg.112114.xyz/?ch={name}&date={date}", "logo": "https://epg.112114.xyz/logo/{name}.png" } ], "blacklist": { "sites": ["", "", "", "", "", "", "", ""] } }问题在于 json 格式经常弄错，使用 AI 来写简单一些，快很多。
使用 cloudflare 域名邮箱实现新邮件微信通知
Cloudflare 一直有个域名邮箱功能，无法发送邮件，但是可以无限前缀转发到自己邮箱。现在它的域名邮箱功能，开始支持 worker 了，worker 可以通过新邮件到达触发。这样就可以做到，使用 worker 发送通知，不需要手机一直开着邮箱 APP 接收邮件了。不喜欢 APP 一直在后台，不只是耗电，也很担心隐私的问题。Worker 可以获取新邮件的发送人和内容，我只想要通知，然后使用 outlook 客户端查看邮件。其实因为有 worker ，不只是简单的邮件通知，还可以玩很多的东西，毕竟一封邮件就可以触发了。export default { async email(message, env, ctx) { // 获取原始发件人邮箱 let originalSender = ''; const fromHeader = message.headers.get("From"); if (fromHeader) { // 使用正则表达式提取邮箱地址 const match = fromHeader.match(/<([^>]+)>/); originalSender = match ? match[1] : fromHeader.trim(); } // 如果没有找到发件人，尝试从其他头部获取 if (!originalSender) { const senderHeader = message.headers.get("Sender"); if (senderHeader) { const match = senderHeader.match(/<([^>]+)>/); originalSender = match ? match[1] : senderHeader.trim(); } } // 如果仍然没有找到，使用一个默认值 if (!originalSender) { originalSender = "未知发件人"; } // 获取邮件主题 const subject = message.headers.get("Subject") || "无主题"; // 发送企业微信消息 const wechatWebhookUrl = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' const wechatMessage = { msgtype: 'text', text: { content: `收到一封新邮件！\n发件人: ${originalSender}` } } // 将消息发送到企业微信机器人 const response = await fetch(wechatWebhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(wechatMessage) }) // 返回响应 if (response.ok) { return new Response('微信消息发送成功', { status: 200 }) } else { return new Response('微信消息发送失败', { status: 500 }) } } }
一键安装脚本curl -fsSL https://tailscale.com/install.sh | sh安装完成后会有一个网址，登录过后，将设备添加进网络即可。tailscale 有一键安装脚本，比 wireguard 更简单，但还是官网面板只支持 3 个设备。如果多个设备，就必须自建Headscale
1. 先安装插件 Python Scripter2 . 3. 脚本放入文件夹C:\Users\Administrator\Documents\Obsidian Vault\.obsidian\scripts\pythonimport xmlrpc.client import os import sys import io import re import requests import hashlib from config import * sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') # 用于存储已上传图片的字典 uploaded_images = {} def get_lsky_token(): response = requests.post(f"{LSKY_API_URL}/tokens", json={ "email": LSKY_EMAIL, "password": LSKY_PASSWORD }) if response.status_code == 200: data = response.json() if data['status']: return data['data']['token'] print(f"获取Lsky Pro token失败: {response.text}") return None def get_file_md5(file_path): hash_md5 = hashlib.md5() with open(file_path, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): hash_md5.update(chunk) return hash_md5.hexdigest() def upload_image_to_lsky(image_path, token): if not os.path.isfile(image_path): print(f"图片文件不存在或不是文件: {image_path}") return None file_md5 = get_file_md5(image_path) if file_md5 in uploaded_images: print(f"图片已上传过: {uploaded_images[file_md5]}") return uploaded_images[file_md5] headers = { "Authorization": f"Bearer {token}", "Accept": "application/json" } print(f"尝试上传图片: {image_path}") try: with open(image_path, 'rb') as image_file: files = {'file': image_file} response = requests.post(f"{LSKY_API_URL}/upload", headers=headers, files=files) if response.status_code == 200: data = response.json() if data['status']: url = data['data']['links']['url'] uploaded_images[file_md5] = url print(f"图片上传成功: {url}") return url print(f"上传图片失败: {response.text}") except Exception as e: print(f"上传图片时发生错误: {str(e)}") return None def replace_image_links(content, vault_path, token): def replace_link(match): image_path = match.group(1) if image_path.startswith('http://') or image_path.startswith('https://'): return match.group(0) # 如果是网络图片，不处理 full_image_path = os.path.normpath(os.path.join(vault_path, image_path)) print(f"处理图片路径: {full_image_path}") if os.path.isfile(full_image_path): new_url = upload_image_to_lsky(full_image_path, token) if new_url: return f"![]({new_url})" else: print(f"图片文件不存在或不是文件: {full_image_path}") return match.group(0) # 替换Obsidian双方括号图片链接 content = re.sub(r'!\[\[(.*?)\]\]', replace_link, content) # 替换标准Markdown图片链接（保留以防万一） content = re.sub(r'!\[.*?\]\((.*?)\)', replace_link, content) return content def get_post_id_by_title(client, username, password, title): recent_posts = client.metaWeblog.getRecentPosts("", username, password, 100) for post in recent_posts: if post['title'] == title: return post['postid'] return None # 打印所有命令行参数，用于调试 print("命令行参数:", sys.argv) # 获取Lsky Pro token lsky_token = get_lsky_token() if not lsky_token: raise Exception("无法获取Lsky Pro token") # 创建XML-RPC客户端 client = xmlrpc.client.ServerProxy(TYPECHO_API_URL) # 获取当前编辑的文件内容 if len(sys.argv) > 2: vault_path = sys.argv[1] # Obsidian保管库路径 file_name = sys.argv[2] # 文件名 file_path = os.path.join(vault_path, file_name) print(f"尝试打开文件: {file_path}") try: with open(file_path, 'r', encoding='utf-8') as file: content = file.read() title = os.path.splitext(file_name)[0] print(f"文件内容读取成功，标题: {title}") print(f"Vault路径: {vault_path}") # 替换图片链接 content = replace_image_links(content, vault_path, lsky_token) except IOError as e: print(f"无法打开文件: {e}") raise else: raise Exception("无法获取当前文件信息") # 创建博客文章结构 post = { "title": title, "description": content, "categories": ["Obsidian"], # 可以根据需要修改分类 "mt_keywords": "obsidian, markdown", # 可以根据需要修改标签 } try: # 检查文章是否已存在 existing_post_id = get_post_id_by_title(client, TYPECHO_USERNAME, TYPECHO_PASSWORD, title) if existing_post_id: # 更新现有文章 success = client.metaWeblog.editPost(existing_post_id, TYPECHO_USERNAME, TYPECHO_PASSWORD, post, True) if success: print(f"文章已成功更新,ID: {existing_post_id}") else: print("文章更新失败") else: # 发布新文章 post_id = client.metaWeblog.newPost("", TYPECHO_USERNAME, TYPECHO_PASSWORD, post, True) print(f"新文章已成功发布,ID: {post_id}") except xmlrpc.client.Fault as err: print(f"发布/更新失败: {err.faultString}") except Exception as e: print(f"发生错误: {str(e)}")4. Config. Py 文件内容# Lsky Pro API 配置 LSKY_API_URL = "https://域名/api/v1" LSKY_EMAIL = "" LSKY_PASSWORD = "" # Typecho 配置 TYPECHO_API_URL = "https://域名/index.php/action/xmlrpc" TYPECHO_USERNAME = "" TYPECHO_PASSWORD = ""