Linux 脚本:查询 API Key 的余额

import requests import cmd import readline class KeyBalanceCLI(cmd.Cmd): intro = "Welcome to the Key Balance CLI. Type 'help' for a list of commands." prompt = "(key_balance) > " def do_query(self, arg): """ 查询单个 API Key 的余额。 用法: query <API_KEY> """ if not arg: print("Error: Please provide an API Key.") return balance, total_balance = get_balances(arg) if balance is not None and total_balance is not None: print_balances(arg, balance, total_balance) else: print(f"Failed to query key: {arg}") def do_batch_query(self, arg): """ 从 keys.db 文件中批量查询所有 API Key 的余额。 用法: batch_query """ try: with open("keys.db", "r") as file: keys = file.read().strip().split(",") # 按逗号分隔读取 Key except FileNotFoundError: print("Error: keys.db file not found.") return total_balance = 0 # balance 总和 total_total_balance = 0 # totalBalance 总和 for key in keys: key = key.strip() # 去除前后空格 if not key: continue # 跳过空 Key balance, total_balance_field = get_balances(key) # 查询 balance 和 totalBalance if balance is not None and total_balance_field is not None: print_balances(key, balance, total_balance_field) # 累加到总和 total_balance += balance total_total_balance += total_balance_field # 打印总 balance 和 totalBalance print(f"总 Balance: {total_balance:.2f}") print(f"总 TotalBalance: {total_total_balance:.2f}") def do_exit(self, arg): """ 退出程序。 用法: exit """ print("Exiting...") return True def get_balances(api_key): """ 查询给定 API Key 的 balance 和 totalBalance。 :param api_key: API Key :return: (balance, totalBalance),如果查询失败则返回 (None, None) """ url = "https://api.siliconflow.cn/v1/user/info" # 替换为实际的 API 地址 headers = {"Authorization": f"Bearer {api_key}"} try: response = requests.get(url, headers=headers) response.raise_for_status() # 检查 HTTP 状态码是否为 200 data = response.json() # 解析 JSON 响应 balance = float(data.get("balance", 0)) # 提取 balance 字段 total_balance = float(data.get("totalBalance", 0)) # 提取 totalBalance 字段 return balance, total_balance except requests.exceptions.RequestException as e: print(f"Key {api_key} 查询失败: {e}") return None, None def print_balances(key, balance, total_balance): """ 打印 API Key 的 balance 和 totalBalance。 :param key: API Key :param balance: balance 值 :param total_balance: totalBalance 值 """ print(f"Key: {key}, Balance: {balance:.2f}, TotalBalance: {total_balance:.2f}") if __name__ == "__main__": KeyBalanceCLI().cmdloop()

July 5, 2023 · 2 min · 302 words

Linux 命令行:`flock` 文件锁

一、flock 基础命令格式 flock [选项] <文件|文件描述符> <命令> # 或 flock [选项] <文件|文件描述符> -c <命令字符串> 二、核心选项及示例说明 1. -s (共享锁 Shared Lock) 作用 获取共享锁(读锁),允许多进程同时读取,但阻止排他锁。 场景 需要多个进程同时读取某个文件,但要求写入操作互斥。 示例 # 两个终端同时运行此命令不会阻塞 flock -s data.lock -c "cat data.txt; sleep 5" 2. -x (排他锁 Exclusive Lock ) 作用 获取排他锁(写锁),禁止其他进程获取任何类型的锁。 场景 需要对文件进行写入操作时,保证数据一致性。 示例 # 第二个进程会阻塞直到第一个完成 flock -x log.lock -c "echo 'New log entry' >> app.log; sleep 3" 3. -n (非阻塞 Non-blocking) 作用 非阻塞模式。若无法立即获取锁,立即失败并退出,不会等待。 场景 快速判断资源是否可用,无需等待。 示例 if flock -n 200; then echo "Got lock, doing work..." sleep 2 else echo "Resource busy, exiting." fi 200>data.lock 4. -w <秒数> (超时等待 Timeout) 作用 指定等待锁的超时时间。超过设定时间仍无法获取锁则放弃。 ...

July 3, 2023 · 2 min · 308 words

Linux 网络配置:Netplan

以下是使用 Netplan 将 eth0 和 eth1 配置为静态 IP 地址的详细步骤(假设你的系统为 Ubuntu/Debian,使用 Netplan 作为网络管理工具): 1. 确认当前 Netplan 配置文件 通常 Netplan 的配置文件位于 /etc/netplan/ 目录下,文件名可能为: 00-installer-config.yaml (Ubuntu Server 安装时生成) 01-netcfg.yaml 或其他以 .yaml 结尾的文件。 查看现有配置: ls /etc/netplan/ 2. 编辑 Netplan 配置文件 使用文本编辑器(如 nano)修改配置文件: sudo nano /etc/netplan/00-installer-config.yaml 静态 IP 配置示例 将以下内容粘贴到文件中(注意 缩进必须使用空格,不能使用 Tab): network: version: 2 renderer: networkd # 或 networkd(Ubuntu Server 默认) ethernets: eth0: addresses: - 192.168.1.8/24 routes: - to: default via: 192.168.1.1 # 替换为你的网关地址 nameservers: addresses: [8.8.8.8, 1.1.1.1] # DNS 服务器 eth1: addresses: - 192.168.10.4/24 # 如果 eth1 不需要默认网关,则省略 routes 部分 关键参数说明 参数 作用 addresses 指定静态 IP 和子网掩码(如 192.168.1.8/24)。 routes 默认路由(网关),via 后填你的路由器 IP(如 192.168.1.1)。 nameservers DNS 服务器列表(如 [8.8.8.8, 1.1.1.1])。 renderer networkd(Server 版常用)或 NetworkManager(桌面版常用)。 3. 应用配置 保存文件后(Ctrl+O → 回车 → Ctrl+X),执行以下命令使配置生效: ...

June 19, 2023 · 1 min · 210 words

Renew Typora

import winreg from datetime import datetime def get_current_date(): """ 获取当前日期并格式化为月/日/年的格式,无前导零。 返回格式:月/日/年 """ current_date = datetime.now() month = current_date.month # 月份,无前导零 day = current_date.day # 日期,无前导零 year = current_date.year # 年份,四位数 return f"{month}/{day}/{year}" def modify_registry(key_path, value_name, value_data, value_type): """ 修改注册表键值 :param key_path: 注册表键的路径,例如 r"SOFTWARE\MyApp" :param value_name: 要修改的值的名称 :param value_data: 要设置的值 :param value_type: 值的类型,例如 winreg.REG_SZ (字符串), winreg.REG_DWORD (整数) 等 """ try: # 打开注册表键(如果不存在则会报错) with winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) as registry: with winreg.OpenKey(registry, key_path, 0, winreg.KEY_SET_VALUE) as key: # 修改键值 winreg.SetValueEx(key, value_name, 0, value_type, value_data) return print(f"成功修改注册表键值:{key_path}\\{value_name}") except PermissionError: return print("权限不足,无法修改注册表。") except FileNotFoundError: return print("指定的注册表键或路径不存在。") except Exception as e: return print(f"发生错误:{e}") # 示例:修改注册表 modify_registry("SOFTWARE\\Typora", "IDate", get_current_date(), winreg.REG_SZ)

March 26, 2023 · 1 min · 102 words

ahk 语法手册

第1章:AutoHotkey简介 1.1 什么是AutoHotkey? AutoHotkey(以下简称AHK)是一款开源的脚本语言工具,主要用于Windows操作系统中的自动化操作。它可以通过编写脚本实现以下功能: 自定义键盘快捷键(热键)。 自动替换输入的文本(热字符串)。 自动执行鼠标点击、移动等操作。 与其他程序交互,自动化复杂任务。 AHK的脚本语言简单易学,适合初学者,同时功能强大,能够满足高级用户的需求。 1.2 AutoHotkey的安装与配置 要开始使用AutoHotkey,首先需要在计算机上安装它。以下是安装步骤: 下载AutoHotkey 访问AutoHotkey的官方网站:https://www.autohotkey.com/ 在“Download”页面选择适合的版本(推荐下载最新稳定版)。 安装AutoHotkey 双击下载的安装文件,按照提示完成安装。 在安装过程中,可以选择是否将.ahk文件与AutoHotkey关联,建议勾选此选项。 验证安装 安装完成后,按Win + R打开运行窗口,输入notepad打开记事本。 在记事本中输入以下内容: MsgBox, Hello, AutoHotkey! 将文件保存为Hello.ahk,然后双击运行该文件。如果弹出一个显示“Hello, AutoHotkey!”的对话框,说明安装成功。 1.3 AutoHotkey的基本功能与应用场景 AutoHotkey可以用于多种场景,以下是一些常见的应用示例: 自定义快捷键 将Ctrl+Shift+S设置为保存所有打开的文档。 使用Win+E快速启动常用的程序或文件夹。 文本替换 输入btw时自动替换为by the way。 快速输入常用邮件签名或模板。 自动化操作 自动点击某个按钮或执行一系列鼠标操作。 批量处理文件或数据。 游戏辅助 实现连点器或一键执行复杂操作。 自定义游戏内的快捷键。 系统增强 创建个性化的任务管理器或系统工具。 优化Windows操作体验。 1.4 总结 本章介绍了AutoHotkey的基本概念、安装方法以及常见的应用场景。通过学习本章内容,你应该已经完成了AutoHotkey的安装,并对其功能有了初步了解。 在下一章中,我们将深入学习AutoHotkey的脚本编写基础,包括变量、运算符和常用的语法规则。 第2章:基础语法 本章将介绍AutoHotkey脚本编写的基础知识,包括脚本的基本结构、变量与数据类型、运算符与表达式,以及注释与脚本组织的技巧。 2.1 脚本的基本结构 AutoHotkey脚本是一个纯文本文件,文件扩展名为.ahk。脚本的基本结构如下: 注释 注释用于解释代码的功能,不会被执行。在AHK中,单行注释以分号;开头: ; 这是一个注释 MsgBox, 这是一个弹窗 热键定义 热键是脚本的核心功能之一。定义热键的语法为: Hotkey::Action 例如: ^j::MsgBox, 你按下了Ctrl+J 热字符串定义 热字符串用于在输入特定文本时触发操作。定义热字符串的语法为: ...

2 min · 321 words

Front Matter 参数详解

以下是 Hugo 中 Markdown 文件开头的元数据区域(官方术语叫 Front Matter)的参数详解: 📌 结构说明 --- 参数名: 值 --- 本质是 YAML/TOML/JSON 格式的元数据区块,用于控制 Hugo 的渲染行为。以下对每个参数做详细解释: 一、核心元数据组 参数 作用说明 推荐值示例 title 文章标题,会被用作 HTML 的 <title> 标签 "深度解析人工智能未来趋势" date 文章创建时间(重要排序依据) 2024-05-30T14:30:00+08:00 tags 标签分类,支持多个标签(影响分类页面生成) ["AI", "机器学习"] draft 草稿模式开关,true 时仅在 hugo server -D 下可见 false (发布时改为false) 二、内容展示控制组 参数 功能细节 主题适配性 showToc 是否显示文章目录(需主题支持) 大多数主题兼容 TocOpen 目录初始展开状态 部分主题支持 hidemeta 隐藏发布日期等元信息显示 主题相关 comments 是否开启评论区(需集成 utterances 等第三方评论系统) Disqus/Utterances 等 三、SEO优化组 参数 技术细节 canonicalURL 规范链接,用于防止重复内容SEO惩罚(当多URL指向同一内容时指定权威地址) description 网页描述(重要SEO元素,建议控制在155字符内) disableHLJS 禁用代码高亮(可提升页面加载速度) 四、高级配置组 参数 特殊说明 weight 手动控制排序权重,值越小排序越靠前(需去掉注释 # 才能生效) aliases 设置 URL 别名(示例值访问 /first 会跳转到该文章) cover 头图配置: - relative: true 表示使用页面资源包(Page Bundle)中的图片 - hidden: true 仅在正文不显示头图 五、开发者工具组 参数 使用场景 editPost 添加「编辑此页」链接(需配置 Git 仓库路径): - appendFilePath: true 会自动追加文件路径 六、主题拓展组(不同主题功能不同) 参数 常见主题支持情况 ShowReadingTime 显示预计阅读时间(多数主题支持) ShowPostNavLinks 显示上一篇/下一篇导航 UseHugoToc 使用 Hugo 原生目录生成替代主题自带的目录系统 ❗️ 重点注意事项 多作者声明方式: ...

1 min · 173 words

Git 删除被忽略的文件

当你将一个 已经被 Git 跟踪的目录 dir/ 添加到 .gitignore 后,Git 的行为会有以下关键变化: 1. 新增文件会被忽略 任何 dir/ 目录下的 新文件 会被 自动忽略,不会被 Git 跟踪。 ✅ 新文件例子: touch dir/new_file.txt git status # 不会显示 new_file.txt 2. 已跟踪的文件仍然被 Git 跟踪 Git 仍然会继续跟踪 dir/ 中之前已经提交(tracked)的文件,即使你现在把 dir/ 加入了 .gitignore。 ⚠️ 这是因为 Git 只忽略未被跟踪(untracked)的文件,不会自动删除仓库历史记录! ✅ 已跟踪文件例子: # 假设 dir/old_file.txt 之前提交过 git add dir/old_file.txt git commit -m "Add old_file.txt" 之后修改 old_file.txt: echo "changed" > dir/old_file.txt git status # 仍然会显示 old_file.txt 已修改! 3. 如何彻底移除跟踪?(如果需要) 如果你希望 完全停止跟踪 dir/ 下的文件(包括已提交的文件),需 手动删除 Git 记录: ...

1 min · 181 words

Gitignore语法

在 Git 项目中,.gitignore 文件用于指定哪些文件或目录应该被 Git 忽略(不纳入版本控制)。下面详细介绍它的 语法规则与用法: 1. 基本规则 (1)忽略单个文件 直接写文件名: secret.txt 👉 Git 会忽略项目根目录下的 secret.txt 文件。 (2)忽略特定目录 以 / 结尾表示目录: node_modules/ logs/ 👉 忽略 node_modules/ 和 logs/ 目录及其所有内容。 (3)匹配任意层级的同名文件/目录 **/temp/ 👉 忽略所有层级下的 temp/ 目录(如 /temp/、/src/temp/)。 2. 通配符规则 (1)* - 匹配任意字符(不包括 /) *.log 👉 忽略所有 .log 文件(如 error.log、debug.log)。 (2)? - 匹配单个字符 file?.txt 👉 忽略 file1.txt、fileA.txt,但不匹配 file10.txt。 (3)[] - 字符集合 [abc].txt 👉 忽略 a.txt、b.txt、c.txt,但不匹配 d.txt。 3. 路径规则 (1)从项目根目录开始匹配 以 / 开头: ...

1 min · 186 words

hugo 初始化

初始化一个 Hugo 网站: 1. 打开终端/CMD,执行初始化命令: hugo new site my-website 这会创建名为 my-website 的网站目录 2. 进入网站目录: cd my-website 3. (建议)添加主题,以最常用的 Ananke 主题为例: git init # 初始化Git仓库 git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke 4. 修改配置文件 hugo.toml,末尾添加: theme = "ananke" 5. 创建第一篇内容: hugo new posts/my-first-post.md 6. 启动本地预览: hugo server -D 打开浏览器访问 http://localhost:1313 就能看到网站啦! 补充说明: 新建站点后会看到这些默认目录结构: ├── archetypes/ # 内容模板 ├── content/ # 网站内容 ├── layouts/ # 自定义模板 ├── static/ # 静态文件 ├── themes/ # 存放主题 └── hugo.toml # 配置文件 如果要生成静态文件,执行: hugo -D 生成的文件会在 public/ 目录中 ...

1 min · 83 words

vim 选择自动复制

Gvim 实现鼠标选中后自动复制到系统剪切板 前置检查 首先确认你的GVim编译时包含clipboard特性 :version 查看结果中是否包含+clipboard(如果没有需要重新编译或更换版本) 方法一:设置剪贴板选项(推荐) 在vimrc中添加: " Windows系统 if has('win32') set clipboard=unnamed else " Linux/Mac系统 set clipboard=unnamedplus endif 方法二:使用鼠标映射 在vimrc中添加: " 自动复制选中文本到剪贴板 vnoremap <LeftRelease> "*y vnoremap <2-LeftRelease> <Nop> " 保留中键粘贴功能 " Mac系统需要特殊处理 if has('mac') set clipboard+=unnamed vnoremap <LeftRelease> "+y endif 方法三:使用自动命令 在vimrc中添加(适用于更复杂场景): augroup AutoYank autocmd! autocmd TextYankPost * if v:event.operator == 'y' && v:event.regname == '' | let @" = @* | endif augroup END 功能验证 重启GVim生效 进入可视模式(鼠标拖选或Shift+方向键) 选中文字后立即会在系统剪贴板中生效 注意事项 Windows和Linux使用不同剪贴板寄存器: Windows:"* Linux/Mac:"+ 可以通过:reg命令查看寄存器内容 或按<Ctrl+v>测试是否可以直接粘贴已选内容 如果需要进一步优化操作手感,可以配合以下设置: " 禁用Vim的默认选择方式 set mouse-=a set selectmode= " 设置Windows风格的选择逻辑 behave mswin source $VIMRUNTIME/mswin.vim 这些设置可以让GVim的鼠标操作更接近常规编辑器体验。 ...

1 min · 91 words