MoreRSS

site iconiMaeGoo | 虹墨修改

95后前端开发者,居住郑州,擅长前端技术,分享个人学习记录。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

iMaeGoo | 虹墨的 RSS 预览

微信快速找出自己创建的群聊

2025-05-08 13:00:00

微信本身没有筛选自己创建的群聊的功能,需要将微信的数据库解密,然后通过 SQL 语句查询。

下载所需工具

  1. 微信 4.0.3.22 Windows 版本,最新版本的不行,下载地址: https://github.com/cscnk52/wechat-windows-versions/releases/tag/v4.0.3.22 (如果这个地址没了就自己再找)

  1. wechat-dump-rs,下载地址: https://github.com/0xlane/wechat-dump-rs/releases
  2. DB Browser for SQLite,下载地址: https://sqlitebrowser.org/dl/#windows

解密数据库

  1. 登录微信,保持微信运行
  2. 打开 cmd,cd 到 wechat-dump-rs.exe 所在目录
  3. 执行 wechat-dump-rs.exe -a
  4. 如果看到 decryption complete!! 就成功了,output to 后面就是解密后的数据库路径

打开数据库

  1. 到 DB Browser for SQLite 的安装目录,打开 DB Browser for SQLCipher.exe

  1. 打开数据库,定位到上一步 output 的目录,打开 contact/contact.db

  1. 点执行 SQL
  2. 粘贴以下语句,点执行
1
2
3
4
5
6
SELECT chat_room.owner, contact.nick_name
FROM chat_room
LEFT JOIN contact
ON chat_room.username = contact.username
WHERE chat_room.owner = "换成你的微信号"
AND contact.is_in_chat_room != 2;
  1. 就可以看到所有自己创建的微信群了

将扣子空间生成的 jsx 格式网页部署到自己的服务器

2025-04-29 08:00:00

扣子空间生成的网页是 jsx 格式的,在扣子空间内可以正常打开,如果想要部署到自己的服务器,则需要经过编译。

为此,我写了一个模板,只需将扣子空间生成的 jsx 重命名为 coze.tsx(注意后缀要改为 tsx)放入本项目 src 目录,即可编译出可静态部署的 dist 产物。

详细步骤

  1. 从扣子空间下载 jsx 文件

  1. 下载 模板工程
  2. 安装 Node.js
  3. 进入本项目所在目录,运行 npm install -g pnpm 安装 pnpm 包管理器
  4. 运行 pnpm install 安装依赖
  5. 将扣子空间生成的 jsx 重命名为 coze.tsx(注意后缀要改为 tsx),放入 src 目录,覆盖原有的 coze.tsx 文件

  1. 检查 coze.tsx 中的 import 语句,确保所有第三方包都已经安装,举例:如果 coze.tsx 中有 import Mermaid from 'mermaid';,就执行安装 pnpm install mermaid
  2. 运行 pnpm run dev 查看效果

  1. 运行 pnpm run build 编译
  2. 编译完成后,在 dist 目录下即可找到编译后的产物

扣子空间邀请码

2025-04-24 08:00:00

字节跳动出了一个类 Manus 的 AI Agent 工具,叫扣子空间,目前是邀请码内测机制,在此分享几个邀请码。

邀请码使用地址: https://space.coze.cn

用完记得评论说下已使用,如果邀请码都已使用,可以评论提醒我补充更多的邀请码。

1
2
3
4
5
Q4RA5622 已激活
54W9053G 已激活
4YUTZNOV 已激活
XFZKRCIZ 已激活
HZFQRQVC 已激活

续 1

发出来才 3 分钟不到就全被用了,然而没一个人留言。有真正需求的可以关注博客页面左边的公众号(虹墨iMaeGoo)私信我获取。

续 2

我的所有 20 个邀请码都发放完毕了,你可以通过其他渠道获得邀请码 - https://docs.qq.com/sheet/DUkdXa1JtQWtlSXJp

续 3

更多邀请码放出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
8D01YILO 已激活
SCFBW27F 已激活
GPI4P0OL 已激活
EDW7VRLW 已激活
3HIZ37XF 已激活
Q4RA5622 已激活
54W9053G 已激活
4YUTZNOV 已激活
XFZKRCIZ 已激活
HZFQRQVC 已激活
D7FWIMJ4 已激活
H9ZM7KQ1 已激活
94PYYP6R 已激活
5HO53HQL 已激活
4YQYH3BC 已激活
C5QJ9RUZ 已激活
42BGV4OD 已激活
C5IKZ13G 已激活
F4R5RQWX 已激活
P449LTOC 已激活
RAL58FKV 已激活
H7K47ET3 已激活
IP765WVL 已激活
H8WDAT20 已激活
ST25AOYY 已激活
V0NRUE3G 已激活
KM0M6HN1 已激活
S97PP4AU 已激活
HE830CXE 已激活
I2ODIZ9M 已激活
CCLLI44L 已激活
MLNM7A0J 已激活
BB2HDWAE 已激活
MLS3IYRN 已激活
9LL7XO6G 已激活
WDIE546J 已激活
96OSOHQT 已激活
EDJ182QW 已激活
LUPTYN8S 已激活
OSIF6AYZ 已激活
BED56SSX 已激活
2M7GCFDZ 已激活
CSDP4RGF 已激活
YIMVWMDB 已激活
HFZAHFQV 已激活
1ZP0HMH5 已激活
HHF0R59D 已激活
8QPRC46N 已激活
G9GAKQ1V 已激活
VN8YCOSM 已激活
BKIE162P 已激活
K4U0ALR0 已激活
ZEC6EJN8 已激活
8LFS25M2 已激活
CGGCT0JK 已激活
33XCKI66 已激活
N32IX2ED 已激活
5BM48I2I 已激活
XJ8YJ9BQ 已激活
FG677MC8 已激活
CPQAI352 已激活
3FL0OJ28 已激活
FQQ6GR3O 已激活
HZX6TK2L 已激活
HEVFPIR7 已激活
BOLFJACA 已激活
7R7NYYSU 已激活
MZRZF6OO 已激活
N65LQH12 已激活
XH8QCFBT 已激活

Midscene.js:AI驱动的自动化测试工具

2025-03-19 08:00:00

字节有一个很实用但不怎么火的项目,叫 Midscene.js,Chrome 商店上的安装数仅有 1 万,它是一个由多模态模型驱动的前端自动化测试插件。

Midscene.js 一共就三大 API:Action、Query、Assert

Action 交互

描述步骤并执行交互。例如,在 GitHub 上交互:查找 GitHub 上的 Twikoo 项目,点进详情页,点个 Star——

Query 提取

从 UI 中“理解”并提取数据,返回值是 JSON 格式,想要什么数据结构,它都可以给你。例如,在面试题宝典网站上提取:string[],所有面试题目——

Assert 断言

判断是否符合指定条件。例如,在智能家庭页面断言:电脑是关着的——

大模型支持情况

项目最初仅支持 GPT-4o 模型,跑一行用例的成本在 ¥0.1 左右,还挺贵的,后来支持了 Qwen-2.5-VL 和 UI-TARS,成本就大幅降低了。以下就以千问模型为例,带领大家上手这个神奇的插件。

安装

可以直接从 Chrome 商店安装:
https://chromewebstore.google.com/detail/midscene/gbldofcpkknbggpkmbdaefngejllnief

配置

从浏览器右上角的插件菜单中打开 Midscene.js 的侧边栏,会提示 No config,点击按钮会弹出 Env Config 的设置框,在里面配置以下变量

1
2
3
4
OPENAI_BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"
OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
MIDSCENE_MODEL_NAME="qwen-vl-max-latest"
MIDSCENE_USE_QWEN_VL=1

其中的 OPENAI_API_KEY 需要你自己申请,申请的地址是:
https://bailian.console.aliyun.com/?apiKey=1#/api-key

以上链接不包含推广,如果你是首次开通阿里云百炼,新用户是有免费额度的,请注意额度的有效期,避免浪费~

测试

接下来用自然语言随便写一条指令,点击 Run 按钮,见证 AI 开始接管你的浏览器……

代码集成

接下来我们尝试编写爬虫,组合这三大 API,完成复杂的自动化任务。

建一个新的 Node.js 项目,安装所需的依赖——

1
pnpm install @midscene/web tsx --save-dev

编写脚本 main.ts,执行你想要进行的操作,例如,打开必应,输入 iMaeGoo 点击搜索,并输出搜索结果——

main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import { AgentOverChromeBridge } from "@midscene/web/bridge-mode";

function sleep(ms: number) {
return new Promise((r) => setTimeout(r, ms));
}

async function main() {
process.env.OPENAI_BASE_URL =
"https://dashscope.aliyuncs.com/compatible-mode/v1";
process.env.OPENAI_API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
process.env.MIDSCENE_MODEL_NAME = "qwen-vl-max-latest";
process.env.MIDSCENE_USE_QWEN_VL = 1;
const agent = new AgentOverChromeBridge();
// 这个方法将连接到你的桌面 Chrome 的新标签页
// 记得启动你的 Chrome 插件,并点击 'allow connection' 按钮。否则你会得到一个 timeout 错误
await agent.connectNewTabWithUrl("https://www.bing.com");
// 这些方法与普通 Midscene agent 相同
await agent.ai("输入 iMaeGoo 点击搜索");
const result = await agent.aiQuery(
"{title: string, url: string}[], 搜索结果"
);
console.log("搜索结果", result);
await sleep(3000);
await agent.destroy();
}

main();

启动你的 Chrome 插件,点击 Bridge Mode,再点击 ‘Allow connection’ 按钮——

随后运行脚本——

1
pnpx tsx main.ts

可以看到脚本成功打开必应搜索 iMaeGoo 并打印出了搜索结果——

仅需两个文件,实现在 VS Code 状态栏监控黄金价格

2025-02-21 08:00:00

最近金价波动剧烈,要是能一边写代码,一边实时监控金价变动,就不会错过高低点了!

C:\Users\你的用户名\.vscode\extensions 新建文件夹 gold-monitor,在文件夹中创建两个文件 package.jsonextension.js

package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"name": "jd-gold-price-monitor",
"displayName": "JD Gold Price Monitor",
"description": "Monitor gold price from JD",
"version": "0.0.3",
"author": "iMaeGoo",
"publisher": "iMaeGoo",
"engines": {
"vscode": "^1.85.0"
},
"categories": [
"Other"
],
"activationEvents": [
"onStartupFinished"
],
"main": "./extension.js",
"contributes": {
"commands": [
{
"command": "gold-price-monitor.start",
"title": "Start Gold Price Monitor"
}
]
}
}
extension.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
const vscode = require("vscode");

let statusBarItem;
let intervalId;

function activate(context) {
// 创建状态栏项
statusBarItem = vscode.window.createStatusBarItem(
// 在状态栏左半边显示
vscode.StatusBarAlignment.Left,
// 数字越大,越靠左
-999
);
context.subscriptions.push(statusBarItem);

// 注册命令
let disposable = vscode.commands.registerCommand(
"gold-price-monitor.start",
() => {
startMonitoring();
}
);

context.subscriptions.push(disposable);

// 激活时自动开始监控
startMonitoring();
}

async function updateGoldPrice() {
try {
const price = await getPrice();
statusBarItem.text = price;
statusBarItem.show();
} catch (error) {
console.error("获取价格失败", error);
statusBarItem.text = error.message;
statusBarItem.show();
}
}

async function getPrice() {
// 获取京东金融民生银行积存金价
const response = await fetch(
"https://api.jdjygold.com/gw/generic/hj/h5/m/latestPrice?reqData={}"
);
const data = await response.json();
const price = data.resultData.datas.price;
return price;
}

function startMonitoring() {
// 清除现有的定时器
if (intervalId) {
clearInterval(intervalId);
}

// 立即更新一次
updateGoldPrice();

// 设置定时器,每隔 6666 毫秒更新一次
intervalId = setInterval(updateGoldPrice, 6666);
}

function deactivate() {
if (intervalId) {
clearInterval(intervalId);
}
}

module.exports = {
activate,
deactivate,
};

重新启动 VS Code(Ctrl + Shift + P,输入 reload window,回车)即可看到效果。

如果你想监测其他品牌金价,可以修改 getPrice 方法,具体实现如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
async function zheshang() {
// 获取京东金融浙商银行积存金价
const response = await fetch(
"https://api.jdjygold.com/gw2/generic/jrm/h5/m/stdLatestPrice?productSku=1961543816"
);
const data = await response.json();
const price = data.resultData.datas.price;
return price;
}

async function zhoushengsheng() {
// 获取周生生首饰金价
try {
const res = await fetch("https://cn.chowsangsang.com/gold-info");
const data = await res.text();
const gold_data_match = data.match(/:gold_data='(.*)'/);
const gold_data = gold_data_match
? JSON.parse(decode(gold_data_match[1]))
: [];
const price = gold_data.find(
(i: any) => i.description === "黄金金价"
).price;
return price;
} catch (e) {
console.error("zhoushengsheng", e);
}
}

async function laofengxiang() {
// 获取老凤祥首饰金价
const res = await fetch("http://lfx1848.com");
const data = await res.text();
const price_match = data.match(/<span id="labContent">(.*)<\/span>/);
const price = price_match ? price_match[1] : "";
return price;
}

async function zhouliufu() {
// 获取周六福首饰金价
const res = await fetch("https://price.zlf.cn/index_35.aspx");
const data = await res.text();
const price_match = data.match(/<span class="fr">(.*)<\/span>/);
const price = price_match ? price_match[1] : "";
return price;
}

async function liufuzhubao() {
// 获取六福珠宝首饰金价
const res = await fetch("https://www.lukfookeshop.com.cn");
const data = await res.text();
const price_match = data.match(/>:(.*?)元\/克/);
const price = price_match ? price_match[1] : "";
return price;
}

async function zhoudafu() {
// 获取周大福首饰金价
const res = await fetch(
`https://api2.ctfmall.com/gateway//ctfmall-common2-server/common/ctfTodayGoldPrice?timestamp=${Date.now()}`
);
const data: any = await res.json();
const price = data.data.todayPriceHK;
return price;
}

async function laomiao() {
// 获取老庙首饰金价
const res = await fetch(
"https://vip.laomiao.com.cn/index.php/m/home-gold_price.html"
);
const data: any = await res.json();
const price = data.data.price_list.find(
(i: any) => i.name === "足金饰品"
).price;
return parseInt(price);
}

Android 14 APP 全屏代码实现

2024-11-21 21:08:00

新的 Android API 改变了应用全屏的方式,网上搜到的全屏代码都不管用了,甚至 谷歌自己的教程 都没有更新,看了 API 文档才研究明白最新代码怎么写。本篇讲述两种新的全屏方式,一种保留状态栏文字的全屏,一种隐藏状态栏的全屏。

保留状态栏,适配全面屏

默认情况下,应用界面不会延伸到系统状态栏、导航栏、导航条等区域,这会很丑,要想适配全面屏显示,在 Android 14 中,可以用一行代码简单实现。

1
2
3
// import androidx.activity.enableEdgeToEdg

enableEdgeToEdge()

隐藏状态栏,完全全屏

适配全面屏并不会隐藏系统状态栏、导航栏、导航条,如果想实现完全全屏,老办法一般是调用 setSystemUiVisibility(),然而这个方法在 14 中已经弃用了,获取 InsetsControllerViewCompat.getWindowInsetsController() 方法也被弃用了,最新的写法是:

1
2
3
4
5
6
7
8
9
// import androidx.core.view.WindowCompat
// import androidx.core.view.WindowInsetsCompat
// import androidx.core.view.WindowInsetsControllerCompat

val windowController = WindowCompat.getInsetsController(window, window.decorView)
// 应用全屏时,用户仍然可以从屏幕顶部下拉唤出状态栏,此行代码实现当用户唤出状态栏后,自动隐藏状态栏
windowController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// 隐藏包括状态栏、导航栏、caption bar 在内的所有系统栏
windowController.hide(WindowInsetsCompat.Type.systemBars())