<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/rss/stylesheet/" type="text/xsl"?>
<rss xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:itunes='http://www.itunes.com/dtds/podcast-1.0.dtd' xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:podbridge='http://www.podbridge.com/podbridge-ad.dtd' version='2.0'>
<channel>
  <title>Test Channel</title>
  <language>en-us</language>
  <generator>microfeed.org</generator>
  <itunes:type>episodic</itunes:type>
  <itunes:explicit>false</itunes:explicit>
  <atom:link rel="self" href="https://mf-drktravis-dpdns-org.pages.dev/rss/" type="application/rss+xml"/>
  <link>https://mf-drktravis-dpdns-org.pages.dev</link>
  <description>
    <![CDATA[<p>a test channel</p>]]>
  </description>
  <itunes:author>lx</itunes:author>
  <itunes:image href="https://mf-drktravis-dpdns-org.pages.dev/assets/default/channel-image.png"/>
  <image>
    <title>Test Channel</title>
    <url>https://mf-drktravis-dpdns-org.pages.dev/assets/default/channel-image.png</url>
    <link>https://mf-drktravis-dpdns-org.pages.dev</link>
  </image>
  <copyright>©2025</copyright>
  <item>
    <title>socket</title>
    <guid>-Y-nUqC3Ni1</guid>
    <pubDate>Mon, 27 Oct 2025 01:15:49 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<h3>socket 服务端</h3><pre class="ql-syntax" spellcheck="false"># threaded_server.py
import Lib.debug.log
import socket, threading
import json
import struct


class SocketServer:
&nbsp; &nbsp; HOST, PORT, BUFSIZE = '0.0.0.0', 5000, 1024 * 32
&nbsp; &nbsp; 
&nbsp; &nbsp; def __init__(self) -&gt; None:
&nbsp; &nbsp; &nbsp; &nbsp; self.handle = socket.socket()
&nbsp; &nbsp; &nbsp; &nbsp; self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
&nbsp; &nbsp; &nbsp; &nbsp; self.handle.bind((self.HOST, self.PORT))
&nbsp; &nbsp; &nbsp; &nbsp; self.handle.listen(5)
&nbsp; &nbsp; 
&nbsp; &nbsp; def start(self):
&nbsp; &nbsp; &nbsp; &nbsp; print(r'[*] Listening %s:%s' % (self.HOST, self.PORT))
&nbsp; &nbsp; &nbsp; &nbsp; while True:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('wait connection...')
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection, (ip, port) = self.handle.accept()
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; threading.Thread(target=self.handle_client, args=(connection, ip, port), daemon=True).start()


&nbsp; &nbsp; def handle_client(self, connection: socket.socket, ip: str, port: int):
&nbsp; &nbsp; &nbsp; &nbsp; ip_port = '%s:%s' % (ip, port)
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; with connection:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[-] Connected: (%s, %s)' % (ip, port))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while True:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[%s] wait message...' % (ip_port))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n, = struct.unpack('!I', connection.recv(4))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # data = connection.recv(n)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(n)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a, b = n / self.BUFSIZE, n % self.BUFSIZE
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(a, b)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a, b = int(a), int(b)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = b''
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for i in range(a):
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print('%s/%s' % (i+1, a))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data += connection.recv(self.BUFSIZE)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data += connection.recv(b)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # data = connection.recv(self.BUFSIZE)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[%s] get message!' % (ip_port))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(data)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print('[%s] %s' % (ip_port, data))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # hex_str = ''.join([r'\x%02x' % v for v in data])
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print('[%s] %s' % (ip_port, hex_str))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # obj = json.loads(data.decode('utf-8'))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(obj)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(len(data))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # with open(r'E:\work\202502\20250206-07\fm58-li-gz05\fm58-li-gz05-far\RotarySys\Ctrl\sd.iso', 'wb') as f:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # &nbsp; &nbsp; f.write(data)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if not data:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection.sendall(data) &nbsp; # 回显
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[-] Disconnected: (%s, %s)' % (ip, port))


if __name__ == '__main__':
&nbsp; &nbsp; SocketServer().start()

</pre><h3>socket 客户端</h3><p><br></p><pre class="ql-syntax" spellcheck="false">import socket
import struct
client = socket.socket()
client.connect(('localhost', 5000))



def send_all(soc: socket.socket, data: bytes):
&nbsp; &nbsp; """
&nbsp; &nbsp; 传输的数据格式定义为：数据头(4字节) + 数据本体
&nbsp; &nbsp; - 数据头：表示数据本体的长度(单位为字节)，如：b`\x00\x00\x00\x07f` 表示数据本体长度是 127字节 (总共就需要发送 131字节)
&nbsp; &nbsp; - 数据本体：需要发送的数据
&nbsp; &nbsp; 注：4字节能表示 2^32个无符号整数，即上述定义能表示约 4TB 的传输数据
&nbsp; &nbsp; """
&nbsp; &nbsp; len_bytes = struct.pack('!I', len(data))
&nbsp; &nbsp; # print(data)
&nbsp; &nbsp; print(len(data))
&nbsp; &nbsp; soc.sendall(len_bytes + data)



# send_all(client, open(r'E:\work\202502\20250206-07\fm58-li-gz05\fm58-li-gz05-far\RotarySys\Ctrl\fileviewer.exe', 'rb').read())


send_all(client, b'hello world')
send_all(client, '你干嘛'.encode('utf-8'))



import time; time.sleep(1)
</pre>]]>
    </description>
    <link>https://mf.drktravis.dpdns.org/i/socket--Y-nUqC3Ni1/</link>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
  <item>
    <title>microfeed</title>
    <guid>-ShBwcUhU8T</guid>
    <pubDate>Mon, 06 Oct 2025 08:43:43 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<p><br></p><p><a href="https://www.microfeed.org/" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/207514210-99ddbd03-f8f0-410a-96c8-80da1afb804d.png"></a></p><p><br></p><h1>Microfeed：Cloudflare 上的轻量级 CMS 自托管</h1><p><br></p><p><a href="https://github.com/microfeed/microfeed/issues/new?assignees=&amp;labels=bug" rel="noopener noreferrer" target="_blank">报告错误</a>&nbsp;·<a href="https://github.com/microfeed/microfeed/discussions/new?category=ideas" rel="noopener noreferrer" target="_blank">请求功能</a>&nbsp;·<a href="mailto:support@microfeed.org" rel="noopener noreferrer" target="_blank">私下给我们发电子邮件</a></p><p>欢迎使用 microfeed，这是一个在 Cloudflare 上自托管的轻量级内容管理系统 （CMS）。 使用微源，您可以轻松发布各种内容，例如音频、视频、照片、文档、博客文章、 以及 Web、RSS 和 JSON 形式的源的外部 URL。对于精通技术的个人来说，这是一个完美的解决方案： 想要自行托管自己的 CMS，而无需运行自己的服务器。</p><p>microfeed 由&nbsp;<a href="https://www.listennotes.com/" rel="noopener noreferrer" target="_blank">Listen Notes</a>&nbsp;构建，托管在 Cloudflare 的&nbsp;<a href="https://pages.cloudflare.com/" rel="noopener noreferrer" target="_blank">Pages</a>、<a href="https://www.cloudflare.com/products/r2/" rel="noopener noreferrer" target="_blank">R2</a>、<a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer" target="_blank">D1</a>&nbsp;和&nbsp;<a href="https://www.cloudflare.com/products/zero-trust/" rel="noopener noreferrer" target="_blank">Zero Trust</a>&nbsp;上。</p><p>如果您有任何问题或反馈，请随时通过&nbsp;<a href="mailto:support@microfeed.org" rel="noopener noreferrer" target="_blank">support@microfeed.org</a>&nbsp;与我们联系。我们很乐意听取您的意见！</p><h2>📚 目录</h2><p><br></p><p><a href="https://github.com/microfeed/microfeed/actions/workflows/deploy.yml" rel="noopener noreferrer" target="_blank"><img src="https://github.com/microfeed/microfeed/actions/workflows/deploy.yml/badge.svg"></a>&nbsp;<a href="https://github.com/microfeed/microfeed/actions/workflows/ci.yml" rel="noopener noreferrer" target="_blank"><img src="https://github.com/microfeed/microfeed/actions/workflows/ci.yml/badge.svg"></a>&nbsp;<a href="mailto:support@microfeed.org" rel="noopener noreferrer" target="_blank"><img src="https://camo.githubusercontent.com/712a03a3128f64547e03e632d0074e35ea95e02678e2066ae715f92115d5e428/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f456d61696c2d737570706f72742534306d6963726f666565642e6f72672d626c7565"></a>&nbsp;<a href="https://www.microfeed.org/i/introducing-microfeed-self-hosted-cms-on-cloudflare-opensource-serverless-free-uhbQEmArlC2/" rel="noopener noreferrer" target="_blank"><img src="https://camo.githubusercontent.com/ff40d4c433cd608db7b0c7ed2b0831746c4274d81df9fc2f89059fa621e482f4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73746162696c6974792d616c7068612d6634643033662e737667"></a></p><ul><li><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#%EF%B8%8F-how-it-works" rel="noopener noreferrer" target="_blank">⭐️ 运作方式</a></li><li><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-installation" rel="noopener noreferrer" target="_blank">🚀 安装</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#prerequisites" rel="noopener noreferrer" target="_blank">先决条件</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#step-1-fork-the-microfeed-repo-to-your-github" rel="noopener noreferrer" target="_blank">步骤 1.将微源存储库分叉到 GitHub</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#step-2-put-some-secrets-on-your-forked-repo" rel="noopener noreferrer" target="_blank">步骤 2.在分叉的存储库上放一些秘密</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#step-3-run-github-action-to-deploy-code" rel="noopener noreferrer" target="_blank">步骤 3.运行 GitHub Action 以部署代码</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#step-4-make-a-few-clicks-on-cloudflare-dashboard" rel="noopener noreferrer" target="_blank">步骤 4.在 Cloudflare 仪表板上点击几下</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#step-5-done-start-publishing" rel="noopener noreferrer" target="_blank">步骤 5.做。开始发布</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#bonus-update-to-the-latest-version-of-microfeed" rel="noopener noreferrer" target="_blank">奖金。更新到最新版本的微进纸</a></li><li><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-faqs" rel="noopener noreferrer" target="_blank">💻 常见问题</a></li><li><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-contributions" rel="noopener noreferrer" target="_blank">💪 贡献</a></li><li class="ql-indent-1"><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#run-microfeed-on-local" rel="noopener noreferrer" target="_blank">在本地运行微源</a></li><li><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#%EF%B8%8F-license" rel="noopener noreferrer" target="_blank">🛡️ 许可证</a></li></ul><h2>⭐️ 运作方式</h2><p><br></p><p>自 1990 年代以来，网络的很大一部分都是由提要驱动的。 人员（和机器人）将项目发布到源，其他人可以订阅该源以接收新内容。</p><p>微提要使个人可以轻松地在 Cloudflare 上自行托管自己的提要，包括但不限于</p><ul><li>音频的播客提要</li><li>帖子的博客提要</li><li>类似 Instagram 的图片提要（例如，<a href="https://llamacorn.listennotes.com/" rel="noopener noreferrer" target="_blank">llamacorn.listennotes.com</a>&nbsp;<a href="https://brand-assets.listennotes.com/" rel="noopener noreferrer" target="_blank">brand-assets.listennotes.com</a>)</li><li>类似 YouTube 的视频提要</li><li>带有自定义链接（例如&nbsp;<a href="https://www.wenbin.org/" rel="noopener noreferrer" target="_blank">wenbin.org</a>)</li><li>外部新闻文章 URL 的内容管理源</li><li>提供更新和新闻报道的营销网站（例如&nbsp;<a href="https://www.microfeed.org/" rel="noopener noreferrer" target="_blank">microfeed.org</a>)</li><li>带有 GUI 仪表板和公共 json 提要的无头 cms（例如，在&nbsp;<a href="https://www.microfeed.org/json/openapi.yaml" rel="noopener noreferrer" target="_blank">YAML</a>&nbsp;和&nbsp;<a href="https://www.microfeed.org/json/openapi.html" rel="noopener noreferrer" target="_blank">HTML</a>&nbsp;中带有 OpenAPI 规范的&nbsp;<a href="https://www.microfeed.org/json/" rel="noopener noreferrer" target="_blank">microfeed.org/json</a>)</li><li>待售域名列表（例如，<a href="https://www.listenhost.com/" rel="noopener noreferrer" target="_blank">ListenHost.com</a>...</li><li>整本书的网站（例如，<a href="https://the-art-of-war.microfeed.org/" rel="noopener noreferrer" target="_blank">《孙子兵法》</a>)</li><li>更新日志网站（例如，<a href="https://changelog.listennotes.com/" rel="noopener noreferrer" target="_blank">changelog.listennotes.com</a>)</li><li>...</li></ul><p>microfeed 使用 Cloudflare&nbsp;<a href="https://pages.cloudflare.com/" rel="noopener noreferrer" target="_blank">Pages</a>&nbsp;托管和运行代码，<a href="https://www.cloudflare.com/products/r2/" rel="noopener noreferrer" target="_blank">R2</a>&nbsp;托管和提供媒体文件，<a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer" target="_blank">D1</a>&nbsp;存储元数据，和&nbsp;<a href="https://www.cloudflare.com/products/zero-trust/" rel="noopener noreferrer" target="_blank">Zero Trust</a>&nbsp;提供对管理仪表板的登录信息。Cloudflare 提供非常慷慨的免费使用配额，使其成为个人或小型企业使用的经济实惠的解决方案。虽然您仍然需要为域名付费，但在 Cloudflare 上托管微源基本上是免费的。</p><p>使用微源，您可以发布各种内容，例如音频、视频、照片、文档、博客文章、 以及可自定义网站、RSS 提要和&nbsp;<a href="https://www.jsonfeed.org/" rel="noopener noreferrer" target="_blank">JSON 提要</a>的外部 URL。 查看微进料的一些实际示例：</p><ul><li>网络提要：<a href="https://llamacorn.listennotes.com/" rel="noopener noreferrer" target="_blank">https://llamacorn.listennotes.com/</a></li><li>RSS 提要：<a href="https://llamacorn.listennotes.com/rss/" rel="noopener noreferrer" target="_blank">https://llamacorn.listennotes.com/rss/</a></li><li>Json 提要：<a href="https://llamacorn.listennotes.com/json/" rel="noopener noreferrer" target="_blank">https://llamacorn.listennotes.com/json/</a></li></ul><p>Microfeed 提供了一个简单而强大的管理仪表板，可以轻松地将项目添加到 Feed， 上传媒体文件，并自定义网页样式。如果您以前使用过 WordPress，您会发现它很熟悉。</p><p><a href="https://user-images.githubusercontent.com/1719237/209486588-00acefe0-dd51-4bfc-aed7-1f63850aa720.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/209486588-00acefe0-dd51-4bfc-aed7-1f63850aa720.png"></a></p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h2>🚀 安装</h2><p><br></p><p>大致上，您将按照以下步骤将微源实例安装到 Cloudflare：</p><ol><li>将<a href="https://github.com/microfeed/microfeed" rel="noopener noreferrer" target="_blank">微源存储库</a>分支到个人（或组织）GitHub 帐户。</li><li>获取 Cloudflare API 令牌，并将其作为机密保存在分叉的 GitHub 存储库中。</li><li>使用分支存储库中的预定义 GitHub Action，使用步骤 2 中的密钥将代码部署到 Cloudflare Pages。</li><li>在 Cloudflare 的仪表板上单击几下即可设置自定义域并配置一些安全设置。</li><li>做。开始发布！</li></ol><blockquote>我们知道并不是每个人都喜欢阅读文档，因此我们尽可能简单地阅读文档 开始使用 Microfeed。但是，我们希望看到 Cloudflare 实现“使用 Cloudflare 登录”OAuth 功能， 这将允许几乎一键部署微进纸。与此同时，我们尝试进行设置过程 对于精通技术的用户来说，尽可能简单。</blockquote><h3>先决条件</h3><p><br></p><ul><li>拥有 Cloudflare 帐户。如果您还没有，可以在&nbsp;<a href="https://dash.cloudflare.com/sign-up" rel="noopener noreferrer" target="_blank">Cloudflare.com 免费注册</a>。</li><li>拥有 GitHub 帐户。如果您没有，可以在&nbsp;<a href="https://github.com/signup" rel="noopener noreferrer" target="_blank">GitHub.com 免费注册</a>。</li></ul><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回目录</a></p><h3>步骤 1.将微源存储库分叉到 GitHub</h3><p><br></p><p>只需单击&nbsp;<a href="https://github.com/microfeed/microfeed/fork" rel="noopener noreferrer" target="_blank">https://github.com/microfeed/microfeed/fork</a>&nbsp;即可分叉存储库。</p><p>将来可以选择修改分叉存储库中的代码，但可能不需要修改 完全触摸代码。只需分叉存储库并保持同步以备将来使用。</p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h3>步骤 2.在分叉的存储库上放一些秘密</h3><p><br></p><p>转到分叉存储库的设置&nbsp;<a href="https://github.com/microfeed/microfeed/settings/secrets/actions" rel="noopener noreferrer" target="_blank">-&gt; 密钥 -&gt;作</a>，并创建 5 个密钥（点击了解更多详细信息）。 有了这些密钥，您就可以使用 GitHub Actions 将微源实例部署到 Cloudflare Pages。</p><p>CLOUDFLARE_ACCOUNT_ID</p><p>您可以从仪表板的 URL 获取您的 cloudflare 帐户 ID：</p><p><a href="https://dash.cloudflare.com/login?lang=en-US" rel="noopener noreferrer" target="_blank">登录 Cloudflare 帐户</a>后，您将被重定向到如下 URL</p><pre class="ql-syntax" spellcheck="false">https://dash.cloudflare.com/[your-cloudflare-account-id-here]
</pre><p><br></p><p>URL 的最后一部分是您的 cloudflare 帐户 ID。</p><p>例如，如果您看到如下网址：</p><pre class="ql-syntax" spellcheck="false">https://dash.cloudflare.com/fff88980eeeeedcc3ffffd4f555f4999
</pre><p><br></p><p>然后，您将CLOUDFLARE_ACCOUNT_ID设置为&nbsp;fff88980eeeeedcc3ffffd4f555f4999：</p><p><a href="https://user-images.githubusercontent.com/1719237/208216752-56f00f51-29cb-43ea-b720-75244719898d.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/208216752-56f00f51-29cb-43ea-b720-75244719898d.png"></a></p><p>CLOUDFLARE_API_TOKEN</p><p>您需要在此处创建一个 API 令牌：<a href="https://dash.cloudflare.com/profile/api-tokens" rel="noopener noreferrer" target="_blank">https://dash.cloudflare.com/profile/api-tokens</a></p><p>创建自定义令牌：</p><p><a href="https://user-images.githubusercontent.com/1719237/205525627-14da54ae-1733-4db5-b65d-94f5ec48f360.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205525627-14da54ae-1733-4db5-b65d-94f5ec48f360.png"></a></p><p>我们需要 Cloudflare Pages 和 D1 的编辑权限：</p><p><a href="https://user-images.githubusercontent.com/1719237/205525675-4c8a6bce-21a8-45e3-bf0c-28981f123da3.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205525675-4c8a6bce-21a8-45e3-bf0c-28981f123da3.png"></a></p><p>最后，将 API 令牌复制到此处：</p><p><a href="https://user-images.githubusercontent.com/1719237/205525785-6fed8e49-7342-4b36-9d07-348e1c28cbcc.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205525785-6fed8e49-7342-4b36-9d07-348e1c28cbcc.png"></a></p><p>R2_ACCESS_KEY_ID和R2_SECRET_ACCESS_KEY</p><p>转到您的&nbsp;<a href="https://dash.cloudflare.com/sign-up/r2" rel="noopener noreferrer" target="_blank">R2 仪表板页面</a>。您可能需要先将信用卡放在那里。除非您的使用量超过非常慷慨的免费配额限制（即 10GB 存储 + 1000 万次读取/月 + 100 万次写入/月），否则您无需付费。</p><p>在此处创建 R2 API 令牌：</p><p><a href="https://user-images.githubusercontent.com/1719237/205526381-cc11d4fe-b053-49d0-9072-de54db31b3b7.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205526381-cc11d4fe-b053-49d0-9072-de54db31b3b7.png"></a></p><p>选择“管理员读写”权限并创建 API 令牌：</p><p><a href="https://private-user-images.githubusercontent.com/1719237/259258288-1a90df29-5660-49d4-b66a-24873812492d.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTk3MjgwMzUsIm5iZiI6MTc1OTcyNzczNSwicGF0aCI6Ii8xNzE5MjM3LzI1OTI1ODI4OC0xYTkwZGYyOS01NjYwLTQ5ZDQtYjY2YS0yNDg3MzgxMjQ5MmQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MTAwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTEwMDZUMDUxNTM1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWRmYThiODYzMGI0NWFlY2JhMjg5OTVlY2IyN2VjOTFlNDRkZWU1YTg1Y2FmMDc1OWViODRlZTgyYmUwNWM0YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.MEtwqpPLYlZrm0H9uKJZPlXYAZLbWY1yj_p8wFv8W10" rel="noopener noreferrer" target="_blank"><img src="https://private-user-images.githubusercontent.com/1719237/259258288-1a90df29-5660-49d4-b66a-24873812492d.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTk3MjgwMzUsIm5iZiI6MTc1OTcyNzczNSwicGF0aCI6Ii8xNzE5MjM3LzI1OTI1ODI4OC0xYTkwZGYyOS01NjYwLTQ5ZDQtYjY2YS0yNDg3MzgxMjQ5MmQucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MTAwNiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTEwMDZUMDUxNTM1WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MWRmYThiODYzMGI0NWFlY2JhMjg5OTVlY2IyN2VjOTFlNDRkZWU1YTg1Y2FmMDc1OWViODRlZTgyYmUwNWM0YSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.MEtwqpPLYlZrm0H9uKJZPlXYAZLbWY1yj_p8wFv8W10"></a></p><p>复制R2_ACCESS_KEY_ID的访问密钥 ID，复制R2_SECRET_ACCESS_KEY的密钥<a href="https://user-images.githubusercontent.com/1719237/205526582-92f440ac-21c4-46d9-a065-cfc1937391c8.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205526582-92f440ac-21c4-46d9-a065-cfc1937391c8.png"></a></p><p>CLOUDFLARE_PROJECT_NAME</p><p>合法的项目名称应包含以下字符：[a-z]、[A-Z]、[0-9] 和 -</p><p>我们建议使用您将用于此项目的自定义域名，并将点 （.） 替换为短划线 （-）</p><p>例如，如果您使用 photos.mycustomdomain.com，则项目名称应为 photos-mycustomdomain-com</p><p>注意：请勿在 [a-z]、[A-Z]、[0-9] 和 - 之外使用下划线 （_）、空格 （ ） 和其他字符。或者 Cloudflare Pages 不允许您创建项目。</p><p>总共需要为 GitHub Actions 添加 5 个机密：</p><p><a href="https://user-images.githubusercontent.com/1719237/205524410-268abf92-af61-467a-8883-78b8d4de3c56.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205524410-268abf92-af61-467a-8883-78b8d4de3c56.png"></a></p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h3>步骤 3.运行 GitHub Action 以部署代码</h3><p><br></p><p>转到&nbsp;<a href="https://github.com/microfeed/microfeed/actions/workflows/deploy.yml" rel="noopener noreferrer" target="_blank">Actions -&gt; Deploy to Cloudflare Pages</a>&nbsp;并运行 Workflow</p><p><a href="https://user-images.githubusercontent.com/1719237/205526856-05ea0ff4-703a-4d08-bc7f-4ae2dfc07cfe.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205526856-05ea0ff4-703a-4d08-bc7f-4ae2dfc07cfe.png"></a></p><p>如果看到绿色复选标记，则部署成功。您可以在&nbsp;<a href="https://dash.cloudflare.com/sign-up/pages" rel="noopener noreferrer" target="_blank">Cloudflare 仪表板</a>中看到一个 Pages 项目：</p><p><a href="https://user-images.githubusercontent.com/1719237/205527141-277620dd-586b-42dd-be97-edb7875d0705.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/205527141-277620dd-586b-42dd-be97-edb7875d0705.png"></a></p><p>您可以通过 ${CLOUDFLARE_PROJECT_NAME}.pages.dev 访问该站点，例如&nbsp;<a href="https://microfeed-org.pages.dev/" rel="noopener noreferrer" target="_blank">https://microfeed-org.pages.dev/</a></p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h3>步骤 4.在 Cloudflare 仪表板上点击几下</h3><p><br></p><p>要管理您的微源实例，您将使用 ${CLOUDFLARE_PROJECT_NAME}.pages.dev/admin 的管理仪表板，例如&nbsp;<a href="https://microfeed-org.pages.dev/admin/" rel="noopener noreferrer" target="_blank">https://microfeed-org.pages.dev/admin/</a>（管理仪表板需要受 Cloudflare Zero Trust 保护）。</p><p>首次访问管理仪表板时，您将按照清单完成设置过程：</p><p><a href="https://user-images.githubusercontent.com/1719237/208216864-38a65086-77ef-4595-bc05-c87be2676e6d.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/208216864-38a65086-77ef-4595-bc05-c87be2676e6d.png"></a></p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h3>步骤 5.做。开始发布</h3><p><br></p><p>完成设置过程后，您的微馈送实例就可以使用了。 您可以从管理仪表板添加、更新或删除项目。</p><p>您还可以在设置/自定义代码中通过编辑原始 HTML 和 CSS 来自定义网站的外观：</p><p><a href="https://user-images.githubusercontent.com/1719237/210062910-e56135f6-557e-419e-a00d-b25dd391c93d.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/210062910-e56135f6-557e-419e-a00d-b25dd391c93d.png"></a></p><p>HTML 代码使用&nbsp;<a href="https://github.com/janl/mustache.js" rel="noopener noreferrer" target="_blank">mustache.js</a>&nbsp;作为模板语言，您可以在其中访问 Feed Json 或 Item Json 中的变量。例如，在我们的营销网站&nbsp;<a href="https://www.microfeed.org/" rel="noopener noreferrer" target="_blank">microfeed.org</a>&nbsp;的主页 （Feed Web） 上，我们使用&nbsp;<a href="https://www.microfeed.org/json/" rel="noopener noreferrer" target="_blank">microfeed.org/json/</a>&nbsp;的 html 代码中的变量，而在<a href="https://www.microfeed.org/i/introducing-microfeed-a-self-hosted-open-source-cms-on-cloudflare-open-alpha-uhbQEmArlC2/" rel="noopener noreferrer" target="_blank">商品的页面</a>&nbsp;（Item Web） 上，我们使用&nbsp;<a href="https://www.microfeed.org/i/introducing-microfeed-a-self-hosted-open-source-cms-on-cloudflare-open-alpha-uhbQEmArlC2/json" rel="noopener noreferrer" target="_blank">${item_url}/json</a>&nbsp;中的变量。</p><p>通过轻松访问微源实例的 json 数据（即&nbsp;<a href="https://www.microfeed.org/json/" rel="noopener noreferrer" target="_blank">Feed Json</a>&nbsp;和&nbsp;<a href="https://www.microfeed.org/i/introducing-microfeed-a-self-hosted-open-source-cms-on-cloudflare-open-alpha-uhbQEmArlC2/json" rel="noopener noreferrer" target="_blank">Item Json</a>），您可以将其用作无头 CMS 并构建自己的客户端应用程序来显示内容。</p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h3>奖金。更新到最新版本的微进纸</h3><p><br></p><p>我们将继续在此微源存储库中添加新功能并修复错误。 您可能希望使用新代码更新分叉存储库。</p><p>首先，在分叉的存储库中同步代码：</p><p><a href="https://user-images.githubusercontent.com/1719237/209483973-c82e7808-0d21-4aad-ac2d-c4e80da691bc.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/209483973-c82e7808-0d21-4aad-ac2d-c4e80da691bc.png"></a></p><p>然后转到&nbsp;<a href="https://github.com/microfeed/microfeed/actions/workflows/deploy.yml" rel="noopener noreferrer" target="_blank">Actions -&gt; Deploy to Cloudflare Pages</a>&nbsp;并运行 Workflow 以部署新代码。</p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h2>💻 常见问题</h2><p><br></p><p>如何跟踪播客/视频/图像下载？</p><p>要使用微提要跟踪播客、视频或图像下载，您可以使用跟踪 URL 功能。 这允许您为媒体文件设置第三方跟踪 URL，例如&nbsp;<a href="https://op3.dev/" rel="noopener noreferrer" target="_blank">OP3</a>、<a href="http://analytics.podtrac.com/" rel="noopener noreferrer" target="_blank">Podtrac</a>&nbsp;提供的 URL...</p><p>要设置跟踪 URL，您需要转到设置/跟踪 URL：<a href="https://user-images.githubusercontent.com/1719237/210665674-39f9b0a9-1f28-4608-b0cd-c67b8a5c87ec.png" rel="noopener noreferrer" target="_blank"><img src="https://user-images.githubusercontent.com/1719237/210665674-39f9b0a9-1f28-4608-b0cd-c67b8a5c87ec.png"></a></p><p>从那里，您可以添加要使用的第三方跟踪 URL。microfeed 会自动将这些 URL 添加到媒体文件的 URL 前面，以便您跟踪下载统计信息。</p><p>这是<a href="https://lowerstreet.co/blog/podcast-tracking" rel="noopener noreferrer" target="_blank">播客行业的常见做法</a>，可以成为监控内容表现并了解受众如何消费内容的有用方法。</p><p>为什么选择 Cloudflare？相信一家营利性公司不是很危险吗？</p><p>许多个人和组织信任并使用 Cloudflare 的服务，因为它在提供可靠和有效的服务方面享有盛誉。 我们（<a href="https://www.listennotes.com/" rel="noopener noreferrer" target="_blank">Listen Notes</a>）多年来一直在使用 Cloudflare。</p><p>在像 Cloudflare 这样的一站式平台上管理所有事情非常方便（例如 DNS、缓存、防火墙、运行代码、CDN、无需信任的登录......</p><p>微进纸仍处于开放 alpha 阶段。Cloudflare 是我们支持的第一个平台。 我们可能会考虑支持其他无服务器平台，以便您可以在需要时轻松迁移离开。</p><p>如果 Cloudflare 取消了我的 microfeed 实例的平台怎么办？</p><p>请务必仔细查看您使用的任何服务（包括 Cloudflare）的服务条款。 如果您违反服务条款，服务可能会采取行动，例如将您的实例去平台化。</p><p>为了防止被去平台化的可能性，最好定期从 Cloudflare 备份您的数据。 这将允许您恢复内容，并在必要时将它们迁移到其他平台。 使用您自己的自定义域也是一个好主意，因为这将使您能够更好地控制您的内容，并在需要时更轻松地将数据移动到不同的平台。</p><p>为什么要使用微进纸？</p><p>如果您已经在使用 Cloudflare 并且对其服务感到满意，那么使用 microfeed 可能是您的不错选择。</p><p>如果您不想管理自己的服务器，微源可能是一个方便的替代方案，可以让您利用 Cloudflare 的基础设施和安全功能。</p><p>如果您不想为服务器付费，microfeed 可能是一种经济高效的解决方案，因为 Cloudflare 提供了慷慨的免费使用配额。</p><p>如果您正在寻找新的东西并且有兴趣探索不同的选择，微馈送可能是一个不错的选择。在使用任何服务之前仔细评估它总是一个好主意，以确保它满足您的需求并且非常适合您的用例。</p><p>如何从 microfeed / Cloudflare 下载/备份数据？</p><p>microfeed 将数据存储在 Cloudflare D1 和 R2 中。因此，您将下载两个内容来备份您的微源数据：</p><ul><li>来自&nbsp;<a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer" target="_blank">Cloudflare D1</a>&nbsp;的 sqlite 数据库，包括所有元数据。</li><li>来自&nbsp;<a href="https://developers.cloudflare.com/r2/" rel="noopener noreferrer" target="_blank">Cloudflare R2</a>&nbsp;的媒体文件，包括音频、图像、视频......</li></ul><p>如何从 D1 下载 sqlite 数据库？</p><p>您可以使用命令行工具查找 sqlite 数据库文件并下载备份：wrangler</p><p><a href="https://developers.cloudflare.com/workers/wrangler/commands/#d1" rel="noopener noreferrer" target="_blank">https://developers.cloudflare.com/workers/wrangler/commands/#d1</a></p><p>如何从 R2 下载媒体文件？</p><p>截至 2023 年 2 月 16 日，Cloudflare 尚未提供从 R2 存储桶批量下载所有文件的工具。</p><p>您可能需要编写脚本以使用<a href="https://developers.cloudflare.com/r2/data-access/s3-api/api/" rel="noopener noreferrer" target="_blank">与 S3 兼容的 API</a>&nbsp;从特定 R2 存储桶中获取所有对象。</p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h2>💪 贡献</h2><p><br></p><p>我们欢迎对 microfeed 做出贡献！如果你对新功能有想法或发现错误，请在存储库中<a href="https://github.com/microfeed/microfeed/issues/new" rel="noopener noreferrer" target="_blank">打开一个问题</a>。如果你想提交修复或新功能，请创建一个拉取请求，其中包含你的更改的详细描述。</p><h3>在本地运行微源</h3><p><br></p><p>先决条件：节点/npm、yarn 和 wrangler</p><p>首先，在 microfeed 的根目录（与此 README.md 文件同一级别）创建一个 .vars.toml 文件，并将 5 个密钥放入 .vars.toml 文件中（类似于<a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#step-2-put-some-secrets-on-your-forked-repo" rel="noopener noreferrer" target="_blank">步骤 2。将一些密钥放在你的分叉存储库中</a>）：</p><pre class="ql-syntax" spellcheck="false"># .vars.toml
CLOUDFLARE_PROJECT_NAME = "your-project-org"
CLOUDFLARE_ACCOUNT_ID = "account id"
CLOUDFLARE_API_TOKEN = 'api token'
R2_ACCESS_KEY_ID = "access key"
R2_SECRET_ACCESS_KEY = "secret key"

R2_PUBLIC_BUCKET = "your-r2-bucket-name"
</pre><p><br></p><p>其次，运行本地开发服务器：</p><pre class="ql-syntax" spellcheck="false">yarn dev
</pre><p><br></p><p>您应该能够通过&nbsp;<a href="http://127.0.0.1:8788/" rel="noopener noreferrer" target="_blank">http://127.0.0.1:8788/</a>&nbsp;访问本地微馈送实例。</p><p>yarn dev&nbsp;是如何工作的？本质上，它同时运行两个进程：和 。该进程启动用于<a href="https://webpack.js.org/configuration/dev-server/" rel="noopener noreferrer" target="_blank">客户端 JavaScript 代码的 webpack DevServer</a>，同时启动&nbsp;<a href="https://developers.cloudflare.com/pages/functions/local-development/" rel="noopener noreferrer" target="_blank">Wrangler 来提供 Pages（边缘）代码</a>。yarn dev:clientyarn dev:edgeyarn dev:clientyarn dev:edge</p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h2>🛡️ 许可证</h2><p><br></p><p>microfeed 根据&nbsp;<a href="https://github.com/microfeed/microfeed/blob/main/LICENSE" rel="noopener noreferrer" target="_blank">AGPL-3.0</a>&nbsp;许可证获得许可。有关更多信息，请参阅&nbsp;<a href="https://github.com/microfeed/microfeed/blob/main/LICENSE" rel="noopener noreferrer" target="_blank">LICENSE 文件</a>。</p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#-table-of-contents" rel="noopener noreferrer" target="_blank">返回📚目录</a></p><h2>大约</h2><p>Cloudflare 上自托管的轻量级 CMS，用于播客、博客、照片、视频、文档和精选 URL。</p><p><br></p><p><a href="https://www.microfeed.org/" rel="noopener noreferrer" target="_blank">www.microfeed.org/</a></p><h3>主题</h3><p><a href="https://github.com/topics/cms" rel="noopener noreferrer" target="_blank">CMS系统</a>&nbsp;<a href="https://github.com/topics/serverless" rel="noopener noreferrer" target="_blank">无服务器</a>&nbsp;<a href="https://github.com/topics/cloudflare" rel="noopener noreferrer" target="_blank">Cloudflare</a>&nbsp;<a href="https://github.com/topics/cloudflare-pages" rel="noopener noreferrer" target="_blank">云耀斑页面</a>&nbsp;<a href="https://github.com/topics/cloudflare-r2" rel="noopener noreferrer" target="_blank">Cloudflare-R2 的</a>&nbsp;<a href="https://github.com/topics/cloudflare-zero-trust" rel="noopener noreferrer" target="_blank">Cloudflare-零信任</a>&nbsp;<a href="https://github.com/topics/cloudflare-d1" rel="noopener noreferrer" target="_blank">Cloudflare-D1</a>&nbsp;<a href="https://github.com/topics/podcast-host" rel="noopener noreferrer" target="_blank">播客主持人</a></p><h3>资源</h3><p><br></p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#readme-ov-file" rel="noopener noreferrer" target="_blank">自述文件</a></p><h3>许可证</h3><p><br></p><p><br></p><p><a href="https://github.com/microfeed/microfeed?tab=readme-ov-file#AGPL-3.0-1-ov-file" rel="noopener noreferrer" target="_blank">AGPL-3.0 许可证</a></p><p><br></p><p><br></p><p><br></p><p><a href="https://github.com/microfeed/microfeed/activity" rel="noopener noreferrer" target="_blank">&nbsp;活动</a></p><p><br></p><p><a href="https://github.com/microfeed/microfeed/custom-properties" rel="noopener noreferrer" target="_blank">&nbsp;自定义属性</a></p><h3>星星</h3><p><br></p><p><br></p><p><a href="https://github.com/microfeed/microfeed/stargazers" rel="noopener noreferrer" target="_blank">&nbsp;3.8k&nbsp;星</a></p><h3>观察家</h3><p><br></p><p><br></p><p><a href="https://github.com/microfeed/microfeed/watchers" rel="noopener noreferrer" target="_blank">&nbsp;26&nbsp;观看</a></p><h3>叉</h3><p><br></p><p><br></p><p><a href="https://github.com/microfeed/microfeed/forks" rel="noopener noreferrer" target="_blank">&nbsp;1.3k&nbsp;叉子</a></p><p><a href="https://github.com/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Fmicrofeed%2Fmicrofeed&amp;report=microfeed+%28user%29" rel="noopener noreferrer" target="_blank">报告存储库</a></p><h2><a href="https://github.com/microfeed/microfeed/releases" rel="noopener noreferrer" target="_blank">释放6</a></h2><p><br></p><p><a href="https://github.com/microfeed/microfeed/releases/tag/v0.1.5" rel="noopener noreferrer" target="_blank">0.1.5版</a></p><p><a href="https://github.com/microfeed/microfeed/releases/tag/v0.1.5" rel="noopener noreferrer" target="_blank">最近的</a></p><p><a href="https://github.com/microfeed/microfeed/releases/tag/v0.1.5" rel="noopener noreferrer" target="_blank">on Mar 15</a></p><p><a href="https://github.com/microfeed/microfeed/releases" rel="noopener noreferrer" target="_blank">+ 5 个版本</a></p><h2><a href="https://github.com/microfeed/microfeed/graphs/contributors" rel="noopener noreferrer" target="_blank">贡献</a></h2><h2><a href="https://github.com/microfeed/microfeed/graphs/contributors" rel="noopener noreferrer" target="_blank">8</a></h2><ul><li><a href="https://github.com/wenbinf" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/1719237?s=64&amp;v=4"></a></li><li><a href="https://github.com/andreybo" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/19314952?s=64&amp;v=4"></a></li><li><a href="https://github.com/allanice001" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/700853?s=64&amp;v=4"></a></li><li><a href="https://github.com/jarylc" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/1162128?s=64&amp;v=4"></a></li><li><a href="https://github.com/jwenjian" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/25657798?s=64&amp;v=4"></a></li><li><a href="https://github.com/orthanc42" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/13221583?s=64&amp;v=4"></a></li><li><a href="https://github.com/TheOnlyWayUp" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/76237496?s=64&amp;v=4"></a></li><li><a href="https://github.com/jcary741" rel="noopener noreferrer" target="_blank"><img src="https://avatars.githubusercontent.com/u/101132508?s=64&amp;v=4"></a></li></ul><h2>语言</h2><p><br></p><ul><li><br></li><li><a href="https://github.com/microfeed/microfeed/search?l=javascript" rel="noopener noreferrer" target="_blank">JavaScript的</a></li><li><a href="https://github.com/microfeed/microfeed/search?l=javascript" rel="noopener noreferrer" target="_blank">80.6%</a></li><li>&nbsp;</li><li><a href="https://github.com/microfeed/microfeed/search?l=html" rel="noopener noreferrer" target="_blank">[HTML全文]</a></li><li><a href="https://github.com/microfeed/microfeed/search?l=html" rel="noopener noreferrer" target="_blank">17.9%</a></li><li>&nbsp;</li><li><a href="https://github.com/microfeed/microfeed/search?l=css" rel="noopener noreferrer" target="_blank">CSS系统</a></li><li><a href="https://github.com/microfeed/microfeed/search?l=css" rel="noopener noreferrer" target="_blank">1.3%</a></li><li>&nbsp;</li><li><a href="https://github.com/microfeed/microfeed/search?l=shell" rel="noopener noreferrer" target="_blank">壳</a></li><li><a href="https://github.com/microfeed/microfeed/search?l=shell" rel="noopener noreferrer" target="_blank">0.2%</a></li></ul><h2>Footer</h2><p><br></p><p>© 2025 GitHub,&nbsp;Inc.</p><h3>Footer navigation</h3><ul><li><a href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" rel="noopener noreferrer" target="_blank">Terms</a></li><li><a href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" rel="noopener noreferrer" target="_blank">Privacy</a></li><li><a href="https://github.com/security" rel="noopener noreferrer" target="_blank">Security</a></li><li><a href="https://www.githubstatus.com/" rel="noopener noreferrer" target="_blank">Status</a></li><li><a href="https://github.community/" rel="noopener noreferrer" target="_blank">Community</a></li><li><a href="https://docs.github.com/" rel="noopener noreferrer" target="_blank">Docs</a></li><li><a href="https://support.github.com/?tags=dotcom-footer" rel="noopener noreferrer" target="_blank">Contact</a></li><li>Manage cookies</li><li>Do not share my personal information</li></ul>]]>
    </description>
    <link>https://mf-drktravis-dpdns-org.pages.dev/i/microfeed--ShBwcUhU8T/</link>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
  <item>
    <title>Hello World</title>
    <guid>7t9pQxnUNtL</guid>
    <pubDate>Mon, 06 Oct 2025 08:38:03 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<p>example desciption</p>]]>
    </description>
    <link>https://mf-drktravis-dpdns-org.pages.dev/i/hello-worl-7t9pQxnUNtL/</link>
    <itunes:image href="https://mf-db.drktravis.dpdns.org/mf-drktravis-dpdns-org/production/images/item-03f38e6214c0705c8badf7d5f44b13cf.png"/>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
  <item>
    <title>untitled</title>
    <guid>ma7qaoDEzio</guid>
    <pubDate>Mon, 06 Oct 2025 08:35:33 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[


#### adv

| [wx.adv.AnimationCtrl](https://docs.wxpython.org/wx.adv.AnimationCtrl.html)           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.adv.animationctrl.png)      | [wx.adv.BitmapComboBox](https://docs.wxpython.org/wx.adv.BitmapComboBox.html)       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.adv.bitmapcombobox.png)    |
| ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| [wx.adv.CalendarCtrl](https://docs.wxpython.org/wx.adv.CalendarCtrl.html)             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.adv.calendarctrl.png)       | [wx.adv.CommandLinkButton](https://docs.wxpython.org/wx.adv.CommandLinkButton.html) | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.adv.commandlinkbutton.png) |
| [wx.adv.DatePickerCtrl](https://docs.wxpython.org/wx.adv.DatePickerCtrl.html)         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.adv.datepickerctrl.png)     | [wx.adv.HyperlinkCtrl](https://docs.wxpython.org/wx.adv.HyperlinkCtrl.html)         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.adv.hyperlinkctrl.png)     |
| [wx.adv.OwnerDrawnComboBox](https://docs.wxpython.org/wx.adv.OwnerDrawnComboBox.html) | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.adv.ownerdrawncombobox.png) | [wx.adv.RichToolTip](https://docs.wxpython.org/wx.adv.RichToolTip.html)             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.adv.richtooltip.png)       |
| [wx.adv.TimePickerCtrl](https://docs.wxpython.org/wx.adv.TimePickerCtrl.html)         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.adv.timepickerctrl.png)     | [wx.aui.AuiMDIParentFrame](https://docs.wxpython.org/wx.aui.AuiMDIParentFrame.html) | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.aui.auimdiparentframe.png) |

#### normal


| [wx.Frame](https://docs.wxpython.org/wx.Frame.html)                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.frame.png)                 | [wx.Dialog](https://docs.wxpython.org/wx.Dialog.html)                                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.dialog.png)                    |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| [wx.MiniFrame](https://docs.wxpython.org/wx.MiniFrame.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.miniframe.png)             |                                                                                             |                                                                                                       |
| [wx.StaticText](https://docs.wxpython.org/wx.StaticText.html)                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.statictext.png)            | [wx.TextCtrl](https://docs.wxpython.org/wx.TextCtrl.html)                                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.textctrl.png)                  |
| [wx.Button](https://docs.wxpython.org/wx.Button.html)                               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.button.png)                | [wx.BitmapButton](https://docs.wxpython.org/wx.BitmapButton.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.bitmapbutton.png)              |
| [wx.ToggleButton](https://docs.wxpython.org/wx.ToggleButton.html)                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.togglebutton.png)          |                                                                                             |                                                                                                       |
| [wx.CheckBox](https://docs.wxpython.org/wx.CheckBox.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.checkbox.png)              | [wx.CheckListBox](https://docs.wxpython.org/wx.CheckListBox.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.checklistbox.png)              |
| [wx.Choice](https://docs.wxpython.org/wx.Choice.html)                               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.choice.png)                | [wx.Choicebook](https://docs.wxpython.org/wx.Choicebook.html)                               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.choicebook.png)                |
| [wx.CollapsiblePane](https://docs.wxpython.org/wx.CollapsiblePane.html)             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.collapsiblepane.png)       | [wx.ColourPickerCtrl](https://docs.wxpython.org/wx.ColourPickerCtrl.html)                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.colourpickerctrl.png)          |
| [wx.RadioButton](https://docs.wxpython.org/wx.RadioButton.html)                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.radiobutton.png)           | [wx.RadioBox](https://docs.wxpython.org/wx.RadioBox.html)                                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.radiobox.png)                  |
| [wx.ComboBox](https://docs.wxpython.org/wx.ComboBox.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.combobox.png)              | [wx.ComboCtrl](https://docs.wxpython.org/wx.ComboCtrl.html)                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.comboctrl.png)                 |
| [wx.dataview.DataViewCtrl](https://docs.wxpython.org/wx.dataview.DataViewCtrl.html) | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.dataview.dataviewctrl.png) | [wx.dataview.DataViewTreeCtrl](https://docs.wxpython.org/wx.dataview.DataViewTreeCtrl.html) | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.dataview.dataviewtreectrl.png) |
| [wx.DirPickerCtrl](https://docs.wxpython.org/wx.DirPickerCtrl.html)                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.dirpickerctrl.png)         | [wx.FileCtrl](https://docs.wxpython.org/wx.FileCtrl.html)                                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.filectrl.png)                  |
| [wx.FilePickerCtrl](https://docs.wxpython.org/wx.FilePickerCtrl.html)               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.filepickerctrl.png)        | [wx.FontPickerCtrl](https://docs.wxpython.org/wx.FontPickerCtrl.html)                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.fontpickerctrl.png)            |
| [wx.Gauge](https://docs.wxpython.org/wx.Gauge.html)                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.gauge.png)                 |                                                                                             |                                                                                                       |
| [wx.GenericDirCtrl](https://docs.wxpython.org/wx.GenericDirCtrl.html)               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.genericdirctrl.png)        |                                                                                             |                                                                                                       |
| [wx.Listbook](https://docs.wxpython.org/wx.Listbook.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.listbook.png)              | [wx.ListBox](https://docs.wxpython.org/wx.ListBox.html)                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.listbox.png)                   |
| [wx.ListCtrl](https://docs.wxpython.org/wx.ListCtrl.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.listctrl.png)              | [wx.ListView](https://docs.wxpython.org/wx.ListView.html)                                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.listview.png)                  |
| [wx.Notebook](https://docs.wxpython.org/wx.Notebook.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.notebook.png)              |                                                                                             |                                                                                                       |
| [wx.ScrollBar](https://docs.wxpython.org/wx.ScrollBar.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.scrollbar.png)             |                                                                                             |                                                                                                       |
| [wx.SearchCtrl](https://docs.wxpython.org/wx.SearchCtrl.html)                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.searchctrl.png)            |                                                                                             |                                                                                                       |
| [wx.Slider](https://docs.wxpython.org/wx.Slider.html)                               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.slider.png)                |                                                                                             |                                                                                                       |
| [wx.SpinButton](https://docs.wxpython.org/wx.SpinButton.html)                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.spinbutton.png)            |                                                                                             |                                                                                                       |
| [wx.SpinCtrl](https://docs.wxpython.org/wx.SpinCtrl.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.spinctrl.png)              | [wx.SpinCtrlDouble](https://docs.wxpython.org/wx.SpinCtrlDouble.html)                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.spinctrldouble.png)            |
| [wx.StaticBitmap](https://docs.wxpython.org/wx.StaticBitmap.html)                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.staticbitmap.png)          |                                                                                             |                                                                                                       |
| [wx.StaticBox](https://docs.wxpython.org/wx.StaticBox.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.staticbox.png)             |                                                                                             |                                                                                                       |
| [wx.TreeCtrl](https://docs.wxpython.org/wx.TreeCtrl.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmac/wx.treectrl.png)              |                                                                                             |                                                                                                       |

#### lib


| [wx.lib.agw.advancedsplash.AdvancedSplash](https://docs.wxpython.org/wx.lib.agw.advancedsplash.AdvancedSplash.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.advancedsplash.advancedsplash.png)             |                                                                                                                                                                  |     |
| ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- |
| [wx.lib.agw.aquabutton.AquaButton](https://docs.wxpython.org/wx.lib.agw.aquabutton.AquaButton.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.aquabutton.aquabutton.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.aui.auibar.AuiToolBar](https://docs.wxpython.org/wx.lib.agw.aui.auibar.AuiToolBar.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.aui.auibar.auitoolbar.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.aui.auibook.AuiNotebook](https://docs.wxpython.org/wx.lib.agw.aui.auibook.AuiNotebook.html)                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.aui.auibook.auinotebook.png)                   |                                                                                                                                                                  |     |
| [wx.lib.agw.aui.framemanager.AuiManager](https://docs.wxpython.org/wx.lib.agw.aui.framemanager.AuiManager.html)                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.aui.framemanager.auimanager.png)               |                                                                                                                                                                  |     |
| [wx.lib.agw.balloontip.BalloonTip](https://docs.wxpython.org/wx.lib.agw.balloontip.BalloonTip.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.balloontip.balloontip.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.buttonpanel.ButtonPanel](https://docs.wxpython.org/wx.lib.agw.buttonpanel.ButtonPanel.html)                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.buttonpanel.buttonpanel.png)                   |                                                                                                                                                                  |     |
| [wx.lib.agw.cubecolourdialog.CubeColourDialog](https://docs.wxpython.org/wx.lib.agw.cubecolourdialog.CubeColourDialog.html)                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.cubecolourdialog.cubecolourdialog.png)         |                                                                                                                                                                  |     |
| [wx.lib.agw.customtreectrl.CustomTreeCtrl](https://docs.wxpython.org/wx.lib.agw.customtreectrl.CustomTreeCtrl.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.customtreectrl.customtreectrl.png)             |                                                                                                                                                                  |     |
| [wx.lib.agw.flatmenu.FlatMenuBar](https://docs.wxpython.org/wx.lib.agw.flatmenu.FlatMenuBar.html)                                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.flatmenu.flatmenubar.png)                      |                                                                                                                                                                  |     |
| [wx.lib.agw.flatnotebook.FlatNotebook](https://docs.wxpython.org/wx.lib.agw.flatnotebook.FlatNotebook.html)                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.flatnotebook.flatnotebook.png)                 |                                                                                                                                                                  |     |
| [wx.lib.agw.floatspin.FloatSpin](https://docs.wxpython.org/wx.lib.agw.floatspin.FloatSpin.html)                                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.floatspin.floatspin.png)                       |                                                                                                                                                                  |     |
| [wx.lib.agw.fmcustomizedlg.FMCustomizeDlg](https://docs.wxpython.org/wx.lib.agw.fmcustomizedlg.FMCustomizeDlg.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.fmcustomizedlg.fmcustomizedlg.png)             |                                                                                                                                                                  |     |
| [wx.lib.agw.foldpanelbar.FoldPanelBar](https://docs.wxpython.org/wx.lib.agw.foldpanelbar.FoldPanelBar.html)                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.foldpanelbar.foldpanelbar.png)                 |                                                                                                                                                                  |     |
| [wx.lib.agw.fourwaysplitter.FourWaySplitter](https://docs.wxpython.org/wx.lib.agw.fourwaysplitter.FourWaySplitter.html)                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.fourwaysplitter.fourwaysplitter.png)           |                                                                                                                                                                  |     |
| [wx.lib.agw.genericmessagedialog.GenericMessageDialog](https://docs.wxpython.org/wx.lib.agw.genericmessagedialog.GenericMessageDialog.html) | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.genericmessagedialog.genericmessagedialog.png) |                                                                                                                                                                  |     |
| [wx.lib.agw.gradientbutton.GradientButton](https://docs.wxpython.org/wx.lib.agw.gradientbutton.GradientButton.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.gradientbutton.gradientbutton.png)             |                                                                                                                                                                  |     |
| [wx.lib.agw.hyperlink.HyperLinkCtrl](https://docs.wxpython.org/wx.lib.agw.hyperlink.HyperLinkCtrl.html)                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.hyperlink.hyperlinkctrl.png)                   |                                                                                                                                                                  |     |
| [wx.lib.agw.hypertreelist.HyperTreeList](https://docs.wxpython.org/wx.lib.agw.hypertreelist.HyperTreeList.html)                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.hypertreelist.hypertreelist.png)               | ![20250721001403.png](https://raw.githubusercontent.com/liangxiongsl/obsidian-public/main/image/20250721001403.png?sha=1565331a7b5f5c35ba6dcb605f03f927107aea28) |     |
| [wx.lib.agw.infobar.InfoBar](https://docs.wxpython.org/wx.lib.agw.infobar.InfoBar.html)                                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.infobar.infobar.png)                           |                                                                                                                                                                  |     |
| [wx.lib.agw.knobctrl.KnobCtrl](https://docs.wxpython.org/wx.lib.agw.knobctrl.KnobCtrl.html)                                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.knobctrl.knobctrl.png)                         |                                                                                                                                                                  |     |
| [wx.lib.agw.labelbook.FlatImageBook](https://docs.wxpython.org/wx.lib.agw.labelbook.FlatImageBook.html)                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.labelbook.flatimagebook.png)                   |                                                                                                                                                                  |     |
| [wx.lib.agw.labelbook.LabelBook](https://docs.wxpython.org/wx.lib.agw.labelbook.LabelBook.html)                                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.labelbook.labelbook.png)                       |                                                                                                                                                                  |     |
| [wx.lib.agw.multidirdialog.MultiDirDialog](https://docs.wxpython.org/wx.lib.agw.multidirdialog.MultiDirDialog.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.multidirdialog.multidirdialog.png)             |                                                                                                                                                                  |     |
| [wx.lib.agw.peakmeter.PeakMeterCtrl](https://docs.wxpython.org/wx.lib.agw.peakmeter.PeakMeterCtrl.html)                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.peakmeter.peakmeterctrl.png)                   |                                                                                                                                                                  |     |
| [wx.lib.agw.piectrl.PieCtrl](https://docs.wxpython.org/wx.lib.agw.piectrl.PieCtrl.html)                                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.piectrl.piectrl.png)                           |                                                                                                                                                                  |     |
| [wx.lib.agw.piectrl.ProgressPie](https://docs.wxpython.org/wx.lib.agw.piectrl.ProgressPie.html)                                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.piectrl.progresspie.png)                       |                                                                                                                                                                  |     |
| [wx.lib.agw.pybusyinfo.PyBusyInfo](https://docs.wxpython.org/wx.lib.agw.pybusyinfo.PyBusyInfo.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.pybusyinfo.pybusyinfo.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.pycollapsiblepane.PyCollapsiblePane](https://docs.wxpython.org/wx.lib.agw.pycollapsiblepane.PyCollapsiblePane.html)             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.pycollapsiblepane.pycollapsiblepane.png)       |                                                                                                                                                                  |     |
| [wx.lib.agw.pygauge.PyGauge](https://docs.wxpython.org/wx.lib.agw.pygauge.PyGauge.html)                                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.pygauge.pygauge.png)                           |                                                                                                                                                                  |     |
| [wx.lib.agw.pyprogress.PyProgress](https://docs.wxpython.org/wx.lib.agw.pyprogress.PyProgress.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.pyprogress.pyprogress.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.ribbon.bar.RibbonBar](https://docs.wxpython.org/wx.lib.agw.ribbon.bar.RibbonBar.html)                                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.ribbon.bar.ribbonbar.png)                      |                                                                                                                                                                  |     |
| [wx.lib.agw.ribbon.buttonbar.RibbonButtonBar](https://docs.wxpython.org/wx.lib.agw.ribbon.buttonbar.RibbonButtonBar.html)                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.ribbon.buttonbar.ribbonbuttonbar.png)          |                                                                                                                                                                  |     |
| [wx.lib.agw.ribbon.gallery.RibbonGallery](https://docs.wxpython.org/wx.lib.agw.ribbon.gallery.RibbonGallery.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.ribbon.gallery.ribbongallery.png)              |                                                                                                                                                                  |     |
| [wx.lib.agw.ribbon.page.RibbonPage](https://docs.wxpython.org/wx.lib.agw.ribbon.page.RibbonPage.html)                                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.ribbon.page.ribbonpage.png)                    |                                                                                                                                                                  |     |
| [wx.lib.agw.ribbon.panel.RibbonPanel](https://docs.wxpython.org/wx.lib.agw.ribbon.panel.RibbonPanel.html)                                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.ribbon.panel.ribbonpanel.png)                  |                                                                                                                                                                  |     |
| [wx.lib.agw.ribbon.toolbar.RibbonToolBar](https://docs.wxpython.org/wx.lib.agw.ribbon.toolbar.RibbonToolBar.html)                           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.ribbon.toolbar.ribbontoolbar.png)              |                                                                                                                                                                  |     |
| [wx.lib.agw.rulerctrl.RulerCtrl](https://docs.wxpython.org/wx.lib.agw.rulerctrl.RulerCtrl.html)                                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.rulerctrl.rulerctrl.png)                       |                                                                                                                                                                  |     |
| [wx.lib.agw.shapedbutton.SBitmapButton](https://docs.wxpython.org/wx.lib.agw.shapedbutton.SBitmapButton.html)                               | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.shapedbutton.sbitmapbutton.png)                |                                                                                                                                                                  |     |
| [wx.lib.agw.shapedbutton.SBitmapTextButton](https://docs.wxpython.org/wx.lib.agw.shapedbutton.SBitmapTextButton.html)                       | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.shapedbutton.sbitmaptextbutton.png)            |                                                                                                                                                                  |     |
| [wx.lib.agw.shapedbutton.SBitmapTextToggleButton](https://docs.wxpython.org/wx.lib.agw.shapedbutton.SBitmapTextToggleButton.html)           | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.shapedbutton.sbitmaptexttogglebutton.png)      |                                                                                                                                                                  |     |
| [wx.lib.agw.shapedbutton.SBitmapToggleButton](https://docs.wxpython.org/wx.lib.agw.shapedbutton.SBitmapToggleButton.html)                   | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.shapedbutton.sbitmaptogglebutton.png)          |                                                                                                                                                                  |     |
| [wx.lib.agw.shortcuteditor.ShortcutEditor](https://docs.wxpython.org/wx.lib.agw.shortcuteditor.ShortcutEditor.html)                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.shortcuteditor.shortcuteditor.png)             |                                                                                                                                                                  |     |
| [wx.lib.agw.speedmeter.SpeedMeter](https://docs.wxpython.org/wx.lib.agw.speedmeter.SpeedMeter.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.speedmeter.speedmeter.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.supertooltip.SuperToolTip](https://docs.wxpython.org/wx.lib.agw.supertooltip.SuperToolTip.html)                                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxgtk/wx.lib.agw.supertooltip.supertooltip.png)                 |                                                                                                                                                                  |     |
| [wx.lib.agw.thumbnailctrl.ThumbnailCtrl](https://docs.wxpython.org/wx.lib.agw.thumbnailctrl.ThumbnailCtrl.html)                             | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.thumbnailctrl.thumbnailctrl.png)               |                                                                                                                                                                  |     |
| [wx.lib.agw.toasterbox.ToasterBox](https://docs.wxpython.org/wx.lib.agw.toasterbox.ToasterBox.html)                                         | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.toasterbox.toasterbox.png)                     |                                                                                                                                                                  |     |
| [wx.lib.agw.ultimatelistctrl.UltimateListCtrl](https://docs.wxpython.org/wx.lib.agw.ultimatelistctrl.UltimateListCtrl.html)                 | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.ultimatelistctrl.ultimatelistctrl.png)         |                                                                                                                                                                  |     |
| [wx.lib.agw.xlsgrid.XLSGrid](https://docs.wxpython.org/wx.lib.agw.xlsgrid.XLSGrid.html)                                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.xlsgrid.xlsgrid.png)                           |                                                                                                                                                                  |     |
| [wx.lib.agw.zoombar.ZoomBar](https://docs.wxpython.org/wx.lib.agw.zoombar.ZoomBar.html)                                                     | ![](https://docs.wxpython.org/_static/images/widgets/fullsize/wxmsw/wx.lib.agw.zoombar.zoombar.png)                           |                                                                                                                                                                  |     |

]]>
    </description>
    <link>https://mf-drktravis-dpdns-org.pages.dev/i/ma7qaoDEzio/</link>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
</channel>
</rss>