<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Qiufeng Blog</title>
    <link>https://qiufengcute.github.io/Blog/</link>
    
    <atom:link href="https://qiufengcute.github.io/Blog/rss.xml" rel="self" type="application/rss+xml"/>
    
    <description>Qiufeng的个人博客</description>
    <pubDate>Sat, 11 Apr 2026 06:24:17 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>MemeWiki - 网络迷因中文百科</title>
      <link>https://qiufengcute.github.io/Blog/posts/MemeWiki/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/MemeWiki/</guid>
      <pubDate>Sat, 04 Apr 2026 02:00:00 GMT</pubDate>
      
      <description>一个专门收录网络迷因的中文维基，解释梗的起源、含义和用法。</description>
      
      
      
      <content:encoded><![CDATA[<h2 id="memewiki">MemeWiki</h2><p><strong>地址</strong>：<ahref="https://memepedia.miraheze.org">https://memepedia.miraheze.org</a></p><p>网络迷因（meme）的中文解释百科。每个条目解释一个梗的<strong>含义、来源、用法</strong>。</p><h2 id="版权">版权</h2><p>文字采用 CC BY 4.0，图片归原作者或合理使用。</p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E9%A1%B9%E7%9B%AE/">项目</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/MemeWiki/">MemeWiki</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E8%BF%B7%E5%9B%A0/">迷因</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E7%BB%B4%E5%9F%BA/">维基</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/MemeWiki/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>UBAD | B站非官方API文档</title>
      <link>https://qiufengcute.github.io/Blog/posts/UBAD/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/UBAD/</guid>
      <pubDate>Sat, 28 Mar 2026 08:00:00 GMT</pubDate>
      
      <description>UBAD 是一个非官方的 B 站 API 文档站，通过抓包整理接口，仅供学习使用。</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://ubad.qiuqfeng.cc">UBAD</a><br /><ahref="https://qiufengcute.github.io/unofficial-bilibili-apis-docs/">UBAD(备用)</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/">技术文档</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E9%9D%9E%E5%AE%98%E6%96%B9API/">非官方API</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Bilibili/">Bilibili</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BC%80%E5%8F%91%E8%80%85%E6%96%87%E6%A1%A3/">开发者文档</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%8A%93%E5%8C%85/">抓包</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/UBAD/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>AppDataManager 应用数据管理库</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E5%BA%93/AppDataManager/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E5%BA%93/AppDataManager/</guid>
      <pubDate>Tue, 24 Mar 2026 10:00:00 GMT</pubDate>
      
      <description>零配置用户数据管理器 - 像管理字典一样管理应用程序数据，自动保存到系统用户目录。</description>
      
      
      
      <content:encoded><![CDATA[<p><ahref="https://github.com/qiufengcute/AppDataManager">GitHub</a></p><p><a href="https://pypi.org/project/AppDataManager/">PyPI</a></p><h2 id="features">Features</h2><ul><li>🚀 <strong>Zero dependencies</strong> - Only Python standardlibrary</li><li>📁 <strong>Automatic paths</strong> - Auto-saved to system userdirectory</li><li>🐍 <strong>Pythonic</strong> - Dict-like and attribute-likeaccess</li><li>🔒 <strong>Namespace isolation</strong> - Multiple apps don'tinterfere</li><li>✨ <strong>Simple &amp; intuitive</strong> - No configurationneeded</li></ul><h2 id="installation">Installation</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">pip install AppDataManager<br></code></pre></td></tr></table></figure><h2 id="quick-start">Quick Start</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> AppDataManager <span class="hljs-keyword">import</span> AppDataManager<br><br><span class="hljs-comment"># Create manager</span><br>dm = AppDataManager(<span class="hljs-string">&quot;myapp&quot;</span>)<br><br><span class="hljs-comment"># Dict-style access</span><br>dm[<span class="hljs-string">&quot;config.json&quot;</span>] = <span class="hljs-string">&#x27;&#123;&quot;theme&quot;: &quot;dark&quot;&#125;&#x27;</span><br><span class="hljs-built_in">print</span>(dm[<span class="hljs-string">&quot;config.json&quot;</span>])<br><br><span class="hljs-comment"># Attribute-style access</span><br>dm.setting = <span class="hljs-string">&quot;enabled&quot;</span><br><span class="hljs-built_in">print</span>(dm.setting)<br><br><span class="hljs-comment"># Iterate all data</span><br><span class="hljs-keyword">for</span> key <span class="hljs-keyword">in</span> dm:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;<span class="hljs-subst">&#123;key&#125;</span>: <span class="hljs-subst">&#123;dm[key]&#125;</span>&quot;</span>)<br><br><span class="hljs-comment"># Check existence</span><br><span class="hljs-keyword">if</span> <span class="hljs-string">&quot;config.json&quot;</span> <span class="hljs-keyword">in</span> dm:<br>    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;Config exists&quot;</span>)<br><br><span class="hljs-comment"># Delete</span><br><span class="hljs-keyword">del</span> dm.setting<br><br><span class="hljs-comment"># Count</span><br><span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;Total: <span class="hljs-subst">&#123;<span class="hljs-built_in">len</span>(dm)&#125;</span> files&quot;</span>)<br></code></pre></td></tr></table></figure><h2 id="storage-locations">Storage Locations</h2><ul><li><strong>Windows</strong>:<code>%LOCALAPPDATA%\&lt;namespace&gt;</code></li><li><strong>macOS</strong>:<code>~/Library/Application Support/&lt;namespace&gt;</code></li><li><strong>Linux</strong>:<code>~/.local/share/&lt;namespace&gt;</code></li></ul>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/">编程工具</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/">应用程序</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%95%B0%E6%8D%AE/">数据</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%AD%98%E5%82%A8/">存储</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E9%85%8D%E7%BD%AE/">配置</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%9C%AC%E5%9C%B0%E6%95%B0%E6%8D%AE/">本地数据</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BA%94%E7%94%A8%E6%95%B0%E6%8D%AE/">应用数据</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%8C%81%E4%B9%85%E6%80%A7/">持久性</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E8%AE%BE%E7%BD%AE/">设置</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E5%BA%93/AppDataManager/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Github Total Github数据统计工具</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E5%BA%93/GithubTotal/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E5%BA%93/GithubTotal/</guid>
      <pubDate>Tue, 24 Mar 2026 10:00:00 GMT</pubDate>
      
      <description>生成包含多维分析的个人 GitHub 统计报告。</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://github.com/qiufengcute/GithubTotal">GitHub</a></p><p><a href="https://pypi.org/project/GithubTotal/">PyPI</a></p><h2 id="features">Features</h2><ul><li>📊 Generate Excel report with 3 sheets:<ul><li><strong>Repository Data</strong>: All repos with metadata (creationdate, update date, language, stars, etc.)</li><li><strong>Statistics</strong>: Summary stats (active repos by period,top language, star leaders, etc.)</li><li><strong>User Info</strong>: Basic profile info</li></ul></li><li>🚀 One command, no config needed</li><li>📈 Auto-categorize repos by creation/update time (New(Thismonth)/Mid(This year)/Old(Before this year))</li><li>⭐ Track your stars (including self-stars)</li></ul><h2 id="installation">Installation</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">pip install GithubTotal<br></code></pre></td></tr></table></figure><h2 id="usage">Usage</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">ght &lt;username&gt; -o &lt;output.xlsx&gt;<br></code></pre></td></tr></table></figure>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/">编程工具</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/github/">github</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E7%BB%9F%E8%AE%A1/">统计</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%8A%A5%E5%91%8A/">报告</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/excel/">excel</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/">命令行</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%88%86%E6%9E%90/">分析</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/github-api/">github-api</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%BB%93%E5%BA%93/">仓库</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%B4%9E%E5%AF%9F/">洞察</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BC%80%E5%8F%91%E8%80%85%E5%B7%A5%E5%85%B7/">开发者工具</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E7%94%9F%E4%BA%A7%E5%8A%9B/">生产力</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E5%BA%93/GithubTotal/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>1024小游戏</title>
      <link>https://qiufengcute.github.io/Blog/posts/1024_1.0.0/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/1024_1.0.0/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>一个有趣的1024数字拼图游戏，包含多个版本更新。</description>
      
      
      
      <content:encoded><![CDATA[<p>源代码：</p><p><a href="https://nsx.lanzout.com/iLuKe29x0lzg">1024.zip -蓝奏云</a></p><p>3d字符&amp;61&amp;1024_1.1.0：</p><p><ahref="/Blog/posts/3d字符&amp;61&amp;1024_1.1.0">3d字符&amp;61&amp;1024_1.1.0</a></p><p>bilibili：</p><p><ahref="https://player.bilibili.com/player.html?bvid=BV1nT4fetEcy&amp;autoplay=0">bilibili</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%B8%B8%E6%88%8F/">游戏</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B0%8F%E6%B8%B8%E6%88%8F/">小游戏</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%A8%B1%E4%B9%90/">娱乐</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%BA%92%E5%8A%A8/">互动</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/1024_1.0.0/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>3D字符与61游戏与1024游戏</title>
      <link>https://qiufengcute.github.io/Blog/posts/3D%E5%AD%97%E7%AC%A6%E4%B8%8E61%E6%B8%B8%E6%88%8F%E4%B8%8E1024%E6%B8%B8%E6%88%8F1.1.0/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/3D%E5%AD%97%E7%AC%A6%E4%B8%8E61%E6%B8%B8%E6%88%8F%E4%B8%8E1024%E6%B8%B8%E6%88%8F1.1.0/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个包含了3D字符, 61和1024游戏 (1.1.0) 的集合。</description>
      
      
      
      <content:encoded><![CDATA[<p><ahref="https://nsx.lanzout.com/io9h129xgcfi">3d字符&amp;61&amp;1024_1.1.0.zip</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%B8%B8%E6%88%8F/">游戏</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B0%8F%E6%B8%B8%E6%88%8F/">小游戏</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/3D%E5%AD%97%E7%AC%A6/">3D字符</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/61%E6%B8%B8%E6%88%8F/">61游戏</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/1024%E6%B8%B8%E6%88%8F/">1024游戏</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/3D%E5%AD%97%E7%AC%A6%E4%B8%8E61%E6%B8%B8%E6%88%8F%E4%B8%8E1024%E6%B8%B8%E6%88%8F1.1.0/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>EasySearch - 简易搜索聚合工具</title>
      <link>https://qiufengcute.github.io/Blog/posts/EasySearch/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/EasySearch/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个简洁高效的本地搜索引擎工具，提供便捷的搜索聚合功能。</description>
      
      
      
      <content:encoded><![CDATA[<p>Github:</p><p><a href="https://github.com/qiufengcute/EasySearch">GitHub -qiufengcute/EasySearch: 一个简洁高效的本地搜索引擎工具</a></p><p>主页:</p><p><a href="https://easysearch.qiuqfeng.cc">EasySearch -简易搜索聚合工具</a></p><p>(备用)</p><p><ahref="https://qiufengcute.github.io/EasySearch/">https://qiufengcute.github.io/EasySearch/</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%90%9C%E7%B4%A2%E5%B7%A5%E5%85%B7/">搜索工具</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/">搜索引擎</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E8%81%9A%E5%90%88%E5%B7%A5%E5%85%B7/">聚合工具</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Web%E5%BA%94%E7%94%A8/">Web应用</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/EasySearch/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>GeekTop项目</title>
      <link>https://qiufengcute.github.io/Blog/posts/GeekTop/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/GeekTop/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个名为GeekTop的项目，提供相关资源下载。</description>
      
      
      
      <content:encoded><![CDATA[<p>蓝奏优享:</p><p><a href="https://www.ilanzou.com/s/XNpn91NL">蓝奏云</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/">应用程序</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B7%A5%E5%85%B7/">工具</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%B8%8B%E8%BD%BD/">下载</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/">资源分享</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/GeekTop/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>IPv6 启用指南</title>
      <link>https://qiufengcute.github.io/Blog/posts/IPv6%20%E5%90%AF%E7%94%A8%E6%8C%87%E5%8D%97/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/IPv6%20%E5%90%AF%E7%94%A8%E6%8C%87%E5%8D%97/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一份详细的IPv6启用指南，帮助用户激活和配置IPv6网络连接。</description>
      
      
      
      <content:encoded><![CDATA[<p>Github:</p><p><a href="https://github.com/qiufengcute/IPv6-Activation-Guide">GitHub- qiufengcute/IPv6-Activation-Guide: A IPv6 activation guide</a></p><p>Page:</p><p><a href="https://ipv6.qiuqfeng.cc">IPv6 启用指南</a></p><p>(备用)</p><p><a href="https://qiufengcute.github.io/IPv6-Activation-Guide">IPv6启用指南</a></p><p>Bilibili:</p><p><ahref="https://player.bilibili.com/player.html?bvid=BV1QpvCBFEwv&amp;autoplay=0">bilibili</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/">技术文档</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/IPv6/">IPv6</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE/">网络配置</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/IPv6%20%E5%90%AF%E7%94%A8%E6%8C%87%E5%8D%97/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>MultiBadge - 多重徽章服务</title>
      <link>https://qiufengcute.github.io/Blog/posts/MultiBadge/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/MultiBadge/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个多重徽章服务，提供在线徽章生成功能。</description>
      
      
      
      <content:encoded><![CDATA[<p>API:</p><p><a href="https://qiufeng.pythonanywhere.com/mb">MultiBadge</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/Web%E6%9C%8D%E5%8A%A1/">Web服务</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/API%E6%9C%8D%E5%8A%A1/">API服务</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BE%BD%E7%AB%A0%E7%94%9F%E6%88%90/">徽章生成</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7/">在线工具</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/MultiBadge/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>MySub - 订阅统计工具</title>
      <link>https://qiufengcute.github.io/Blog/posts/MySub/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/MySub/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个用于统计和显示各平台订阅数/粉丝数的PySide6桌面应用程序，支持多种API接入。</description>
      
      
      
      <content:encoded><![CDATA[<p>代码:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br><span class="line">855</span><br><span class="line">856</span><br><span class="line">857</span><br><span class="line">858</span><br><span class="line">859</span><br><span class="line">860</span><br><span class="line">861</span><br><span class="line">862</span><br><span class="line">863</span><br><span class="line">864</span><br><span class="line">865</span><br><span class="line">866</span><br><span class="line">867</span><br><span class="line">868</span><br><span class="line">869</span><br><span class="line">870</span><br><span class="line">871</span><br><span class="line">872</span><br><span class="line">873</span><br><span class="line">874</span><br><span class="line">875</span><br><span class="line">876</span><br><span class="line">877</span><br><span class="line">878</span><br><span class="line">879</span><br><span class="line">880</span><br><span class="line">881</span><br><span class="line">882</span><br><span class="line">883</span><br><span class="line">884</span><br><span class="line">885</span><br><span class="line">886</span><br><span class="line">887</span><br><span class="line">888</span><br><span class="line">889</span><br><span class="line">890</span><br><span class="line">891</span><br><span class="line">892</span><br><span class="line">893</span><br><span class="line">894</span><br><span class="line">895</span><br><span class="line">896</span><br><span class="line">897</span><br><span class="line">898</span><br><span class="line">899</span><br><span class="line">900</span><br><span class="line">901</span><br><span class="line">902</span><br><span class="line">903</span><br><span class="line">904</span><br><span class="line">905</span><br><span class="line">906</span><br><span class="line">907</span><br><span class="line">908</span><br><span class="line">909</span><br><span class="line">910</span><br><span class="line">911</span><br><span class="line">912</span><br><span class="line">913</span><br><span class="line">914</span><br><span class="line">915</span><br><span class="line">916</span><br><span class="line">917</span><br><span class="line">918</span><br><span class="line">919</span><br><span class="line">920</span><br><span class="line">921</span><br><span class="line">922</span><br><span class="line">923</span><br><span class="line">924</span><br><span class="line">925</span><br><span class="line">926</span><br><span class="line">927</span><br><span class="line">928</span><br><span class="line">929</span><br><span class="line">930</span><br><span class="line">931</span><br><span class="line">932</span><br><span class="line">933</span><br><span class="line">934</span><br><span class="line">935</span><br><span class="line">936</span><br><span class="line">937</span><br><span class="line">938</span><br><span class="line">939</span><br><span class="line">940</span><br><span class="line">941</span><br><span class="line">942</span><br><span class="line">943</span><br><span class="line">944</span><br><span class="line">945</span><br><span class="line">946</span><br><span class="line">947</span><br><span class="line">948</span><br><span class="line">949</span><br><span class="line">950</span><br><span class="line">951</span><br><span class="line">952</span><br><span class="line">953</span><br><span class="line">954</span><br><span class="line">955</span><br><span class="line">956</span><br><span class="line">957</span><br><span class="line">958</span><br><span class="line">959</span><br><span class="line">960</span><br><span class="line">961</span><br><span class="line">962</span><br><span class="line">963</span><br><span class="line">964</span><br><span class="line">965</span><br><span class="line">966</span><br><span class="line">967</span><br><span class="line">968</span><br></pre></td><td class="code"><pre><code class="hljs python"><span class="hljs-keyword">from</span> PySide6.QtWidgets <span class="hljs-keyword">import</span> (QApplication, QMainWindow, QWidget, QVBoxLayout,<br>                              QHBoxLayout, QLineEdit, QPushButton, QLabel,<br>                              QScrollArea, QStackedWidget, QTableWidget,<br>                              QTableWidgetItem, QHeaderView, QComboBox,<br>                              QAbstractItemView, QMessageBox, QSpinBox)<br><span class="hljs-keyword">from</span> PySide6.QtCore <span class="hljs-keyword">import</span> Qt, QTimer, QThread, Signal, QUrl, QPropertyAnimation, QPoint, QEasingCurve<br><span class="hljs-keyword">from</span> urllib.parse <span class="hljs-keyword">import</span> quote_plus<br><span class="hljs-keyword">from</span> PySide6.QtGui <span class="hljs-keyword">import</span> QFont, QDesktopServices, QFontMetrics<br><span class="hljs-keyword">from</span> urllib.parse <span class="hljs-keyword">import</span> urlparse<br><span class="hljs-keyword">from</span> urllib.parse <span class="hljs-keyword">import</span> urlunparse, parse_qsl, urlencode, unquote<br><span class="hljs-keyword">import</span> sys<br><span class="hljs-keyword">import</span> os<br><span class="hljs-keyword">import</span> json<br><span class="hljs-keyword">import</span> requests<br><span class="hljs-keyword">import</span> time<br><span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime<br><span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> <span class="hljs-type">Any</span>, <span class="hljs-type">Optional</span><br><br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">FansAPIManager</span>:<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-comment"># 粉丝数 API 列表，每项为 dict: &#123;&quot;name&quot;:..., &quot;api_url&quot;:..., &quot;api_key&quot;:..., &quot;fans_path&quot;:...&#125;</span><br>        <span class="hljs-variable language_">self</span>.fans_apis = []<br>        <span class="hljs-comment"># 每次获取粉丝数的冷却（秒）</span><br>        <span class="hljs-variable language_">self</span>.cooldown = <span class="hljs-number">60</span><br>        <span class="hljs-comment"># 要显示的用户名</span><br>        <span class="hljs-variable language_">self</span>.username = <span class="hljs-string">&quot;&quot;</span><br>        <span class="hljs-variable language_">self</span>.theme_mode = <span class="hljs-string">&quot;light&quot;</span><br>        <span class="hljs-comment"># 尝试从磁盘加载已保存设置</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.load_settings()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_settings_path</span>(<span class="hljs-params">self</span>):<br>        appdata = os.getenv(<span class="hljs-string">&#x27;APPDATA&#x27;</span>) <span class="hljs-keyword">or</span> os.path.expanduser(<span class="hljs-string">&#x27;~&#x27;</span>)<br>        folder = os.path.join(appdata, <span class="hljs-string">&#x27;MySub&#x27;</span>)<br>        os.makedirs(folder, exist_ok=<span class="hljs-literal">True</span>)<br>        <span class="hljs-keyword">return</span> os.path.join(folder, <span class="hljs-string">&#x27;settings.json&#x27;</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">load_settings</span>(<span class="hljs-params">self</span>):<br>        path = <span class="hljs-variable language_">self</span>.get_settings_path()<br>        <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> os.path.exists(path):<br>            <span class="hljs-keyword">return</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">&#x27;r&#x27;</span>, encoding=<span class="hljs-string">&#x27;utf-8&#x27;</span>) <span class="hljs-keyword">as</span> f:<br>                data = json.load(f)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">return</span><br><br>        <span class="hljs-comment"># 加载粉丝数 API 列表</span><br>        <span class="hljs-keyword">try</span>:<br>            fa = data.get(<span class="hljs-string">&#x27;fans_apis&#x27;</span>)<br>            <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(fa, <span class="hljs-built_in">list</span>):<br>                <span class="hljs-variable language_">self</span>.fans_apis = fa<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-variable language_">self</span>.fans_apis = []<br><br>        <span class="hljs-comment"># 冷却与用户名</span><br>        <span class="hljs-keyword">try</span>:<br>            cd = data.get(<span class="hljs-string">&#x27;cooldown&#x27;</span>)<br>            <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(cd, (<span class="hljs-built_in">int</span>, <span class="hljs-built_in">float</span>)) <span class="hljs-keyword">and</span> cd &gt; <span class="hljs-number">0</span>:<br>                <span class="hljs-variable language_">self</span>.cooldown = <span class="hljs-built_in">int</span>(cd)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-variable language_">self</span>.cooldown = <span class="hljs-number">60</span><br>        <span class="hljs-keyword">try</span>:<br>            un = data.get(<span class="hljs-string">&#x27;username&#x27;</span>)<br>            <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(un, <span class="hljs-built_in">str</span>):<br>                <span class="hljs-variable language_">self</span>.username = un<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-variable language_">self</span>.username = <span class="hljs-string">&quot;&quot;</span><br><br>        <span class="hljs-comment"># 主题</span><br>        tm = data.get(<span class="hljs-string">&#x27;theme_mode&#x27;</span>)<br>        <span class="hljs-keyword">if</span> tm <span class="hljs-keyword">in</span> (<span class="hljs-string">&#x27;light&#x27;</span>, <span class="hljs-string">&#x27;dark&#x27;</span>, <span class="hljs-string">&#x27;system&#x27;</span>):<br>            <span class="hljs-variable language_">self</span>.theme_mode = tm<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">save_settings</span>(<span class="hljs-params">self</span>):<br>        path = <span class="hljs-variable language_">self</span>.get_settings_path()<br>        data = &#123;<br>            <span class="hljs-comment"># 粉丝数 API 列表与冷却/用户名</span><br>            <span class="hljs-string">&#x27;fans_apis&#x27;</span>: <span class="hljs-variable language_">self</span>.fans_apis,<br>            <span class="hljs-string">&#x27;cooldown&#x27;</span>: <span class="hljs-variable language_">self</span>.cooldown,<br>            <span class="hljs-string">&#x27;username&#x27;</span>: <span class="hljs-variable language_">self</span>.username,<br>            <span class="hljs-string">&#x27;theme_mode&#x27;</span>: <span class="hljs-variable language_">self</span>.theme_mode<br>        &#125;<br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">&#x27;w&#x27;</span>, encoding=<span class="hljs-string">&#x27;utf-8&#x27;</span>) <span class="hljs-keyword">as</span> f:<br>                json.dump(data, f, ensure_ascii=<span class="hljs-literal">False</span>, indent=<span class="hljs-number">2</span>)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-comment"># 保存失败时忽略（不影响主流程）</span><br>            <span class="hljs-keyword">pass</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">log_error</span>(<span class="hljs-params">self, message: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:<br>        <span class="hljs-string">&quot;&quot;&quot;把错误信息写入到 %APPDATA%/MySub/Logs 下，返回日志文件路径。&quot;&quot;&quot;</span><br>        <span class="hljs-keyword">try</span>:<br>            appdata = os.getenv(<span class="hljs-string">&#x27;APPDATA&#x27;</span>) <span class="hljs-keyword">or</span> os.path.expanduser(<span class="hljs-string">&#x27;~&#x27;</span>)<br>            folder = os.path.join(appdata, <span class="hljs-string">&#x27;MySub&#x27;</span>, <span class="hljs-string">&#x27;Logs&#x27;</span>)<br>            os.makedirs(folder, exist_ok=<span class="hljs-literal">True</span>)<br>            fname = datetime.now().strftime(<span class="hljs-string">&quot;%Y_%m_%d_%H_%M_%S_MySub_ErrorLog.log&quot;</span>)<br>            path = os.path.join(folder, fname)<br>            <span class="hljs-keyword">with</span> <span class="hljs-built_in">open</span>(path, <span class="hljs-string">&#x27;w&#x27;</span>, encoding=<span class="hljs-string">&#x27;utf-8&#x27;</span>) <span class="hljs-keyword">as</span> f:<br>                f.write(<span class="hljs-string">f&quot;[<span class="hljs-subst">&#123;datetime.now().isoformat()&#125;</span>]\n&quot;</span>)<br>                f.write(message)<br>                f.write(<span class="hljs-string">&#x27;\n&#x27;</span>)<br>            <span class="hljs-keyword">return</span> path<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">return</span> <span class="hljs-string">&#x27;&#x27;</span><br><br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">FanFetcher</span>(<span class="hljs-title class_ inherited__">QThread</span>):<br>    <span class="hljs-string">&quot;&quot;&quot;后台按配置请求各平台粉丝数，完成后发出字典&#123;name: fans_int&#125;。&quot;&quot;&quot;</span><br>    fans_ready = Signal(<span class="hljs-built_in">dict</span>)<br>    error_occurred = Signal(<span class="hljs-built_in">str</span>)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, api_manager, parent=<span class="hljs-literal">None</span></span>):<br>        <span class="hljs-built_in">super</span>().__init__(parent)<br>        <span class="hljs-variable language_">self</span>.api_manager = api_manager<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">run</span>(<span class="hljs-params">self</span>):<br>        results = &#123;&#125;<br>        <span class="hljs-keyword">try</span>:<br>            apis = <span class="hljs-built_in">list</span>(<span class="hljs-built_in">getattr</span>(<span class="hljs-variable language_">self</span>.api_manager, <span class="hljs-string">&#x27;fans_apis&#x27;</span>, []) <span class="hljs-keyword">or</span> [])<br>            <span class="hljs-comment"># helper to get by path (支持 .a.b)</span><br>            <span class="hljs-keyword">def</span> <span class="hljs-title function_">_get_by_path</span>(<span class="hljs-params">obj, path</span>):<br>                <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> path:<br>                    <span class="hljs-keyword">return</span> obj<br>                <span class="hljs-keyword">if</span> path == <span class="hljs-string">&#x27;.&#x27;</span> <span class="hljs-keyword">or</span> path == <span class="hljs-string">&#x27;&#x27;</span>:<br>                    <span class="hljs-keyword">return</span> obj<br>                <span class="hljs-keyword">if</span> path.startswith(<span class="hljs-string">&#x27;.&#x27;</span>):<br>                    path = path[<span class="hljs-number">1</span>:]<br>                parts = [p <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> path.split(<span class="hljs-string">&#x27;.&#x27;</span>) <span class="hljs-keyword">if</span> p]<br>                cur = obj<br>                <span class="hljs-keyword">try</span>:<br>                    <span class="hljs-keyword">for</span> p <span class="hljs-keyword">in</span> parts:<br>                        <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(cur, <span class="hljs-built_in">dict</span>):<br>                            cur = cur.get(p)<br>                        <span class="hljs-keyword">elif</span> <span class="hljs-built_in">isinstance</span>(cur, <span class="hljs-built_in">list</span>):<br>                            <span class="hljs-comment"># 不支持索引访问，返回 None</span><br>                            <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span><br>                        <span class="hljs-keyword">else</span>:<br>                            <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span><br>                    <span class="hljs-keyword">return</span> cur<br>                <span class="hljs-keyword">except</span> Exception:<br>                    <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span><br><br>            <span class="hljs-keyword">for</span> cfg <span class="hljs-keyword">in</span> apis:<br>                <span class="hljs-keyword">try</span>:<br>                    name = cfg.get(<span class="hljs-string">&#x27;name&#x27;</span>) <span class="hljs-keyword">or</span> cfg.get(<span class="hljs-string">&#x27;api_name&#x27;</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;unknown&#x27;</span><br>                    api_url = cfg.get(<span class="hljs-string">&#x27;api_url&#x27;</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span><br>                    api_key = cfg.get(<span class="hljs-string">&#x27;api_key&#x27;</span>) <span class="hljs-keyword">or</span> cfg.get(<span class="hljs-string">&#x27;apikey&#x27;</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span><br>                    fans_path = cfg.get(<span class="hljs-string">&#x27;fans_path&#x27;</span>) <span class="hljs-keyword">or</span> cfg.get(<span class="hljs-string">&#x27;fans_pos&#x27;</span>) <span class="hljs-keyword">or</span> cfg.get(<span class="hljs-string">&#x27;results_path&#x27;</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span><br><br>                    <span class="hljs-comment"># 支持 &#123;apikey&#125; 和 &#123;username&#125; 占位符</span><br>                    req_url = api_url<br>                    <span class="hljs-keyword">if</span> <span class="hljs-string">&#x27;&#123;apikey&#125;&#x27;</span> <span class="hljs-keyword">in</span> req_url:<br>                        req_url = req_url.replace(<span class="hljs-string">&#x27;&#123;apikey&#125;&#x27;</span>, quote_plus(api_key <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>))<br>                    <span class="hljs-keyword">if</span> <span class="hljs-string">&#x27;&#123;api_key&#125;&#x27;</span> <span class="hljs-keyword">in</span> req_url:<br>                        req_url = req_url.replace(<span class="hljs-string">&#x27;&#123;api_key&#125;&#x27;</span>, quote_plus(api_key <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>))<br>                    <span class="hljs-keyword">if</span> <span class="hljs-string">&#x27;&#123;username&#125;&#x27;</span> <span class="hljs-keyword">in</span> req_url:<br>                        req_url = req_url.replace(<span class="hljs-string">&#x27;&#123;username&#125;&#x27;</span>, quote_plus(<span class="hljs-variable language_">self</span>.api_manager.username <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>))<br><br>                    <span class="hljs-comment"># 发起请求</span><br>                    <span class="hljs-keyword">try</span>:<br>                        resp = requests.get(req_url, timeout=(<span class="hljs-number">15</span>, <span class="hljs-number">60</span>))<br>                    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                        <span class="hljs-variable language_">self</span>.error_occurred.emit(<span class="hljs-string">f&quot;请求 <span class="hljs-subst">&#123;name&#125;</span> 失败: <span class="hljs-subst">&#123;<span class="hljs-built_in">repr</span>(e)&#125;</span>&quot;</span>)<br>                        <span class="hljs-keyword">continue</span><br><br>                    j = <span class="hljs-literal">None</span><br>                    <span class="hljs-keyword">try</span>:<br>                        j = resp.json()<br>                    <span class="hljs-keyword">except</span> Exception:<br>                        j = <span class="hljs-literal">None</span><br><br>                    val = <span class="hljs-literal">None</span><br>                    <span class="hljs-keyword">if</span> j <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> <span class="hljs-literal">None</span>:<br>                        val = _get_by_path(j, fans_path)<br>                    <span class="hljs-comment"># 允许直接文本返回</span><br>                    <span class="hljs-keyword">if</span> val <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span> <span class="hljs-keyword">and</span> <span class="hljs-built_in">isinstance</span>(resp.text, <span class="hljs-built_in">str</span>):<br>                        <span class="hljs-comment"># 尝试直接解析全文为数字（去掉非数字字符）</span><br>                        txt = resp.text.strip()<br>                        <span class="hljs-keyword">if</span> txt:<br>                            val = txt<br><br>                    <span class="hljs-comment"># 尝试把 val 转为 int</span><br>                    parsed = <span class="hljs-literal">None</span><br>                    <span class="hljs-keyword">try</span>:<br>                        <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(val, <span class="hljs-built_in">int</span>):<br>                            parsed = <span class="hljs-built_in">int</span>(val)<br>                        <span class="hljs-keyword">elif</span> <span class="hljs-built_in">isinstance</span>(val, <span class="hljs-built_in">float</span>):<br>                            parsed = <span class="hljs-built_in">int</span>(val)<br>                        <span class="hljs-keyword">elif</span> <span class="hljs-built_in">isinstance</span>(val, <span class="hljs-built_in">str</span>):<br>                            s = val.strip()<br>                            <span class="hljs-comment"># 去掉逗号和空格</span><br>                            s2 = s.replace(<span class="hljs-string">&#x27;,&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>).replace(<span class="hljs-string">&#x27;，&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>).replace(<span class="hljs-string">&#x27; &#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>)<br>                            <span class="hljs-comment"># 只要开头包含数字就取连续数字</span><br>                            <span class="hljs-keyword">import</span> re<br>                            m = re.search(<span class="hljs-string">r&quot;(\d+)&quot;</span>, s2)<br>                            <span class="hljs-keyword">if</span> m:<br>                                parsed = <span class="hljs-built_in">int</span>(m.group(<span class="hljs-number">1</span>))<br>                    <span class="hljs-keyword">except</span> Exception:<br>                        parsed = <span class="hljs-literal">None</span><br><br>                    <span class="hljs-keyword">if</span> parsed <span class="hljs-keyword">is</span> <span class="hljs-literal">None</span>:<br>                        <span class="hljs-comment"># 不是 int，记录日志并丢弃</span><br>                        <span class="hljs-keyword">try</span>:<br>                            <span class="hljs-variable language_">self</span>.api_manager.log_error(<span class="hljs-string">f&quot;平台 <span class="hljs-subst">&#123;name&#125;</span> 返回的粉丝数无法解析: <span class="hljs-subst">&#123;<span class="hljs-built_in">repr</span>(val)&#125;</span> (url: <span class="hljs-subst">&#123;req_url&#125;</span>)&quot;</span>)<br>                        <span class="hljs-keyword">except</span> Exception:<br>                            <span class="hljs-keyword">pass</span><br>                        <span class="hljs-keyword">continue</span><br><br>                    results[name] = <span class="hljs-built_in">int</span>(parsed)<br>                <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>                    <span class="hljs-keyword">try</span>:<br>                        <span class="hljs-variable language_">self</span>.api_manager.log_error(<span class="hljs-string">f&quot;处理平台配置出错: <span class="hljs-subst">&#123;<span class="hljs-built_in">repr</span>(e)&#125;</span>\n配置: <span class="hljs-subst">&#123;cfg&#125;</span>&quot;</span>)<br>                    <span class="hljs-keyword">except</span> Exception:<br>                        <span class="hljs-keyword">pass</span><br>                    <span class="hljs-keyword">continue</span><br><br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-variable language_">self</span>.error_occurred.emit(<span class="hljs-string">f&quot;获取粉丝数线程失败: <span class="hljs-subst">&#123;<span class="hljs-built_in">repr</span>(e)&#125;</span>&quot;</span>)<br>            <span class="hljs-keyword">except</span> Exception:<br>                <span class="hljs-keyword">pass</span><br>        <span class="hljs-comment"># 发出结果（可能为空）</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.fans_ready.emit(results)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br><br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">AnimatedDigit</span>(<span class="hljs-title class_ inherited__">QWidget</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, ch=<span class="hljs-string">&#x27;0&#x27;</span>, parent=<span class="hljs-literal">None</span>, font_size=<span class="hljs-number">36</span>, width=<span class="hljs-number">30</span>, height=<span class="hljs-number">60</span></span>):<br>        <span class="hljs-built_in">super</span>().__init__(parent)<br>        <span class="hljs-comment"># 先创建字体并用字体度量决定最小宽度，避免传入的 width 太小导致字符被裁剪</span><br>        <span class="hljs-variable language_">self</span>.font = QFont()<br>        <span class="hljs-variable language_">self</span>.font.setPointSize(font_size)<br>        fm = QFontMetrics(<span class="hljs-variable language_">self</span>.font)<br>        minw = fm.horizontalAdvance(<span class="hljs-string">&#x27;0&#x27;</span>) + <span class="hljs-number">8</span><br>        <span class="hljs-comment"># 保证宽度至少为字符最小宽度</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.width = <span class="hljs-built_in">max</span>(width <span class="hljs-keyword">or</span> <span class="hljs-number">0</span>, minw)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-variable language_">self</span>.width = <span class="hljs-built_in">max</span>(<span class="hljs-number">30</span>, minw)<br>        <span class="hljs-variable language_">self</span>.height = height<br>        <span class="hljs-variable language_">self</span>.setFixedSize(<span class="hljs-variable language_">self</span>.width, <span class="hljs-variable language_">self</span>.height)<br><br>        <span class="hljs-comment"># 两个标签用于滚动动画：old 在上，新在下；给标签增加一点内边距，减少裁剪风险</span><br>        <span class="hljs-variable language_">self</span>.label_old = QLabel(<span class="hljs-variable language_">self</span>)<br>        <span class="hljs-variable language_">self</span>.label_old.setAlignment(Qt.AlignCenter)<br>        <span class="hljs-variable language_">self</span>.label_old.setFont(<span class="hljs-variable language_">self</span>.font)<br>        <span class="hljs-variable language_">self</span>.label_old.setContentsMargins(<span class="hljs-number">4</span>, <span class="hljs-number">0</span>, <span class="hljs-number">4</span>, <span class="hljs-number">0</span>)<br>        <span class="hljs-variable language_">self</span>.label_old.setGeometry(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-variable language_">self</span>.width, <span class="hljs-variable language_">self</span>.height)<br><br>        <span class="hljs-variable language_">self</span>.label_new = QLabel(<span class="hljs-variable language_">self</span>)<br>        <span class="hljs-variable language_">self</span>.label_new.setAlignment(Qt.AlignCenter)<br>        <span class="hljs-variable language_">self</span>.label_new.setFont(<span class="hljs-variable language_">self</span>.font)<br>        <span class="hljs-variable language_">self</span>.label_new.setContentsMargins(<span class="hljs-number">4</span>, <span class="hljs-number">0</span>, <span class="hljs-number">4</span>, <span class="hljs-number">0</span>)<br>        <span class="hljs-variable language_">self</span>.label_new.setGeometry(<span class="hljs-number">0</span>, <span class="hljs-variable language_">self</span>.height, <span class="hljs-variable language_">self</span>.width, <span class="hljs-variable language_">self</span>.height)<br><br>        <span class="hljs-variable language_">self</span>.current = <span class="hljs-built_in">str</span>(ch)<br>        <span class="hljs-variable language_">self</span>.label_old.setText(<span class="hljs-variable language_">self</span>.current)<br>        <span class="hljs-variable language_">self</span>.anim_old = <span class="hljs-literal">None</span><br>        <span class="hljs-variable language_">self</span>.anim_new = <span class="hljs-literal">None</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">animate_to</span>(<span class="hljs-params">self, new_ch: <span class="hljs-built_in">str</span>, duration=<span class="hljs-number">400</span></span>):<br>        new_ch = <span class="hljs-built_in">str</span>(new_ch)<br>        <span class="hljs-keyword">if</span> new_ch == <span class="hljs-variable language_">self</span>.current:<br>            <span class="hljs-keyword">return</span><br>        <span class="hljs-comment"># 准备标签内容与位置</span><br>        <span class="hljs-variable language_">self</span>.label_old.setText(<span class="hljs-variable language_">self</span>.current)<br>        <span class="hljs-variable language_">self</span>.label_old.move(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>)<br>        <span class="hljs-variable language_">self</span>.label_new.setText(new_ch)<br>        <span class="hljs-variable language_">self</span>.label_new.move(<span class="hljs-number">0</span>, <span class="hljs-variable language_">self</span>.height)<br><br>        <span class="hljs-comment"># 动画：old 向上移出，新从下移入</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.anim_old = QPropertyAnimation(<span class="hljs-variable language_">self</span>.label_old, <span class="hljs-string">b&#x27;pos&#x27;</span>)<br>            <span class="hljs-variable language_">self</span>.anim_old.setDuration(duration)<br>            <span class="hljs-variable language_">self</span>.anim_old.setStartValue(QPoint(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>))<br>            <span class="hljs-variable language_">self</span>.anim_old.setEndValue(QPoint(<span class="hljs-number">0</span>, -<span class="hljs-variable language_">self</span>.height))<br>            <span class="hljs-variable language_">self</span>.anim_old.setEasingCurve(QEasingCurve.OutCubic)<br><br>            <span class="hljs-variable language_">self</span>.anim_new = QPropertyAnimation(<span class="hljs-variable language_">self</span>.label_new, <span class="hljs-string">b&#x27;pos&#x27;</span>)<br>            <span class="hljs-variable language_">self</span>.anim_new.setDuration(duration)<br>            <span class="hljs-variable language_">self</span>.anim_new.setStartValue(QPoint(<span class="hljs-number">0</span>, <span class="hljs-variable language_">self</span>.height))<br>            <span class="hljs-variable language_">self</span>.anim_new.setEndValue(QPoint(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>))<br>            <span class="hljs-variable language_">self</span>.anim_new.setEasingCurve(QEasingCurve.OutCubic)<br><br>            <span class="hljs-comment"># 启动动画</span><br>            <span class="hljs-variable language_">self</span>.anim_old.start()<br>            <span class="hljs-variable language_">self</span>.anim_new.start()<br><br>            <span class="hljs-comment"># 动画结束时更新状态</span><br>            <span class="hljs-keyword">def</span> <span class="hljs-title function_">on_finished</span>():<br>                <span class="hljs-keyword">try</span>:<br>                    <span class="hljs-variable language_">self</span>.current = new_ch<br>                    <span class="hljs-variable language_">self</span>.label_old.setText(<span class="hljs-variable language_">self</span>.current)<br>                    <span class="hljs-variable language_">self</span>.label_old.move(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>)<br>                    <span class="hljs-variable language_">self</span>.label_new.move(<span class="hljs-number">0</span>, <span class="hljs-variable language_">self</span>.height)<br>                <span class="hljs-keyword">except</span> Exception:<br>                    <span class="hljs-keyword">pass</span><br><br>            <span class="hljs-comment"># 通过连接 anim_new.finished</span><br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-variable language_">self</span>.anim_new.finished.connect(on_finished)<br>            <span class="hljs-keyword">except</span> Exception:<br>                on_finished()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-comment"># 回退：直接替换文本</span><br>            <span class="hljs-variable language_">self</span>.current = new_ch<br>            <span class="hljs-variable language_">self</span>.label_old.setText(<span class="hljs-variable language_">self</span>.current)<br>            <span class="hljs-variable language_">self</span>.label_old.move(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>)<br>            <span class="hljs-variable language_">self</span>.label_new.move(<span class="hljs-number">0</span>, <span class="hljs-variable language_">self</span>.height)<br><br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">AnimatedNumberWidget</span>(<span class="hljs-title class_ inherited__">QWidget</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, parent=<span class="hljs-literal">None</span>, font_size=<span class="hljs-number">48</span>, digit_width=<span class="hljs-number">30</span>, digit_height=<span class="hljs-number">60</span>, spacing=<span class="hljs-number">4</span></span>):<br>        <span class="hljs-built_in">super</span>().__init__(parent)<br>        <span class="hljs-variable language_">self</span>.font_size = font_size<br>        <span class="hljs-variable language_">self</span>.digit_width = digit_width<br>        <span class="hljs-variable language_">self</span>.digit_height = digit_height<br>        <span class="hljs-variable language_">self</span>.spacing = spacing<br>        <span class="hljs-variable language_">self</span>.digits = []<br>        <span class="hljs-variable language_">self</span>.value = <span class="hljs-number">0</span><br>        <span class="hljs-variable language_">self</span>.container = QWidget(<span class="hljs-variable language_">self</span>)<br>        <span class="hljs-variable language_">self</span>.hbox = QHBoxLayout(<span class="hljs-variable language_">self</span>.container)<br>        <span class="hljs-variable language_">self</span>.hbox.setContentsMargins(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>)<br>        <span class="hljs-variable language_">self</span>.hbox.setSpacing(<span class="hljs-variable language_">self</span>.spacing)<br>        layout = QVBoxLayout(<span class="hljs-variable language_">self</span>)<br>        layout.setContentsMargins(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>)<br>        layout.addWidget(<span class="hljs-variable language_">self</span>.container)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">set_value</span>(<span class="hljs-params">self, val: <span class="hljs-built_in">int</span></span>):<br>        <span class="hljs-keyword">try</span>:<br>            val = <span class="hljs-built_in">int</span>(val)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">return</span><br>        s = <span class="hljs-built_in">str</span>(val)[::-<span class="hljs-number">1</span>]<br>        <span class="hljs-variable language_">self</span>._ensure_digits(<span class="hljs-built_in">len</span>(s))<br>        <span class="hljs-comment"># 更新每位</span><br>        <span class="hljs-keyword">for</span> i, ch <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(s.rjust(<span class="hljs-built_in">len</span>(<span class="hljs-variable language_">self</span>.digits), <span class="hljs-string">&#x27;0&#x27;</span>)):<br>            <span class="hljs-variable language_">self</span>.digits[i].animate_to(ch)<br>        <span class="hljs-variable language_">self</span>.value = val<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_ensure_digits</span>(<span class="hljs-params">self, n: <span class="hljs-built_in">int</span></span>):<br>        <span class="hljs-comment"># 如果当前位数不足则增加</span><br>        <span class="hljs-keyword">while</span> <span class="hljs-built_in">len</span>(<span class="hljs-variable language_">self</span>.digits) &lt; n:<br>            d = AnimatedDigit(<span class="hljs-string">&#x27;0&#x27;</span>, parent=<span class="hljs-variable language_">self</span>.container, font_size=<span class="hljs-variable language_">self</span>.font_size, width=<span class="hljs-variable language_">self</span>.digit_width, height=<span class="hljs-variable language_">self</span>.digit_height)<br>            <span class="hljs-variable language_">self</span>.hbox.addWidget(d)<br>            <span class="hljs-variable language_">self</span>.digits.insert(<span class="hljs-number">0</span>, d)  <span class="hljs-comment"># 在左侧插入（高位）</span><br>        <span class="hljs-comment"># 如果比需要多，则移除左侧多余位</span><br>        <span class="hljs-keyword">while</span> <span class="hljs-built_in">len</span>(<span class="hljs-variable language_">self</span>.digits) &gt; n:<br>            w = <span class="hljs-variable language_">self</span>.digits.pop(<span class="hljs-number">0</span>)<br>            w.setParent(<span class="hljs-literal">None</span>)<br>            w.deleteLater()<br><br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">SettingsWindow</span>(<span class="hljs-title class_ inherited__">QMainWindow</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, api_manager, parent=<span class="hljs-literal">None</span></span>):<br>        <span class="hljs-built_in">super</span>().__init__(parent)<br>        <span class="hljs-variable language_">self</span>.api_manager = api_manager<br>        <span class="hljs-variable language_">self</span>.current_nav_key = <span class="hljs-string">&quot;basic&quot;</span><br>        <span class="hljs-variable language_">self</span>.setup_ui()<br>        <span class="hljs-variable language_">self</span>.apply_theme_to_settings(api_manager.theme_mode)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">setup_ui</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.setWindowTitle(<span class="hljs-string">&quot;设置 - MySub&quot;</span>)<br>        <span class="hljs-variable language_">self</span>.setFixedSize(<span class="hljs-number">800</span>, <span class="hljs-number">600</span>)<br>        <br>        central_widget = QWidget()<br>        <span class="hljs-variable language_">self</span>.setCentralWidget(central_widget)<br>        main_layout = QHBoxLayout(central_widget)<br>        main_layout.setContentsMargins(<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>)<br>        main_layout.setSpacing(<span class="hljs-number">0</span>)<br>        <br>        <span class="hljs-comment"># 左侧导航栏</span><br>        <span class="hljs-variable language_">self</span>.sidebar = QWidget()<br>        <span class="hljs-variable language_">self</span>.sidebar.setFixedWidth(<span class="hljs-number">200</span>)<br>        sidebar_layout = QVBoxLayout(<span class="hljs-variable language_">self</span>.sidebar)<br>        sidebar_layout.setContentsMargins(<span class="hljs-number">0</span>, <span class="hljs-number">20</span>, <span class="hljs-number">0</span>, <span class="hljs-number">20</span>)<br>        sidebar_layout.setSpacing(<span class="hljs-number">0</span>)<br>        <br>        <span class="hljs-comment"># 设置标题</span><br>        settings_title = QLabel(<span class="hljs-string">&quot;设置&quot;</span>)<br>        settings_title.setObjectName(<span class="hljs-string">&quot;settings_title&quot;</span>)<br>        settings_title.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">            QLabel#settings_title &#123;</span><br><span class="hljs-string">                font-size: 18px;</span><br><span class="hljs-string">                font-weight: bold;</span><br><span class="hljs-string">                padding: 15px 20px;</span><br><span class="hljs-string">            &#125;</span><br><span class="hljs-string">        &quot;&quot;&quot;</span>)<br>        sidebar_layout.addWidget(settings_title)<br>        <br>        <span class="hljs-comment"># 导航按钮</span><br>        <span class="hljs-variable language_">self</span>.nav_buttons = &#123;&#125;<br>        nav_items = [<br>            (<span class="hljs-string">&quot;基础设置&quot;</span>, <span class="hljs-string">&quot;basic&quot;</span>),<br>            (<span class="hljs-string">&quot;粉丝数API&quot;</span>, <span class="hljs-string">&quot;fans_api&quot;</span>),<br>            (<span class="hljs-string">&quot;关于&quot;</span>, <span class="hljs-string">&quot;about&quot;</span>)<br>        ]<br>        <br>        <span class="hljs-keyword">for</span> text, key <span class="hljs-keyword">in</span> nav_items:<br>            btn = QPushButton(text)<br>            btn.setFixedHeight(<span class="hljs-number">45</span>)<br>            btn.setObjectName(<span class="hljs-string">&quot;nav_button&quot;</span>)<br>            btn.setProperty(<span class="hljs-string">&#x27;nav_key&#x27;</span>, key)<br>            btn.clicked.connect(<span class="hljs-variable language_">self</span>.on_nav_click)<br>            sidebar_layout.addWidget(btn)<br>            <span class="hljs-variable language_">self</span>.nav_buttons[key] = btn<br>        <br>        sidebar_layout.addStretch()<br>        main_layout.addWidget(<span class="hljs-variable language_">self</span>.sidebar)<br>        <br>        <span class="hljs-comment"># 右侧内容区域</span><br>        <span class="hljs-variable language_">self</span>.content_stack = QStackedWidget()<br>        <span class="hljs-variable language_">self</span>.content_stack.setObjectName(<span class="hljs-string">&quot;content_stack&quot;</span>)<br>        <br>        <span class="hljs-comment"># 创建各个设置页面</span><br>        <span class="hljs-variable language_">self</span>.basic_page = <span class="hljs-variable language_">self</span>.create_basic_page()<br>        <span class="hljs-variable language_">self</span>.fans_api_page = <span class="hljs-variable language_">self</span>.create_fans_api_page()<br>        <span class="hljs-variable language_">self</span>.about_page = <span class="hljs-variable language_">self</span>.create_about_page()<br><br>        <span class="hljs-variable language_">self</span>.content_stack.addWidget(<span class="hljs-variable language_">self</span>.basic_page)<br>        <span class="hljs-variable language_">self</span>.content_stack.addWidget(<span class="hljs-variable language_">self</span>.fans_api_page)<br>        <span class="hljs-variable language_">self</span>.content_stack.addWidget(<span class="hljs-variable language_">self</span>.about_page)<br>        <br>        main_layout.addWidget(<span class="hljs-variable language_">self</span>.content_stack)<br>        <br>        <span class="hljs-comment"># 默认选中基础设置</span><br>        <span class="hljs-variable language_">self</span>.update_nav_style()<br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">create_basic_page</span>(<span class="hljs-params">self</span>):<br>        widget = QWidget()<br>        layout = QVBoxLayout(widget)<br>        layout.setContentsMargins(<span class="hljs-number">30</span>, <span class="hljs-number">30</span>, <span class="hljs-number">30</span>, <span class="hljs-number">30</span>)<br>        <br>        title = QLabel(<span class="hljs-string">&quot;基础设置&quot;</span>)<br>        title.setObjectName(<span class="hljs-string">&quot;page_title&quot;</span>)<br>        title.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">            QLabel#page_title &#123;</span><br><span class="hljs-string">                font-size: 24px;</span><br><span class="hljs-string">                font-weight: bold;</span><br><span class="hljs-string">                margin-bottom: 20px;</span><br><span class="hljs-string">            &#125;</span><br><span class="hljs-string">        &quot;&quot;&quot;</span>)<br>        layout.addWidget(title)<br>        <br>        <span class="hljs-comment"># 主题设置</span><br>        theme_label = QLabel(<span class="hljs-string">&quot;主题模式&quot;</span>)<br>        theme_label.setObjectName(<span class="hljs-string">&quot;section_title&quot;</span>)<br>        theme_label.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">            QLabel#section_title &#123;</span><br><span class="hljs-string">                font-size: 16px;</span><br><span class="hljs-string">                font-weight: bold;</span><br><span class="hljs-string">                margin-top: 20px;</span><br><span class="hljs-string">            &#125;</span><br><span class="hljs-string">        &quot;&quot;&quot;</span>)<br>        layout.addWidget(theme_label)<br>        <br>        <span class="hljs-variable language_">self</span>.theme_combo = QComboBox()<br>        <span class="hljs-variable language_">self</span>.theme_combo.addItems([<span class="hljs-string">&quot;浅色模式&quot;</span>, <span class="hljs-string">&quot;深色模式&quot;</span>, <span class="hljs-string">&quot;跟随系统&quot;</span>])<br>        <span class="hljs-comment"># 设置当前主题</span><br>        <span class="hljs-keyword">if</span> <span class="hljs-variable language_">self</span>.api_manager.theme_mode == <span class="hljs-string">&quot;light&quot;</span>:<br>            <span class="hljs-variable language_">self</span>.theme_combo.setCurrentText(<span class="hljs-string">&quot;浅色模式&quot;</span>)<br>        <span class="hljs-keyword">elif</span> <span class="hljs-variable language_">self</span>.api_manager.theme_mode == <span class="hljs-string">&quot;dark&quot;</span>:<br>            <span class="hljs-variable language_">self</span>.theme_combo.setCurrentText(<span class="hljs-string">&quot;深色模式&quot;</span>)<br>        <span class="hljs-keyword">else</span>:<br>            <span class="hljs-variable language_">self</span>.theme_combo.setCurrentText(<span class="hljs-string">&quot;跟随系统&quot;</span>)<br>            <br>        <span class="hljs-variable language_">self</span>.theme_combo.setObjectName(<span class="hljs-string">&quot;theme_combo&quot;</span>)<br>        <span class="hljs-variable language_">self</span>.theme_combo.currentTextChanged.connect(<span class="hljs-variable language_">self</span>.on_theme_changed)<br>        layout.addWidget(<span class="hljs-variable language_">self</span>.theme_combo)<br>        <br>        <span class="hljs-comment"># 获取冷却设置（秒）</span><br>        cooldown_label = QLabel(<span class="hljs-string">&quot;获取冷却（秒）&quot;</span>)<br>        cooldown_label.setObjectName(<span class="hljs-string">&quot;section_title&quot;</span>)<br>        layout.addWidget(cooldown_label)<br><br>        <span class="hljs-variable language_">self</span>.cooldown_spin = QSpinBox()<br>        <span class="hljs-variable language_">self</span>.cooldown_spin.setRange(<span class="hljs-number">1</span>, <span class="hljs-number">86400</span>)<br>        <span class="hljs-variable language_">self</span>.cooldown_spin.setValue(<span class="hljs-built_in">int</span>(<span class="hljs-built_in">getattr</span>(<span class="hljs-variable language_">self</span>.api_manager, <span class="hljs-string">&#x27;cooldown&#x27;</span>, <span class="hljs-number">60</span>)))<br>        <span class="hljs-variable language_">self</span>.cooldown_spin.setSuffix(<span class="hljs-string">&#x27; s&#x27;</span>)<br>        <span class="hljs-variable language_">self</span>.cooldown_spin.valueChanged.connect(<span class="hljs-variable language_">self</span>._on_cooldown_changed)<br>        layout.addWidget(<span class="hljs-variable language_">self</span>.cooldown_spin)<br><br>        <span class="hljs-comment"># 用户名设置</span><br>        username_label = QLabel(<span class="hljs-string">&quot;用户名&quot;</span>)<br>        username_label.setObjectName(<span class="hljs-string">&quot;section_title&quot;</span>)<br>        layout.addWidget(username_label)<br><br>        <span class="hljs-variable language_">self</span>.username_edit = QLineEdit()<br>        <span class="hljs-variable language_">self</span>.username_edit.setText(<span class="hljs-built_in">getattr</span>(<span class="hljs-variable language_">self</span>.api_manager, <span class="hljs-string">&#x27;username&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>)<br>        <span class="hljs-variable language_">self</span>.username_edit.setPlaceholderText(<span class="hljs-string">&#x27;输入要显示的用户名&#x27;</span>)<br>        <span class="hljs-variable language_">self</span>.username_edit.editingFinished.connect(<span class="hljs-variable language_">self</span>._on_username_changed)<br>        layout.addWidget(<span class="hljs-variable language_">self</span>.username_edit)<br>        <br>        layout.addStretch()<br>        <span class="hljs-keyword">return</span> widget<br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">create_fans_api_page</span>(<span class="hljs-params">self</span>):<br>        widget = QWidget()<br>        layout = QVBoxLayout(widget)<br>        layout.setContentsMargins(<span class="hljs-number">30</span>, <span class="hljs-number">30</span>, <span class="hljs-number">30</span>, <span class="hljs-number">30</span>)<br><br>        title = QLabel(<span class="hljs-string">&quot;粉丝数 API 设置&quot;</span>)<br>        title.setObjectName(<span class="hljs-string">&quot;page_title&quot;</span>)<br>        layout.addWidget(title)<br><br>        info = QLabel(<span class="hljs-string">&quot;配置每个平台的粉丝数 API。APIURL 需要包含 &#123;apikey&#125; 占位符，支持 &#123;username&#125; 占位符。&quot;</span>)<br>        layout.addWidget(info)<br><br>        <span class="hljs-comment"># 表格（名称、APIURL、APIKEY、粉丝数路径）</span><br>        <span class="hljs-variable language_">self</span>.api_table = QTableWidget(<span class="hljs-built_in">len</span>(<span class="hljs-variable language_">self</span>.api_manager.fans_apis), <span class="hljs-number">4</span>)<br>        <span class="hljs-variable language_">self</span>.api_table.setHorizontalHeaderLabels([<span class="hljs-string">&quot;名称&quot;</span>, <span class="hljs-string">&quot;APIURL&quot;</span>, <span class="hljs-string">&quot;APIKEY&quot;</span>, <span class="hljs-string">&quot;粉丝数路径&quot;</span>])<br>        <span class="hljs-variable language_">self</span>.api_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)<br>        <span class="hljs-variable language_">self</span>.api_table.setEditTriggers(QAbstractItemView.AllEditTriggers)<br><br>        <span class="hljs-comment"># 填充数据</span><br>        <span class="hljs-keyword">for</span> row, cfg <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(<span class="hljs-variable language_">self</span>.api_manager.fans_apis):<br>            name_item = QTableWidgetItem(cfg.get(<span class="hljs-string">&#x27;name&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>))<br>            apiurl_item = QTableWidgetItem(cfg.get(<span class="hljs-string">&#x27;api_url&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>))<br>            apikey_item = QTableWidgetItem(cfg.get(<span class="hljs-string">&#x27;api_key&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>))<br>            fans_path_item = QTableWidgetItem(cfg.get(<span class="hljs-string">&#x27;fans_path&#x27;</span>, <span class="hljs-string">&#x27;&#x27;</span>))<br>            <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">0</span>, name_item)<br>            <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">1</span>, apiurl_item)<br>            <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">2</span>, apikey_item)<br>            <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">3</span>, fans_path_item)<br><br>        layout.addWidget(<span class="hljs-variable language_">self</span>.api_table)<br><br>        <span class="hljs-comment"># 添加和删除按钮</span><br>        api_btn_layout = QHBoxLayout()<br>        add_api_btn = QPushButton(<span class="hljs-string">&quot;+ 添加&quot;</span>)<br>        delete_api_btn = QPushButton(<span class="hljs-string">&quot;- 删除选中&quot;</span>)<br>        add_api_btn.clicked.connect(<span class="hljs-variable language_">self</span>.add_api_item)<br>        delete_api_btn.clicked.connect(<span class="hljs-variable language_">self</span>.delete_api_item)<br>        api_btn_layout.addWidget(add_api_btn)<br>        api_btn_layout.addWidget(delete_api_btn)<br>        api_btn_layout.addStretch()<br>        layout.addLayout(api_btn_layout)<br><br>        <span class="hljs-comment"># 自动保存：响应表格变化，不需要保存按钮</span><br>        <span class="hljs-variable language_">self</span>.api_table.itemChanged.connect(<span class="hljs-variable language_">self</span>.on_api_table_changed)<br><br>        layout.addStretch()<br>        <span class="hljs-keyword">return</span> widget<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">add_api_item</span>(<span class="hljs-params">self</span>):<br>        row = <span class="hljs-variable language_">self</span>.api_table.rowCount()<br>        <span class="hljs-variable language_">self</span>.api_table.insertRow(row)<br>        name_item = QTableWidgetItem(<span class="hljs-string">&quot;&quot;</span>)<br>        apiurl_item = QTableWidgetItem(<span class="hljs-string">&quot;&quot;</span>)<br>        apikey_item = QTableWidgetItem(<span class="hljs-string">&quot;&quot;</span>)<br>        fans_path_item = QTableWidgetItem(<span class="hljs-string">&quot;&quot;</span>)<br>        <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">0</span>, name_item)<br>        <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">1</span>, apiurl_item)<br>        <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">2</span>, apikey_item)<br>        <span class="hljs-variable language_">self</span>.api_table.setItem(row, <span class="hljs-number">3</span>, fans_path_item)<br>        <span class="hljs-variable language_">self</span>.on_api_table_changed()<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">delete_api_item</span>(<span class="hljs-params">self</span>):<br>        current_row = <span class="hljs-variable language_">self</span>.api_table.currentRow()<br>        <span class="hljs-keyword">if</span> current_row &gt;= <span class="hljs-number">0</span>:<br>            <span class="hljs-variable language_">self</span>.api_table.removeRow(current_row)<br>            <span class="hljs-variable language_">self</span>.on_api_table_changed()<br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">create_about_page</span>(<span class="hljs-params">self</span>):<br>        widget = QWidget()<br>        layout = QVBoxLayout(widget)<br>        layout.setContentsMargins(<span class="hljs-number">30</span>, <span class="hljs-number">30</span>, <span class="hljs-number">30</span>, <span class="hljs-number">30</span>)<br>        <br>        title = QLabel(<span class="hljs-string">&quot;关于 MySub&quot;</span>)<br>        title.setObjectName(<span class="hljs-string">&quot;page_title&quot;</span>)<br>        layout.addWidget(title)<br>        <br>        about_text = QLabel(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">        &lt;h3&gt;粉丝聚合器&lt;/h3&gt;</span><br><span class="hljs-string">        &lt;p&gt;本程序可按配置定时从多个平台获取粉丝数并聚合显示。&lt;/p&gt;</span><br><span class="hljs-string">        &lt;br&gt;</span><br><span class="hljs-string">        &lt;p&gt;&lt;b&gt;版本:&lt;/b&gt; 1.0.0&lt;/p&gt;</span><br><span class="hljs-string">        &lt;p&gt;&lt;b&gt;开发者:&lt;/b&gt; Qiufeng&lt;/p&gt;</span><br><span class="hljs-string">        &lt;p&gt;&lt;b&gt;说明:&lt;/b&gt; 在设置中配置每个平台的 APIURL、APIKEY 与粉丝数 JSON 路径（或直接解析文本），支持 URL 中使用 &lt;code&gt;&#123;apikey&#125;&lt;/code&gt; 和 &lt;code&gt;&#123;username&#125;&lt;/code&gt; 占位符。&lt;/p&gt;</span><br><span class="hljs-string">        &lt;br&gt;</span><br><span class="hljs-string">        &lt;p&gt;获取到的非整数结果将被丢弃并记录日志。&lt;/p&gt;</span><br><span class="hljs-string">        &quot;&quot;&quot;</span>)<br>        about_text.setWordWrap(<span class="hljs-literal">True</span>)<br>        layout.addWidget(about_text)<br>        <br>        layout.addStretch()<br>        <span class="hljs-keyword">return</span> widget<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">on_api_table_changed</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-comment"># 从 api_table 重建粉丝数 API 列表并保存</span><br>        fps = []<br>        <span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-variable language_">self</span>.api_table.rowCount()):<br>            name_item = <span class="hljs-variable language_">self</span>.api_table.item(row, <span class="hljs-number">0</span>)<br>            api_url_item = <span class="hljs-variable language_">self</span>.api_table.item(row, <span class="hljs-number">1</span>)<br>            api_key_item = <span class="hljs-variable language_">self</span>.api_table.item(row, <span class="hljs-number">2</span>)<br>            fans_path_item = <span class="hljs-variable language_">self</span>.api_table.item(row, <span class="hljs-number">3</span>)<br>            <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> name_item:<br>                <span class="hljs-keyword">continue</span><br>            name = name_item.text()<br>            api_url = api_url_item.text() <span class="hljs-keyword">if</span> api_url_item <span class="hljs-keyword">else</span> <span class="hljs-string">&#x27;&#x27;</span><br>            api_key = api_key_item.text() <span class="hljs-keyword">if</span> api_key_item <span class="hljs-keyword">else</span> <span class="hljs-string">&#x27;&#x27;</span><br>            fans_path = fans_path_item.text() <span class="hljs-keyword">if</span> fans_path_item <span class="hljs-keyword">else</span> <span class="hljs-string">&#x27;&#x27;</span><br>            fps.append(&#123;<span class="hljs-string">&#x27;name&#x27;</span>: name, <span class="hljs-string">&#x27;api_url&#x27;</span>: api_url, <span class="hljs-string">&#x27;api_key&#x27;</span>: api_key, <span class="hljs-string">&#x27;fans_path&#x27;</span>: fans_path&#125;)<br><br>        <span class="hljs-comment"># 覆盖并保存</span><br>        <span class="hljs-variable language_">self</span>.api_manager.fans_apis = fps<br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.api_manager.save_settings()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">on_nav_click</span>(<span class="hljs-params">self</span>):<br>        button = <span class="hljs-variable language_">self</span>.sender()<br>        new_nav_key = button.<span class="hljs-built_in">property</span>(<span class="hljs-string">&#x27;nav_key&#x27;</span>)<br>        <br>        <span class="hljs-keyword">if</span> new_nav_key != <span class="hljs-variable language_">self</span>.current_nav_key:<br>            <span class="hljs-variable language_">self</span>.current_nav_key = new_nav_key<br>            <span class="hljs-variable language_">self</span>.update_nav_style()<br>            <br>            page_index = &#123;<br>                <span class="hljs-string">&quot;basic&quot;</span>: <span class="hljs-number">0</span>, <span class="hljs-string">&quot;fans_api&quot;</span>: <span class="hljs-number">1</span>, <span class="hljs-string">&quot;about&quot;</span>: <span class="hljs-number">2</span><br>            &#125;[new_nav_key]<br>            <span class="hljs-variable language_">self</span>.content_stack.setCurrentIndex(page_index)<br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">update_nav_style</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">for</span> key, btn <span class="hljs-keyword">in</span> <span class="hljs-variable language_">self</span>.nav_buttons.items():<br>            <span class="hljs-keyword">if</span> key == <span class="hljs-variable language_">self</span>.current_nav_key:<br>                btn.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                    QPushButton &#123;</span><br><span class="hljs-string">                        text-align: left;</span><br><span class="hljs-string">                        padding: 12px 20px;</span><br><span class="hljs-string">                        border: none;</span><br><span class="hljs-string">                        background-color: #1a73e8;</span><br><span class="hljs-string">                        color: white;</span><br><span class="hljs-string">                        font-size: 14px;</span><br><span class="hljs-string">                        border-radius: 0px;</span><br><span class="hljs-string">                    &#125;</span><br><span class="hljs-string">                &quot;&quot;&quot;</span>)<br>            <span class="hljs-keyword">else</span>:<br>                btn.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                    QPushButton &#123;</span><br><span class="hljs-string">                        text-align: left;</span><br><span class="hljs-string">                        padding: 12px 20px;</span><br><span class="hljs-string">                        border: none;</span><br><span class="hljs-string">                        background-color: transparent;</span><br><span class="hljs-string">                        color: #666;</span><br><span class="hljs-string">                        font-size: 14px;</span><br><span class="hljs-string">                        border-radius: 0px;</span><br><span class="hljs-string">                    &#125;</span><br><span class="hljs-string">                    QPushButton:hover &#123;</span><br><span class="hljs-string">                        background-color: #e8f0fe;</span><br><span class="hljs-string">                        color: #1a73e8;</span><br><span class="hljs-string">                    &#125;</span><br><span class="hljs-string">                &quot;&quot;&quot;</span>)<br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">on_theme_changed</span>(<span class="hljs-params">self, theme_text</span>):<br>        <span class="hljs-keyword">if</span> theme_text == <span class="hljs-string">&quot;浅色模式&quot;</span>:<br>            theme = <span class="hljs-string">&quot;light&quot;</span><br>        <span class="hljs-keyword">elif</span> theme_text == <span class="hljs-string">&quot;深色模式&quot;</span>:<br>            theme = <span class="hljs-string">&quot;dark&quot;</span><br>        <span class="hljs-keyword">else</span>:  <span class="hljs-comment"># 跟随系统</span><br>            theme = <span class="hljs-string">&quot;system&quot;</span><br>        <span class="hljs-variable language_">self</span>.api_manager.theme_mode = theme<br>        <span class="hljs-keyword">if</span> <span class="hljs-variable language_">self</span>.parent():<br>            <span class="hljs-variable language_">self</span>.parent().apply_theme(theme)<br>        <span class="hljs-variable language_">self</span>.apply_theme_to_settings(theme)<br>        <span class="hljs-comment"># 主题更改后自动保存设置</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.api_manager.save_settings()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_on_cooldown_changed</span>(<span class="hljs-params">self, v</span>):<br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.api_manager.cooldown = <span class="hljs-built_in">int</span>(v)<br>            <span class="hljs-variable language_">self</span>.api_manager.save_settings()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">_on_username_changed</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.api_manager.username = (<span class="hljs-variable language_">self</span>.username_edit.text() <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>).strip()<br>            <span class="hljs-variable language_">self</span>.api_manager.save_settings()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>    <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">apply_theme_to_settings</span>(<span class="hljs-params">self, theme</span>):<br>        <span class="hljs-keyword">if</span> theme == <span class="hljs-string">&quot;light&quot;</span>:<br>            <span class="hljs-variable language_">self</span>.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                QMainWindow &#123;</span><br><span class="hljs-string">                    background-color: white;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QWidget#sidebar &#123;</span><br><span class="hljs-string">                    background-color: #f8f9fa;</span><br><span class="hljs-string">                    border-right: 1px solid #e0e0e0;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QLabel#settings_title &#123;</span><br><span class="hljs-string">                    color: #333;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QLabel#page_title, QLabel#section_title &#123;</span><br><span class="hljs-string">                    color: #333;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QStackedWidget#content_stack &#123;</span><br><span class="hljs-string">                    background-color: white;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QTableWidget &#123;</span><br><span class="hljs-string">                    background-color: white;</span><br><span class="hljs-string">                    color: black;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">            &quot;&quot;&quot;</span>)<br>        <span class="hljs-keyword">else</span>:<br>            <span class="hljs-variable language_">self</span>.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                QMainWindow &#123;</span><br><span class="hljs-string">                    background-color: #202124;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QWidget#sidebar &#123;</span><br><span class="hljs-string">                    background-color: #303134;</span><br><span class="hljs-string">                    border-right: 1px solid #5f6368;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QLabel#settings_title &#123;</span><br><span class="hljs-string">                    color: #e8eaed;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QLabel#page_title, QLabel#section_title &#123;</span><br><span class="hljs-string">                    color: #e8eaed;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QStackedWidget#content_stack &#123;</span><br><span class="hljs-string">                    background-color: #303134;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">                QTableWidget &#123;</span><br><span class="hljs-string">                    background-color: #303134;</span><br><span class="hljs-string">                    color: #e8eaed;</span><br><span class="hljs-string">                &#125;</span><br><span class="hljs-string">            &quot;&quot;&quot;</span>)<br><br><br><span class="hljs-keyword">class</span> <span class="hljs-title class_">MySubWindow</span>(<span class="hljs-title class_ inherited__">QMainWindow</span>):<br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-built_in">super</span>().__init__()<br>        <span class="hljs-variable language_">self</span>.api_manager = FansAPIManager()<br>        <span class="hljs-variable language_">self</span>.setup_ui()<br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">setup_ui</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.setWindowTitle(<span class="hljs-string">&quot;MySub&quot;</span>)<br>        <span class="hljs-variable language_">self</span>.setMinimumSize(<span class="hljs-number">1000</span>, <span class="hljs-number">700</span>)<br>        <br>        <span class="hljs-comment"># 创建中央部件</span><br>        <span class="hljs-variable language_">self</span>.central_widget = QWidget()<br>        <span class="hljs-variable language_">self</span>.setCentralWidget(<span class="hljs-variable language_">self</span>.central_widget)<br>        <span class="hljs-variable language_">self</span>.main_layout = QVBoxLayout(<span class="hljs-variable language_">self</span>.central_widget)<br>        <span class="hljs-variable language_">self</span>.main_layout.setContentsMargins(<span class="hljs-number">50</span>, <span class="hljs-number">30</span>, <span class="hljs-number">50</span>, <span class="hljs-number">20</span>)<br>        <span class="hljs-variable language_">self</span>.main_layout.setSpacing(<span class="hljs-number">0</span>)<br>        <br>        <span class="hljs-comment"># 顶部搜索区域</span><br>        <span class="hljs-variable language_">self</span>.setup_top_area()<br>        <br>        <span class="hljs-comment"># 主内容区域 - 现在为空</span><br>        <span class="hljs-variable language_">self</span>.setup_content_area()<br>        <br>        <span class="hljs-comment"># 底部区域</span><br>        <span class="hljs-variable language_">self</span>.setup_bottom_area()<br>        <br>        <span class="hljs-comment"># 应用主题</span><br>        <span class="hljs-variable language_">self</span>.apply_theme(<span class="hljs-variable language_">self</span>.api_manager.theme_mode)<br>        <span class="hljs-comment"># 粉丝数轮询定时器（基于设置中的 cooldown）</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.fans_timer = QTimer(<span class="hljs-variable language_">self</span>)<br>            <span class="hljs-variable language_">self</span>.fans_timer.setInterval(<span class="hljs-built_in">max</span>(<span class="hljs-number">1</span>, <span class="hljs-built_in">int</span>(<span class="hljs-variable language_">self</span>.api_manager.cooldown)) * <span class="hljs-number">1000</span>)<br>            <span class="hljs-variable language_">self</span>.fans_timer.timeout.connect(<span class="hljs-variable language_">self</span>.fetch_fans)<br>            <span class="hljs-comment"># 立即触发一次并开始定时</span><br>            <span class="hljs-variable language_">self</span>.fetch_fans()<br>            <span class="hljs-variable language_">self</span>.fans_timer.start()<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">setup_top_area</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-comment"># 顶部容器 - 始终居中上方</span><br>        <span class="hljs-variable language_">self</span>.top_container = QWidget()<br>        <span class="hljs-variable language_">self</span>.top_container.setFixedHeight(<span class="hljs-number">120</span>)<br>        top_layout = QVBoxLayout(<span class="hljs-variable language_">self</span>.top_container)<br>        top_layout.setAlignment(Qt.AlignCenter)<br>        <span class="hljs-comment"># 顶部显示用户名和粉丝总数（用户名位于上方，粉丝数位于中间下方）</span><br>        <span class="hljs-variable language_">self</span>.username_label = QLabel((<span class="hljs-variable language_">self</span>.api_manager.username <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>))<br>        <span class="hljs-variable language_">self</span>.username_label.setAlignment(Qt.AlignCenter)<br>        <span class="hljs-comment"># 不在这里固定文字颜色，让主题统一控制文本颜色（便于暗/亮模式切换）</span><br>        <span class="hljs-variable language_">self</span>.username_label.setStyleSheet(<span class="hljs-string">&quot;font-size: 28px; font-weight: bold;&quot;</span>)<br>        top_layout.addWidget(<span class="hljs-variable language_">self</span>.username_label)<br><br>        <span class="hljs-comment"># 粉丝数显示（动画数字）</span><br>        <span class="hljs-variable language_">self</span>.animated_number = AnimatedNumberWidget(parent=<span class="hljs-variable language_">self</span>.top_container, font_size=<span class="hljs-number">48</span>, digit_width=<span class="hljs-number">28</span>, digit_height=<span class="hljs-number">60</span>)<br>        <span class="hljs-comment"># 初始为 0</span><br>        <span class="hljs-variable language_">self</span>.animated_number.set_value(<span class="hljs-number">0</span>)<br>        top_layout.addWidget(<span class="hljs-variable language_">self</span>.animated_number)<br>        <br>        <span class="hljs-variable language_">self</span>.main_layout.addWidget(<span class="hljs-variable language_">self</span>.top_container)<br>        <br>        <span class="hljs-comment"># 设置按钮</span><br>        <span class="hljs-variable language_">self</span>.settings_btn = QPushButton(<span class="hljs-string">&quot;⚙️&quot;</span>)<br>        <span class="hljs-variable language_">self</span>.settings_btn.setFixedSize(<span class="hljs-number">40</span>, <span class="hljs-number">40</span>)<br>        <span class="hljs-variable language_">self</span>.settings_btn.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">            QPushButton &#123;</span><br><span class="hljs-string">                background-color: transparent;</span><br><span class="hljs-string">                border: 2px solid #dfe1e5;</span><br><span class="hljs-string">                border-radius: 20px;</span><br><span class="hljs-string">                font-size: 16px;</span><br><span class="hljs-string">            &#125;</span><br><span class="hljs-string">            QPushButton:hover &#123;</span><br><span class="hljs-string">                background-color: #f8f9fa;</span><br><span class="hljs-string">            &#125;</span><br><span class="hljs-string">        &quot;&quot;&quot;</span>)<br>        <span class="hljs-variable language_">self</span>.settings_btn.clicked.connect(<span class="hljs-variable language_">self</span>.open_settings)<br>        <br>        <span class="hljs-comment"># 将设置按钮添加到窗口</span><br>        <span class="hljs-variable language_">self</span>.settings_btn.setParent(<span class="hljs-variable language_">self</span>.central_widget)<br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">setup_content_area</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-comment"># 主内容区域现在为空</span><br>        <span class="hljs-keyword">pass</span><br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">setup_bottom_area</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-comment"># 底部区域现在为空</span><br>        <span class="hljs-keyword">pass</span><br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">resizeEvent</span>(<span class="hljs-params">self, event</span>):<br>        <span class="hljs-variable language_">self</span>.settings_btn.move(<span class="hljs-variable language_">self</span>.central_widget.width() - <span class="hljs-number">60</span>, <span class="hljs-number">20</span>)<br>        <span class="hljs-built_in">super</span>().resizeEvent(event)<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">closeEvent</span>(<span class="hljs-params">self, event</span>):<br>        <span class="hljs-comment"># 在窗口关闭时停止计时器并尝试优雅停止所有后台线程，避免 QThread: Destroyed while thread &#x27;&#x27; is still running</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-keyword">if</span> <span class="hljs-built_in">hasattr</span>(<span class="hljs-variable language_">self</span>, <span class="hljs-string">&#x27;fans_timer&#x27;</span>):<br>                    <span class="hljs-variable language_">self</span>.fans_timer.stop()<br>            <span class="hljs-keyword">except</span> Exception:<br>                <span class="hljs-keyword">pass</span><br><br>            workers = <span class="hljs-built_in">getattr</span>(<span class="hljs-variable language_">self</span>, <span class="hljs-string">&#x27;_fan_workers&#x27;</span>, [])[:]<br>            <span class="hljs-keyword">for</span> w <span class="hljs-keyword">in</span> workers:<br>                <span class="hljs-keyword">try</span>:<br>                    <span class="hljs-keyword">if</span> w <span class="hljs-keyword">and</span> <span class="hljs-built_in">getattr</span>(w, <span class="hljs-string">&#x27;isRunning&#x27;</span>, <span class="hljs-keyword">lambda</span>: <span class="hljs-literal">False</span>)():<br>                        <span class="hljs-keyword">try</span>:<br>                            <span class="hljs-comment"># 尝试终止并等待线程结束（如果线程在网络 IO 上阻塞，terminate 可能是必要手段）</span><br>                            w.terminate()<br>                            w.wait(<span class="hljs-number">2000</span>)<br>                        <span class="hljs-keyword">except</span> Exception:<br>                            <span class="hljs-keyword">pass</span><br>                <span class="hljs-keyword">except</span> Exception:<br>                    <span class="hljs-keyword">pass</span><br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-built_in">super</span>().closeEvent(event)<br>        <span class="hljs-keyword">except</span> Exception:<br>            event.accept()<br>        <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">open_settings</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-variable language_">self</span>.settings_window = SettingsWindow(<span class="hljs-variable language_">self</span>.api_manager, <span class="hljs-variable language_">self</span>)<br>        <span class="hljs-variable language_">self</span>.settings_window.show()<br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">fetch_fans</span>(<span class="hljs-params">self</span>):<br>        <span class="hljs-comment"># 更新界面上的用户名显示</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.username_label.setText(<span class="hljs-variable language_">self</span>.api_manager.username <span class="hljs-keyword">or</span> <span class="hljs-string">&#x27;&#x27;</span>)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>        <span class="hljs-comment"># 启动后台线程获取粉丝数</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-comment"># 将线程父对象设为窗口，便于管理生命周期</span><br>            worker = FanFetcher(<span class="hljs-variable language_">self</span>.api_manager, parent=<span class="hljs-variable language_">self</span>)<br>            worker.fans_ready.connect(<span class="hljs-variable language_">self</span>.on_fans_ready)<br>            worker.error_occurred.connect(<span class="hljs-variable language_">self</span>.on_fans_error)<br>            <span class="hljs-comment"># 保持引用以避免被回收</span><br>            <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-built_in">hasattr</span>(<span class="hljs-variable language_">self</span>, <span class="hljs-string">&#x27;_fan_workers&#x27;</span>):<br>                <span class="hljs-variable language_">self</span>._fan_workers = []<br>            <span class="hljs-variable language_">self</span>._fan_workers.append(worker)<br>            <span class="hljs-keyword">def</span> <span class="hljs-title function_">_on_done</span>():<br>                <span class="hljs-keyword">try</span>:<br>                    <span class="hljs-keyword">if</span> worker <span class="hljs-keyword">in</span> <span class="hljs-built_in">getattr</span>(<span class="hljs-variable language_">self</span>, <span class="hljs-string">&#x27;_fan_workers&#x27;</span>, []):<br>                        <span class="hljs-variable language_">self</span>._fan_workers.remove(worker)<br>                <span class="hljs-keyword">except</span> Exception:<br>                    <span class="hljs-keyword">pass</span><br>                <span class="hljs-keyword">try</span>:<br>                    worker.deleteLater()<br>                <span class="hljs-keyword">except</span> Exception:<br>                    <span class="hljs-keyword">pass</span><br>            worker.finished.connect(_on_done)<br>            worker.start()<br>        <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-variable language_">self</span>.api_manager.log_error(<span class="hljs-string">f&quot;启动粉丝数获取失败: <span class="hljs-subst">&#123;<span class="hljs-built_in">repr</span>(e)&#125;</span>&quot;</span>)<br>            <span class="hljs-keyword">except</span> Exception:<br>                <span class="hljs-keyword">pass</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">on_fans_ready</span>(<span class="hljs-params">self, results: <span class="hljs-built_in">dict</span></span>):<br>        <span class="hljs-comment"># results: &#123;name: fans_int&#125;</span><br>        <span class="hljs-keyword">try</span>:<br>            total = <span class="hljs-built_in">sum</span>(<span class="hljs-built_in">int</span>(v) <span class="hljs-keyword">for</span> v <span class="hljs-keyword">in</span> results.values()) <span class="hljs-keyword">if</span> results <span class="hljs-keyword">else</span> <span class="hljs-number">0</span><br>        <span class="hljs-keyword">except</span> Exception:<br>            total = <span class="hljs-number">0</span><br>        <span class="hljs-comment"># 更新动画数字（逐位滚动）</span><br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.animated_number.set_value(total)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br><br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">on_fans_error</span>(<span class="hljs-params">self, message: <span class="hljs-built_in">str</span></span>):<br>        <span class="hljs-keyword">try</span>:<br>            <span class="hljs-variable language_">self</span>.api_manager.log_error(<span class="hljs-string">f&quot;粉丝获取错误: <span class="hljs-subst">&#123;message&#125;</span>&quot;</span>)<br>        <span class="hljs-keyword">except</span> Exception:<br>            <span class="hljs-keyword">pass</span><br>            <br>    <span class="hljs-keyword">def</span> <span class="hljs-title function_">apply_theme</span>(<span class="hljs-params">self, theme</span>):<br>        <span class="hljs-variable language_">self</span>.api_manager.theme_mode = theme<br>        <span class="hljs-keyword">if</span> theme == <span class="hljs-string">&quot;light&quot;</span>:<br>            <span class="hljs-comment"># 统一通过根样式设置颜色，确保 QLabel / QWidget 等继承正确的文字颜色</span><br>            <span class="hljs-variable language_">self</span>.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                QMainWindow, QWidget &#123; background-color: white; color: black; &#125;</span><br><span class="hljs-string">                QLabel &#123; color: black; &#125;</span><br><span class="hljs-string">                QPushButton &#123; color: #3c4043; &#125;</span><br><span class="hljs-string">                QTableWidget &#123; background-color: white; color: black; &#125;</span><br><span class="hljs-string">            &quot;&quot;&quot;</span>)<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-variable language_">self</span>.settings_btn.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                    QPushButton &#123;</span><br><span class="hljs-string">                        background-color: transparent;</span><br><span class="hljs-string">                        border: 2px solid #dfe1e5;</span><br><span class="hljs-string">                        border-radius: 20px;</span><br><span class="hljs-string">                        font-size: 16px;</span><br><span class="hljs-string">                        color: #3c4043;</span><br><span class="hljs-string">                    &#125;</span><br><span class="hljs-string">                    QPushButton:hover &#123; background-color: #f8f9fa; &#125;</span><br><span class="hljs-string">                &quot;&quot;&quot;</span>)<br>            <span class="hljs-keyword">except</span> Exception:<br>                <span class="hljs-keyword">pass</span><br>        <span class="hljs-keyword">else</span>:<br>            <span class="hljs-comment"># 暗色主题：统一设置背景与文字颜色，确保子控件继承</span><br>            <span class="hljs-variable language_">self</span>.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                QMainWindow, QWidget &#123; background-color: #202124; color: #e8eaed; &#125;</span><br><span class="hljs-string">                QLabel &#123; color: #e8eaed; &#125;</span><br><span class="hljs-string">                QPushButton &#123; color: #e8eaed; &#125;</span><br><span class="hljs-string">                QTableWidget &#123; background-color: #303134; color: #e8eaed; &#125;</span><br><span class="hljs-string">            &quot;&quot;&quot;</span>)<br>            <span class="hljs-keyword">try</span>:<br>                <span class="hljs-variable language_">self</span>.settings_btn.setStyleSheet(<span class="hljs-string">&quot;&quot;&quot;</span><br><span class="hljs-string">                    QPushButton &#123;</span><br><span class="hljs-string">                        background-color: transparent;</span><br><span class="hljs-string">                        border: 2px solid #5f6368;</span><br><span class="hljs-string">                        border-radius: 20px;</span><br><span class="hljs-string">                        font-size: 16px;</span><br><span class="hljs-string">                        color: #e8eaed;</span><br><span class="hljs-string">                    &#125;</span><br><span class="hljs-string">                    QPushButton:hover &#123; background-color: #303134; &#125;</span><br><span class="hljs-string">                &quot;&quot;&quot;</span>)<br>            <span class="hljs-keyword">except</span> Exception:<br>                <span class="hljs-keyword">pass</span><br><br><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:<br>    app = QApplication(sys.argv)<br>    <br>    window = MySubWindow()<br>    window.show()<br>    <br>    sys.exit(app.<span class="hljs-built_in">exec</span>())<br></code></pre></td></tr></table></figure>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/">应用程序</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Python/">Python</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/GUI/">GUI</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E8%AE%A2%E9%98%85%E7%BB%9F%E8%AE%A1/">订阅统计</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E7%B2%89%E4%B8%9D%E6%95%B0%E7%9B%91%E6%8E%A7/">粉丝数监控</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/MySub/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Packnload - Minecraft模组批量下载工具</title>
      <link>https://qiufengcute.github.io/Blog/posts/Packnload/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/Packnload/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一款轻量级、高效的Minecraft Mod批量下载工具，可以根据配置文件自动下载指定的模组。</description>
      
      
      
      <content:encoded><![CDATA[<p>Github:</p><p><a href="https://github.com/qiufengcute/Packnload/">GitHub -qiufengcute/Packnload: 一款轻量级、高效的 Minecraft Mod批量下载工具</a></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">&#123;</span><br>    <span class="hljs-attr">&quot;name&quot;</span><span class="hljs-punctuation">:</span><span class="hljs-string">&quot;模组包名&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;author&quot;</span><span class="hljs-punctuation">:</span><span class="hljs-string">&quot;作者名&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;version&quot;</span><span class="hljs-punctuation">:</span><span class="hljs-string">&quot;版本号&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;mod_list&quot;</span><span class="hljs-punctuation">:</span><span class="hljs-punctuation">[</span><br>        <span class="hljs-string">&quot;mod列表&quot;</span><br>    <span class="hljs-punctuation">]</span><br><span class="hljs-punctuation">&#125;</span><br></code></pre></td></tr></table></figure><p>mod列表(mod_list)注:<br />一行一个(开头和结尾要双引号且如果下行还有结尾需要逗号)</p><p>是modrinth的模组slug</p><p>比如Sodium的URL是<ahref="https://modrinth.com/mod/sodium">https://modrinth.com/mod/sodium</a></p><p>就是跟在"/mod/"后面的那串(sodium)</p><p>但是如果结尾有/要去掉</p><p>比如URL为<ahref="https://modrinth.com/mod/sodium/">https://modrinth.com/mod/sodium/</a>,那么结果不是sodium/</p><p>要把结尾的/去掉,所以结果应该是sodium</p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%B8%B8%E6%88%8F%E5%B7%A5%E5%85%B7/">游戏工具</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Minecraft/">Minecraft</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%A8%A1%E7%BB%84%E7%AE%A1%E7%90%86/">模组管理</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%89%B9%E9%87%8F%E4%B8%8B%E8%BD%BD/">批量下载</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B7%A5%E5%85%B7%E8%BD%AF%E4%BB%B6/">工具软件</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/Packnload/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Python Import Size VSCode插件</title>
      <link>https://qiufengcute.github.io/Blog/posts/Python%20Import%20Size/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/Python%20Import%20Size/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个VSCode插件，可以在编辑器中显示Python导入库的大小信息，类似于ErrorLens的功能。</description>
      
      
      
      <content:encoded><![CDATA[<p>Github:</p><p><a href="https://github.com/qiufengcute/python-import-size">GitHub -qiufengcute/Python-Import-Size: Display Python import library sizesinline in VSCode, similar to ErrorLens but for importstatements.</a></p><p>VSCode Marketplace:</p><p><ahref="https://marketplace.visualstudio.com/items?itemName=qiufeng-vscext.python-import-size">PythonImport Size - Visual Studio Marketplace</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/">开发工具</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Python/">Python</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/VSCode/">VSCode</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/">插件开发</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/">代码分析</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/Python%20Import%20Size/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>RSS2IMG - RSS转图片服务</title>
      <link>https://qiufengcute.github.io/Blog/posts/RSS2IMG/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/RSS2IMG/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个将RSS源转换为图片的服务，可以通过URL参数指定RSS地址。</description>
      
      
      
      <content:encoded><![CDATA[<p>URL: <ahref="https://qiufeng.pythonanywhere.com/r2i/">https://qiufeng.pythonanywhere.com/r2i/</a></p><p>参数列表:</p><table><thead><tr class="header"><th>参数名</th><th>必要性</th><th>介绍</th></tr></thead><tbody><tr class="odd"><td>url</td><td>是</td><td>RSS URL</td></tr></tbody></table><h2 id="示例">示例</h2><p>URL: <ahref="https://qiufeng.pythonanywhere.com/r2i/?url=https://www.minecraft.net/en-us/feeds/community-content/rss">https://qiufeng.pythonanywhere.com/r2i/?url=https://www.minecraft.net/en-us/feeds/community-content/rss</a></p><figure><img src="/Blog/imgs/RSS2IMGEx.png" alt="示例返回(2026/3/1)" /><figcaption aria-hidden="true">示例返回(2026/3/1)</figcaption></figure>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/Web%E6%9C%8D%E5%8A%A1/">Web服务</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%9C%A8%E7%BA%BF%E5%B7%A5%E5%85%B7/">在线工具</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/RSS/">RSS</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%9B%BE%E7%89%87%E7%94%9F%E6%88%90/">图片生成</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/RSS2IMG/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>个人主页项目</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个可配置的个人主页项目，支持自定义个人信息、文章和项目展示。</description>
      
      
      
      <content:encoded><![CDATA[<p><a href="https://www.ilanzou.com/s/e9iN7Pa2">蓝奏云优享版</a></p><p>配置文件格式:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">&#123;</span><br>  <span class="hljs-attr">&quot;name_zh&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;中文名&quot;</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;name_en&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;英文名&quot;</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;theme_color&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;主题色(带#)&quot;</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;slogans&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">&#123;</span><br>    <span class="hljs-attr">&quot;under_name&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;名下Slogan&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;under_avatar&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;头像下Slogan&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;bottom_left&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;底下左边Slogan&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;bottom_right&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;底下右边Slogan&quot;</span><br>  <span class="hljs-punctuation">&#125;</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;avatar_path&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;头像(支持网络URL)&quot;</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;articles&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span> <span class="hljs-comment">// 文章</span><br>    <span class="hljs-punctuation">&#123;</span><br>      <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;标题&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;desc&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;介绍&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;tag&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><br>        <span class="hljs-string">&quot;标签&quot;</span><br>      <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;markdown&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;文章MD文件(支持网络URL)&quot;</span><br>    <span class="hljs-punctuation">&#125;</span><br>  <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;projects&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span> <span class="hljs-comment">// 项目</span><br>    <span class="hljs-punctuation">&#123;</span><br>      <span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;名字&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;description&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;介绍&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;cover&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;封面(可选 支持网络URL)&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;点击后跳转到的URL&quot;</span><br>    <span class="hljs-punctuation">&#125;</span><br>  <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;about&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">&#123;</span> <span class="hljs-comment">// 关于</span><br>    <span class="hljs-attr">&quot;description&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;个人介绍&quot;</span><span class="hljs-punctuation">,</span><br>    <span class="hljs-attr">&quot;urls&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span> <span class="hljs-comment">// 相关链接</span><br>      <span class="hljs-punctuation">&#123;</span><br>        <span class="hljs-attr">&quot;name&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;名称&quot;</span><span class="hljs-punctuation">,</span><br>        <span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;URL&quot;</span><span class="hljs-punctuation">,</span><br>        <span class="hljs-attr">&quot;icon&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;图标(可选 支持网络URL)&quot;</span><br>      <span class="hljs-punctuation">&#125;</span><br>    <span class="hljs-punctuation">]</span><br>  <span class="hljs-punctuation">&#125;</span><br><span class="hljs-punctuation">&#125;</span><br></code></pre></td></tr></table></figure>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/Web%E5%BA%94%E7%94%A8/">Web应用</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5/">个人主页</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/">配置文件</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/JSON%E6%A0%BC%E5%BC%8F/">JSON格式</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/">前端开发</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>井字棋游戏</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E4%BA%95%E5%AD%97%E6%A3%8B/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E4%BA%95%E5%AD%97%E6%A3%8B/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个用Python编写的井字棋游戏，包含单机模式和B站演示视频。</description>
      
      
      
      <content:encoded><![CDATA[<p>github:</p><p><a href="https://github.com/qiufengcute/TICTACTOE">GitHub -qiufengcute/TICTACTOE</a></p><p>bilibili:</p><p><ahref="https://www.bilibili.com/video/BV1At421V7dG?vd_source=16a214e3ff37c13729a0a17862bb8e86">python井字棋_单机游戏热门视频</a></p><p>蓝奏云:</p><p><a href="https://nsx.lanzout.com/iAOCM1rzz6bg">文件</a></p><p>密码:435e</p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%B8%B8%E6%88%8F/">游戏</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B0%8F%E6%B8%B8%E6%88%8F/">小游戏</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Python/">Python</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%BA%95%E5%AD%97%E6%A3%8B/">井字棋</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E4%BA%95%E5%AD%97%E6%A3%8B/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>倒数日应用</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E5%80%92%E6%95%B0%E6%97%A5/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E5%80%92%E6%95%B0%E6%97%A5/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>一款用于计算和展示各种重要日期倒计时的应用，支持多个版本更新。</description>
      
      
      
      <content:encoded><![CDATA[<p>蓝奏云：</p><p>1.0.0：</p><p><a href="https://nsx.lanzout.com/inkJC27i466j">倒数日 1.0.0.zip -蓝奏云</a></p><p>1.0.1：</p><p><a href="https://nsx.lanzout.com/i50m427qnq0f">倒数日 1.0.1.zip -蓝奏云</a></p><p>1.1.0：</p><p><a href="https://nsx.lanzout.com/iaQfy27t9g8h">倒数日 1.1.0.zip -蓝奏云</a></p><p>1.1.1：</p><p><a href="https://nsx.lanzout.com/iVWxo27v0lpc">倒数日 1.1.1.zip -蓝奏云</a></p><p>1.1.2：</p><p><a href="https://nsx.lanzout.com/iEBca27va12j">倒数日 1.1.2.zip -蓝奏云</a></p><p>1.1.2安装包：</p><p><a href="https://nsx.lanzout.com/iH4Uv27yfj0d">文件</a></p><p>密码:bhza</p><p>1.1.2安卓安装包：</p><p><ahref="https://www.123pan.com/s/pVMBjv-LYZgH">daoshur_v1.1.2_apksetup.apk官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘</a></p><p>1.1.3安装包&amp;zip：</p><p><a href="https://nsx.lanzout.com/b00jdm1tmd">倒数日1.1.3</a></p><p>密码:95hx</p><p>1.1.3安卓安装包：</p><p><ahref="https://www.123pan.com/s/pVMBjv-FGZgH">daoshur_apksetup_v1.1.3.apk官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘</a></p><p>1.2.0zip：</p><p><a href="https://nsx.lanzout.com/iIfnm289fqri">倒数日 1.2.0.zip -蓝奏云</a></p><p>1.2.0安卓安装包：</p><p><ahref="https://www.123pan.com/s/pVMBjv-inZgH">daoshur_apksetup_v1.2.0.apk官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘</a></p><p>1.2.1安装包&amp;zip：</p><p><a href="https://nsx.lanzout.com/b00jdmdipc">倒数日1.2.1</a></p><p>密码:hv8g</p><p>1.2.1安卓安装包：</p><p><ahref="https://www.123pan.com/s/pVMBjv-l2ZgH">daoshur_apksetup_v1.2.1.apk官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘</a></p><p>1.2.2安装包&amp;zip：</p><p><a href="https://nsx.lanzout.com/b00jdmgzgd">倒数日1.2.2</a></p><p>密码:6wa4</p><p>1.2.2安卓安装包：</p><p><ahref="https://www.123pan.com/s/pVMBjv-PsZgH">daoshur_apksetup_v1.2.2.apk官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘</a></p><p>源代码:<br /><a href="https://nsx.lanzout.com/iDgz128ey5ed">源代码</a></p><p>bilibili：</p><p><ahref="https://player.bilibili.com/player.html?bvid=BV1r3ebeZEFj&amp;autoplay=0">bilibili</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/">应用程序</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B7%A5%E5%85%B7/">工具</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E6%97%B6%E9%97%B4%E7%AE%A1%E7%90%86/">时间管理</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Android/">Android</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E5%80%92%E6%95%B0%E6%97%A5/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>待办事件管理应用</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E5%BE%85%E5%8A%9E%E4%BA%8B%E4%BB%B6-TW/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E5%BE%85%E5%8A%9E%E4%BA%8B%E4%BB%B6-TW/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个待办事件管理应用程序，支持安装包和APK下载，并有B站演示视频。</description>
      
      
      
      <content:encoded><![CDATA[<p>1.0.0:</p><p>安装包：</p><p><a href="https://nsx.lanzout.com/iNyqC29wznpc">文件</a></p><p>密码:hgxr</p><p>源代码：</p><p><a href="https://nsx.lanzout.com/iyWGi29wzpva">待办事件1.0.0源代码.zip - 蓝奏云</a></p><p>apk：</p><p><ahref="https://www.123pan.com/s/pVMBjv-VuZgH">daib_apksetup_v1.0.0.apk官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘</a></p><p>bilibili：</p><p><ahref="https://player.bilibili.com/player.html?bvid=BV1654begEMQ&amp;autoplay=0">bilibili</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/">应用程序</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Android/">Android</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86/">任务管理</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BE%85%E5%8A%9E%E4%BA%8B%E9%A1%B9/">待办事项</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E5%BE%85%E5%8A%9E%E4%BA%8B%E4%BB%B6-TW/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>待办事件管理工具</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E5%BE%85%E5%8A%9E%E4%BA%8B%E4%BB%B6/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E5%BE%85%E5%8A%9E%E4%BA%8B%E4%BB%B6/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个用于管理待办事件的工具，帮助用户跟踪和管理日常任务。</description>
      
      
      
      <content:encoded><![CDATA[<p>github:</p><p><a href="https://github.com/qiufengcute/to-do/">GitHub -qiufengcute/to-do</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/">应用程序</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86/">任务管理</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%BE%85%E5%8A%9E%E4%BA%8B%E9%A1%B9/">待办事项</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/GitHub%E9%A1%B9%E7%9B%AE/">GitHub项目</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E5%BE%85%E5%8A%9E%E4%BA%8B%E4%BB%B6/#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>恶魔轮盘游戏</title>
      <link>https://qiufengcute.github.io/Blog/posts/%E6%81%B6%E9%AD%94%E8%BD%AE%E7%9B%98/</link>
      <guid>https://qiufengcute.github.io/Blog/posts/%E6%81%B6%E9%AD%94%E8%BD%AE%E7%9B%98/</guid>
      <pubDate>Mon, 02 Mar 2026 12:00:00 GMT</pubDate>
      
      <description>这是一个用Python编写的恶魔轮盘游戏，包含B站演示视频。</description>
      
      
      
      <content:encoded><![CDATA[<p>github:</p><p><a href="https://github.com/qiufengcute/emlp">GitHub -qiufengcute/emlp</a></p><p>bilibili:</p><p><ahref="https://www.bilibili.com/video/BV1uK421v7Li?vd_source=16a214e3ff37c13729a0a17862bb8e86">python恶魔轮盘_哔哩哔哩bilibili</a></p>]]></content:encoded>
      
      
      <category domain="https://qiufengcute.github.io/Blog/categories/%E6%B8%B8%E6%88%8F/">游戏</category>
      
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%B0%8F%E6%B8%B8%E6%88%8F/">小游戏</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/%E5%A8%B1%E4%B9%90/">娱乐</category>
      
      <category domain="https://qiufengcute.github.io/Blog/tags/Python/">Python</category>
      
      
      <comments>https://qiufengcute.github.io/Blog/posts/%E6%81%B6%E9%AD%94%E8%BD%AE%E7%9B%98/#disqus_thread</comments>
      
    </item>
    
  </channel>
</rss>
