{
  "about" : "记录曾经踩过的坑, 也偶尔会写一些技术食用指南",
  "acceptsDonation" : true,
  "acceptsDonationETHAddress" : "0x218fd357ed56d7812e6592cdc3e31cd3a04dcfb3",
  "acceptsDonationMessage" : "Thanks",
  "articles" : [
    {
      "articleNumber" : 16,
      "articleReference" : "9D5E2DD8-16",
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "一键安装地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js)\n\n脚本仓库地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js)\n\n----\n\n没错, 还是原来的那个插件, 已经安装的V友应该会收到推送通知, 哈哈哈.\n\n----\n\n> 这个地方添加了一个举报按钮\n![](https://i.imgur.com/BaSTXVg.png) \n\n> 点击之后会弹一个窗口, 支持选择对应的管理员, 当前默认是我, 后面的改变选择会持久化到本地\n\n> 下方输入举报原因\n\n![](https://i.imgur.com/hK8W37H.png) \n\n> 点击确定之后会唤起钱包进行支付, 支付完成之后, 会在左下角提示状态.\n\n> 管理员这边收到消息大概是这样的:\n\n![](https://i.imgur.com/BlBNCHx.png) \n \n",
      "contentRendered" : "<p>一键安装地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js\">v2ex-scene-script.user.js</a></p>\n<p>脚本仓库地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js\">v2ex-scene-script.user.js</a></p>\n<hr />\n<p>没错, 还是原来的那个插件, 已经安装的V友应该会收到推送通知, 哈哈哈.</p>\n<hr />\n<blockquote>\n<p>这个地方添加了一个举报按钮<br />\n<img src=\"https://i.imgur.com/BaSTXVg.png\" alt=\"\" /></p>\n</blockquote>\n<blockquote>\n<p>点击之后会弹一个窗口, 支持选择对应的管理员, 当前默认是我, 后面的改变选择会持久化到本地</p>\n</blockquote>\n<blockquote>\n<p>下方输入举报原因</p>\n</blockquote>\n<p><img src=\"https://i.imgur.com/hK8W37H.png\" alt=\"\" /></p>\n<blockquote>\n<p>点击确定之后会唤起钱包进行支付, 支付完成之后, 会在左下角提示状态.</p>\n</blockquote>\n<blockquote>\n<p>管理员这边收到消息大概是这样的:</p>\n</blockquote>\n<p><img src=\"https://i.imgur.com/BlBNCHx.png\" alt=\"\" /></p>\n",
      "created" : 805380629.185308,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "F405BCBE-F874-49CB-9BEE-BA9E573BF903",
      "link" : "/F405BCBE-F874-49CB-9BEE-BA9E573BF903/",
      "slug" : "",
      "tags" : {

      },
      "title" : "做了一个V2EX的举报插件. 可以通过这个插件脚本来实现举报站内帖子, 联通 V2EX 的通知系统, 快速通知到对应的管理员.\n"
    },
    {
      "articleNumber" : 14,
      "articleReference" : "9D5E2DD8-14",
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

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

      },
      "title" : "做了一个叫WorkTreeDesk的工具, 主要是方便使用Git的WorkTree功能, 以及集成了Gitee的部分代码评审功能, 还在迭代中, 目前功能还比较简单, 主要是方便自己使用, 也欢迎有兴趣的朋友一起参与开发."
    },
    {
      "articleNumber" : 13,
      "articleReference" : "9D5E2DD8-13",
      "articleType" : 0,
      "attachments" : [
        "FBD17A08-9284-42E2-A5A8-5268574D7599.png",
        "9E219DF3-0820-4280-8CB6-A3E190512B91.png",
        "2C6121CF-D784-44B4-AB59-C35CA09B9B76.png"
      ],
      "cids" : {
        "2C6121CF-D784-44B4-AB59-C35CA09B9B76.png" : "Qmd3Mk3LtcP9dLG133iLsaywvFmgWt1MqfuKc6LN2zFSNN",
        "9E219DF3-0820-4280-8CB6-A3E190512B91.png" : "QmUzTcweZN1D5r1BjbmfBkckew4iz6J53Np8rj3gYx4NVU",
        "FBD17A08-9284-42E2-A5A8-5268574D7599.png" : "QmVA7bPpWvBKKuCD6HUhSvXwJtNPaLjLdsiG3qzSC8MTmn"
      },
      "content" : "### Demo地址: http://oxapi.v2ex.info/\n### Github项目地址: https://github.com/HelloWorldImJoe/oxapi\n\n#### [附一个测试的 markdown 文件, 直接创建项目新建 md 文件就可以了](https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1)\n\n- 因为托管到了腾讯云, 所以点击调试可能会失败, 如果是本地运行的话是没问题的.\n\n- 要是想体验调试的话, 可以用这个[proxy脚本](https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js)在本地运行启动:\n```\n\tnode ./local-proxy.js\n\n```\n##### 启动之后, 在网站中配置自定义代理: \n<img width=\"1122\" alt=\"9E219DF3-0820-4280-8CB6-A3E190512B91\" src=\"9E219DF3-0820-4280-8CB6-A3E190512B91.png\">\n\n---\n附一些使用截图: \n\n<img width=\"2560\" alt=\"FBD17A08-9284-42E2-A5A8-5268574D7599\" src=\"FBD17A08-9284-42E2-A5A8-5268574D7599.png\">\n\n<img width=\"2556\" alt=\"2C6121CF-D784-44B4-AB59-C35CA09B9B76\" src=\"2C6121CF-D784-44B4-AB59-C35CA09B9B76.png\">",
      "contentRendered" : "<h3>Demo地址: <a href=\"http://oxapi.v2ex.info/\">http://oxapi.v2ex.info/</a></h3>\n<h3>Github项目地址: <a href=\"https://github.com/HelloWorldImJoe/oxapi\">https://github.com/HelloWorldImJoe/oxapi</a></h3>\n<h4><a href=\"https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1\">附一个测试的 markdown 文件, 直接创建项目新建 md 文件就可以了</a></h4>\n<ul>\n<li>\n<p>因为托管到了腾讯云, 所以点击调试可能会失败, 如果是本地运行的话是没问题的.</p>\n</li>\n<li>\n<p>要是想体验调试的话, 可以用这个<a href=\"https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js\">proxy脚本</a>在本地运行启动:</p>\n</li>\n</ul>\n<pre><code>\tnode ./local-proxy.js\n\n</code></pre>\n<h5>启动之后, 在网站中配置自定义代理:</h5>\n<img width=\"1122\" alt=\"9E219DF3-0820-4280-8CB6-A3E190512B91\" src=\"9E219DF3-0820-4280-8CB6-A3E190512B91.png\">\n<hr />\n<p>附一些使用截图:</p>\n<img width=\"2560\" alt=\"FBD17A08-9284-42E2-A5A8-5268574D7599\" src=\"FBD17A08-9284-42E2-A5A8-5268574D7599.png\">\n<img width=\"2556\" alt=\"2C6121CF-D784-44B4-AB59-C35CA09B9B76\" src=\"2C6121CF-D784-44B4-AB59-C35CA09B9B76.png\">\n",
      "created" : 800245154.745069,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/33AF8B51-E1C2-49C3-A75E-72EEEB9BDFBC/FBD17A08-9284-42E2-A5A8-5268574D7599.png",
      "heroImageFilename" : "FBD17A08-9284-42E2-A5A8-5268574D7599.png",
      "heroImageHeight" : 1326,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/33AF8B51-E1C2-49C3-A75E-72EEEB9BDFBC/FBD17A08-9284-42E2-A5A8-5268574D7599.png",
      "heroImageWidth" : 2560,
      "id" : "33AF8B51-E1C2-49C3-A75E-72EEEB9BDFBC",
      "link" : "/33AF8B51-E1C2-49C3-A75E-72EEEB9BDFBC/",
      "slug" : "",
      "tags" : {

      },
      "title" : "做了一版开源的本地API文档编辑器, 有需求的朋友自取, MIT协议"
    },
    {
      "articleNumber" : 12,
      "articleReference" : "9D5E2DD8-12",
      "articleType" : 0,
      "attachments" : [
        "generate_emoji_json.sh",
        "rename_smirkboy_files.sh"
      ],
      "cids" : {
        "generate_emoji_json.sh" : "QmS76c3v6zRtpkGkoE4SfwsZmsXNTiFGhjUJr5kHhZ8WQx",
        "rename_smirkboy_files.sh" : "QmZegXVttjA4svgwtiDghcWeUqCakcdzGA1eF97Xb2t6WA"
      },
      "content" : "一个中文表情包的仓库地址: https://github.com/zhaoolee/ChineseBQB\n\n```\n\n./rename_smirkboy_files.sh --p 假笑男孩\n./rename_smirkboy_files.sh -p 假笑男孩 --dry-run\n./rename_smirkboy_files.sh /path/to/dir -p 其他前缀 -n\n\n\n./generate_emoji_json.sh 生成json文件\n\n```\n\n<a href=\"rename_smirkboy_files.sh\">rename_smirkboy_files.sh</a>\n\n<a href=\"generate_emoji_json.sh\">generate_emoji_json.sh</a>",
      "contentRendered" : "<p>一个中文表情包的仓库地址: <a href=\"https://github.com/zhaoolee/ChineseBQB\">https://github.com/zhaoolee/ChineseBQB</a></p>\n<pre><code>\n./rename_smirkboy_files.sh --p 假笑男孩\n./rename_smirkboy_files.sh -p 假笑男孩 --dry-run\n./rename_smirkboy_files.sh /path/to/dir -p 其他前缀 -n\n\n\n./generate_emoji_json.sh 生成json文件\n\n</code></pre>\n<p><a href=\"rename_smirkboy_files.sh\">rename_smirkboy_files.sh</a></p>\n<p><a href=\"generate_emoji_json.sh\">generate_emoji_json.sh</a></p>\n",
      "created" : 798942496.831783,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "90C4CA55-7131-452C-8E06-BF23E04F9367",
      "link" : "/90C4CA55-7131-452C-8E06-BF23E04F9367/",
      "slug" : "",
      "tags" : {

      },
      "title" : "提取Github中表情包为json文件"
    },
    {
      "articleNumber" : 11,
      "articleReference" : "9D5E2DD8-11",
      "articleType" : 0,
      "attachments" : [
        "4.png",
        "5.png",
        "input.png",
        "0692C518-3E0D-4A1D-84B3-88947EF4ECBE.png"
      ],
      "cids" : {
        "0692C518-3E0D-4A1D-84B3-88947EF4ECBE.png" : "QmYoco28Tk8urE1jrKDWieqdaDeE4G3a724e5VfBHm9UjE",
        "4.png" : "QmRhkjcoApLkVJqrr3ajDbSnXPCKy5C7emeWPzo9exiWTn",
        "5.png" : "QmehH55YT4qWNHG5XZ5ikKriR4hLmX4938iZCu2ohBNiWu",
        "input.png" : "QmVkeySTxbGgjPXiVR4TrbbfCWVSBJiBVxxxJYou2kimW5"
      },
      "content" : "源码地址: https://github.com/HelloWorldImJoe/TampermonkeyScripts\n\n脚本安装地址: [油猴脚本安装地址]( https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-custom-emoji.user.js)\n\n一个贡献表情或者反馈问题的节点: https://www.v2ex.com/go/emojipic\n\n原理: 没有什么复杂的东西, 为了无服务器, 资源存在planet上, 使用ipfs来存储. 然后绑定了sol.build域名, sol.build域名是v2ex信任的图床域名. 所以可以直接显示图片.\n\n---\n\n开源的中文表情包仓库: https://github.com/zhaoolee/ChineseBQB\n\n我整理的一些表情包:\n\n假笑男孩: https://fun.zhihaoo.sol.build/F5BB3309-D68F-4A06-837A-52584CD60241\n\n乌龟: https://fun.zhihaoo.sol.build/94B7CD12-5A08-4B76-8490-36303C1A0BA5\n\n猫咪日常: https://fun.zhihaoo.sol.build/7FCBA86A-1901-4A45-B392-7C19EE9DB52D\n\n葫芦娃:https://fun.zhihaoo.sol.build/32CB621D-51EB-4EE8-85CC-5FB6106AA6A6\n\n---\n\nPlanet用户可以使用\n\n```https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/90C4CA55-7131-452C-8E06-BF23E04F9367/```\n\n来处理中文表情包仓库中的资源来快速转换为V2EX可用的资源 \n\n---\n\n相关截图: \n<img width=\"838\" alt=\"input\" src=\"input.png\">\n\n<img width=\"684\" alt=\"0692C518-3E0D-4A1D-84B3-88947EF4ECBE\" src=\"0692C518-3E0D-4A1D-84B3-88947EF4ECBE.png\">\n\n<img width=\"834\" alt=\"4\" src=\"4.png\">\n\n<img width=\"846\" alt=\"5\" src=\"5.png\">\n",
      "contentRendered" : "<p>源码地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts\">https://github.com/HelloWorldImJoe/TampermonkeyScripts</a></p>\n<p>脚本安装地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-custom-emoji.user.js\">油猴脚本安装地址</a></p>\n<p>一个贡献表情或者反馈问题的节点: <a href=\"https://www.v2ex.com/go/emojipic\">https://www.v2ex.com/go/emojipic</a></p>\n<p>原理: 没有什么复杂的东西, 为了无服务器, 资源存在planet上, 使用ipfs来存储. 然后绑定了sol.build域名, sol.build域名是v2ex信任的图床域名. 所以可以直接显示图片.</p>\n<hr />\n<p>开源的中文表情包仓库: <a href=\"https://github.com/zhaoolee/ChineseBQB\">https://github.com/zhaoolee/ChineseBQB</a></p>\n<p>我整理的一些表情包:</p>\n<p>假笑男孩: <a href=\"https://fun.zhihaoo.sol.build/F5BB3309-D68F-4A06-837A-52584CD60241\">https://fun.zhihaoo.sol.build/F5BB3309-D68F-4A06-837A-52584CD60241</a></p>\n<p>乌龟: <a href=\"https://fun.zhihaoo.sol.build/94B7CD12-5A08-4B76-8490-36303C1A0BA5\">https://fun.zhihaoo.sol.build/94B7CD12-5A08-4B76-8490-36303C1A0BA5</a></p>\n<p>猫咪日常: <a href=\"https://fun.zhihaoo.sol.build/7FCBA86A-1901-4A45-B392-7C19EE9DB52D\">https://fun.zhihaoo.sol.build/7FCBA86A-1901-4A45-B392-7C19EE9DB52D</a></p>\n<p>葫芦娃:<a href=\"https://fun.zhihaoo.sol.build/32CB621D-51EB-4EE8-85CC-5FB6106AA6A6\">https://fun.zhihaoo.sol.build/32CB621D-51EB-4EE8-85CC-5FB6106AA6A6</a></p>\n<hr />\n<p>Planet用户可以使用</p>\n<p><code>https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/90C4CA55-7131-452C-8E06-BF23E04F9367/</code></p>\n<p>来处理中文表情包仓库中的资源来快速转换为V2EX可用的资源</p>\n<hr />\n<p>相关截图:<br />\n<img width=\"838\" alt=\"input\" src=\"input.png\"></p>\n<img width=\"684\" alt=\"0692C518-3E0D-4A1D-84B3-88947EF4ECBE\" src=\"0692C518-3E0D-4A1D-84B3-88947EF4ECBE.png\">\n<img width=\"834\" alt=\"4\" src=\"4.png\">\n<img width=\"846\" alt=\"5\" src=\"5.png\">\n",
      "created" : 798798569.454333,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/75C70AC6-0333-4341-83FD-60E81BDA0549/input.png",
      "heroImageFilename" : "input.png",
      "heroImageHeight" : 307,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/75C70AC6-0333-4341-83FD-60E81BDA0549/input.png",
      "heroImageWidth" : 838,
      "id" : "75C70AC6-0333-4341-83FD-60E81BDA0549",
      "link" : "/75C70AC6-0333-4341-83FD-60E81BDA0549/",
      "slug" : "",
      "tags" : {

      },
      "title" : "做了一个V2EX的自定义表情插件, 支持回复的时候使用自定义表情"
    },
    {
      "articleNumber" : 10,
      "articleReference" : "9D5E2DD8-10",
      "articleType" : 0,
      "attachments" : [
        "579EC131-3012-4716-9876-6E75DA02466C.png"
      ],
      "cids" : {
        "579EC131-3012-4716-9876-6E75DA02466C.png" : "QmUzTcweZN1D5r1BjbmfBkckew4iz6J53Np8rj3gYx4NVU"
      },
      "content" : "站点地址: http://oxapi.v2ex.info/\n\n这有一个本地的 proxy 文件, 可以使用 node 启动, 放在个人中心的配置里:\n\nhttps://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js\n\n启动命令: ```node ./local-proxy.js```\n\n<img width=\"1122\" alt=\"579EC131-3012-4716-9876-6E75DA02466C\" src=\"579EC131-3012-4716-9876-6E75DA02466C.png\">\n\n大佬们给我提提意见, 我看看还有没有做下去的必要 🤡\n\n附一个测试的 markdown 文件, 直接创建项目新建 md 文件就可以了:\n\nhttps://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1\n\n\nps: 后续看看V站的记事本能不能有接口, 要是有接口的话, 这个文档完全可以存在记事本里. 当做自定义节点的产品发布者的api文档?",
      "contentRendered" : "<p>站点地址: <a href=\"http://oxapi.v2ex.info/\">http://oxapi.v2ex.info/</a></p>\n<p>这有一个本地的 proxy 文件, 可以使用 node 启动, 放在个人中心的配置里:</p>\n<p><a href=\"https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js\">https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/local-proxy.js</a></p>\n<p>启动命令: <code>node ./local-proxy.js</code></p>\n<img width=\"1122\" alt=\"579EC131-3012-4716-9876-6E75DA02466C\" src=\"579EC131-3012-4716-9876-6E75DA02466C.png\">\n<p>大佬们给我提提意见, 我看看还有没有做下去的必要 🤡</p>\n<p>附一个测试的 markdown 文件, 直接创建项目新建 md 文件就可以了:</p>\n<p><a href=\"https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1\">https://github.com/HelloWorldImJoe/OxApiDocument/blob/master/Demo_API.md?plain=1</a></p>\n<p>ps: 后续看看V站的记事本能不能有接口, 要是有接口的话, 这个文档完全可以存在记事本里. 当做自定义节点的产品发布者的api文档?</p>\n",
      "created" : 798451482.373202,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/F1A42B98-3284-43C0-9DCE-4ACEB6F937CE/579EC131-3012-4716-9876-6E75DA02466C.png",
      "heroImageFilename" : "579EC131-3012-4716-9876-6E75DA02466C.png",
      "heroImageHeight" : 801,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/F1A42B98-3284-43C0-9DCE-4ACEB6F937CE/579EC131-3012-4716-9876-6E75DA02466C.png",
      "heroImageWidth" : 1122,
      "id" : "F1A42B98-3284-43C0-9DCE-4ACEB6F937CE",
      "link" : "/F1A42B98-3284-43C0-9DCE-4ACEB6F937CE/",
      "slug" : "",
      "tags" : {

      },
      "title" : "之前说的 api 文档编辑器暂时出了一版, 先部署在了腾讯云的 EO 上面, api 的调试可能调试不了, 正式版应该没有这个问题, 发出来主要是让大佬们给提提意见 🤡\n\n\n"
    },
    {
      "articleNumber" : 9,
      "articleReference" : "9D5E2DD8-9",
      "articleType" : 0,
      "attachments" : [
        "chat.png",
        "look.png",
        "menu.png",
        "pic.png",
        "quoted.png"
      ],
      "cids" : {
        "chat.png" : "QmUYZrMtEYh11JaXcekL9s3Y4KiGc4ufAzP2yF3R6rg8uM",
        "look.png" : "QmXZGbuNgDaAwUu74pdsjJgNuQ7oozUaxYkGq7WagJmXLd",
        "menu.png" : "QmQwzbWifFa9nLmm6ZMSLM77Sx9zK1o5MUQiqHxU5dswB5",
        "pic.png" : "QmUrdyEasqw2bzm9kqeYhGv15fKv8f3koFMNUSqRqVjdph",
        "quoted.png" : "QmSif9Pkz2a1Jpre7NCChpufMsEccrKqVWybWuVWxG1suM"
      },
      "content" : "一键安装地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js)\n\n脚本仓库地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js)\n\n---\n更新 2026-01-07:\n\n '新增聊天面板拖动缩放与自适应布局能力,可以通过右下角的拖拽手柄调整大小',\n            '新增主动发起会话功能, 输入用户名直接发起一个会话',\n            '新增聊天面板位置记忆功能, 面板位置会在关闭后保存, 下次打开时恢复',\n            '新增会话置顶功能, 置顶的会话会固定在列表顶部',\n            '新增消息引用功能, 可以引用某条消息进行回复, 长按消息气泡即可触发操作面板',\n            '新增引用消息点击跳转到原消息位置, 如果原消息在当前页面没加载, 则不跳转',\n            '新增日/月模式切换, 可以在面板顶部切换当前主题',\n            '新增图片显示支持, 可以在消息中显示图片链接',\n            '新增R按钮和C按钮, R按钮用于刷新会话列表(适应于消息不同步), C按钮用于清除当前会话记录(重新建立索引)',\n            '优化PIN状态不会再在刷新后丢失',\n            '修复若干已知问题'\n\n--- \n\n更新 2026-01-06:\n\n1. 最新版本添加了 `引用与打赏私聊` 的功能, 长按消息就可以唤起操作菜单\n\n2. 消息中支持显示引用消息以及图片消息(i.imgur.com 与 i.v2ex.co 来源)\n\n3. 点击引用消息可以快速跳转到被引用的消息(已经加载过,没有加载的跳转不到)\n\n4. 支持常用钱包, 已验证: okx, phantom\n\n---\n\n相关截图:\n\n<img width=\"953\" alt=\"menu\" src=\"menu.png\">\n\n<img width=\"947\" alt=\"quoted\" src=\"quoted.png\">\n\n<img width=\"934\" alt=\"pic\" src=\"pic.png\">\n\n<img width=\"2194\" alt=\"look\" src=\"look.png\">\n\n<img width=\"2197\" alt=\"chat\" src=\"chat.png\">",
      "contentRendered" : "<p>一键安装地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js\">v2ex-scene-script.user.js</a></p>\n<p>脚本仓库地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js\">v2ex-scene-script.user.js</a></p>\n<hr />\n<p>更新 2026-01-07:</p>\n<p>'新增聊天面板拖动缩放与自适应布局能力,可以通过右下角的拖拽手柄调整大小',<br />\n'新增主动发起会话功能, 输入用户名直接发起一个会话',<br />\n'新增聊天面板位置记忆功能, 面板位置会在关闭后保存, 下次打开时恢复',<br />\n'新增会话置顶功能, 置顶的会话会固定在列表顶部',<br />\n'新增消息引用功能, 可以引用某条消息进行回复, 长按消息气泡即可触发操作面板',<br />\n'新增引用消息点击跳转到原消息位置, 如果原消息在当前页面没加载, 则不跳转',<br />\n'新增日/月模式切换, 可以在面板顶部切换当前主题',<br />\n'新增图片显示支持, 可以在消息中显示图片链接',<br />\n'新增R按钮和C按钮, R按钮用于刷新会话列表(适应于消息不同步), C按钮用于清除当前会话记录(重新建立索引)',<br />\n'优化PIN状态不会再在刷新后丢失',<br />\n'修复若干已知问题'</p>\n<hr />\n<p>更新 2026-01-06:</p>\n<ol>\n<li>\n<p>最新版本添加了 <code>引用与打赏私聊</code> 的功能, 长按消息就可以唤起操作菜单</p>\n</li>\n<li>\n<p>消息中支持显示引用消息以及图片消息(i.imgur.com 与 i.v2ex.co 来源)</p>\n</li>\n<li>\n<p>点击引用消息可以快速跳转到被引用的消息(已经加载过,没有加载的跳转不到)</p>\n</li>\n<li>\n<p>支持常用钱包, 已验证: okx, phantom</p>\n</li>\n</ol>\n<hr />\n<p>相关截图:</p>\n<img width=\"953\" alt=\"menu\" src=\"menu.png\">\n<img width=\"947\" alt=\"quoted\" src=\"quoted.png\">\n<img width=\"934\" alt=\"pic\" src=\"pic.png\">\n<img width=\"2194\" alt=\"look\" src=\"look.png\">\n<img width=\"2197\" alt=\"chat\" src=\"chat.png\">\n",
      "created" : 789436800,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/8D96F6CF-85A3-4913-8094-8E5D94F5CF94/look.png",
      "heroImageFilename" : "look.png",
      "heroImageHeight" : 1287,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/8D96F6CF-85A3-4913-8094-8E5D94F5CF94/look.png",
      "heroImageWidth" : 2194,
      "id" : "8D96F6CF-85A3-4913-8094-8E5D94F5CF94",
      "link" : "/8D96F6CF-85A3-4913-8094-8E5D94F5CF94/",
      "slug" : "",
      "tags" : {

      },
      "title" : "[重大更新]做了一个V2EX的私聊模块,可以通过发送1枚$v2ex来进行私聊会话,联通V2EX的通知系统,实现了消息引用等常用消息的展示与发送"
    },
    {
      "articleNumber" : 8,
      "articleReference" : "9D5E2DD8-8",
      "articleType" : 0,
      "attachments" : [
        "feat_20251225.png"
      ],
      "cids" : {
        "feat_20251225.png" : "QmbWhk5z2rzmzsn3fiRp2CcweQzShyZk3Vb2i9YYhcguQJ"
      },
      "content" : "[V2EX历史数据看板](https://data.v2ex.pro)添加了对打赏相关数据的展示\n\n<img width=\"1726\" alt=\"feat_20251225\" src=\"feat_20251225.png\">",
      "contentRendered" : "<p><a href=\"https://data.v2ex.pro\">V2EX历史数据看板</a>添加了对打赏相关数据的展示</p>\n<img width=\"1726\" alt=\"feat_20251225\" src=\"feat_20251225.png\">\n",
      "created" : 788352959.42599,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/BE777FCE-641A-493A-A9A5-03F65EAE12B8/feat_20251225.png",
      "heroImageFilename" : "feat_20251225.png",
      "heroImageHeight" : 1266,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/BE777FCE-641A-493A-A9A5-03F65EAE12B8/feat_20251225.png",
      "heroImageWidth" : 1726,
      "id" : "BE777FCE-641A-493A-A9A5-03F65EAE12B8",
      "link" : "/BE777FCE-641A-493A-A9A5-03F65EAE12B8/",
      "slug" : "",
      "tags" : {

      },
      "title" : "data.v2ex.pro更新: 添加对打赏相关社区数据的展示"
    },
    {
      "articleNumber" : 7,
      "articleReference" : "9D5E2DD8-7",
      "articleType" : 0,
      "attachments" : [
        "alert.png",
        "tips.png",
        "topic.png",
        "tx.png",
        "ui.png"
      ],
      "cids" : {
        "alert.png" : "QmXdjQMKBCNUvpm9BNejdzL3ChUNVzrS8XBkVHSY2jMZUg",
        "tips.png" : "QmXt4QiDp9VaxGRbiB15jo5iPtfcoSy5KJjDBKSf32Ys9f",
        "topic.png" : "QmVuZqKLictY5Z5xi2BjJTjPeBhGFTLXApK9aGovE4U2Tx",
        "tx.png" : "QmPQKcDTbxmvFYQ1i3AvJeq9C1JbTTHJNCb1AMANCN9ZXd",
        "ui.png" : "QmXREQsoFs4sUS2XfHuBCVCtmCabhhU9hCeuL7qSHzRK53"
      },
      "content" : "一键安装地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js)\n\n脚本仓库地址: [v2ex-scene-script.user.js](https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js)\n\n<img width=\"937\" alt=\"topic\" src=\"topic.png\">\n\n<img width=\"1017\" alt=\"alert\" src=\"alert.png\">\n\n<img width=\"803\" alt=\"ui\" src=\"ui.png\">\n\n<img width=\"812\" alt=\"tips\" src=\"tips.png\">",
      "contentRendered" : "<p>一键安装地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/v2ex-scene-script.user.js\">v2ex-scene-script.user.js</a></p>\n<p>脚本仓库地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/blob/master/v2ex-scene-script.user.js\">v2ex-scene-script.user.js</a></p>\n<img width=\"937\" alt=\"topic\" src=\"topic.png\">\n<img width=\"1017\" alt=\"alert\" src=\"alert.png\">\n<img width=\"803\" alt=\"ui\" src=\"ui.png\">\n<img width=\"812\" alt=\"tips\" src=\"tips.png\">\n",
      "created" : 788322675.408268,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/C681D6D5-C703-4B97-AFC3-5736D355B5F7/topic.png",
      "heroImageFilename" : "topic.png",
      "heroImageHeight" : 601,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/C681D6D5-C703-4B97-AFC3-5736D355B5F7/topic.png",
      "heroImageWidth" : 937,
      "id" : "C681D6D5-C703-4B97-AFC3-5736D355B5F7",
      "link" : "/C681D6D5-C703-4B97-AFC3-5736D355B5F7/",
      "slug" : "",
      "tags" : {

      },
      "title" : "写了一个使用 $V2EX 打赏帖子回复的脚本, 可以在帖子回复中通过点击按钮来打赏对应的回复人并同步到 V2EX 的记录中."
    },
    {
      "articleNumber" : 6,
      "articleReference" : "9D5E2DD8-6",
      "articleType" : 0,
      "attachments" : [
        "longshot20251229131715.png"
      ],
      "cids" : {
        "longshot20251229131715.png" : "QmYpxsg5xgStHe4on6Kp3HjNR6dmt2CsV5Qyb43qVT8qnj"
      },
      "content" : "工具站点地址: https://data.v2ex.pro/\n\n仓库地址: https://github.com/HelloWorldImJoe/v2ex-info-history\n\n数据源地址: https://github.com/GrabCoffee/v2ex-info-newsletter-data\n\n---\n\n### 技术栈: \n纯React前端项目\n\n### 数据采集: \n使用Cloud Flare定时采集的数据, 然后保存到了github仓库中, 有些时候可能会被限流导致一些采集不到的脏数据, 在前端做了一层过滤,应该不影响整体的分析.\n\n### 发布: \n这个可以详细说一下思路\n\n1. 使用了Planet的文件夹发布功能: 将项目打包之后, 通过planet发布文件夹并生成ipns\n\n2. 在V2EX的[Planet管理器](https://www.v2ex.com/planet/dashboard)中, 提交这个ipns, 并绑定了[data.v2ex.pro](https://data.v2ex.pro/)的域名\n\n3. 因为正常V2ex的Planet管理器是会去站点找一个planet.json的文件, 所以我伪造了这个文件, 并修改了这个文件对应的ipns, 目的是能够让v2ex抓取到我最新的cid来与上面提到的域名做关联. 为了在Planet管理器中能显示头像, 我还加了一个avator的头像, 看起来像是一个正常的站点, \n![](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/V2EX/20251219164623315.png)\n\n4. 整体就是这么一个思路,大家可以尝试一下, 很好玩. 还可以通过这个planet.json做一些更好玩的事情\n\n---\n\n预览图:\n<img width=\"1480\" alt=\"longshot20251229131715\" src=\"longshot20251229131715.png\">\n![](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/V2EX/20251219164752151.png)\n\nps: 数据不是实时的, 最新的数据是昨天(utc时间)的, 如果是早晨8点左右的话, 可以算是伪实时😂",
      "contentRendered" : "<p>工具站点地址: <a href=\"https://data.v2ex.pro/\">https://data.v2ex.pro/</a></p>\n<p>仓库地址: <a href=\"https://github.com/HelloWorldImJoe/v2ex-info-history\">https://github.com/HelloWorldImJoe/v2ex-info-history</a></p>\n<p>数据源地址: <a href=\"https://github.com/GrabCoffee/v2ex-info-newsletter-data\">https://github.com/GrabCoffee/v2ex-info-newsletter-data</a></p>\n<hr />\n<h3>技术栈:</h3>\n<p>纯React前端项目</p>\n<h3>数据采集:</h3>\n<p>使用Cloud Flare定时采集的数据, 然后保存到了github仓库中, 有些时候可能会被限流导致一些采集不到的脏数据, 在前端做了一层过滤,应该不影响整体的分析.</p>\n<h3>发布:</h3>\n<p>这个可以详细说一下思路</p>\n<ol>\n<li>\n<p>使用了Planet的文件夹发布功能: 将项目打包之后, 通过planet发布文件夹并生成ipns</p>\n</li>\n<li>\n<p>在V2EX的<a href=\"https://www.v2ex.com/planet/dashboard\">Planet管理器</a>中, 提交这个ipns, 并绑定了<a href=\"https://data.v2ex.pro/\">data.v2ex.pro</a>的域名</p>\n</li>\n<li>\n<p>因为正常V2ex的Planet管理器是会去站点找一个planet.json的文件, 所以我伪造了这个文件, 并修改了这个文件对应的ipns, 目的是能够让v2ex抓取到我最新的cid来与上面提到的域名做关联. 为了在Planet管理器中能显示头像, 我还加了一个avator的头像, 看起来像是一个正常的站点,<br />\n<img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/V2EX/20251219164623315.png\" alt=\"\" /></p>\n</li>\n<li>\n<p>整体就是这么一个思路,大家可以尝试一下, 很好玩. 还可以通过这个planet.json做一些更好玩的事情</p>\n</li>\n</ol>\n<hr />\n<p>预览图:<br />\n<img width=\"1480\" alt=\"longshot20251229131715\" src=\"longshot20251229131715.png\"><br />\n<img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/V2EX/20251219164752151.png\" alt=\"\" /></p>\n<p>ps: 数据不是实时的, 最新的数据是昨天(utc时间)的, 如果是早晨8点左右的话, 可以算是伪实时😂</p>\n",
      "created" : 787807948.782182,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/ECEF7DC4-CB58-4608-80AB-A605377F299D/longshot20251229131715.png",
      "heroImageFilename" : "longshot20251229131715.png",
      "heroImageHeight" : 1290,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/ECEF7DC4-CB58-4608-80AB-A605377F299D/longshot20251229131715.png",
      "heroImageWidth" : 1480,
      "id" : "ECEF7DC4-CB58-4608-80AB-A605377F299D",
      "link" : "/ECEF7DC4-CB58-4608-80AB-A605377F299D/",
      "slug" : "",
      "tags" : {

      },
      "title" : "昨天搞了一个$v2ex 历史数据查看工具, 已经上传到 Github 开源, 数据使用的是日报积攒下来的, 大家可以使用这个工具来查看$v2ex 最近的一些变化."
    },
    {
      "articleNumber" : 5,
      "articleReference" : "9D5E2DD8-5",
      "articleType" : 0,
      "attachments" : [
        "single.png",
        "reply.png"
      ],
      "cids" : {
        "reply.png" : "Qmc1vufn1ZnLEG25NEixKynUBFFAc1zKE5HE9wit4HCjZz",
        "single.png" : "Qmezd97dMbrMFTrvPaVqR1VfYLzRpe273seVwJdTkB1u3m"
      },
      "content" : "[脚本一键安装地址]( https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/topic-quick-thank.user.js)\n \n仓库地址: https://github.com/HelloWorldImJoe/TampermonkeyScripts\n \n开发背景: https://v2ex.com/t/1170807?p=1#r_16953786\n \n截图:\n  \n\n<img width=\"907\" alt=\"single\" src=\"single.png\">\n\n<img width=\"844\" alt=\"reply\" src=\"reply.png\">",
      "contentRendered" : "<p><a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/topic-quick-thank.user.js\">脚本一键安装地址</a></p>\n<p>仓库地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts\">https://github.com/HelloWorldImJoe/TampermonkeyScripts</a></p>\n<p>开发背景: <a href=\"https://v2ex.com/t/1170807?p=1#r_16953786\">https://v2ex.com/t/1170807?p=1#r_16953786</a></p>\n<p>截图:</p>\n<img width=\"907\" alt=\"single\" src=\"single.png\">\n<img width=\"844\" alt=\"reply\" src=\"reply.png\">\n",
      "created" : 784277880.147431,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/176FADDB-C471-4306-88C7-07948948B9C4/single.png",
      "heroImageFilename" : "single.png",
      "heroImageHeight" : 294,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/176FADDB-C471-4306-88C7-07948948B9C4/single.png",
      "heroImageWidth" : 907,
      "id" : "176FADDB-C471-4306-88C7-07948948B9C4",
      "link" : "/176FADDB-C471-4306-88C7-07948948B9C4/",
      "slug" : "",
      "tags" : {

      },
      "title" : "做了一个没啥用的小玩意,用来快速感谢打赏帖子的大佬, 如果你的帖子被大佬打赏了, 可以使用这个脚本来快速进行回复感谢."
    },
    {
      "articleNumber" : 4,
      "articleReference" : "9D5E2DD8-4",
      "articleType" : 0,
      "attachments" : [
        "deployment.sh"
      ],
      "cids" : {
        "deployment.sh" : "QmcLkuMXzo5KgN2ZAt8Ui6tpxs2t1dDZnmtsVQHjVZqs2Q"
      },
      "content" : "Planet已经占用了4001端口, 所以我将swarm port设置为了4002,\n\n修改相关配置, 或者直接在目录下运行:./deployment.sh, 会直接创建一个ipfs的节点, 创建成功之后, 可以通过`http://localhost:${ipfs_gateway_port}/webui `打开webui来进行简单操作.\n\n\n脚本文件: <a href=\"deployment.sh\">deployment.sh</a>\n\n脚本源码如下:\n\n```\n# !/bin/bash\n\n# 检查 Docker 是否安装\nif ! [ -x \"$(command -v docker)\" ]; then\n  echo 'Error: Docker is not installed.' >&2\n  exit 1\nfi\necho 'Docker is installed.'\n\n# 检查是否有正在运行的 IPFS 容器\nif [ \"$(docker ps -q -f name=ipfs_host)\" ]; then\n  echo 'Error: An IPFS container is already running.' >&2\n  exit 1\nfi\necho 'No running IPFS container found.'\n\n# 检查是否有同名的停止状态的 IPFS 容器\nif [ \"$(docker ps -aq -f status=exited -f name=ipfs_host)\" ]; then\n  echo 'Error: A stopped IPFS container with the same name already exists.' >&2\n  exit 1\nfi\necho 'No stopped IPFS container with the same name found.'\n\necho 'Proceeding with deployment...'\n# 创建存储目录\ncurrent_dir=$(pwd)\ncd $current_dir\nmkdir -p ./ipfs_staging\nmkdir -p ./ipfs_data\n\necho 'Storage directories created.'\n\n# 设置环境变量\nexport ipfs_staging=./ipfs_staging\nexport ipfs_data=./ipfs_data\nexport ipfs_swarm_port=4002\nexport ipfs_api_port=8080\nexport ipfs_gateway_port=5001\n\necho \"IPFS staging directory: ${ipfs_staging}\"\necho \"IPFS data directory: ${ipfs_data}\"\necho \"IPFS swarm port: ${ipfs_swarm_port}\"\necho \"IPFS API port: ${ipfs_api_port}\"\necho \"IPFS gateway port: ${ipfs_gateway_port}\"\n\n# 运行 IPFS 容器\ndocker 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\nif [ $? -ne 0 ]; then\n  docker rm -f ipfs_host 2>/dev/null\n  rm -rf ./ipfs_staging\n  rm -rf ./ipfs_data\n  echo 'Error: Failed to start the IPFS container.' >&2\n  exit 1\nfi\necho 'IPFS container started successfully.'\n\nopen \"http://localhost:${ipfs_gateway_port}/webui\"\n```\n",
      "contentRendered" : "<p>Planet已经占用了4001端口, 所以我将swarm port设置为了4002,</p>\n<p>修改相关配置, 或者直接在目录下运行:./deployment.sh, 会直接创建一个ipfs的节点, 创建成功之后, 可以通过<code>http://localhost:${ipfs_gateway_port}/webui </code>打开webui来进行简单操作.</p>\n<p>脚本文件: <a href=\"deployment.sh\">deployment.sh</a></p>\n<p>脚本源码如下:</p>\n<pre><code># !/bin/bash\n\n# 检查 Docker 是否安装\nif ! [ -x &quot;$(command -v docker)&quot; ]; then\n  echo 'Error: Docker is not installed.' &gt;&amp;2\n  exit 1\nfi\necho 'Docker is installed.'\n\n# 检查是否有正在运行的 IPFS 容器\nif [ &quot;$(docker ps -q -f name=ipfs_host)&quot; ]; then\n  echo 'Error: An IPFS container is already running.' &gt;&amp;2\n  exit 1\nfi\necho 'No running IPFS container found.'\n\n# 检查是否有同名的停止状态的 IPFS 容器\nif [ &quot;$(docker ps -aq -f status=exited -f name=ipfs_host)&quot; ]; then\n  echo 'Error: A stopped IPFS container with the same name already exists.' &gt;&amp;2\n  exit 1\nfi\necho 'No stopped IPFS container with the same name found.'\n\necho 'Proceeding with deployment...'\n# 创建存储目录\ncurrent_dir=$(pwd)\ncd $current_dir\nmkdir -p ./ipfs_staging\nmkdir -p ./ipfs_data\n\necho 'Storage directories created.'\n\n# 设置环境变量\nexport ipfs_staging=./ipfs_staging\nexport ipfs_data=./ipfs_data\nexport ipfs_swarm_port=4002\nexport ipfs_api_port=8080\nexport ipfs_gateway_port=5001\n\necho &quot;IPFS staging directory: ${ipfs_staging}&quot;\necho &quot;IPFS data directory: ${ipfs_data}&quot;\necho &quot;IPFS swarm port: ${ipfs_swarm_port}&quot;\necho &quot;IPFS API port: ${ipfs_api_port}&quot;\necho &quot;IPFS gateway port: ${ipfs_gateway_port}&quot;\n\n# 运行 IPFS 容器\ndocker 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\nif [ $? -ne 0 ]; then\n  docker rm -f ipfs_host 2&gt;/dev/null\n  rm -rf ./ipfs_staging\n  rm -rf ./ipfs_data\n  echo 'Error: Failed to start the IPFS container.' &gt;&amp;2\n  exit 1\nfi\necho 'IPFS container started successfully.'\n\nopen &quot;http://localhost:${ipfs_gateway_port}/webui&quot;\n</code></pre>\n",
      "created" : 780143384.322766,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "1F9DF495-C122-4705-9F8E-299ACFCF3BB9",
      "link" : "/1F9DF495-C122-4705-9F8E-299ACFCF3BB9/",
      "slug" : "",
      "tags" : {

      },
      "title" : "使用docker创建一个ipfs节点"
    },
    {
      "articleNumber" : 3,
      "articleReference" : "9D5E2DD8-3",
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "效果大概是这样的:\n![longshot20250919154127](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250919154127.png)\n\n![longshot20250919154149](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250919154149.png)\n\n大概流程就是: 我会解析planet聚合器中的节点, 找到对应的`data-site-address`, 然后在最前方拼上scheme: `planet://`, 再调用`window.open()`打开这个连接, 就完成了这个半自动操作😂\n\n点击某个博客关注后, 同一列表的其他博客不会显示已关注, 刷新一下界面就可以了, 这里我不想点关注之后再刷新, 比较影响体验.\n\n因为真正的关注是在planet中实现的, 所以界面上的已关注我放开了取消关注的限制, 如果planet中已经取消关注了, 界面上还显示已关注这是正常现象, 毕竟数据不能同步, 我也不想做的太麻烦, 看着碍眼手动点一下得了.\n\n仓库地址: https://github.com/HelloWorldImJoe/TampermonkeyScripts\n\n快速安装地址: [脚本安装地址](https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/planet-follow-button.user.js)",
      "contentRendered" : "<p>效果大概是这样的:<br />\n<img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250919154127.png\" alt=\"longshot20250919154127\" /></p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250919154149.png\" alt=\"longshot20250919154149\" /></p>\n<p>大概流程就是: 我会解析planet聚合器中的节点, 找到对应的<code>data-site-address</code>, 然后在最前方拼上scheme: <code>planet://</code>, 再调用<code>window.open()</code>打开这个连接, 就完成了这个半自动操作😂</p>\n<p>点击某个博客关注后, 同一列表的其他博客不会显示已关注, 刷新一下界面就可以了, 这里我不想点关注之后再刷新, 比较影响体验.</p>\n<p>因为真正的关注是在planet中实现的, 所以界面上的已关注我放开了取消关注的限制, 如果planet中已经取消关注了, 界面上还显示已关注这是正常现象, 毕竟数据不能同步, 我也不想做的太麻烦, 看着碍眼手动点一下得了.</p>\n<p>仓库地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts\">https://github.com/HelloWorldImJoe/TampermonkeyScripts</a></p>\n<p>快速安装地址: <a href=\"https://github.com/HelloWorldImJoe/TampermonkeyScripts/raw/master/planet-follow-button.user.js\">脚本安装地址</a></p>\n",
      "created" : 779960463.899509,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "1003784A-995B-4E54-8F76-59F5EE2552C3",
      "link" : "/1003784A-995B-4E54-8F76-59F5EE2552C3/",
      "slug" : "",
      "tags" : {

      },
      "title" : "[Planet] planet聚合器里面的博客都很好, 我想pin到我的planet中的话, 得先提取地址, 然后在planet中点关注, 粘贴地址才能followed, 很麻烦, 所以我搞了一个油猴, 一键followed"
    },
    {
      "articleNumber" : 2,
      "articleReference" : "9D5E2DD8-2",
      "articleType" : 0,
      "attachments" : [
        "1图.png",
        "2图.png",
        "3图.png",
        "4图.png",
        "5图.png",
        "图1.png",
        "图2.png"
      ],
      "cids" : {
        "1图.png" : "QmeqHoXazjLGQ9SbYBoRNpZxtr1Ug3n9P6jmk7Q8gcLc6h",
        "2图.png" : "QmdHrLZMrUKB5S1C5BmeNDuhn4riapX1pmtrjnAvLCBp6R",
        "3图.png" : "QmdHrLZMrUKB5S1C5BmeNDuhn4riapX1pmtrjnAvLCBp6R",
        "4图.png" : "QmYJBAwaXjSDdeFuEv2Dh4CpcHdmB6288YgpG8wQ176Jyu",
        "5图.png" : "QmaVcn9Z34e3uozfT5ip2ymLD8qXVuTEugAp5GQ8uUJxZn",
        "图1.png" : "QmVMr7YhtEskE9whwrhC4dHAC4ZLoizJ9JTGEzNw37qq5q",
        "图2.png" : "QmURvgty4kz6zFbEHZxGYgGjhfWsqoJFpGxvdLrWfZBh4M"
      },
      "content" : "> 之前上线了一个针对V2EX的空投网站, 最近有V友反馈说这个网站被Chrome标记成了危险站点, 需要向谷歌申诉一下, 记录一下处理这次事件的整个过程\n\n\n\n### 背景\n\n大概是一个月之前, 我上线了一个解析V2EX帖子回复内容并进行批量空投的站点, 一直也没啥人用, 我也没怎么关注过, 直到昨天下午, 我帮一个V站大佬进行批量空投之后, 晚上有V友给我提示说站点被chrome标记成了危险站点, 提醒我去谷歌申诉一下. 在此感谢[@Jianrry](https://www.v2ex.com/member/Jianrry)的友情提示, 帖子原文在这: [刚才帮 @PilgrimSun 大佬搞了一波空投, 顺便给空投加上了一个筛选指定楼层区间的功能, 顺便 po 一下过程中的一些细节](https://www.v2ex.com/t/1160233)\n\n\n\n### 过程\n\n今早晨, 我打开[我的空投网站](https://airdrop.grabcoffee.cc/), 果然提示我是危险站点!<img width=\"2390\" alt=\"1图\" src=\"1图.png\">\n\n于是我点击`详细信息->请告知我们`, 在这个页面进行了一次简单的申诉\n\n<img width=\"2347\" alt=\"2图\" src=\"2图.png\">\n\n点击提交, 提示成功, 然后我等了有半个小时, 再次打开网站, 很好, 还是危险站点😂, 于是我再次点击`详细信息->发现了钓鱼式攻击`进入这个帮助界面\n\n<img width=\"2347\" alt=\"3图\" src=\"3图.png\">\n\n点击了`自我保护->Google安全中心`进入了安全界面并注册了账号, 填写了我的站点地址:\n\n<img width=\"2560\" alt=\"4图\" src=\"4图.png\">\n\n碰到了一个小问题, 使用clodflare快捷验证打开的新界面一直不重定向, 所以我更换了验证方式, 使用了通用的`适用任何DNS提供商`, 根据提示配置好dns解析, 点击验证, 如图\n\n<img width=\"2560\" alt=\"5图\" src=\"5图.png\">\n等待验证完成之后, 再次打开网站, 我发现危险站点的提示页面已经消失了, 虽然谷歌安全的后台面板还提示一个安全问题:\n\n<img width=\"2560\" alt=\"图1\" src=\"图1.png\">\n\n但是好像没啥影响, 就不继续处理了.\n\n\n\n以上, 就是本次事件的处理过程, 再次感谢@Jianrry的友情提示🙏🏻\n\n\n-------------------------------------------\n\n_以上没有解决安全问题,过了半个小时又被封了, 下面是真正的整改过程_\n\n-------------------------------------------\n\n\n目前已经恢复访问, 主要是根据谷歌提供的安全警告来进行了整改\n\n主要操作: \n\n1. 去[谷歌安全中心](https://search.google.com/search-console)证明自己是站点所有者\n\n2. 然后查看谷歌给出的安全警告, 如图:\n<img width=\"2560\" alt=\"图1\" src=\"图1.png\">\n3. 打开网站代码, 告诉AI我的站点被安全警告了,把具体的安全警告贴给他, 让AI给出整改\n\n4. AI整改完之后, 再让AI根据整改内容提供一份申诉话术用来申请审核.\n\n5. 发布网站, 点击申请审核, 等待结果.\n\n如果审核通过的话, 大概会收到一封邮件和一封站内信, 如下图:\n\n<img width=\"1462\" alt=\"图2\" src=\"图2.png\">",
      "contentRendered" : "<blockquote>\n<p>之前上线了一个针对V2EX的空投网站, 最近有V友反馈说这个网站被Chrome标记成了危险站点, 需要向谷歌申诉一下, 记录一下处理这次事件的整个过程</p>\n</blockquote>\n<h3>背景</h3>\n<p>大概是一个月之前, 我上线了一个解析V2EX帖子回复内容并进行批量空投的站点, 一直也没啥人用, 我也没怎么关注过, 直到昨天下午, 我帮一个V站大佬进行批量空投之后, 晚上有V友给我提示说站点被chrome标记成了危险站点, 提醒我去谷歌申诉一下. 在此感谢<a href=\"https://www.v2ex.com/member/Jianrry\">@Jianrry</a>的友情提示, 帖子原文在这: <a href=\"https://www.v2ex.com/t/1160233\">刚才帮 @PilgrimSun 大佬搞了一波空投, 顺便给空投加上了一个筛选指定楼层区间的功能, 顺便 po 一下过程中的一些细节</a></p>\n<h3>过程</h3>\n<p>今早晨, 我打开<a href=\"https://airdrop.grabcoffee.cc/\">我的空投网站</a>, 果然提示我是危险站点!<img width=\"2390\" alt=\"1图\" src=\"1图.png\"></p>\n<p>于是我点击<code>详细信息-&gt;请告知我们</code>, 在这个页面进行了一次简单的申诉</p>\n<img width=\"2347\" alt=\"2图\" src=\"2图.png\">\n<p>点击提交, 提示成功, 然后我等了有半个小时, 再次打开网站, 很好, 还是危险站点😂, 于是我再次点击<code>详细信息-&gt;发现了钓鱼式攻击</code>进入这个帮助界面</p>\n<img width=\"2347\" alt=\"3图\" src=\"3图.png\">\n<p>点击了<code>自我保护-&gt;Google安全中心</code>进入了安全界面并注册了账号, 填写了我的站点地址:</p>\n<img width=\"2560\" alt=\"4图\" src=\"4图.png\">\n<p>碰到了一个小问题, 使用clodflare快捷验证打开的新界面一直不重定向, 所以我更换了验证方式, 使用了通用的<code>适用任何DNS提供商</code>, 根据提示配置好dns解析, 点击验证, 如图</p>\n<img width=\"2560\" alt=\"5图\" src=\"5图.png\">\n等待验证完成之后, 再次打开网站, 我发现危险站点的提示页面已经消失了, 虽然谷歌安全的后台面板还提示一个安全问题:\n<img width=\"2560\" alt=\"图1\" src=\"图1.png\">\n<p>但是好像没啥影响, 就不继续处理了.</p>\n<p>以上, 就是本次事件的处理过程, 再次感谢@Jianrry的友情提示🙏🏻</p>\n<hr />\n<p><em>以上没有解决安全问题,过了半个小时又被封了, 下面是真正的整改过程</em></p>\n<hr />\n<p>目前已经恢复访问, 主要是根据谷歌提供的安全警告来进行了整改</p>\n<p>主要操作:</p>\n<ol>\n<li>\n<p>去<a href=\"https://search.google.com/search-console\">谷歌安全中心</a>证明自己是站点所有者</p>\n</li>\n<li>\n<p>然后查看谷歌给出的安全警告, 如图:</p>\n</li>\n</ol>\n<img width=\"2560\" alt=\"图1\" src=\"图1.png\">\n3. 打开网站代码, 告诉AI我的站点被安全警告了,把具体的安全警告贴给他, 让AI给出整改\n<ol start=\"4\">\n<li>\n<p>AI整改完之后, 再让AI根据整改内容提供一份申诉话术用来申请审核.</p>\n</li>\n<li>\n<p>发布网站, 点击申请审核, 等待结果.</p>\n</li>\n</ol>\n<p>如果审核通过的话, 大概会收到一封邮件和一封站内信, 如下图:</p>\n<img width=\"1462\" alt=\"图2\" src=\"图2.png\">\n",
      "created" : 779939735.473022,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "heroImage" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/6BF739FC-CC5A-472B-81F6-7FCAF6A96892/1%E5%9B%BE.png",
      "heroImageFilename" : "1图.png",
      "heroImageHeight" : 1291,
      "heroImageURL" : "https://k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc.eth.sucks/6BF739FC-CC5A-472B-81F6-7FCAF6A96892/1%E5%9B%BE.png",
      "heroImageWidth" : 2390,
      "id" : "6BF739FC-CC5A-472B-81F6-7FCAF6A96892",
      "link" : "/6BF739FC-CC5A-472B-81F6-7FCAF6A96892/",
      "slug" : "",
      "tags" : {

      },
      "title" : "关于Chrome标记危险网站的处理"
    },
    {
      "articleNumber" : 1,
      "articleReference" : "9D5E2DD8-1",
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "## 一. 关于交易的细节\n\n#### 以v2ex的20$v2ex打赏为例:\n\n##### 1.在点击打赏按钮之后, 会唤起钱包进行交易, 其实在交易的面板中是有一个默认折叠的高级选项的, 可以点击展开折叠, 如图1所示:\n\n![image-20250917103257389](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/image-20250917103257389.png)\n\n##### 2. 如果点开高级选项会显示本次交易包含的操作指令, 如图2所示: \n\n![2](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/2.png)\n\n> Program Id 就是程序的ID, 也就是我们常说的智能合约\n>\n> Data 就是这个程序传入的参数\n\n可以看到打赏V币一共执行了3个指令, 上面两个指令是Unknown, 所以钱包把他们对应的合约地址也就是Program Id给贴出来了, 右边有一个打开按钮, 点击就可以查看这个合约的具体信息. 最后一个指令是Transfer, 这个指令是内置指令, 也就是System Program, 类似系统内核里面自带的一些工具或者函数方法. (其实前面两个ComputeBudget, 也是系统提供的, 是NativeLoader管理的, 为什么显示Unknown不清楚, 但是这不是这次讨论的重点, pass掉)\n\n然后细说最后这个Transfer, 这个其实就是转账操作, 转账分两种, 一种是原生转账, 一种是SPL转账,  咱们使用的V币打赏就是SPL转账, 这两种转账差不多其实, 先细说这个图里的SPL转账:\n\n1. Amount是2+7个0, 因为V币是6位小数, 所以这个Amount * V币的小数位就是实际操作的V币数量\n2. Source 是来源 Token 账户, 在这个图里面是: 4kbSR...9PARy\n3. Destination 是目标 Token 账户\n4. Owner 是授权人或者说是来源Token账户的所有者, 这个地方我没有裁全, 大概能看到是我H5u的钱包公钥.\n\n这个地方需要注意的是, Token账户地址不是你的钱包地址, 而是你在对应Token下创建的账户, 这也是为什么我们给从来没持有国V币的用户(or 回收了V币钱包地址)打赏的时候, 会额外支付0.002sol的原因, 这0.002sol就是用来创建对方在V2EX Token上的账户租金. \n\n这一点就是原生转账和SPL转账之间最大的不同, 原生转账的双方地址就是双方对应的solana链上的钱包地址, 而SPL转账则是对应Token上面的账户地址.\n\n\n\n##### 3. 我们点击确认按钮, 大概会得到下面这一个界面:\n\n![image-20250917110211969](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/image-20250917110211969.png)\n\n在这个界面的最下方有一个 _在Solscan上查看_  点击就可以在Solscan上查看这一笔交易的详细信息, 包括传参, 账户操作, Log之类的, 大概是这样的:\n\n![4](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/4.png)\n\nps: 还有一个比较好用的查看交易信息的网站叫: https://explorer.solana.com/  后面可以拼接: tx/xxxx  或者 address/xxxx, 就可以查看交易或者对应的账户信息, address可以是代币地址, 也可以是钱包地址.\n\n\n\n#### 以https://sol-incinerator.com回收空钱包地址的截图为例, 大家可以自己分析一下或者自己尝试着操作一下看看:\n\n![-1](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-1.png)\n\n![-2](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-2.png)\n\n![-3](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-3.png)\n\n![-4](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-4.png)\n\n\n\n## 二. 关于在交易所以及Web3钱包的一些tips, 这点可能需要大家来一起补充, 我操作的比较少, 挑我知道的说\n\n#### 1. 在`交易所钱包`的虚拟货币 和 在`Web3钱包`里面的虚拟货币 虚拟币是一样的, 但还是有一些不同的, 打个比方:\n\n- **交易所里的币** 就像是你存在**银行**里的钱。\n  - 银行帮你保管，交易记录在银行的内部账本上。\n  - 你使用网银APP进行操作，非常方便。\n  - 但理论上，银行可以冻结你的账户（配合调查时），如果银行倒闭，你的钱可能会受损。\n- **Web3钱包里的币** 就像是你放在**自己家里保险箱**的现金。\n  - 现金完全由你掌控，看得见摸得着。\n  - 你可以自由支配，无需经过任何第三方。\n  - 但如果你弄丢了保险箱钥匙（私钥/助记词），或者被小偷破门而入，钱就永远找不回来了。\n\n\n\n#### 2. 交易所里面的充币/提币, web3钱包里面的转账手续费问题\n\n挑我知道的说:\n\n1. web3钱包的转账是没有第三方收取手续费的, 只需要支付一些gas和优先费就可以了\n2. 交易所里面的这个`充币`目测没有什么额外的手续费, 跟web3钱包是一样的\n3. 但是这个`提币`操作, 好像都是需要一些额外的服务费的, 之前用Binance好像每笔usdt都会收我0.5u的样子, 现在用okx每次大概收我1u, 但是我去帮助文档里面检索了一下, 发现这么一些答案: \n\n![longshot20250917101323](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250917101323.png)\n\n![longshot20250917101944](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250917101944.png)\n\n![longshot20250917101954](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250917101954.png)\n\n还有这么一个解释:\n\n![web3提币手续费和交易所不一致](https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/web3提币手续费和交易所不一致.png)\n\n",
      "contentRendered" : "<h2>一. 关于交易的细节</h2>\n<h4>以v2ex的20$v2ex打赏为例:</h4>\n<h5>1.在点击打赏按钮之后, 会唤起钱包进行交易, 其实在交易的面板中是有一个默认折叠的高级选项的, 可以点击展开折叠, 如图1所示:</h5>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/image-20250917103257389.png\" alt=\"image-20250917103257389\" /></p>\n<h5>2. 如果点开高级选项会显示本次交易包含的操作指令, 如图2所示:</h5>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/2.png\" alt=\"2\" /></p>\n<blockquote>\n<p>Program Id 就是程序的ID, 也就是我们常说的智能合约</p>\n<p>Data 就是这个程序传入的参数</p>\n</blockquote>\n<p>可以看到打赏V币一共执行了3个指令, 上面两个指令是Unknown, 所以钱包把他们对应的合约地址也就是Program Id给贴出来了, 右边有一个打开按钮, 点击就可以查看这个合约的具体信息. 最后一个指令是Transfer, 这个指令是内置指令, 也就是System Program, 类似系统内核里面自带的一些工具或者函数方法. (其实前面两个ComputeBudget, 也是系统提供的, 是NativeLoader管理的, 为什么显示Unknown不清楚, 但是这不是这次讨论的重点, pass掉)</p>\n<p>然后细说最后这个Transfer, 这个其实就是转账操作, 转账分两种, 一种是原生转账, 一种是SPL转账,  咱们使用的V币打赏就是SPL转账, 这两种转账差不多其实, 先细说这个图里的SPL转账:</p>\n<ol>\n<li>Amount是2+7个0, 因为V币是6位小数, 所以这个Amount * V币的小数位就是实际操作的V币数量</li>\n<li>Source 是来源 Token 账户, 在这个图里面是: 4kbSR...9PARy</li>\n<li>Destination 是目标 Token 账户</li>\n<li>Owner 是授权人或者说是来源Token账户的所有者, 这个地方我没有裁全, 大概能看到是我H5u的钱包公钥.</li>\n</ol>\n<p>这个地方需要注意的是, Token账户地址不是你的钱包地址, 而是你在对应Token下创建的账户, 这也是为什么我们给从来没持有国V币的用户(or 回收了V币钱包地址)打赏的时候, 会额外支付0.002sol的原因, 这0.002sol就是用来创建对方在V2EX Token上的账户租金.</p>\n<p>这一点就是原生转账和SPL转账之间最大的不同, 原生转账的双方地址就是双方对应的solana链上的钱包地址, 而SPL转账则是对应Token上面的账户地址.</p>\n<h5>3. 我们点击确认按钮, 大概会得到下面这一个界面:</h5>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/image-20250917110211969.png\" alt=\"image-20250917110211969\" /></p>\n<p>在这个界面的最下方有一个 <em>在Solscan上查看</em>  点击就可以在Solscan上查看这一笔交易的详细信息, 包括传参, 账户操作, Log之类的, 大概是这样的:</p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/4.png\" alt=\"4\" /></p>\n<p>ps: 还有一个比较好用的查看交易信息的网站叫: <a href=\"https://explorer.solana.com/\">https://explorer.solana.com/</a>  后面可以拼接: tx/xxxx  或者 address/xxxx, 就可以查看交易或者对应的账户信息, address可以是代币地址, 也可以是钱包地址.</p>\n<h4>以<a href=\"https://sol-incinerator.com%E5%9B%9E%E6%94%B6%E7%A9%BA%E9%92%B1%E5%8C%85%E5%9C%B0%E5%9D%80%E7%9A%84%E6%88%AA%E5%9B%BE%E4%B8%BA%E4%BE%8B\">https://sol-incinerator.com回收空钱包地址的截图为例</a>, 大家可以自己分析一下或者自己尝试着操作一下看看:</h4>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-1.png\" alt=\"-1\" /></p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-2.png\" alt=\"-2\" /></p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-3.png\" alt=\"-3\" /></p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/-4.png\" alt=\"-4\" /></p>\n<h2>二. 关于在交易所以及Web3钱包的一些tips, 这点可能需要大家来一起补充, 我操作的比较少, 挑我知道的说</h2>\n<h4>1. 在<code>交易所钱包</code>的虚拟货币 和 在<code>Web3钱包</code>里面的虚拟货币 虚拟币是一样的, 但还是有一些不同的, 打个比方:</h4>\n<ul>\n<li><strong>交易所里的币</strong> 就像是你存在<strong>银行</strong>里的钱。\n<ul>\n<li>银行帮你保管，交易记录在银行的内部账本上。</li>\n<li>你使用网银APP进行操作，非常方便。</li>\n<li>但理论上，银行可以冻结你的账户（配合调查时），如果银行倒闭，你的钱可能会受损。</li>\n</ul>\n</li>\n<li><strong>Web3钱包里的币</strong> 就像是你放在<strong>自己家里保险箱</strong>的现金。\n<ul>\n<li>现金完全由你掌控，看得见摸得着。</li>\n<li>你可以自由支配，无需经过任何第三方。</li>\n<li>但如果你弄丢了保险箱钥匙（私钥/助记词），或者被小偷破门而入，钱就永远找不回来了。</li>\n</ul>\n</li>\n</ul>\n<h4>2. 交易所里面的充币/提币, web3钱包里面的转账手续费问题</h4>\n<p>挑我知道的说:</p>\n<ol>\n<li>web3钱包的转账是没有第三方收取手续费的, 只需要支付一些gas和优先费就可以了</li>\n<li>交易所里面的这个<code>充币</code>目测没有什么额外的手续费, 跟web3钱包是一样的</li>\n<li>但是这个<code>提币</code>操作, 好像都是需要一些额外的服务费的, 之前用Binance好像每笔usdt都会收我0.5u的样子, 现在用okx每次大概收我1u, 但是我去帮助文档里面检索了一下, 发现这么一些答案:</li>\n</ol>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250917101323.png\" alt=\"longshot20250917101323\" /></p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250917101944.png\" alt=\"longshot20250917101944\" /></p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/longshot20250917101954.png\" alt=\"longshot20250917101954\" /></p>\n<p>还有这么一个解释:</p>\n<p><img src=\"https://raw.githubusercontent.com/HelloWorldImJoe/ImageHosting/master/Blog/web3%E6%8F%90%E5%B8%81%E6%89%8B%E7%BB%AD%E8%B4%B9%E5%92%8C%E4%BA%A4%E6%98%93%E6%89%80%E4%B8%8D%E4%B8%80%E8%87%B4.png\" alt=\"web3提币手续费和交易所不一致\" /></p>\n",
      "created" : 779783281.036725,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "6B6E486F-4924-447A-9415-DF8681B9650A",
      "link" : "/6B6E486F-4924-447A-9415-DF8681B9650A/",
      "slug" : "",
      "tags" : {

      },
      "title" : "最近看到一些刚接触虚拟币交易的朋友踩了一些坑, 简单整理了一份入门小Tips给大家参考."
    },
    {
      "articleNumber" : 15,
      "articleReference" : "9D5E2DD8-15",
      "articleType" : 0,
      "attachments" : [

      ],
      "cids" : {

      },
      "content" : "### Hello World 👋\n\n- :orange_book: Focusing on iOS、Flutter & Odoo\n- :hammer: Engaged in ERP development\n- :ram: Wayward development\n- :meat_on_bone: Amateur cook\n",
      "contentRendered" : "<h3>Hello World 👋</h3>\n<ul>\n<li>:orange_book: Focusing on iOS、Flutter &amp; Odoo</li>\n<li>:hammer: Engaged in ERP development</li>\n<li>:ram: Wayward development</li>\n<li>:meat_on_bone: Amateur cook</li>\n</ul>\n",
      "created" : 767754360,
      "externalLink" : "",
      "hasAudio" : false,
      "hasVideo" : false,
      "id" : "EC3F7B15-F582-4CCD-BB7B-7B51606D4B51",
      "link" : "/EC3F7B15-F582-4CCD-BB7B-7B51606D4B51/",
      "modified" : 801968892.005647,
      "slug" : "",
      "tags" : {

      },
      "title" : "README"
    }
  ],
  "created" : 775035461.445516,
  "id" : "9D5E2DD8-82DF-4BC0-87F4-B0261E9DA5C8",
  "ipns" : "k51qzi5uqu5dkpb1bjwsgzpmhwnieraeelxrc54sp3q65vxmci73k19cxwidlc",
  "juiceboxEnabled" : false,
  "name" : "Developer Blog",
  "plausibleEnabled" : false,
  "podcastCategories" : {

  },
  "podcastExplicit" : false,
  "podcastLanguage" : "en",
  "tags" : {

  },
  "telegramUsername" : "helloimjoe",
  "twitterUsername" : "NiceImJoe",
  "updated" : 805380665.571645
}