<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>gaohongxiang</title>
        <link>https://paragraph.com/@gaohongxiang-2</link>
        <description>hi</description>
        <lastBuildDate>Mon, 20 Jul 2026 00:05:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>gaohongxiang</title>
            <url>https://storage.googleapis.com/papyrus_images/2b6288d697291a5f6993fc0717c1703d909d8d0fbbc4bfaab16ebf36bcfa50b3.jpg</url>
            <link>https://paragraph.com/@gaohongxiang-2</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Wreck League《沉船联盟》]]></title>
            <link>https://paragraph.com/@gaohongxiang-2/wreck-league</link>
            <guid>2jTkOcgbDcwYdX9YhcMN</guid>
            <pubDate>Thu, 10 Aug 2023 05:28:57 GMT</pubDate>
            <description><![CDATA[Wreck League《沉船联盟》是一个格斗竞技类游戏。由nWay与Animoca Brands合作开发，并以Yuga Labs作为我们第一季的合作伙伴，未来还将推出更多知名品牌，《沉船联盟》是迄今为止最雄心勃勃的 Web3 游戏项目。 Website: https://wreckleague.xyz/ Twitter: https://twitter.com/WreckLeagueHQ Youtube: https://www.youtube.com/@WreckLeagueHQ Medium: https://medium.com/wreck-league KYC: https://allowlist.wreckleague.xyz/KYC游戏需要kyc。八月快照NFT游戏中的nft称为机甲，机甲所有权是《沉船联盟》的基石。 机甲由 10 个机甲部件构成，例如手臂、胸部、头部、腿部、肩膀、护膝、卫星和配件，每个部件都有特定的战斗用途。零件可以与该特定类型的其他机甲零件互换，从而使玩家能够自由地在高度精细的特异性水平上定制他们的机甲。MINT第一季与Yuga合作，将 Yuga...]]></description>
            <content:encoded><![CDATA[<p>Wreck League《沉船联盟》是一个格斗竞技类游戏。由<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.nway.com/">nWay与</a><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.animocabrands.com/">Animoca Brands</a>合作开发，并以<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.yuga.com/">Yuga Labs</a>作为我们第一季的合作伙伴，未来还将推出更多知名品牌，《<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.wreckleague.xyz/">沉船联盟》</a>是迄今为止最雄心勃勃的 Web3 游戏项目。</p><p><strong>Website:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wreckleague.xyz/">https://wreckleague.xyz/</a></p><p><strong>Twitter</strong>: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/WreckLeagueHQ">https://twitter.com/WreckLeagueHQ</a></p><p><strong>Youtube:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/@WreckLeagueHQ">https://www.youtube.com/@WreckLeagueHQ</a></p><p><strong>Medium:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/wreck-league">https://medium.com/wreck-league</a></p><p><strong>KYC:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://allowlist.wreckleague.xyz/">https://allowlist.wreckleague.xyz/</a></p><h1 id="h-kyc" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">KYC</h1><p>游戏需要kyc。八月快照</p><h1 id="h-nft" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">NFT</h1><p>游戏中的nft称为机甲，机甲所有权是《沉船联盟》的基石。</p><p>机甲由 10 个机甲部件构成，例如手臂、胸部、头部、腿部、肩膀、护膝、卫星和配件，每个部件都有特定的战斗用途。零件可以与该特定类型的其他机甲零件互换，从而使玩家能够自由地在高度精细的特异性水平上定制他们的机甲。</p><h1 id="h-mint" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">MINT</h1><p>第一季与Yuga合作，将 Yuga 的角色融入到《沉船联盟》的宇宙中，称为Yuga 机甲零件。</p><p>四个 Yuga 系列各有 20 个独特的机甲部件，因此总共 80 个部件可以混合搭配（四个 Yuga 系列各有两套完整的机甲套装），创造出几乎无穷无尽的 Yuga 机甲。</p><p>mint分3个阶段，时间持续几个月</p><p>Mint 1 — The Genesis Mint — Kodas （八月进行）</p><p>Mint 2 — MAYC &amp; BAKC （第四季度）</p><p>Mint 3 — BAYC （第四季度）</p><p>**每个mint阶段结束后，相应的Yuga NFT持有者可以免费mint一个。**比如Yuga的Kodas持有者在mint1阶段结束后，可以免费mint一个kodas风格的机甲盒。</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">机甲盒</h3><p>mint不是直接给机甲，而是给机甲盒，有两种机甲盒：<strong>Majestic Box 和 Booster Box</strong>。同时发售，并且两者可以同时购买。</p><p>Majestic Box 包含 10 个随机零件，您可以使用它们从头开始组装完整的机甲。</p><p>Booster Box 由 5 个随机机甲部件组成，您可以使用它们来增强现有机甲或用于构建新机甲。这些盒子一起为收集体验增添了惊喜和机会。</p><p><strong>购买一个 Majestic Box 可以保证您获得 10 个部件来制造机甲，而购买两个 Booster 盒可以保证您获得 10 个部件……但不一定是组装一个机甲所需的 10 个部件。</strong></p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">稀有度等级</h3><p>盒子和机甲部件本身都是独特的不可替代代币（NFT）。</p><p>第一季的机甲盒子分为六个不同的稀有度等级：</p><p>common（普通）</p><p>uncommon（罕见）</p><p>rare（稀有）</p><p>epic（史诗）</p><p>legendary（传奇）</p><p>Yuga（yuga）</p><p>盒子的稀有性保证了其中所含零件的稀有性，并提高了分配的稀有度。例如，打开普通的 Majestic 箱子将获得普通零件，而打开传奇的 Majestic 箱子将获得传奇、史诗和稀有零件。Yuga 机甲零件只能来自 yuga 等级的 Majestic 盒子。</p><p>在销售阶段，Majestic 和 Booster 盒子的稀有度将被隐藏，以避免稀有度被狙击。一旦这个阶段结束，每个盒子的稀有度就会被揭示。盒子在其稀有性被揭晓之前和之后都将开放交易，允许所有者在 OpenSea 等市场上买卖盒子。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>组装机甲</strong></h2><p>盒子打开后，所有者将能够领取里面的机甲部件，盒子本身将被烧毁。</p><p>官网上的车库功能将允许机甲所有者组装他们的机甲。您拥有的机甲零件越多，可用的自定义选项就越多。这使您可以组合您想要的确切部件来创建根据您的特定需求量身定制的强大的定制机甲。组装好的机甲也是可以在市场上单独出售的 NFT。</p><p>开箱和首个沉船联盟游戏活动在同一天进行，因此玩家无需等待组装后就可以开始使用他们的机甲。</p><h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">玩法</h1><p>《沉船联盟》有Web3 和 Web2 两个版本！Android、iOS 和 PC 都支持！</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">角色</h3><p>创作者</p><p>所有者</p><p>熟练玩家</p><p>拥有最优秀机甲的车主能够轻松地与最熟练的玩家联手，形成强大的合作伙伴关系，在联盟各种比赛的最高梯队中竞争</p><h3 id="h-web3" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Web3版本</h3><p>游戏在9月份开始</p><p>将以 1 对 1 的战斗开始，但最终会演变为 3 对 3 的活动，您需要不同的机甲阵容来参加。此外，特定类型的活动和锦标赛将需要一定数量的机甲才能参加比赛。您拥有的机甲越多，参与活动以获得更好奖励的机会就越多。</p><p>排行榜赛</p><p>锦标赛</p><p>邀请赛</p><p>冠军杯</p><p>个人所有者也能够举办自己的锦标赛和游戏活动，培育以沉船联盟为中心的蓬勃发展的草根比赛社区。</p><h3 id="h-web2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Web2版本</h3><p>免费玩</p><p>机甲NFT持有者可以在游戏内商店售卖自己创建的机甲。本质上，机甲 NFT 所有者可以创建其机甲的链下副本，作为非 NFT 的应用内购买 (IAP) 选项。这些用户创建的机甲将填充游戏内商店，为玩家提供广泛的机甲选项，以增强他们的游戏体验。当游戏玩家购买其中一款机甲时，产生的部分收入将与 NFT 创建者/所有者分享，从而在游戏内培育社区驱动的经济。</p><p>此版本将于今年晚些时候推出。</p>]]></content:encoded>
            <author>gaohongxiang-2@newsletter.paragraph.com (gaohongxiang)</author>
        </item>
        <item>
            <title><![CDATA[OAuth2认证+谷歌客户端库调用gmail api处理业务]]></title>
            <link>https://paragraph.com/@gaohongxiang-2/oauth2-gmail-api</link>
            <guid>vK9Jmqcv7kNtQoGErOHw</guid>
            <pubDate>Mon, 13 Feb 2023 13:06:01 GMT</pubDate>
            <description><![CDATA[OAuth2认证+谷歌客户端库调用gmail api处理业务需求：使用程序来自动化处理邮箱，比如获取指定邮件、获取验证码等业务 两个方案模拟点击，但使用方式不打开网页来处理。这种可控因素多，效率低，访问外网速度慢，需要时间比较久走协议，访问gmail api 来获取建议程序使用走协议的方案，不可控因素少，效率高。POP协议和gmail客户端开启邮件访问授权访问授权，授权方式用户名+密码+开启安全性较低的应用的访问权限，从2020.05.30开始，google已不再支持此权限用户名+应用密码+开启二次验证，比较麻烦用户名+OAuth2验证建议使用用户名+OAuth2验证的方式 编程层次也存在分析解决方案使用python编写，smtplib库发送邮件。imaplib库接收邮件。垃圾邮件库，处理比较垃圾库使用，qq等库，但是现在imbox，yagmail其他人写邮件的库，方便好用的邮箱2验证，gmail邮箱不好用，其他邮箱可以用这个库。谷歌开发的库，google_auth_oauthlib（OAuth2验证）、google-api-python-client（谷歌客户端库）综上，解决方...]]></description>
            <content:encoded><![CDATA[<h1 id="h-oauth2gmail-api" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">OAuth2认证+谷歌客户端库调用gmail api处理业务</h1><p>需求：使用程序来自动化处理邮箱，比如获取指定邮件、获取验证码等业务</p><p>两个方案</p><ol><li><p>模拟点击，但使用方式不打开网页来处理。这种可控因素多，效率低，访问外网速度慢，需要时间比较久</p></li><li><p>走协议，访问gmail api 来获取</p></li></ol><p>建议程序使用走协议的方案，不可控因素少，效率高。</p><blockquote><p>POP协议和gmail客户端开启邮件访问</p></blockquote><p>授权访问授权，授权方式</p><ol><li><p>用户名+密码+开启安全性较低的应用的访问权限，从2020.05.30开始，google已不再支持此权限</p></li><li><p>用户名+应用密码+开启二次验证，比较麻烦</p></li><li><p>用户名+OAuth2验证</p></li></ol><p>建议使用用户名+OAuth2验证的方式</p><p>编程层次也存在分析解决方案</p><ol><li><p>使用python编写，smtplib库发送邮件。imaplib库接收邮件。垃圾邮件库，处理比较垃圾库</p></li><li><p>使用，qq等库，但是现在imbox，yagmail其他人写邮件的库，方便好用的邮箱2验证，gmail邮箱不好用，其他邮箱可以用这个库。</p></li><li><p>谷歌开发的库，google_auth_oauthlib（OAuth2验证）、google-api-python-client（谷歌客户端库）</p></li></ol><p>综上，解决方案为：</p><blockquote><p>python程序走协议通过用户名+OAuth2的验证方式，使用google_auth_oauthlib、google-api-python-client等谷歌客户端库来访问gmail api，实现业务需求。</p></blockquote><p>以下为官方示例教程</p><ul><li><p>使用 OAuth 2.0 访问 Google API：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.google.com/identity/protocols/oauth2">https://developers.google.com/identity/protocols/oauth2</a></p></li><li><p>快速入门：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.google.com/gmail/api/quickstart/python">https://developers.google.com/gmail/api/quickstart/python</a></p></li></ul><p>具体流程如下</p><ol><li><p>Google API Console 获取 OAuth 2.0 从客户端连接。</p></li><li><p>您的客户端应用程序从 Google 授权服务器请求访问令牌，从响应中获取令牌，</p></li><li><p>的业务通知发送到您要访问的 Google API，验证后处理。</p></li></ol><p>为了更好地理解自己的逻辑，官方提供了将 OAuth 2.0 与 Google 使用结合的互动式视频（包括使用您的客户端连接的选项）：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.google.com/oauthplayground/">https://developers.google.com/authplayground/</a></p><h2 id="h-google-api-console-oauth-20" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Google API Console 获取 OAuth 2.0 客户端请求 从</h2><p>谷歌API解析地址：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://console.cloud.google.com/">https://console.google.com/</a></p><p>1、创建并选择项目</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fa0731a1c12a9f27d80393c876ea050703d741ba4cf19447257572b5edbddfab.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>2、创建证书</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3fe6cad2b10b0333f86473670859c8afd39e559525b6210abd39b2cb17a21ae3.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>证书下载完整搜索项目目录下，可以重命名为<code>client_secret.json</code></p><p>3、编辑OAuth同意画面，添加测试用户</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d6ede7f8ea6f980c7c938ecffc062ff5ae7160bebfcc72579ac2db36993bc663.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>4、启用gmail api</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f558a9ee21faefa6787eb190ac553a52d4a32a3dd36917f98ac1482039e32162.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-google" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">客户端应用从 Google 授权服务器请求访问令牌，从响应中添加令牌</h2><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">安装谷歌客户端库</h3><pre data-type="codeBlock" text="  pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
"><code>  pip install <span class="hljs-operator">-</span><span class="hljs-operator">-</span>upgrade google<span class="hljs-operator">-</span>api<span class="hljs-operator">-</span>python<span class="hljs-operator">-</span>client google<span class="hljs-operator">-</span>auth<span class="hljs-operator">-</span>httplib2 google<span class="hljs-operator">-</span>auth<span class="hljs-operator">-</span>oauthlib
</code></pre><p>官方库github地址</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/googleapis/google-auth-library-python-oauthlib">https://github.com/googleapis/google-auth-library-python-oauthlib</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/googleapis/google-api-python-client">https://github.com/googleapis/google-api-python-client</a></p></li></ul><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">生成并存储备用标记</h3><pre data-type="codeBlock" text="from google_auth_oauthlib.flow import Flow
import google.oauth2.credentials
from googleapiclient.discovery import build
import html2text
import base64
import json, sys, os 
sys.path.append(os.getcwd()) # 根目录
# 导入模块都从根目录开始写
from accounts.adspower import *

class OAuth2Unit(AdsPowerUnit):
    
    def __init__(self, ads_id):
        super(OAuth2Unit, self).__init__(ads_id)

    def create_refresh_token(self, gmail):
        &quot;&quot;&quot;所有邮箱授权，生成刷新令牌，保存起来，以后直接用
        &quot;&quot;&quot;
        # # 使用谷歌API的客户秘密文件创建流程
        flow = Flow.from_client_secrets_file(
            &apos;./client_secret.json&apos;,
            # 阅读、撰写、发送和永久删除你在Gmail的所有邮件
            scopes=[&apos;openid&apos;,&apos;https://mail.google.com/&apos;, &apos;https://www.googleapis.com/auth/userinfo.email&apos;, &apos;https://www.googleapis.com/auth/userinfo.profile&apos;],
            redirect_uri=&apos;urn:ietf:wg:oauth:2.0:oob&apos;)

        # 告诉用户要去授权的URL
        auth_url, _ = flow.authorization_url(
            # 离线访问所请求范围的权限，可以刷新访问令牌，而无需重新提示用户授予权限
            access_type=&apos;offline&apos;,
            # 增量授权，建议打开
            include_granted_scopes=&apos;true&apos;)
        
        # 利用selenium自动获取code，这样可以全自动
        url = format(auth_url)
        self.driver.get(url)
        try:
            WebDriverWait(self.driver,10).until(EC.visibility_of_element_located((By.XPATH, &quot;//div[text()=&apos;&quot;+gmail+&quot;&apos;]&quot;))).click()
            WebDriverWait(self.driver,10).until(EC.visibility_of_element_located((By.XPATH, &quot;//div/div/div/div/div/div/div/div/div/div/div/div[2]&quot;))).click()
            time.sleep(2)
            # 勾选gmail权限
            WebDriverWait(self.driver,10).until(lambda x:self.driver.find_elements(by=By.CSS_SELECTOR, value=&quot;input&quot;))[3].click()
            WebDriverWait(self.driver,10).until(lambda x:self.driver.find_elements(by=By.CSS_SELECTOR, value=&quot;button&quot;))[2].click()
        except Exception as e:
            pass
        code = WebDriverWait(self.driver,10).until(EC.visibility_of_element_located((By.TAG_NAME, &quot;textarea&quot;))).get_attribute(&quot;value&quot;)
        print(code)
        # # 手动复制url得到code再粘贴到终端的方式。
        # # 终端获得的url复制到新邮箱所在adspower浏览器，新邮箱同意授权
        # print(&apos;Please go to this URL: {}&apos;.format(auth_url))
        # # 用户得到的授权码填入此处，来获取访问令牌。
        # code = input(&apos;Enter the authorization code: &apos;)

        flow.fetch_token(code=code)
        # credentials包含token（访问令牌）、refresh_token（刷新令牌）、client_id、client_secret等信息
        credentials = flow.credentials

        # 将刷新令牌保存到json文件
        # json.load()：将已编码的 JSON 字符串解码为 Python 对象
        # json.dump()：将 Python 对象编码成 JSON 字符串
        new_refresh_token = {gmail: credentials.refresh_token}
        with open(&apos;./accounts/mail/credential_tokens.json&apos;, &apos;r&apos;) as f:
            content = json.load(f)
            old_refresh_token = content[&apos;refresh_token&apos;]
            refresh_token = {**old_refresh_token, **new_refresh_token}
            content.update({&quot;refresh_token&quot;: refresh_token})

        with open(&apos;./accounts/mail/credential_tokens.json&apos;, &apos;w&apos;) as f:
            json.dump(content, f, indent=4, ensure_ascii=False)

if __name__ == &apos;__main__&apos;:

    oauth = OAuth2Unit(&apos;adspower_id&apos;)
    # 这个谷歌邮箱是添加进OAuth同意屏幕的测试用户
    oauth.create_refresh_token(&quot;gmail_address&quot;)
"><code><span class="hljs-keyword">from</span> google_auth_oauthlib.flow <span class="hljs-keyword">import</span> Flow
<span class="hljs-keyword">import</span> google.oauth2.credentials
<span class="hljs-keyword">from</span> googleapiclient.discovery <span class="hljs-keyword">import</span> build
<span class="hljs-keyword">import</span> html2text
<span class="hljs-keyword">import</span> base64
<span class="hljs-keyword">import</span> json, sys, os 
sys.path.append(os.getcwd()) <span class="hljs-comment"># 根目录</span>
<span class="hljs-comment"># 导入模块都从根目录开始写</span>
<span class="hljs-keyword">from</span> accounts.adspower <span class="hljs-keyword">import</span> *

<span class="hljs-keyword">class</span> <span class="hljs-title class_">OAuth2Unit</span>(<span class="hljs-title class_ inherited__">AdsPowerUnit</span>):
    
    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, ads_id</span>):
        <span class="hljs-built_in">super</span>(OAuth2Unit, self).__init__(ads_id)

    <span class="hljs-keyword">def</span> <span class="hljs-title function_">create_refresh_token</span>(<span class="hljs-params">self, gmail</span>):
        <span class="hljs-string">"""所有邮箱授权，生成刷新令牌，保存起来，以后直接用
        """</span>
        <span class="hljs-comment"># # 使用谷歌API的客户秘密文件创建流程</span>
        flow = Flow.from_client_secrets_file(
            <span class="hljs-string">'./client_secret.json'</span>,
            <span class="hljs-comment"># 阅读、撰写、发送和永久删除你在Gmail的所有邮件</span>
            scopes=[<span class="hljs-string">'openid'</span>,<span class="hljs-string">'https://mail.google.com/'</span>, <span class="hljs-string">'https://www.googleapis.com/auth/userinfo.email'</span>, <span class="hljs-string">'https://www.googleapis.com/auth/userinfo.profile'</span>],
            redirect_uri=<span class="hljs-string">'urn:ietf:wg:oauth:2.0:oob'</span>)

        <span class="hljs-comment"># 告诉用户要去授权的URL</span>
        auth_url, _ = flow.authorization_url(
            <span class="hljs-comment"># 离线访问所请求范围的权限，可以刷新访问令牌，而无需重新提示用户授予权限</span>
            access_type=<span class="hljs-string">'offline'</span>,
            <span class="hljs-comment"># 增量授权，建议打开</span>
            include_granted_scopes=<span class="hljs-string">'true'</span>)
        
        <span class="hljs-comment"># 利用selenium自动获取code，这样可以全自动</span>
        url = <span class="hljs-built_in">format</span>(auth_url)
        self.driver.get(url)
        <span class="hljs-keyword">try</span>:
            WebDriverWait(self.driver,<span class="hljs-number">10</span>).until(EC.visibility_of_element_located((By.XPATH, <span class="hljs-string">"//div[text()='"</span>+gmail+<span class="hljs-string">"']"</span>))).click()
            WebDriverWait(self.driver,<span class="hljs-number">10</span>).until(EC.visibility_of_element_located((By.XPATH, <span class="hljs-string">"//div/div/div/div/div/div/div/div/div/div/div/div[2]"</span>))).click()
            time.sleep(<span class="hljs-number">2</span>)
            <span class="hljs-comment"># 勾选gmail权限</span>
            WebDriverWait(self.driver,<span class="hljs-number">10</span>).until(<span class="hljs-keyword">lambda</span> x:self.driver.find_elements(by=By.CSS_SELECTOR, value=<span class="hljs-string">"input"</span>))[<span class="hljs-number">3</span>].click()
            WebDriverWait(self.driver,<span class="hljs-number">10</span>).until(<span class="hljs-keyword">lambda</span> x:self.driver.find_elements(by=By.CSS_SELECTOR, value=<span class="hljs-string">"button"</span>))[<span class="hljs-number">2</span>].click()
        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
            <span class="hljs-keyword">pass</span>
        code = WebDriverWait(self.driver,<span class="hljs-number">10</span>).until(EC.visibility_of_element_located((By.TAG_NAME, <span class="hljs-string">"textarea"</span>))).get_attribute(<span class="hljs-string">"value"</span>)
        <span class="hljs-built_in">print</span>(code)
        <span class="hljs-comment"># # 手动复制url得到code再粘贴到终端的方式。</span>
        <span class="hljs-comment"># # 终端获得的url复制到新邮箱所在adspower浏览器，新邮箱同意授权</span>
        <span class="hljs-comment"># print('Please go to this URL: {}'.format(auth_url))</span>
        <span class="hljs-comment"># # 用户得到的授权码填入此处，来获取访问令牌。</span>
        <span class="hljs-comment"># code = input('Enter the authorization code: ')</span>

        flow.fetch_token(code=code)
        <span class="hljs-comment"># credentials包含token（访问令牌）、refresh_token（刷新令牌）、client_id、client_secret等信息</span>
        credentials = flow.credentials

        <span class="hljs-comment"># 将刷新令牌保存到json文件</span>
        <span class="hljs-comment"># json.load()：将已编码的 JSON 字符串解码为 Python 对象</span>
        <span class="hljs-comment"># json.dump()：将 Python 对象编码成 JSON 字符串</span>
        new_refresh_token = {gmail: credentials.refresh_token}
        <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">'./accounts/mail/credential_tokens.json'</span>, <span class="hljs-string">'r'</span>) <span class="hljs-keyword">as</span> f:
            content = json.load(f)
            old_refresh_token = content[<span class="hljs-string">'refresh_token'</span>]
            refresh_token = {**old_refresh_token, **new_refresh_token}
            content.update({<span class="hljs-string">"refresh_token"</span>: refresh_token})

        <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(<span class="hljs-string">'./accounts/mail/credential_tokens.json'</span>, <span class="hljs-string">'w'</span>) <span class="hljs-keyword">as</span> f:
            json.dump(content, f, indent=<span class="hljs-number">4</span>, ensure_ascii=<span class="hljs-literal">False</span>)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:

    oauth = OAuth2Unit(<span class="hljs-string">'adspower_id'</span>)
    <span class="hljs-comment"># 这个谷歌邮箱是添加进OAuth同意屏幕的测试用户</span>
    oauth.create_refresh_token(<span class="hljs-string">"gmail_address"</span>)
</code></pre><p>此段代码结合了adspower指纹浏览器使用，实现完全自动化。如果不需要，把adspower相关部分删掉，使用手动复制url得到code再粘贴到终端的方式来生成刷新令牌（refresh_token）</p><p>授权范围（scopes）决定了应用的权限，具体请参考：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.google.com/gmail/api/auth/scopes?hl=en">https://developers.google.com/gmail/api/auth/scopes?hl=en</a></p><p>将刷新令牌保存到<code>credential_tokens.json</code>文件中备用，下次应用访问此用户就不用征求意见了。文件格式如下</p><pre data-type="codeBlock" text="{
    &quot;client_id&quot;: &quot;xxx&quot;,
    &quot;client_secret&quot;: &quot;xxx&quot;,
    &quot;token_uri&quot;: &quot;https://oauth2.googleapis.com/token&quot;,
    &quot;refresh_token&quot;: {
        &quot;xxx@gmail.com&quot;: &quot;xxx&quot;,
        &quot;yyy@gmail.com&quot;: &quot;yyy&quot;
    }
}
"><code>{
    <span class="hljs-string">"client_id"</span>: <span class="hljs-string">"xxx"</span>,
    <span class="hljs-string">"client_secret"</span>: <span class="hljs-string">"xxx"</span>,
    <span class="hljs-string">"token_uri"</span>: <span class="hljs-string">"https://oauth2.googleapis.com/token"</span>,
    <span class="hljs-string">"refresh_token"</span>: {
        <span class="hljs-string">"xxx@gmail.com"</span>: <span class="hljs-string">"xxx"</span>,
        <span class="hljs-string">"yyy@gmail.com"</span>: <span class="hljs-string">"yyy"</span>
    }
}
</code></pre><p>相关方法示例</p><ul><li><p>google_auth_oauthlib.flow module：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html#google_auth_oauthlib.flow.Flow.from_client_secrets_file">https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html#google_auth_oauthlib.flow.Flow.from_client_secrets_file</a></p></li><li><p>credentials示例：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://google-auth.readthedocs.io/en/latest/reference/google.oauth2.credentials.html#google.oauth2.credentials.Credentials">https://google-auth.readthedocs.io/en/latest/reference/google.oauth2.credentials.html#google.oauth2.credentials.Credentials</a></p></li></ul><h2 id="h-google-gmail-api" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">将该令牌发送到Google Gmail API，完成业务</h2><pre data-type="codeBlock" text="class GmailUnit():
    def __init__(self, gmail, file_=&apos;./credential_tokens.json&apos;):
        &quot;&quot;&quot;获取授权,调用google gmail api
        &quot;&quot;&quot;
        
        data = json.load(open(file_,&apos;r&apos;,encoding=&quot;utf-8&quot;))
        credentials = google.oauth2.credentials.Credentials(
            token=None,
            refresh_token=data[&apos;refresh_token&apos;][gmail],
            client_id=data[&apos;client_id&apos;],
            client_secret=data[&apos;client_secret&apos;],
            token_uri=data[&apos;token_uri&apos;]
            )
        self.service = build(&apos;gmail&apos;, &apos;v1&apos;, credentials=credentials)

    def get_messages_by_query(self, user_id=&apos;me&apos;, label_ids=[&apos;INBOX&apos;], query=&apos;&apos;):
        try:
            response = self.service.users().messages().list(userId=user_id, labelIds=label_ids, q=query).execute()
            messages = []
            if &apos;messages&apos; in response:
                messages.extend(response[&apos;messages&apos;])
            while &apos;nextPageToken&apos; in response:
                page_token = response[&apos;nextPageToken&apos;]
                response = self.service.users().messages().list(userId=user_id, labelIds=label_ids, q=query, pageToken=page_token).execute()
                messages.extend(response[&apos;messages&apos;])
            # print(messages)
            # print(len(messages))

            for message in messages:
                msg = self.service.users().messages().get(userId=user_id, id=message[&apos;id&apos;]).execute()
                # print(msg)
                # 正文
                msg = msg[&apos;payload&apos;][&apos;body&apos;][&apos;data&apos;]
                # print(msg)
                # base64url解码
                msg = base64.urlsafe_b64decode(msg).decode(&apos;utf-8&apos;)
                print(msg)
        except Exception as e:
            print(&apos;An error occurred: %s&apos; % e)

if __name__ == &apos;__main__&apos;:

    gmail = GmailUnit(&quot;xxx@gmail.com&quot;)
    #user_id=&apos;me&apos;, label_ids=[&apos;INBOX&apos;], query=&apos;&apos;
    gmail.get_messages_by_query(query=&apos;from:xxx subject:xxx&apos;)
"><code>class GmailUnit():
    def __init__(<span class="hljs-built_in">self</span>, gmail, file_<span class="hljs-operator">=</span><span class="hljs-string">'./credential_tokens.json'</span>):
        <span class="hljs-string">""</span><span class="hljs-string">"获取授权,调用google gmail api
        "</span><span class="hljs-string">""</span>
        
        data <span class="hljs-operator">=</span> json.load(open(file_,<span class="hljs-string">'r'</span>,encoding<span class="hljs-operator">=</span><span class="hljs-string">"utf-8"</span>))
        credentials <span class="hljs-operator">=</span> google.oauth2.credentials.Credentials(
            token<span class="hljs-operator">=</span>None,
            refresh_token<span class="hljs-operator">=</span>data[<span class="hljs-string">'refresh_token'</span>][gmail],
            client_id<span class="hljs-operator">=</span>data[<span class="hljs-string">'client_id'</span>],
            client_secret<span class="hljs-operator">=</span>data[<span class="hljs-string">'client_secret'</span>],
            token_uri<span class="hljs-operator">=</span>data[<span class="hljs-string">'token_uri'</span>]
            )
        <span class="hljs-built_in">self</span>.service <span class="hljs-operator">=</span> build(<span class="hljs-string">'gmail'</span>, <span class="hljs-string">'v1'</span>, credentials<span class="hljs-operator">=</span>credentials)

    def get_messages_by_query(<span class="hljs-built_in">self</span>, user_id<span class="hljs-operator">=</span><span class="hljs-string">'me'</span>, label_ids<span class="hljs-operator">=</span>[<span class="hljs-string">'INBOX'</span>], query<span class="hljs-operator">=</span><span class="hljs-string">''</span>):
        <span class="hljs-keyword">try</span>:
            response <span class="hljs-operator">=</span> <span class="hljs-built_in">self</span>.service.users().messages().list(userId<span class="hljs-operator">=</span>user_id, labelIds<span class="hljs-operator">=</span>label_ids, q<span class="hljs-operator">=</span>query).execute()
            messages <span class="hljs-operator">=</span> []
            <span class="hljs-keyword">if</span> <span class="hljs-string">'messages'</span> in response:
                messages.extend(response[<span class="hljs-string">'messages'</span>])
            <span class="hljs-keyword">while</span> <span class="hljs-string">'nextPageToken'</span> in response:
                page_token <span class="hljs-operator">=</span> response[<span class="hljs-string">'nextPageToken'</span>]
                response <span class="hljs-operator">=</span> <span class="hljs-built_in">self</span>.service.users().messages().list(userId<span class="hljs-operator">=</span>user_id, labelIds<span class="hljs-operator">=</span>label_ids, q<span class="hljs-operator">=</span>query, pageToken<span class="hljs-operator">=</span>page_token).execute()
                messages.extend(response[<span class="hljs-string">'messages'</span>])
            # print(messages)
            # print(len(messages))

            <span class="hljs-keyword">for</span> message in messages:
                <span class="hljs-built_in">msg</span> <span class="hljs-operator">=</span> <span class="hljs-built_in">self</span>.service.users().messages().get(userId<span class="hljs-operator">=</span>user_id, id<span class="hljs-operator">=</span>message[<span class="hljs-string">'id'</span>]).execute()
                # print(<span class="hljs-built_in">msg</span>)
                # 正文
                <span class="hljs-built_in">msg</span> <span class="hljs-operator">=</span> <span class="hljs-built_in">msg</span>[<span class="hljs-string">'payload'</span>][<span class="hljs-string">'body'</span>][<span class="hljs-string">'data'</span>]
                # print(<span class="hljs-built_in">msg</span>)
                # base64url解码
                <span class="hljs-built_in">msg</span> <span class="hljs-operator">=</span> base64.urlsafe_b64decode(<span class="hljs-built_in">msg</span>).decode(<span class="hljs-string">'utf-8'</span>)
                print(<span class="hljs-built_in">msg</span>)
        except Exception <span class="hljs-keyword">as</span> e:
            print(<span class="hljs-string">'An error occurred: %s'</span> <span class="hljs-operator">%</span> e)

<span class="hljs-keyword">if</span> __name__ <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-string">'__main__'</span>:

    gmail <span class="hljs-operator">=</span> GmailUnit(<span class="hljs-string">"xxx@gmail.com"</span>)
    #user_id<span class="hljs-operator">=</span><span class="hljs-string">'me'</span>, label_ids<span class="hljs-operator">=</span>[<span class="hljs-string">'INBOX'</span>], query<span class="hljs-operator">=</span><span class="hljs-string">''</span>
    gmail.get_messages_by_query(query<span class="hljs-operator">=</span><span class="hljs-string">'from:xxx subject:xxx'</span>)
</code></pre><p>__init__函数从<code>credential_tokens.json</code>文件中读取数据，获取授权</p><p>get_messages_by_query函数调用gmail api处理业务</p><p>具体业务查看官方gmail api文档</p><ul><li><p>google gmail api：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://developers.google.com/gmail/api/reference/rest?apix=true%E3%80%81https://developers.google.com/resources/api-libraries/documentation/gmail/v1/python/latest/index.html">https://developers.google.com/gmail/api/reference/rest?apix=true、https://developers.google.com/resources/api-libraries/documentation/gmail/v1/python/latest/index.html</a></p></li><li><p>可用于 Gmail 的搜索运算符（查询条件）：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://support.google.com/mail/answer/7190?hl=en">https://support.google.com/mail/answer/7190?hl=en</a></p></li></ul><p>文件结构如下</p><pre data-type="codeBlock" text="client_secret.json  # 下载的OAuth 2.0 客户端凭据
credential_tokens.json  # 存放refresh_token等信息，获取授权用
mail.py # OAuth2Unit获取refresh_token，GmailUnit处理业务
adspower.py # adspower指纹浏览器相关，用不到请忽略，文末列出相关代码
"><code>client_secret.json  # 下载的OAuth <span class="hljs-number">2.0</span> 客户端凭据
credential_tokens.json  # 存放refresh_token等信息，获取授权用
mail.py # OAuth2Unit获取refresh_token，GmailUnit处理业务
adspower.py # adspower指纹浏览器相关，用不到请忽略，文末列出相关代码
</code></pre><p>其他参考示例</p><ul><li><p>Python 读取gmail代码示例: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://justcode.ikeepstudying.com/2019/09/python-%E8%AF%BB%E5%8F%96gmail-python-%E6%90%9C%E7%B4%A2gmail-python%E6%93%8D%E4%BD%9Cgmail-how-to-access-gmail-using-python/">https://justcode.ikeepstudying.com/2019/09/python-读取gmail-python-搜索gmail-python操作gmail-how-to-access-gmail-using-python/</a></p></li><li><p>操作方法：在 Python 中使用 OAuth2 和 Gmail发送HTML邮件: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blog.macuyiko.com/post/2016/how-to-send-html-mails-with-oauth2-and-gmail-in-python.html">https://blog.macuyiko.com/post/2016/how-to-send-html-mails-with-oauth2-and-gmail-in-python.html</a></p></li><li><p>Google OAuth 2.0 中文认证指南：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wiki.jikexueyuan.com/project/google-oauth-2/">https://wiki.jikexueyuan.com/project/google-oauth-2/</a></p></li></ul><p>adspower相关代码</p><pre data-type="codeBlock" text="from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import requests,time

class AdsPowerUnit(object):
    &quot;&quot;&quot;selenium操作adspower指纹浏览器
    &quot;&quot;&quot;

    def __init__(self, ads_id):
        &quot;&quot;&quot;启动浏览器（webdriver为adspower自带的，不必单独下载）

        通过adspower提供的api和自己的浏览器id来启动浏览器

        Attributes：
            ads_id:adspower浏览器id
        &quot;&quot;&quot;
        self.ads_id = ads_id
        status = &apos;http://local.adspower.com:50325/status&apos;
        open_url = &quot;http://local.adspower.net:50325/api/v1/browser/start?user_id=&quot; + self.ads_id
        self.close_url = &quot;http://local.adspower.net:50325/api/v1/browser/stop?user_id=&quot; + self.ads_id

        resp = requests.get(open_url).json()
        if resp[&quot;code&quot;] != 0:
            print(resp[&quot;msg&quot;])
            print(&quot;please check ads_id&quot;)

        
        # 启动浏览器后在返回值中拿到对应的Webdriver的路径resp[&quot;data&quot;][&quot;webdriver&quot;]
        chrome_driver = Service(str(resp[&quot;data&quot;][&quot;webdriver&quot;]))

        # selenium启动的chrome浏览器是一个空白的浏览器。chromeOptions是一个配置chrome启动属性的类，用来配置参数。
        chrome_options = webdriver.ChromeOptions()
        # adspower提供的debug接口,用于执行selenium自动化
        chrome_options.add_experimental_option(&quot;debuggerAddress&quot;, resp[&quot;data&quot;][&quot;ws&quot;][&quot;selenium&quot;])
        # add_extension设置应用扩展。但是注意，adspower的扩展不能通过代码，是通过在客户端的应用程序里上传的，会应用到所有浏览器
        # chrome_options.add_extension(&quot;./metamask.crx&quot;)
        chrome_options.add_argument(&apos;--disable-gpu&apos;)

        #get直接返回，再也不等待界面加载完成
        desired_capabilities = DesiredCapabilities.CHROME
        desired_capabilities[&quot;pageLoadStrategy&quot;] = &quot;none&quot;

        self.driver = webdriver.Chrome(service=chrome_driver, options=chrome_options)
       
        # 全屏
        self.driver.maximize_window()

        self.close_other_windows()

    def close_other_windows(self):
        &quot;&quot;&quot;关闭无关窗口，只留当前窗口
        理论上下面代码会保留当前窗口，句柄没错。但是实际窗口却没有达到预期。不清楚具体原因。后续再研究。目前能做到的就是只保留一个窗口
        &quot;&quot;&quot;
        current_handle = self.driver.current_window_handle
        all_handles = self.driver.window_handles
        for handle in all_handles:
            self.driver.switch_to.window(handle)
            if handle != current_handle:
                self.driver.close()

    def quit(self):
        &quot;&quot;&quot;关闭浏览器
        &quot;&quot;&quot;
        time.sleep(5)
        self.driver.quit()
        requests.get(self.close_url)
"><code><span class="hljs-keyword">from</span> selenium <span class="hljs-keyword">import</span> webdriver
<span class="hljs-keyword">from</span> selenium.webdriver.chrome.service <span class="hljs-keyword">import</span> Service
<span class="hljs-keyword">from</span> selenium.webdriver.chrome.options <span class="hljs-keyword">import</span> Options
<span class="hljs-keyword">from</span> selenium.webdriver.support.wait <span class="hljs-keyword">import</span> WebDriverWait
<span class="hljs-keyword">from</span> selenium.webdriver.support <span class="hljs-keyword">import</span> expected_conditions <span class="hljs-keyword">as</span> EC
<span class="hljs-keyword">from</span> selenium.webdriver.common.by <span class="hljs-keyword">import</span> By
<span class="hljs-keyword">from</span> selenium.webdriver.common.keys <span class="hljs-keyword">import</span> Keys
<span class="hljs-keyword">from</span> selenium.webdriver.common.action_chains <span class="hljs-keyword">import</span> ActionChains
<span class="hljs-keyword">from</span> selenium.webdriver.common.desired_capabilities <span class="hljs-keyword">import</span> DesiredCapabilities
<span class="hljs-keyword">import</span> requests,time

<span class="hljs-keyword">class</span> <span class="hljs-title class_">AdsPowerUnit</span>(<span class="hljs-title class_ inherited__">object</span>):
    <span class="hljs-string">"""selenium操作adspower指纹浏览器
    """</span>

    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, ads_id</span>):
        <span class="hljs-string">"""启动浏览器（webdriver为adspower自带的，不必单独下载）

        通过adspower提供的api和自己的浏览器id来启动浏览器

        Attributes：
            ads_id:adspower浏览器id
        """</span>
        self.ads_id = ads_id
        status = <span class="hljs-string">'http://local.adspower.com:50325/status'</span>
        open_url = <span class="hljs-string">"http://local.adspower.net:50325/api/v1/browser/start?user_id="</span> + self.ads_id
        self.close_url = <span class="hljs-string">"http://local.adspower.net:50325/api/v1/browser/stop?user_id="</span> + self.ads_id

        resp = requests.get(open_url).json()
        <span class="hljs-keyword">if</span> resp[<span class="hljs-string">"code"</span>] != <span class="hljs-number">0</span>:
            <span class="hljs-built_in">print</span>(resp[<span class="hljs-string">"msg"</span>])
            <span class="hljs-built_in">print</span>(<span class="hljs-string">"please check ads_id"</span>)

        
        <span class="hljs-comment"># 启动浏览器后在返回值中拿到对应的Webdriver的路径resp["data"]["webdriver"]</span>
        chrome_driver = Service(<span class="hljs-built_in">str</span>(resp[<span class="hljs-string">"data"</span>][<span class="hljs-string">"webdriver"</span>]))

        <span class="hljs-comment"># selenium启动的chrome浏览器是一个空白的浏览器。chromeOptions是一个配置chrome启动属性的类，用来配置参数。</span>
        chrome_options = webdriver.ChromeOptions()
        <span class="hljs-comment"># adspower提供的debug接口,用于执行selenium自动化</span>
        chrome_options.add_experimental_option(<span class="hljs-string">"debuggerAddress"</span>, resp[<span class="hljs-string">"data"</span>][<span class="hljs-string">"ws"</span>][<span class="hljs-string">"selenium"</span>])
        <span class="hljs-comment"># add_extension设置应用扩展。但是注意，adspower的扩展不能通过代码，是通过在客户端的应用程序里上传的，会应用到所有浏览器</span>
        <span class="hljs-comment"># chrome_options.add_extension("./metamask.crx")</span>
        chrome_options.add_argument(<span class="hljs-string">'--disable-gpu'</span>)

        <span class="hljs-comment">#get直接返回，再也不等待界面加载完成</span>
        desired_capabilities = DesiredCapabilities.CHROME
        desired_capabilities[<span class="hljs-string">"pageLoadStrategy"</span>] = <span class="hljs-string">"none"</span>

        self.driver = webdriver.Chrome(service=chrome_driver, options=chrome_options)
       
        <span class="hljs-comment"># 全屏</span>
        self.driver.maximize_window()

        self.close_other_windows()

    <span class="hljs-keyword">def</span> <span class="hljs-title function_">close_other_windows</span>(<span class="hljs-params">self</span>):
        <span class="hljs-string">"""关闭无关窗口，只留当前窗口
        理论上下面代码会保留当前窗口，句柄没错。但是实际窗口却没有达到预期。不清楚具体原因。后续再研究。目前能做到的就是只保留一个窗口
        """</span>
        current_handle = self.driver.current_window_handle
        all_handles = self.driver.window_handles
        <span class="hljs-keyword">for</span> handle <span class="hljs-keyword">in</span> all_handles:
            self.driver.switch_to.window(handle)
            <span class="hljs-keyword">if</span> handle != current_handle:
                self.driver.close()

    <span class="hljs-keyword">def</span> <span class="hljs-title function_">quit</span>(<span class="hljs-params">self</span>):
        <span class="hljs-string">"""关闭浏览器
        """</span>
        time.sleep(<span class="hljs-number">5</span>)
        self.driver.quit()
        requests.get(self.close_url)
</code></pre>]]></content:encoded>
            <author>gaohongxiang-2@newsletter.paragraph.com (gaohongxiang)</author>
        </item>
        <item>
            <title><![CDATA[全链互操作性协议—LayerZero教程
]]></title>
            <link>https://paragraph.com/@gaohongxiang-2/layerzero</link>
            <guid>Jq65NyCXaUGPL89A1YdO</guid>
            <pubDate>Mon, 13 Feb 2023 13:05:33 GMT</pubDate>
            <description><![CDATA[全链互操作性协议——LayerZero教程layerzero是一种原生跨链协议，无需信任的全链互操作性协议，是用于智能合约在链之间进行通信的消息传输层，它可以实现具有低级通信原语的跨链应用程序。它是加密桥接的一个新维度，旨在连接所有EVM链并统一流动性池。 进一步了解LayerZero：无需信任的全链互操作性协议 当前LayerZero正以30亿美元估值筹集新资金，FTX Ventures承诺领投，融资内容包括 LayerZero代币、STG代币及LayerZero股权。3 月 31 日，LayerZero Labs 宣布完成 1.35 亿美元 A+ 轮融资，该轮融资由 FTX Ventures、红杉资本与 a16z 共同领投，Coinbase Ventures、PayPal Ventures、Tiger Global 和 Uniswap Labs 等参投，投后估值为 10 亿美元。此前 LayerZero Labs 曾于 2021 年 9 月完成 600 万美元 A 轮融资，该轮融资由 Multicoin 和 Binance Labs 领投。 layerzero官方github...]]></description>
            <content:encoded><![CDATA[<h1 id="h-layerzero" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">全链互操作性协议——LayerZero教程</h1><p>layerzero是一种原生跨链协议，无需信任的全链互操作性协议，是用于智能合约在链之间进行通信的消息传输层，它可以实现具有低级通信原语的跨链应用程序。它是加密桥接的一个新维度，旨在连接所有EVM链并统一流动性池。</p><p>进一步了解</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/searchblock.eth/EoxnJ2lXtK1yYdHhtXP9Ny_TM0cOGg8nmgOY9hv6wZE">LayerZero：无需信任的全链互操作性协议</a></p></li><li><br></li></ul><p>当前LayerZero正以30亿美元估值筹集新资金，FTX Ventures承诺领投，融资内容包括 LayerZero代币、STG代币及LayerZero股权。3 月 31 日，LayerZero Labs 宣布完成 1.35 亿美元 A+ 轮融资，该轮融资由 FTX Ventures、红杉资本与 a16z 共同领投，Coinbase Ventures、PayPal Ventures、Tiger Global 和 Uniswap Labs 等参投，投后估值为 10 亿美元。此前 LayerZero Labs 曾于 2021 年 9 月完成 600 万美元 A 轮融资，该轮融资由 Multicoin 和 Binance Labs 领投。</p><p>layerzero官方github提到了他们的代币名称 $ZRO</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f6b32c669950955d28cc4940d417bd349b752c1ca79484cff1cec4f514e40156.png" alt="ZRO" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">ZRO</figcaption></figure><p>这是一个很有潜力的项目，并没有在社区透露太多信息。如果做成了可能会改变跨链生态的格局。这样的项目如果有空投的话，一定是很不错的，值得挑一些重点项目来交互。</p><h2 id="h-stargate-finance" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Stargate Finance</h2><p>Stargate FinanceStargate 是一个完全可组合的流动性传输协议，是全链DeFi的核心。它是使用layerzero协议的第一个项目，官方背景，必交互。</p><h3 id="h-1-stargate-finance-dao" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1、成为 Stargate Finance 的 DAO 投票者</h3><p>首先购买Stargate Financ的代币STG（5个左右即可）。STG合约去 <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://coinmarketcap.com/currencies/stargate-finance/">coinmarketcap</a> 复制。目前六条链上都有，想在哪条链上买就选择对应链上的合约，拿到合约后去对应链上的dex去swap即可</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/11311ea2be8c1ef292014dc6fe3810a5f067ef8c3986698de2e9c047c8c073d8.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/11311ea2be8c1ef292014dc6fe3810a5f067ef8c3986698de2e9c047c8c073d8.png" alt="STG" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">STG</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/cc744b9c8e05d7e38ac57f77283487c6c96f5474731f4a62e036cc939b585b25.png" alt="stake STG" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">stake STG</figcaption></figure><h3 id="h-2" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2、跨链转移资产</h3><p>跨过去用stargate的Transfer功能，跨回来可以交互其他使用layerzero的产品，比如：Sushiswap、Hashflow等。这样即交互了stargate又交互了其他应用。同时，现在有个OP奥德赛活动，只要<code>通过其他链向op链转最少100usdc</code>，即可奖励一个nft，一举三得。</p><h4 id="h-stargateop" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">资产通过stargate从其他链跨到OP</h4><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/155fe3bb97c662b3d36d4004c908ef78da341edd39b05cb1e98bf5fb26148c58.png" alt="transfer" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">transfer</figcaption></figure><h4 id="h-opnft" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">领取OP活动nft</h4><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bf1b8ac14de529712fd01e931eda561bd33448204ec4f81f7eb336b372dc5356.png" alt="op_stargate" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">op_stargate</figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3e4e61680ceede868ed73e92493373008eced382c7b14a5215d644a162470286.png" alt="nft" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">nft</figcaption></figure><h4 id="h-sushiswapop" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">资产通过Sushiswap从OP跨回来</h4><blockquote><p>如果想交互下面提到的farming的话，就先不要跨回来啦。</p></blockquote><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c03102e3c2466692e710cc2a906649d1778c039cb22023ee7b103fbbbceff56f.png" alt="sushi" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">sushi</figcaption></figure><h3 id="h-3farming" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3、farming交互</h3><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/8dab37144efb77ae14fdf73592fab19939e4fe92c4712d4967b8a5f323bede66.png" alt="farm" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">farm</figcaption></figure><h2 id="h-usdc" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">USDC 零层桥接</h2><p>这是官方一个测试demo，它是第 0 层的桥梁，我们可以使用它在 EVM 链之间发送 USDC。 网址：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://usdcdemo.layerzero.network/bridge">usdcdemo</a></p><ul><li><p>USDC 歌尔力合约地址： 0x07865c6E87B9F70255377e024ace6630C1Eaa37F</p></li><li><p>USDC Avax 合约地址： 0x5425890298aed601595a70AB815c96711a31Bc65</p></li></ul><p>领goerli测试网的usdc可以从网站左下角的<code>Faucet USDC</code>处领，也可以通过uniswap去兑换。领不到usdc的情况下就用兑换的方式。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/5cd04f40a57511020b39a49e1bc2f67bc0898c2a7add85c5fccbf2a8e072e997.png" alt="usdcdemo" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">usdcdemo</figcaption></figure><h2 id="h-liquidswap" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">liquidswap交互</h2><p>它是第零层上的一座桥梁，我们可以使用它在以太坊和 Aptos 之间发送代币。近期aptos大热，很有必要交互一下。网址：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://bridge.liquidswap.com/">liquidswap</a></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/099bdddda557c27a5898fbcad532193a8c1b7d9d892a28f08fc8ae8ebff70088.png" alt="liquidswap" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">liquidswap</figcaption></figure><h2 id="h-gh0stly-gh0sts" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Gh0stly Gh0sts</h2><p>Gh0stly Gh0sts（小幽灵）是LayerZero官方发布的第一个真正意义上的“全链NFT”。总量7710个。如果想通过它博空投，只能去二级市场购买。目前地板价0.12ETH（2022/10/29）。根据推特的信息展示，小幽灵将会发布一款小游戏。不清楚是否会对NFT持有者进行空投。</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/gh0stlygh0sts">Gh0stly Gh0sts 推特</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://opensea.io/zh-CN/collection/gh0stlygh0sts">Gh0stly Gh0sts opensea</a></p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/30f2e0331d3f40cd856bb8f6046e6cc104382cbffb8762e438520c4d2f843ce5.png" alt="Gh0stly Gh0sts" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Gh0stly Gh0sts</figcaption></figure><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">其他</h2><p>上面几个项目权重比较大，建议交互。其他项目自行研究吧。</p>]]></content:encoded>
            <author>gaohongxiang-2@newsletter.paragraph.com (gaohongxiang)</author>
        </item>
        <item>
            <title><![CDATA[Nostr协议+闪电网络介绍及体验]]></title>
            <link>https://paragraph.com/@gaohongxiang-2/nostr</link>
            <guid>qkhjQQ9WC7kfksvFMTJp</guid>
            <pubDate>Mon, 13 Feb 2023 05:37:41 GMT</pubDate>
            <description><![CDATA[文章不是保姆级的，需要带入自己的思考。文末有体验流程的总结，可以前后对比着看。最后的参考文章都非常棒，本文参考了它们，推荐阅读。 特别提醒：助记词、私钥、lndhub wallet backup 都是敏感数据，一定要保存好，泄漏或遗失都会导致你的资产损失。我的nostr：https://nostrplebs.com/s/gaohongxiang 欢迎关注NostrNostr是一个基于公私钥的消息传输协议。协议本身非常简洁，只解决一个问题：如何让用户直接以公钥为身份向外发送消息。 它提供了一个我们重新构建互联网的机会，从头重建一遍互联网。Nostr的账户系统Nostr的账户系统就是公私钥公钥（npub1nv7...mqmmx）-> 对应账号。通过公钥关注用户私钥（nsec17c6...rswm9）-> 对应密码。私钥控制账户账户去中心化 公私钥基于数学生成，无需许可，不依赖任何其他第三方服务（不需要手机号，不需要邮箱等），完全由自己掌握。也就是说任何第三方机构都无法封禁你的账号，天然抗审查。对比我们常用的twitter、微信等应用，他们有能力封禁账户。典型例子是美国前总统特朗普的t...]]></description>
            <content:encoded><![CDATA[<p>文章不是保姆级的，需要带入自己的思考。文末有体验流程的总结，可以前后对比着看。最后的参考文章都非常棒，本文参考了它们，推荐阅读。</p><p>特别提醒：<code>助记词</code>、<code>私钥</code>、<code>lndhub wallet backup</code> 都是敏感数据，一定要保存好，泄漏或遗失都会导致你的资产损失。</p><blockquote><p>我的nostr：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostrplebs.com/s/gaohongxiang">https://nostrplebs.com/s/gaohongxiang</a> 欢迎关注</p></blockquote><h1 id="h-nostr" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Nostr</h1><p>Nostr是一个基于公私钥的消息传输协议。协议本身非常简洁，只解决一个问题：如何让用户直接以公钥为身份向外发送消息。</p><p>它提供了一个我们重新构建互联网的机会，从头重建一遍互联网。</p><h2 id="h-nostr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Nostr的账户系统</h2><p>Nostr的账户系统就是公私钥</p><ul><li><p>公钥（npub1nv7...mqmmx）-&gt; 对应账号。通过公钥关注用户</p></li><li><p>私钥（nsec17c6...rswm9）-&gt; 对应密码。私钥控制账户</p></li></ul><p><code>账户去中心化</code></p><p>公私钥基于数学生成，无需许可，不依赖任何其他第三方服务（不需要手机号，不需要邮箱等），完全由自己掌握。也就是说任何第三方机构都无法封禁你的账号，天然抗审查。对比我们常用的twitter、微信等应用，他们有能力封禁账户。典型例子是美国前总统特朗普的twitter账号被封。被封代表着你的账户及数据不属于你了，而nostr账户及数据是可以带走的，与平台无关。</p><h2 id="h-nostr" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Nostr运行原理</h2><p>Nostr 预设了两种角色去运行这个协议</p><ul><li><p>客户端</p></li><li><p>转发器（relay）</p></li></ul><blockquote><p>它的结构很简单，客户端接收（拉取）消息、递送消息，relay 转发消息。</p></blockquote><p>客户端把用户使用公钥签名的消息发给 relay，relay把此消息转发给关注了这个公钥的其他客户端。同时，每一个客户端也接收（拉取）relay发来的其他公钥的消息。</p><p>它有一些关键的属性是什么？</p><ul><li><p>relay 跟 relay 之间不通信</p></li><li><p>客户端 跟 客户端 之间不通信</p></li><li><p>relay 跟 客户端 之间通信</p></li></ul><p>这是一个很重要但是一直被大家忽视的属性。很多人误解了 Nostr 的特性都在于它没有理解到这一点。协议的作者 fiatjaf 一开始说得很清楚，Nostr 不是一个点对点的协议，大家的消息都是要经过 relay 的，而 relay 之间互相是不通信的，所以它也不像我们认识到的区块链的网络一样所有节点都相互通信。</p><p>在 nostr 中，有一个很重要的问题需要解决，由于 relay 之间不同步数据，那么数据要怎么在整个网络中同步呢？nostr 的设计很巧妙，每个 relay 之间不同步消息，同步消息的机制由 client 来实现。client把自己知道的用户及相关的 relay 地址传播到其他的 relay 中。这样其他的用户就可以通过这些信息找到目标用户的 relay，拉取到目标用户的消息，从而完成信息的传播。 这样做的好处在于每个 relay 不需要像区块链节点那样存储全量的数据。nostr 的这种数据存储方式类似于数据库分片，让每个 relay 的存储压力不那么大。当然这样做也有坏处，如果用户的消息只在某一个 relay 上，如果这个 relay 出现问题，就有可能导致数据永久丢失。</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">客户端</h3><p><code>客户端去中心化</code></p><p>nostr是底层协议，直接与协议交互显然不方便，门槛高，就需要客户端来封装nostr协议。也就是说，客户端是用户与nostr协议交互的载体。客户端有很多，下面是目前比较常见的，使用任意一个都可以，他们都实现了nostr协议。</p><p>浏览器客户端</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://snort.social/">https://snort.social/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://iris.to/">https://iris.to/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://astral.ninja/">https://astral.ninja/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostr.band/">https://nostr.band/</a></p></li></ul><p>移动客户端</p><ul><li><p>Damus（iOS）</p></li><li><p>Amethyst（Android）</p></li></ul><p>官方维护的客户端列表</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/vishalxl/Nostr-Clients-Features-List#nostr-client-feature-list">https://github.com/vishalxl/Nostr-Clients-Features-List#nostr-client-feature-list</a></p></li></ul><p>这里对习惯了传统社交应用的人来说比较新奇的点在于：你可以使用任意一个你喜欢的客户端，你在A客户端上做的交互也同时会在B客户端存在。也就是说，这些交互都是绑定你的账户的，并不会困在某一个客户端（应用）里，因为他们底层都是在跟nostr协议交互。</p><p>举个例子：你在客户端iris里设置了头像或者发了篇帖子，当你在客户端Damus里使用相同的公私钥时，这个头像或帖子还在！这对于没接触过的人来说非常神奇，因为你不可能在微博里发了篇帖子在twitter上还能看见它，他们是不互通的。请记住：nostr是底层协议，客户端是对nostr协议的实现，是协议上的应用。</p><h3 id="h-relay" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">relay</h3><p><code>服务端（relay）去中心化</code></p><ul><li><p>消息都经过签名，relay无法篡改，因此不必信任relay</p></li><li><p>如果一个relay把你封禁了，你也可以转发到其他的relay或者创建自己的relay</p></li></ul><p>relay是离用户比较远的一个角色，用户可以根据需要切换relay。目前的运营基本是用爱发电。随着nostr协议的流行，预计未来会出现付费reply，必须付费才能连接。比如说有的人愿意去做图片的 relay，有的人愿意做视频的 relay，有的人可能会做一些像类似于直播这样的 relay。这些都不是协议层的内容，市场会有选择，期待新的商业模式出现。</p><p>如果你想自己搭建一个relay，下面是一些教程</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/BlockChainCaffe/Nostr-Relay-Setup-Guide">https://github.com/BlockChainCaffe/Nostr-Relay-Setup-Guide</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://andreneves.xyz/p/set-up-a-nostr-relay-server-in-under">https://andreneves.xyz/p/set-up-a-nostr-relay-server-in-under</a></p></li></ul><h2 id="h-nip" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">NIP</h2><p>NIP是nostr的一些标准，类似比特币的BIP，以太坊的EIP。具体标准查看官方github：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/nostr-protocol/nips">https://github.com/nostr-protocol/nips</a></p><h3 id="h-nip-05-id" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><code>NIP-05 ID</code></h3><p>由于公钥是一串难以记忆的字符串，对人类非常不友好。当我想关注一个人时，看到的都是不同的字符串，很难看出来是不是要关注的人。而NIP-05就是解决这个问题的，将公钥替换为人类可读ID。类似于构建在Nostr上面的一个域名，它是唯一的。下面是一些服务商。</p><h4 id="h-" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">付费</h4><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostrplebs.com/">https://nostrplebs.com/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nip05.nostr.band/">https://nip05.nostr.band/</a></p></li></ul><p>这里付款会用到闪电网络，看下文。nostrplebs普通会员费用大概12500sat，nostr.band费用1000sat。</p><p>购买成功后就会分配<code>NIP-05 ID</code>。去任意客户端在设置的NIP-05那一项里填进去保存即可。</p><ul><li><p>nostrplebs：<code>username@nostrplebs.com</code></p></li><li><p>nostr.band：<code>username@nostr.band</code></p></li></ul><p>nostrplebs</p><ul><li><p>提供的功能：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostrplebs.com/features">https://nostrplebs.com/features</a></p></li><li><p>帮助中心：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.nostrplebs.com/">https://help.nostrplebs.com/</a></p></li></ul><p>其中有一条是闪电地址转发和管理。Nostr Plebs 成员可以将发送到他们注册的 NIP-05 ID 的闪电支付转发到他们现有的闪电地址，为他们提供一个身份和支付地址。</p><h4 id="h-" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">免费</h4><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostr.directory/">https://nostr.directory/</a></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostrverified.com/">https://nostrverified.com/</a></p></li></ul><p>这两个是免费的，但是需要用twitter账户验证一下。流程大概就是证明你控制这两个账户。</p><ul><li><p>twitter发一个包含你公钥的推文，格式根据网站的来。</p></li><li><p>nostr验证（nostr.directory是发一个带你twitter用户名的post，nostrverified是填表）</p></li></ul><p>验证通过就会分配<code>NIP-05 ID</code>。</p><ul><li><p>nostr.directory：<code>yourtwitterhandle@nostr.directory</code></p></li><li><p>nostrverified：<code>yourtwitterhandle@NostrVerified.com</code></p></li></ul><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">小应用</h2><p>国际象棋游戏</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://jesterui.github.io/">https://jesterui.github.io/</a></p></li></ul><p>进入网站，你生成一个公钥，就可以在里面跟人家下棋了，你可以选择机器人跟你下棋，也可以选择跟一个对手下棋。你们的每一步棋其实都是通过 Nostr 协议的 relay 来转发的。象棋的步数的解析，输赢的判定全部放在你本地的客户端，而怎么寻找对手放在 relay 上，就这么简单。</p><p>私密聊天室‌</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sendstr.com/">https://sendstr.com/</a></p></li></ul><p>你在里面你就可以生成一个一次性的公钥，你把公钥发给别人，然后别人就可以用你的公钥，他自己也生成一个一次性的公钥，然后就跟你进入聊天。这些公钥都是一次性的，用完就丢掉。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">挑战</h2><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">私钥泄漏遗忘问题</h3><p>遗忘/丢失私钥即表示丢失账户控制权，任何人也无法帮你找回账户。另外，私钥被盗/泄漏即表示不止你一个人能控制此账户。</p><p>目前通过客户端生成的私钥本身存在泄漏的风险。可能的解决方案</p><ul><li><p>硬件钱包生成（助记词，按m/44&apos;/1237&apos;/0&apos;/0/0派生路径生成？）</p></li><li><p>离线生成（openssl？）</p></li></ul><p>使用上，每个客户端初次使用都需要导入私钥，存在安全隐患</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">内容存储</h3><p>社交必定会产生大量的内容。这些内容的存储如果是中心化的，那么nostr的抗审查是不是就打折扣了。也许会有结合区块链的存储方式，比如用AR或者IPFS来做存储。</p><p>数据同步问题，假设别人没有使用你使用的reply，就看不到你的内容？是不是未来会发展成公共和私人两个方向？公共relay就像twitter一样，存储足够多的信息。而私人relay就像discord的频道一样，加入了才看得到。</p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">垃圾信息</h3><p>在 nip-13 中， 定义了 pow 机制来增加发送垃圾消息的成本，但这样应该还不足以拦截垃圾信息。</p><p>在这个问题上，有另外一个思路，由于 relay 和 client 实现上的自由度很高，relay 和 client 可以自行决定可以传播什么样的信息，对哪些信息进行拦截，对一些恶意用户设置黑名单，然后在 relay 之间分享。 这样可以让 nostr 形成各种类型的社区，每个社区都有自己的规则，那些任由垃圾消息传播的社区会成为垃圾场，有着良好规则和优质内容的社区就会越来越庞大。</p><h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">比特币闪电网络</h1><p>Nostr是一个去中心化的社交协议，没有定义协议层面的经济激励。目前发展趋势是使用比特币闪电网络来完成支付功能。原生去中心化社交+原生去中心化支付，构成了生态闭环。</p><p>闪电网络是比特币的二层，是一个链下支付通道，最终结算在比特币网络上。可以为用户提供更便宜，更高效的比特币充提体验。</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">支持闪电网络的钱包</h2><p>常用的闪电网络钱包</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://bluewallet.io/">https://bluewallet.io/</a> (不支持闪电地址)</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://walletofsatoshi.com/">https://walletofsatoshi.com/</a> (支持闪电地址)</p></li></ul><p>bluewallet比特币主网是助记词，闪电网络是<code>lndhub wallet backup</code>,长下面的样子</p><pre data-type="codeBlock" text="lndhub://5678...ju997@https://lndhub.io
"><code>lndhub:<span class="hljs-regexp">//</span><span class="hljs-number">5678</span>...ju997@https:<span class="hljs-regexp">//lnd</span>hub.io
</code></pre><p>walletofsatoshi是直接邮箱注册，全托管，没有助记词，对新手比较友好。</p><h2 id="h-bolt" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">BOLT</h2><p>BOLT（Basis of Lightning Technology）协议是闪电网络的基础，它是对各种层面上通信和应用处理的一个全面的协议。具体标准查看官方github：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/lightning/bolts">https://github.com/lightning/bolts</a></p><h3 id="h-" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">支付</h3><p>跟支付相关的bolt是bolt11，以及还没实施的bolt12</p><h4 id="h-bolt11-lightning-invoice" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">BOLT11 Lightning Invoice</h4><p>Lightning Invoice（发票）是闪电网络一次性的收款地址，有具体数额。收款后就失效。</p><p>在闪电网络钱包的接收（receive）页面创建，需要输入具体数额。类似下面这样的地址,<code>lnbc</code>开头，<code>ln</code>是闪电网络，<code>bc</code>是比特币主网</p><pre data-type="codeBlock" text="lnbc1u1p370f5mpp5qkffutcv63z8f8nvg3p95k7938m40s2e24h45rxxp3sd8r0ecpesdqu2askcmr9wssx7e3q2dshgmmndp5scqzpgxqyz5vqsp5hkny0uvacea2sdway60tvvaxuxgypzz0qn5hm6fp7zsw274zu4pq9qyyssqkvwwt24s6y2c9kw0dqkyvcpw6zll367yr80q0rf3wjewa8ndgm2ymeeywrj33eg4pf2l4kkkqf08eu6f8k5dstxfdkjxzlwpwslkgegp00lg5f
"><code></code></pre><p>得到这个地址后在nostr发post，nostr客户端自动将此地址转换成一个求打赏链接，效果如下</p><pre data-type="codeBlock" text="⚡ Pay with lightning 
"><code>⚡ Pay <span class="hljs-keyword">with</span> lightning 
</code></pre><p>当有人打赏后，钱包里就会收到比特币。</p><p>BOLT11 Lightning Invoice目前的问题是</p><ul><li><p>只能使用一次，收款后就失效。</p></li><li><p>需要实时生成</p></li><li><p>只能接收不能发送</p></li></ul><h4 id="h-bolt12-offer" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">BOLT12 Offer</h4><p>bolt12可以看作是bolt11的升级，解决了bolt11的问题</p><ul><li><p>可以持久使用</p></li><li><p>能接收也能发送</p></li></ul><p>关于发送，类似提款机，你扫码后会想你支付钱。持久使用比较重要，可以作为收款码使用，不必每次都要创建一个新的。但是目前bolt12还没有实施，只能等了。目前想要持久使用的替代方案是使用闪电地址。</p><h4 id="h-lightning-address" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">lightning Address（闪电地址）</h4><p>lightning Address（闪电地址）或 LNURL 并非闪电网络规范BOLT的一部分，实际上它是一种网络工程的运用。最终的支付方依然用利用闪电发票，只不过借助了服务端来获取发票。</p><p>闪电地址可读性非常高，并且是闪电网络持续的收款地址，可以一直使用。</p><p>下面是支持闪电地址的应用，可以挑选一个自己喜欢的后缀。</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://lightningaddress.com/">https://lightningaddress.com/</a></p></li></ul><p>我体验过的应用</p><ul><li><p>lightingTipBot，是一个telegram应用，加入后会发给你一个lightning Address，例如：<code>gaohongxiang@ln.tips</code>。收款在tg的频道机器人钱包里，总感觉有点怪。</p></li><li><p>walletofsatoshi，是一个移动端钱包，收付款都在一个移动端钱包里。但是它好像自动生成闪电地址，例如：<code>machoroot85@walletofsatoshi.com</code>，这个前缀不是我想要的，但是没有找到修改前缀的功能。</p></li></ul><p>得到闪电地址后，在nostr的设置里把这个地址填在<code>LN Address</code>里，然后主页会有一个闪电打赏标志</p><pre data-type="codeBlock" text="⚡
"><code></code></pre><p>不同客户端可能显示不一样。</p><h4 id="h-bolt12lightning-address" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">BOLT12与lightning Address的区别</h4><p>bolt12是闪电网络的规范，是协议层的解决方案，而lightning Address/LNURL不是闪电网络的规范，是应用层的解决方案。这意味着bolt12具有更好的隐私，较小的集中化风险（DNS）和非技术用户的UX更好，并且不需要像lightning Address/LNURL那样需要Web服务器，TLS证书和域名等外部依赖项。</p><p>bolt11是一长串字符，而lightning Address是可读性很高的标识符。bolt12也是一长串字符吗？能不能也转成可读性很高的标识符？</p><h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">体验流程</h1><p>Nostr是自由的消息传递协议，比特币是自由的价值传递协议。两者结合，形成一个生态闭环。</p><ol><li><p>创建一个nostr账户。可以从任意nostr客户端创建（自动生成公私钥，保存好私钥），也可以先用安全方式生成公私钥，然后在客户端导入私钥（切记保护好私钥）</p><ul><li><p>浏览器：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://snort.social/">https://snort.social/</a></p></li><li><p>ios：Damus</p></li><li><p>Android：Amethyst</p></li></ul></li><li><p>nostr账户设置一下用户名、头像等</p></li><li><p>创建一个支持闪电网络的钱包（切记保护好<code>lndhub wallet backup</code>）</p><ul><li><p>bluewallet：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://bluewallet.io/">https://bluewallet.io/</a></p></li><li><p>walletofsatoshi：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://walletofsatoshi.com/">https://walletofsatoshi.com/</a></p></li></ul></li><li><p>创建一个闪电地址（3和4可以在一个钱包，也可以不同钱包）</p><ul><li><p>lightningaddress集合：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://lightningaddress.com/">https://lightningaddress.com/</a> （暂时推荐walletofsatoshi，期待bluewallet支持此功能）</p></li><li><p>我目前策略是主用bluewallet，nostr的闪电地址暂时用walletofsatoshi，然后用nostrplebs的<code>NIP-05 ID</code>转发闪电地址。如果未来bluewallet能用闪电地址功能肯定会切换过去。这样收付款、打赏都在一个钱包，方便。或者等bolt12成熟后会替代闪电地址？</p></li></ul></li><li><p>从交易所提点比特币到钱包</p><ul><li><p>ok支持比特币闪电网络</p></li></ul></li><li><p>购买一个 <code>NIP-05 ID</code></p><ul><li><p>付费推荐：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostrplebs.com/">https://nostrplebs.com/</a></p></li><li><p>免费推荐：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nostr.directory/">https://nostr.directory/</a></p></li></ul></li><li><p>nostr账户设置 <code>NIP-05 ID</code>（替代公钥）</p><ul><li><p>将刚刚购买的 <code>NIP-05 ID</code>填到nostr账户设置的<code>NIP-05</code>里，替换公钥。别人通过这个域名就可以找到你</p></li></ul></li><li><p>nostr账户设置 <code>LN Address</code>（这是一个持续性的收款地址，主页里会显示这个长期闪电网络地址）</p><ul><li><p>将闪电地址填到nostr账户设置的<code>LN Address</code>里。</p></li><li><p>如果你<code>NIP-05</code>是购买的nostrplebs的服务，它提供一个转发功能，可以用你的<code>NIP-05 ID</code>链接到你的闪电地址。对外你的nostr id和闪电地址就统一了。强迫症患者的福音。<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.nostrplebs.com/hc/nostrplebs/en/setup-use/6">这是设置 Lightning 地址转发教程</a></p></li></ul></li><li><p>nostr发一个post，内容为<code>Lightning Invoice</code>（这是一个一次性的收款地址）。</p><ul><li><p>在闪电网络钱包里创建一个固定数额的<code>Lightning Invoice</code>，复制到nostr里，发一个post。有人打赏后你的钱包会收到比特币。</p></li></ul></li><li><p>多研究nostr生态应用</p><ul><li><p>国际象棋游戏：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://jesterui.github.io/">https://jesterui.github.io/</a></p></li><li><p>私密聊天室‌：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://sendstr.com/">https://sendstr.com/</a></p></li></ul></li></ol><h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">参考</h1><ul><li><p>nostr文档：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/nostr-protocol/nostr">https://github.com/nostr-protocol/nostr</a></p></li><li><p>nips：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/nostr-protocol/nips">https://github.com/nostr-protocol/nips</a></p></li><li><p>聊聊Nostr那些事：社交协议、去代币经济、监管与破圈：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://8btcnews.substack.com/p/nostr?r=14dl19&amp;utm_campaign=post&amp;utm_medium=email">https://8btcnews.substack.com/p/nostr?r=14dl19&amp;utm_campaign=post&amp;utm_medium=email</a></p></li><li><p>Nostr 协议详解（科普篇）：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://juejin.cn/post/7196290097548722233">https://juejin.cn/post/7196290097548722233</a></p></li><li><p>科普各地址：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/evilcos/status/1621380824867430400">https://twitter.com/evilcos/status/1621380824867430400</a></p></li><li><p>Nostr 爆火后，去中心化社交才刚刚开始：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/EvieEvieXia/status/1621824477339455489">https://twitter.com/EvieEvieXia/status/1621824477339455489</a></p></li><li><p>聊聊 nostr：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/AurtrianAjian/status/1604892353478942721?s=20&amp;t=QaVe_ENpk00K6G8bzpPR5w">https://twitter.com/AurtrianAjian/status/1604892353478942721?s=20&amp;t=QaVe_ENpk00K6G8bzpPR5w</a></p></li><li><p>Damus一出，Nostr能「杀」死Twitter吗？：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mirror.xyz/jeanchen.eth/nkOORLT96GxuuSBJ6pH0HQVovaiuY9kf7Pdi0ADMMO0">https://mirror.xyz/jeanchen.eth/nkOORLT96GxuuSBJ6pH0HQVovaiuY9kf7Pdi0ADMMO0</a></p></li><li><p>NostrPlebs帮助文档：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://help.nostrplebs.com/hc/nostrplebs/en">https://help.nostrplebs.com/hc/nostrplebs/en</a></p></li><li><p>深入解读闪电网络：探寻比特币支付通道的前世今生：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.odaily.site/post/5185000">http://www.odaily.site/post/5185000</a></p></li><li><p>闪电网络历史与现实：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.nfgyl.com/gbhq/9184.html">http://www.nfgyl.com/gbhq/9184.html</a></p></li><li><p>闪电网络简史：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.qklw.com/baike/20220723/256783.html">https://www.qklw.com/baike/20220723/256783.html</a></p></li><li><p>blots：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/lightning/bolts">https://github.com/lightning/bolts</a></p></li><li><p>blot11与blot12的对比：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/LN_Capital/status/1589321549894799360">https://twitter.com/LN_Capital/status/1589321549894799360</a></p></li><li><p>The Lightning Invoice：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.bolt11.org/">https://www.bolt11.org/</a></p></li><li><p>offer：Lightning 的原生体验，无处不在：<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://bolt12.org/">https://bolt12.org/</a></p></li></ul>]]></content:encoded>
            <author>gaohongxiang-2@newsletter.paragraph.com (gaohongxiang)</author>
        </item>
        <item>
            <title><![CDATA[2021投资复盘]]></title>
            <link>https://paragraph.com/@gaohongxiang-2/2021</link>
            <guid>ozNlUj9S4IabKtoxJk3K</guid>
            <pubDate>Wed, 16 Feb 2022 16:50:26 GMT</pubDate>
            <description><![CDATA[我是17年6月23号通过李笑来老师的通往财富自由之路了解到的区块链，那时候每天都兴致盎然，学习什么是区块链，什么是比特币，什么是以太坊，看老猫、白话区块链、金马的文章，金毛老师那会每天在李笑来老师的文章下面留言，特别佩服，后来，变成了大佬，而我，现在还是一个小白。 17年我也买了比特币、以太坊，受李笑来老师影响，除了当时1co热潮，搭进去一些，剩下的一直留到21年末，当然，因为本金实在太少，虽然收益率不错，但实际利润非常有限。 现在想来，最后悔的一件事就是18年熊市后就没有再关注币圈了，没有在耕耘的季节付出，导致这轮牛市没有果实可以收获。当时认知不够，觉得熊市没得玩，就没有参与，事实是这轮牛市暴富的大佬很多都是上轮熊市默默耕耘的。这是我经历过的最贵的认知。 一直在忙现实中的事，从21年3月才重新开始关注币圈，想起了金马老师，果断进了他的社群，后来又加入了老杨、远明的defi社群，那会参加币安打新、defi套利、cake ifo、coinlist打新、raydium打新等等活动，因为多少有之前的基础，又有正确的指引，学起来比较快，很快就上手。但还是因为本金实在少，只能跟着喝汤。于是...]]></description>
            <content:encoded><![CDATA[<p>我是17年6月23号通过李笑来老师的通往财富自由之路了解到的区块链，那时候每天都兴致盎然，学习什么是区块链，什么是比特币，什么是以太坊，看老猫、白话区块链、金马的文章，金毛老师那会每天在李笑来老师的文章下面留言，特别佩服，后来，变成了大佬，而我，现在还是一个小白。</p><p>17年我也买了比特币、以太坊，受李笑来老师影响，除了当时1co热潮，搭进去一些，剩下的一直留到21年末，当然，因为本金实在太少，虽然收益率不错，但实际利润非常有限。</p><p>现在想来，最后悔的一件事就是18年熊市后就没有再关注币圈了，没有在耕耘的季节付出，导致这轮牛市没有果实可以收获。当时认知不够，觉得熊市没得玩，就没有参与，事实是这轮牛市暴富的大佬很多都是上轮熊市默默耕耘的。这是我经历过的最贵的认知。</p><p>一直在忙现实中的事，从21年3月才重新开始关注币圈，想起了金马老师，果断进了他的社群，后来又加入了老杨、远明的defi社群，那会参加币安打新、defi套利、cake ifo、coinlist打新、raydium打新等等活动，因为多少有之前的基础，又有正确的指引，学起来比较快，很快就上手。但还是因为本金实在少，只能跟着喝汤。于是就各种搜集信息，想着抓住个机会能暴富，当时看公众号推一个矿叫htm，每天更新收益，心动了，还问了金马老师能不能参与，他说tvl小的都是土矿，不要参与，我当时鬼迷心窍， 没有听大佬的建议，还是冲了进去，然后就没有然后了，理所当然的被埋了。这件事给我的教训是千万不要看公众号投资！！！一个项目经过层层传递，到了公众号这个大众都接触到的媒介时，就是收割的时候了，我还想着赚钱，太蠢了。同样的逻辑还有免费群，里面发的东西大概率是找接盘侠的。</p><p>后来519，币圈沉寂了几个月。后来游戏爆发了，我9月份听说了一个游戏叫刀片，投入了一点还真赚钱了，一半复投一半利润，开始尝到了一些甜头，注意力集中在了游戏上，但很快，土狗游戏又开始横行，跟朋友一起玩了个叫龙珠的游戏，当时看别人一直在复投，fomo了，又一次被埋。这次的教训是投资千万不能被fomo情绪左右，切记机会有很多，钱是赚不完的，但可以亏完！本金比什么都重要！投资前一定要仔细研究项目，也就是做投研，这一点是急需提升的能力。加入了币圈科学家社群，学习大佬的投研能力。</p><p>当然，游戏目前为止还是赚钱的，侥幸遇到了raca，开蛋开出来了R，巅峰时期一个蛋值1000u，一天三四个蛋，美滋滋。拿利润又投了几个热度高的游戏，基本都死了，又强化一遍教训，不要fomo！！！投资前做投研！！！人真的是要被鞭打的遍体鳞伤才会付出行动改变。另一个新的教训是我发现我不会做止盈！还是贪念在左右我。当时一个R能卖30w，朋友劝我卖了，我还想等它再多涨一些再卖，期间还可以打蛋有收益。那个时候raca非常火，链游四大天王之一，已经是人声鼎沸了，而这个时期的链游我没有意识到还都是pz，这么高的利润得有多少新人来接。行话说买在无人问津时，卖在人声鼎沸处。说是会说，可真到了自己身上，却忘的干干净净。假认知不是认知！于是，没几天，巅峰不在，一路下滑，好在，项目方还是会玩的，及时转型，还有的救。现在就只能等元兽王国出来了。</p><p>对于nft，之前我一直认为是大佬的游戏，nft头像动辄几十万几百万的，不是我这种小散能玩的动的。而且nft流动性是一个很大的问题，热度不在了很容易咋手里，卖都卖不出。但不得不说，我还是带有偏见了，大佬有大佬的玩法，小散也有小散的玩法。有人通过肝白名单也赚了很多钱，抛开卷不说，这确实是个途径。非常有必要学习一下这一块的知识，于是，加入了焦波的nft社群。币圈投资不能有偏见，偏见都是跟钱过不去。</p><p>这一年的经历，我接触的圈子都比较正，没有乱七八糟的东西，更没有被骗过。我开始赚钱了，今年运气比较好吧，coinlist、raydiunm中了不少，另外游戏也赚了一些。也收获了一些经验教训。</p><p>总结一下经验教训</p><ul><li><p>熊市一定要耕耘，牛市才能收获。</p></li><li><p>不看公众号、免费群投资</p></li><li><p>保住本金，不要被fomo，多问一个为什么</p></li><li><p>投资前做投研</p></li><li><p>及时止盈！浮盈不是盈，放到口袋里的才是！</p></li><li><p>投资不能带偏见，偏见都是跟钱过不去。多学习为什么别人能通过这个赚钱</p></li></ul><p>其实我的教训别人也都经历过，也听别人总结过，但是，没自己亲身经历就没有链接感，就是当一个故事听了，经历才能成长。</p><p>李笑来说付费就是捡便宜，币圈让我见识到这个便宜有多大，高质量的付费社群能帮一个小白快速拉高认知，少走很多弯路。目前我加入了defi、游戏、nft的付费社群，跟大家一起成长一起赚钱！</p><p>目前我的策略是</p><ul><li><p>coinlist打新、dex打新、各交易所打新继续参与，nft白名单开始参与，这是以小搏大的好机会。</p></li><li><p>游戏、nft持续跟进</p></li><li><p>积累到越来越多的本金就放入defi中套利</p></li></ul>]]></content:encoded>
            <author>gaohongxiang-2@newsletter.paragraph.com (gaohongxiang)</author>
        </item>
    </channel>
</rss>