> 前文帖子地址: [大佬们有没有什么方便 CodeReview 的工具?支持点击跳转到对应实现的那种.](https://www.v2ex.com/t/1213602)
## 先放仓库地址, 欢迎大家Star, Fork, 提Issue, 以及Pull Request:
Github仓库地址: https://github.com/HelloWorldImJoe/WorkTreeDesk
> ps: 因为没有做签名的原因? Mac安装包可能会被误报, 需要在系统设置里允许安装, 具体操作可以参考这个链接: https://support.apple.com/zh-cn/HT202491
## 采用的技术栈: Tauri + React
不得不说Tauri打出来的包是真的小, Window安装包只有2.97MB, Mac安装包也只有5MB.
## 做这件事情的初始动机:
就是前文帖子里面的场景, 一直被这个问题困扰, 之前尝试过使用AI做一版, 但是因为生成的Rust代码我看不懂, 就放弃了. 最近因为在学习Rust, 所以就重新把这个工具正经做了一版.
## 目前支持的功能:
- Git WorkTree的基本功能: 创建, 删除, 列表展示.
- 集中管理多个仓库的WorkTree, 可以为每个仓库设置默认的编辑器(目前主流的编辑器应该是都加进去了), 一键使用默认编辑器打开对应的WorkTree, 或者在Finder中显示.
- 集成了Gitee的代码评审功能: 可以直接在工具里查看待评审的PR, 以及PR的详情, 还可以点击CodeReview按钮, 通过本地ide打开对应的PR分支, 主要是方便跳转到对应的实现, 以及方便进行代码评审.
## 后面可能会做的功能:
- 支持更多的Git平台, 目前只支持Gitee, 后面可能会支持GitHub, GitLab等.
- 支持代码评审的评论功能, 这个优先级应该会最高, 但是因为马上要开新项目了, 所以不一定什么时候有空来做.
## 最后放几张截图, 供大家快速决策是否有用:



Created
### Demo地址: http://oxapi.v2ex.info/
### Github项目地址: https://github.com/HelloWorldImJoe/oxapi
#### [附一个测试的 markdown 文件, 直接创建项目新建 md 文件就可以了](https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1)
- 因为托管到了腾讯云, 所以点击调试可能会失败, 如果是本地运行的话是没问题的.
- 要是想体验调试的话, 可以用这个[proxy脚本](https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js)在本地运行启动:
```
node ./local-proxy.js
```
##### 启动之后, 在网站中配置自定义代理:
<img width="1122" alt="9E219DF3-0820-4280-8CB6-A3E190512B91" src="9E219DF3-0820-4280-8CB6-A3E190512B91.png">
---
附一些使用截图:
<img width="2560" alt="FBD17A08-9284-42E2-A5A8-5268574D7599" src="FBD17A08-9284-42E2-A5A8-5268574D7599.png">
<img width="2556" alt="2C6121CF-D784-44B4-AB59-C35CA09B9B76" src="2C6121CF-D784-44B4-AB59-C35CA09B9B76.png">
Created
一个中文表情包的仓库地址: https://github.com/zhaoolee/ChineseBQB
```
./rename_smirkboy_files.sh --p 假笑男孩
./rename_smirkboy_files.sh -p 假笑男孩 --dry-run
./rename_smirkboy_files.sh /path/to/dir -p 其他前缀 -n
./generate_emoji_json.sh 生成json文件
```
<a href="rename_smirkboy_files.sh">rename_smirkboy_files.sh</a>
<a href="generate_emoji_json.sh">generate_emoji_json.sh</a>
Created
源码地址: https://github.com/HelloWorldImJoe/TampermonkeyScripts
脚本安装地址: [油猴脚本安装地址]( https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-custom-emoji.user.js)
一个贡献表情或者反馈问题的节点: https://www.v2ex.com/go/emojipic
原理: 没有什么复杂的东西, 为了无服务器, 资源存在planet上, 使用ipfs来存储. 然后绑定了sol.build域名, sol.build域名是v2ex信任的图床域名. 所以可以直接显示图片.
---
开源的中文表情包仓库: https://github.com/zhaoolee/ChineseBQB
我整理的一些表情包:
假笑男孩: https://fun.zhihaoo.sol.build/F5BB3309-D68F-4A06-837A-52584CD60241
乌龟: https://fun.zhihaoo.sol.build/94B7CD12-5A08-4B76-8490-36303C1A0BA5
猫咪日常: https://fun.zhihaoo.sol.build/7FCBA86A-1901-4A45-B392-7C19EE9DB52D
葫芦娃:https://fun.zhihaoo.sol.build/32CB621D-51EB-4EE8-85CC-5FB6106AA6A6
---
Planet用户可以使用
```https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/90C4CA55-7131-452C-8E06-BF23E04F9367/```
来处理中文表情包仓库中的资源来快速转换为V2EX可用的资源
---
相关截图:
<img width="838" alt="input" src="input.png">
<img width="684" alt="0692C518-3E0D-4A1D-84B3-88947EF4ECBE" src="0692C518-3E0D-4A1D-84B3-88947EF4ECBE.png">
<img width="834" alt="4" src="4.png">
<img width="846" alt="5" src="5.png">
Created
站点地址: http://oxapi.v2ex.info/
这有一个本地的 proxy 文件, 可以使用 node 启动, 放在个人中心的配置里:
https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js
启动命令: ```node ./local-proxy.js```
<img width="1122" alt="579EC131-3012-4716-9876-6E75DA02466C" src="579EC131-3012-4716-9876-6E75DA02466C.png">
大佬们给我提提意见, 我看看还有没有做下去的必要 🤡
附一个测试的 markdown 文件, 直接创建项目新建 md 文件就可以了:
https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1
ps: 后续看看V站的记事本能不能有接口, 要是有接口的话, 这个文档完全可以存在记事本里. 当做自定义节点的产品发布者的api文档?
Created
一键安装地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js)
脚本仓库地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js)
---
更新 2026-01-07:
'新增聊天面板拖动缩放与自适应布局能力,可以通过右下角的拖拽手柄调整大小',
'新增主动发起会话功能, 输入用户名直接发起一个会话',
'新增聊天面板位置记忆功能, 面板位置会在关闭后保存, 下次打开时恢复',
'新增会话置顶功能, 置顶的会话会固定在列表顶部',
'新增消息引用功能, 可以引用某条消息进行回复, 长按消息气泡即可触发操作面板',
'新增引用消息点击跳转到原消息位置, 如果原消息在当前页面没加载, 则不跳转',
'新增日/月模式切换, 可以在面板顶部切换当前主题',
'新增图片显示支持, 可以在消息中显示图片链接',
'新增R按钮和C按钮, R按钮用于刷新会话列表(适应于消息不同步), C按钮用于清除当前会话记录(重新建立索引)',
'优化PIN状态不会再在刷新后丢失',
'修复若干已知问题'
---
更新 2026-01-06:
1. 最新版本添加了 `引用与打赏私聊` 的功能, 长按消息就可以唤起操作菜单
2. 消息中支持显示引用消息以及图片消息(i.imgur.com 与 i.v2ex.co 来源)
3. 点击引用消息可以快速跳转到被引用的消息(已经加载过,没有加载的跳转不到)
4. 支持常用钱包, 已验证: okx, phantom
---
相关截图:
<img width="953" alt="menu" src="menu.png">
<img width="947" alt="quoted" src="quoted.png">
<img width="934" alt="pic" src="pic.png">
<img width="2194" alt="look" src="look.png">
<img width="2197" alt="chat" src="chat.png">
Created
[V2EX历史数据看板](https://data.v2ex.pro)添加了对打赏相关数据的展示
<img width="1726" alt="feat_20251225" src="feat_20251225.png">
Created
一键安装地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js)
脚本仓库地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js)
<img width="937" alt="topic" src="topic.png">
<img width="1017" alt="alert" src="alert.png">
<img width="803" alt="ui" src="ui.png">
<img width="812" alt="tips" src="tips.png">
Created
工具站点地址: https://data.v2ex.pro/
仓库地址: https://github.com/HelloWorldImJoe/v2ex-info-history
数据源地址: https://github.com/GrabCoffee/v2ex-info-newsletter-data
---
### 技术栈:
纯React前端项目
### 数据采集:
使用Cloud Flare定时采集的数据, 然后保存到了github仓库中, 有些时候可能会被限流导致一些采集不到的脏数据, 在前端做了一层过滤,应该不影响整体的分析.
### 发布:
这个可以详细说一下思路
1. 使用了Planet的文件夹发布功能: 将项目打包之后, 通过planet发布文件夹并生成ipns
2. 在V2EX的[Planet管理器](https://www.v2ex.com/planet/dashboard)中, 提交这个ipns, 并绑定了[data.v2ex.pro](https://data.v2ex.pro/)的域名
3. 因为正常V2ex的Planet管理器是会去站点找一个planet.json的文件, 所以我伪造了这个文件, 并修改了这个文件对应的ipns, 目的是能够让v2ex抓取到我最新的cid来与上面提到的域名做关联. 为了在Planet管理器中能显示头像, 我还加了一个avator的头像, 看起来像是一个正常的站点,

4. 整体就是这么一个思路,大家可以尝试一下, 很好玩. 还可以通过这个planet.json做一些更好玩的事情
---
预览图:
<img width="1480" alt="longshot20251229131715" src="longshot20251229131715.png">

ps: 数据不是实时的, 最新的数据是昨天(utc时间)的, 如果是早晨8点左右的话, 可以算是伪实时😂
Created
[脚本一键安装地址]( https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/topic-quick-thank.user.js)
仓库地址: https://github.com/HelloWorldImJoe/TampermonkeyScripts
开发背景: https://v2ex.com/t/1170807?p=1#r_16953786
截图:
<img width="907" alt="single" src="single.png">
<img width="844" alt="reply" src="reply.png">
Created
Planet已经占用了4001端口, 所以我将swarm port设置为了4002,
修改相关配置, 或者直接在目录下运行:./deployment.sh, 会直接创建一个ipfs的节点, 创建成功之后, 可以通过`http://localhost:${ipfs_gateway_port}/webui `打开webui来进行简单操作.
脚本文件: <a href="deployment.sh">deployment.sh</a>
脚本源码如下:
```
# !/bin/bash
# 检查 Docker 是否安装
if ! [ -x "$(command -v docker)" ]; then
echo 'Error: Docker is not installed.' >&2
exit 1
fi
echo 'Docker is installed.'
# 检查是否有正在运行的 IPFS 容器
if [ "$(docker ps -q -f name=ipfs_host)" ]; then
echo 'Error: An IPFS container is already running.' >&2
exit 1
fi
echo 'No running IPFS container found.'
# 检查是否有同名的停止状态的 IPFS 容器
if [ "$(docker ps -aq -f status=exited -f name=ipfs_host)" ]; then
echo 'Error: A stopped IPFS container with the same name already exists.' >&2
exit 1
fi
echo 'No stopped IPFS container with the same name found.'
echo 'Proceeding with deployment...'
# 创建存储目录
current_dir=$(pwd)
cd $current_dir
mkdir -p ./ipfs_staging
mkdir -p ./ipfs_data
echo 'Storage directories created.'
# 设置环境变量
export ipfs_staging=./ipfs_staging
export ipfs_data=./ipfs_data
export ipfs_swarm_port=4002
export ipfs_api_port=8080
export ipfs_gateway_port=5001
echo "IPFS staging directory: ${ipfs_staging}"
echo "IPFS data directory: ${ipfs_data}"
echo "IPFS swarm port: ${ipfs_swarm_port}"
echo "IPFS API port: ${ipfs_api_port}"
echo "IPFS gateway port: ${ipfs_gateway_port}"
# 运行 IPFS 容器
docker run -d --name ipfs_host -v ${ipfs_staging}:/export -v ${ipfs_data}:/data/ipfs -p ${ipfs_swarm_port}:4001 -p ${ipfs_api_port}:8080 -p ${ipfs_gateway_port}:5001 ipfs/kubo:latest
if [ $? -ne 0 ]; then
docker rm -f ipfs_host 2>/dev/null
rm -rf ./ipfs_staging
rm -rf ./ipfs_data
echo 'Error: Failed to start the IPFS container.' >&2
exit 1
fi
echo 'IPFS container started successfully.'
open "http://localhost:${ipfs_gateway_port}/webui"
```
Created
效果大概是这样的:


大概流程就是: 我会解析planet聚合器中的节点, 找到对应的`data-site-address`, 然后在最前方拼上scheme: `planet://`, 再调用`window.open()`打开这个连接, 就完成了这个半自动操作😂
点击某个博客关注后, 同一列表的其他博客不会显示已关注, 刷新一下界面就可以了, 这里我不想点关注之后再刷新, 比较影响体验.
因为真正的关注是在planet中实现的, 所以界面上的已关注我放开了取消关注的限制, 如果planet中已经取消关注了, 界面上还显示已关注这是正常现象, 毕竟数据不能同步, 我也不想做的太麻烦, 看着碍眼手动点一下得了.
仓库地址: https://github.com/HelloWorldImJoe/TampermonkeyScripts
快速安装地址: [脚本安装地址](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/planet-follow-button.user.js)
Created
> 之前上线了一个针对V2EX的空投网站, 最近有V友反馈说这个网站被Chrome标记成了危险站点, 需要向谷歌申诉一下, 记录一下处理这次事件的整个过程
### 背景
大概是一个月之前, 我上线了一个解析V2EX帖子回复内容并进行批量空投的站点, 一直也没啥人用, 我也没怎么关注过, 直到昨天下午, 我帮一个V站大佬进行批量空投之后, 晚上有V友给我提示说站点被chrome标记成了危险站点, 提醒我去谷歌申诉一下. 在此感谢[@Jianrry](https://www.v2ex.com/member/Jianrry)的友情提示, 帖子原文在这: [刚才帮 @PilgrimSun 大佬搞了一波空投, 顺便给空投加上了一个筛选指定楼层区间的功能, 顺便 po 一下过程中的一些细节](https://www.v2ex.com/t/1160233)
### 过程
今早晨, 我打开[我的空投网站](https://airdrop.grabcoffee.cc/), 果然提示我是危险站点!<img width="2390" alt="1图" src="1图.png">
于是我点击`详细信息->请告知我们`, 在这个页面进行了一次简单的申诉
<img width="2347" alt="2图" src="2图.png">
点击提交, 提示成功, 然后我等了有半个小时, 再次打开网站, 很好, 还是危险站点😂, 于是我再次点击`详细信息->发现了钓鱼式攻击`进入这个帮助界面
<img width="2347" alt="3图" src="3图.png">
点击了`自我保护->Google安全中心`进入了安全界面并注册了账号, 填写了我的站点地址:
<img width="2560" alt="4图" src="4图.png">
碰到了一个小问题, 使用clodflare快捷验证打开的新界面一直不重定向, 所以我更换了验证方式, 使用了通用的`适用任何DNS提供商`, 根据提示配置好dns解析, 点击验证, 如图
<img width="2560" alt="5图" src="5图.png">
等待验证完成之后, 再次打开网站, 我发现危险站点的提示页面已经消失了, 虽然谷歌安全的后台面板还提示一个安全问题:
<img width="2560" alt="图1" src="图1.png">
但是好像没啥影响, 就不继续处理了.
以上, 就是本次事件的处理过程, 再次感谢@Jianrry的友情提示🙏🏻
-------------------------------------------
_以上没有解决安全问题,过了半个小时又被封了, 下面是真正的整改过程_
-------------------------------------------
目前已经恢复访问, 主要是根据谷歌提供的安全警告来进行了整改
主要操作:
1. 去[谷歌安全中心](https://search.google.com/search-console)证明自己是站点所有者
2. 然后查看谷歌给出的安全警告, 如图:
<img width="2560" alt="图1" src="图1.png">
3. 打开网站代码, 告诉AI我的站点被安全警告了,把具体的安全警告贴给他, 让AI给出整改
4. AI整改完之后, 再让AI根据整改内容提供一份申诉话术用来申请审核.
5. 发布网站, 点击申请审核, 等待结果.
如果审核通过的话, 大概会收到一封邮件和一封站内信, 如下图:
<img width="1462" alt="图2" src="图2.png">
Created
## 一. 关于交易的细节
#### 以v2ex的20$v2ex打赏为例:
##### 1.在点击打赏按钮之后, 会唤起钱包进行交易, 其实在交易的面板中是有一个默认折叠的高级选项的, 可以点击展开折叠, 如图1所示:

##### 2. 如果点开高级选项会显示本次交易包含的操作指令, 如图2所示:

> Program Id 就是程序的ID, 也就是我们常说的智能合约
>
> Data 就是这个程序传入的参数
可以看到打赏V币一共执行了3个指令, 上面两个指令是Unknown, 所以钱包把他们对应的合约地址也就是Program Id给贴出来了, 右边有一个打开按钮, 点击就可以查看这个合约的具体信息. 最后一个指令是Transfer, 这个指令是内置指令, 也就是System Program, 类似系统内核里面自带的一些工具或者函数方法. (其实前面两个ComputeBudget, 也是系统提供的, 是NativeLoader管理的, 为什么显示Unknown不清楚, 但是这不是这次讨论的重点, pass掉)
然后细说最后这个Transfer, 这个其实就是转账操作, 转账分两种, 一种是原生转账, 一种是SPL转账, 咱们使用的V币打赏就是SPL转账, 这两种转账差不多其实, 先细说这个图里的SPL转账:
1. Amount是2+7个0, 因为V币是6位小数, 所以这个Amount * V币的小数位就是实际操作的V币数量
2. Source 是来源 Token 账户, 在这个图里面是: 4kbSR...9PARy
3. Destination 是目标 Token 账户
4. Owner 是授权人或者说是来源Token账户的所有者, 这个地方我没有裁全, 大概能看到是我H5u的钱包公钥.
这个地方需要注意的是, Token账户地址不是你的钱包地址, 而是你在对应Token下创建的账户, 这也是为什么我们给从来没持有国V币的用户(or 回收了V币钱包地址)打赏的时候, 会额外支付0.002sol的原因, 这0.002sol就是用来创建对方在V2EX Token上的账户租金.
这一点就是原生转账和SPL转账之间最大的不同, 原生转账的双方地址就是双方对应的solana链上的钱包地址, 而SPL转账则是对应Token上面的账户地址.
##### 3. 我们点击确认按钮, 大概会得到下面这一个界面:

在这个界面的最下方有一个 _在Solscan上查看_ 点击就可以在Solscan上查看这一笔交易的详细信息, 包括传参, 账户操作, Log之类的, 大概是这样的:

ps: 还有一个比较好用的查看交易信息的网站叫: https://explorer.solana.com/ 后面可以拼接: tx/xxxx 或者 address/xxxx, 就可以查看交易或者对应的账户信息, address可以是代币地址, 也可以是钱包地址.
#### 以https://sol-incinerator.com回收空钱包地址的截图为例, 大家可以自己分析一下或者自己尝试着操作一下看看:




## 二. 关于在交易所以及Web3钱包的一些tips, 这点可能需要大家来一起补充, 我操作的比较少, 挑我知道的说
#### 1. 在`交易所钱包`的虚拟货币 和 在`Web3钱包`里面的虚拟货币 虚拟币是一样的, 但还是有一些不同的, 打个比方:
- **交易所里的币** 就像是你存在**银行**里的钱。
- 银行帮你保管,交易记录在银行的内部账本上。
- 你使用网银APP进行操作,非常方便。
- 但理论上,银行可以冻结你的账户(配合调查时),如果银行倒闭,你的钱可能会受损。
- **Web3钱包里的币** 就像是你放在**自己家里保险箱**的现金。
- 现金完全由你掌控,看得见摸得着。
- 你可以自由支配,无需经过任何第三方。
- 但如果你弄丢了保险箱钥匙(私钥/助记词),或者被小偷破门而入,钱就永远找不回来了。
#### 2. 交易所里面的充币/提币, web3钱包里面的转账手续费问题
挑我知道的说:
1. web3钱包的转账是没有第三方收取手续费的, 只需要支付一些gas和优先费就可以了
2. 交易所里面的这个`充币`目测没有什么额外的手续费, 跟web3钱包是一样的
3. 但是这个`提币`操作, 好像都是需要一些额外的服务费的, 之前用Binance好像每笔usdt都会收我0.5u的样子, 现在用okx每次大概收我1u, 但是我去帮助文档里面检索了一下, 发现这么一些答案:



还有这么一个解释:

Created