<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>flydean</title>
        <link>http://www.flydean.com/blog</link>
        <description>程序那些事 Blog</description>
        <lastBuildDate>Wed, 14 Aug 2024 03:00:15 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <copyright>Copyright © 2024 程序那些事.&lt;p&gt;&lt;a href="http://beian.miit.gov.cn/" class="footer_lin"&gt;粤ICP备19017836号&lt;/a&gt;&lt;/p&gt;</copyright>
        <item>
            <title><![CDATA[再升级!MoneyPrinterPlus集成GPT_SoVITS]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS</guid>
            <pubDate>Wed, 14 Aug 2024 03:00:15 GMT</pubDate>
            <description><![CDATA[MoneyPrinterPlus现在可以和大名鼎鼎的GPT_SoVITS集成了,让money printer快人一步]]></description>
            <content:encoded><![CDATA[<p>最近有很多优秀的语音合成TTS工具，目前MoneyPrinterPlus已经集成了ChatTTS和fasterWhisper。应朋友们的要求，最近MoneyPrinterPlus也集成了GPT_SoVITS这个优秀的语音合成工具。</p>
<p>今天给大家详细讲解一下，如何在MoneyPrinterPlus中使用GPT_SoVITS。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="软件准备">软件准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS#%E8%BD%AF%E4%BB%B6%E5%87%86%E5%A4%87" class="hash-link" aria-label="软件准备的直接链接" title="软件准备的直接链接">​</a></h2>
<p>当然，前提条件就是你需要下载MoneyPrinterPlus软件啦。</p>
<p>下载地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>用得好的朋友，不妨给个star支持一下。 在软件v4.4版本之后，MoneyPrinterPlus已经支持GPT_SoVITS本地TTS语音服务啦。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="启动gpt_sovits">启动GPT_SoVITS<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS#%E5%90%AF%E5%8A%A8gpt_sovits" class="hash-link" aria-label="启动GPT_SoVITS的直接链接" title="启动GPT_SoVITS的直接链接">​</a></h2>
<p>GPT_SoVITS这个工具怎么安装这里就不多讲了。</p>
<p>我们讲下如何跟MoneyPrinterPlus进行合作配置。</p>
<p>GPT_SoVITS有很多功能，包括语音训练，模型微调，TTS语音推理，变声等功能。</p>
<p>这里我们使用的是GPT_SoVITS的核心TTS语音推理功能。</p>
<p>首先我们启动GPT_SoVITS：</p>
<p>在1-GPT-SoVITS-TTS ---》 1C推理 ---》 开启TTS推理webUI</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408141014256.png" alt="image-20240814101451460" class="img_ev3q"></p>
<p>然后你就可以看到这样的TTS推理界面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408141038032.png" alt="image-20240814103843764" class="img_ev3q"></p>
<p>你可以选择参考音频，参考文本，参考音频的语言。</p>
<p>然后可以输入要合成的文本，合成语音的类别，语速，top_k, top_p和temperature。</p>
<p>当然，上面的都不重要，我们不需要通过webUI来调用GPT_SoVITS，我们需要的是通过API来和GPT_SoVITS进行交互。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="api启动gpt_sovits">API启动GPT_SoVITS<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS#api%E5%90%AF%E5%8A%A8gpt_sovits" class="hash-link" aria-label="API启动GPT_SoVITS的直接链接" title="API启动GPT_SoVITS的直接链接">​</a></h2>
<p>如果下载的是GPT_SoVITS的集合包，那么可以直接执行下面的命令来启动GPT_SoVITS的API：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">启动api: runtime</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">python.exe api.py </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>启动之后，你会看到下面的内容：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408140024195.png" alt="image-20240814002404640" class="img_ev3q"></p>
<p>上面的启动是最简单的启动，没有指定参考音频，如果你想指定参考音频的话，可以执行下面的命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">python api.py </span><span class="token parameter variable" style="color:#36acaa">-dr</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"123.wav"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-dt</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"一二三。"</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-dl</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"zh"</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>当然，还有其他的一些启动参数如下：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-dr</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">默认参考音频路径</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-dt</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">默认参考音频文本</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-dl</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">默认参考音频语种, </span><span class="token variable string" style="color:#e3116c">"中文"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"英文"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"日文"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"韩文"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"粤语,"</span><span class="token variable" style="color:#36acaa">zh</span><span class="token variable string" style="color:#e3116c">","</span><span class="token variable" style="color:#36acaa">en</span><span class="token variable string" style="color:#e3116c">","</span><span class="token variable" style="color:#36acaa">ja</span><span class="token variable string" style="color:#e3116c">","</span><span class="token variable" style="color:#36acaa">ko</span><span class="token variable string" style="color:#e3116c">","</span><span class="token variable" style="color:#36acaa">yue"</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-d</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">推理设备, </span><span class="token variable string" style="color:#e3116c">"cuda"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"cpu"</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-a</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">绑定地址, 默认</span><span class="token variable string" style="color:#e3116c">"127.0.0.1"</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-p</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">绑定端口, 默认9880, 可在 config.py 中指定</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-fp</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">覆盖 config.py 使用全精度</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-hp</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">覆盖 config.py 使用半精度</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-sm</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">流式返回模式, 默认不启用, </span><span class="token variable string" style="color:#e3116c">"close"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"c"</span><span class="token variable" style="color:#36acaa">, </span><span class="token variable string" style="color:#e3116c">"normal"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"n"</span><span class="token variable" style="color:#36acaa">, </span><span class="token variable string" style="color:#e3116c">"keepalive"</span><span class="token variable" style="color:#36acaa">,</span><span class="token variable string" style="color:#e3116c">"k"</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">·-mt</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token plain">返回的音频编码格式, 流式默认ogg, 非流式默认wav, </span><span class="token string" style="color:#e3116c">"wav"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"ogg"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"aac"</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa"></span><br></span><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">·-cp</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">文本切分符号设定, 默认为空, 以</span><span class="token variable string" style="color:#e3116c">",.，。"</span><span class="token variable" style="color:#36acaa">字符串的方式传入</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-hb</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">cnhubert路径</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">`</span><span class="token variable parameter variable" style="color:#36acaa">-b</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"> - </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">bert路径</span><span class="token variable" style="color:#36acaa">`</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>大家可以根据需要自行选择。</p>
<p>默认情况下API会启动在9880端口，我们可以使用下面的命令来测试API的启动效果：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">使用执行参数指定的参考音频:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">GET:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">http://127.0.0.1:9880?text</span><span class="token variable operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">先帝创业未半而中道崩殂，今天下三分，益州疲弊，此诚危急存亡之秋也。</span><span class="token variable operator" style="color:#393A34">&amp;</span><span class="token variable assign-left variable" style="color:#36acaa">text_language</span><span class="token variable operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">zh</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">POST:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">``</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">json</span><br></span><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa"></span><span class="token variable punctuation" style="color:#393A34">{</span><span class="token variable" style="color:#36acaa"></span><br></span><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">    </span><span class="token variable string" style="color:#e3116c">"text"</span><span class="token variable builtin class-name" style="color:#36acaa">:</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">"先帝创业未半而中道崩殂，今天下三分，益州疲弊，此诚危急存亡之秋也。"</span><span class="token variable" style="color:#36acaa">,</span><br></span><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa">    </span><span class="token variable string" style="color:#e3116c">"text_language"</span><span class="token variable builtin class-name" style="color:#36acaa">:</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">"zh"</span><span class="token variable" style="color:#36acaa"></span><br></span><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa"></span><span class="token variable punctuation" style="color:#393A34">}</span><span class="token variable" style="color:#36acaa"></span><br></span><span class="token-line" style="color:#393A34"><span class="token variable" style="color:#36acaa"></span><span class="token variable" style="color:#36acaa">`</span><span class="token plain">``</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="配置moneyprinterplus">配置MoneyPrinterPlus<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS#%E9%85%8D%E7%BD%AEmoneyprinterplus" class="hash-link" aria-label="配置MoneyPrinterPlus的直接链接" title="配置MoneyPrinterPlus的直接链接">​</a></h2>
<p>好了,回到我们的MoneyPrinterPlus页面。</p>
<p>在基本配置页面，本地语音TTS，我们选择GPTSoVITS, 然后输入GPTSoVITS的地址。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408141054853.png" alt="image-20240814105434708" class="img_ev3q"></p>
<p>在AI视频或者视频混剪区，在视频TTS语音合成区，我们选择本地服务。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408140022307.png" alt="image-20240814002245394" class="img_ev3q"></p>
<p>这里列出来GPTsoVITS所需要的大部分参数。</p>
<p>你可以使用参考音频，参考音频文本，参考音频语音。</p>
<p>然后可以条件temperature,top_P, top_K等信息。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408140023414.png" alt="image-20240814002312805" class="img_ev3q"></p>
<p>点击试听声音，如果你听到合成的声音，那么恭喜你，你的配置成功了。</p>
<p>同时，在GPTsoVITS服务的日志文件中，你可以看到一些语音合成的进度。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202408140019914.png" alt="image-20240814001906393" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/012-money-printer-plus-GPTSoVITS#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>GPTsoVITS是一个非常强大的服务，和MoneyPrinterPlus结合起来使用，你将会无往不利。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[MoneyPrinterPlus全面支持本地Ollama大模型]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/009-money-printer-plus-ollama-support</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/009-money-printer-plus-ollama-support</guid>
            <pubDate>Sun, 04 Aug 2024 07:21:08 GMT</pubDate>
            <description><![CDATA[现在,MoneyPrinterPlus除了支持大模型厂商的服务之外，还可以接入本地的Ollama大模型了。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus现在支持批量混剪,一键AI生成视频，一键批量发布短视频这些功能了。</p>
<p>之前支持的大模型是常用的云厂商，比如OpenAI,Azure,Kimi,Qianfan,Baichuan,Tongyi Qwen, DeepSeek这些。</p>
<p>支持云厂商的原因是现在大模型使用基本都很便宜，并且大厂的稳定性，性能都比本地搭建要好很多。</p>
<p>但是很多小伙伴说还是希望接入本地的LLM模型。</p>
<p>所以，最近我对MoneyPrinterPlus进行了一些适配，最新版本已经支持Ollama了。</p>
<p>你可以在Ollama中接入你想要使用的大模型。</p>
<p>下面告诉大家如何在MoneyPrinterPlus中使用本地的Ollama模型。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="软件准备">软件准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/009-money-printer-plus-ollama-support#%E8%BD%AF%E4%BB%B6%E5%87%86%E5%A4%87" class="hash-link" aria-label="软件准备的直接链接" title="软件准备的直接链接">​</a></h2>
<p>当然，前提条件就是你需要下载MoneyPrinterPlus软件啦。</p>
<p>下载地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>用得好的朋友，不妨给个star支持一下。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装ollama">安装Ollama<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/009-money-printer-plus-ollama-support#%E5%AE%89%E8%A3%85ollama" class="hash-link" aria-label="安装Ollama的直接链接" title="安装Ollama的直接链接">​</a></h2>
<p>如果已经有Ollama的朋友可以直接跳过本节。</p>
<p>对于没有安装过Ollama的朋友，可以直接进入Ollama的官网： <a href="https://ollama.com/" target="_blank" rel="noopener noreferrer">https://ollama.com/</a> 进行安装和下载。</p>
<p>现在Ollama支持windows，linux和Mac这三种操作系统。</p>
<p>我们以linux环境为例来讲解一下Ollama的安装。</p>
<p>在linux环境中，Ollama只需要执行下面的命令即可：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-fsSL</span><span class="token plain"> https://ollama.com/install.sh </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>系统会自动下载Ollama的安装包，进行安装。</p>
<p>这样Ollama就安装好了。</p>
<p>Ollama支持很多models，我们可以在他的 <a href="https://ollama.com/library" target="_blank" rel="noopener noreferrer">https://ollama.com/library</a> 网站中查找需要的模型。</p>
<p>比较常用的像llama3,mistral, llama2-chinese等等。</p>
<p>我们可以使用 ollama list 来查看现有的模型。</p>
<p>如果要下载对应的模型，可以ollama pull llama3从Ollama的模型注册表中拉取指定的模型到本地。</p>
<p>然后使用 ollama run llama3 来运行对应的模型。</p>
<p>当然ollama还有一些其他的用法。这里就不多讲了，大家可以去看下ollama的文档。</p>
<p>ollama安装好之后，我们可以通过下面的命令来测试一下ollama的使用：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://localhost:11434/api/generate </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  "model": "llama3",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">  "prompt":"Why is the sky blue?"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>如果有返回，那么说明你的ollama是没有问题的。可以继续使用了。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="在moneyprinterplus中配置ollama">在MoneyPrinterPlus中配置Ollama<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/009-money-printer-plus-ollama-support#%E5%9C%A8moneyprinterplus%E4%B8%AD%E9%85%8D%E7%BD%AEollama" class="hash-link" aria-label="在MoneyPrinterPlus中配置Ollama的直接链接" title="在MoneyPrinterPlus中配置Ollama的直接链接">​</a></h2>
<p>我们启动MoneyPrinterPlus,点击左边的基本配置，在右边的LLM大模型配置项中，我们下拉选择Ollama。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151424830.png" alt="image-20240715142420621" class="img_ev3q"></p>
<p>Ollama的配置需要设置两项。</p>
<p>第一项是Base Url，也就是调用Ollama的地址。</p>
<p>如果你的ollama在本地，就填：<a href="http://localhost:11434/" target="_blank" rel="noopener noreferrer">http://localhost:11434/</a></p>
<p>如果是在其他远程的机子上，就填：<a href="http://ip:11434/" target="_blank" rel="noopener noreferrer">http://IP:11434/</a></p>
<p>需要注意的是，Ollama默认只会暴露端口给本机连接。
如果需要远程连接Ollama，还需要改下Ollama的配置：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vi</span><span class="token plain"> /etc/systemd/system/ollama.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">在</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Service</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">下面添加一下环境变量：</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#配置远程访问</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">Environment</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"OLLAMA_HOST=0.0.0.0"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>修改完之后重新load并重启ollama即可：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl daemon-reload </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl restart ollama</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>第二项是Ollama中的模型名字。</p>
<p>比如你用的是llama3,那么这里就填llama3就行了。</p>
<p>Ollama配置好之后，就可以进入AI视频区域：</p>
<p>在视频主题区输入你需要生成的视频主题，点击生成视频文案。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151443554.png" alt="image-20240715144309076" class="img_ev3q"></p>
<p>如果有文案生成，那么恭喜你，说明Ollama配置完成了。</p>
<p>接下来尽情使用MoneyPrinterPlus吧。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[在MoneyPrinterPlus中使用本地chatTTS语音模型]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/010-money-printer-plus-chattts</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/010-money-printer-plus-chattts</guid>
            <pubDate>Sun, 04 Aug 2024 07:21:08 GMT</pubDate>
            <description><![CDATA[chatTTS是一个开源的优秀语音合成工具，现在你可以在MoneyPrinterPlus中轻松的使用本地chatTTS模型来为视频生成语音了。]]></description>
            <content:encoded><![CDATA[<p>之前MoneyPrinterPlus在批量混剪,一键AI生成视频这些功能上的语音合成功能都用的是云厂商的语音服务，比阿里云，腾讯云和微软云。</p>
<p>云厂商虽然提供了优质的语音服务，但是用起来还是要收费。</p>
<p>为了各位小伙伴的钱包，现在特意给MoneyPrinterPlus上线了本地chatTTS语音服务。</p>
<p>赶紧来体验吧。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="软件准备">软件准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/010-money-printer-plus-chattts#%E8%BD%AF%E4%BB%B6%E5%87%86%E5%A4%87" class="hash-link" aria-label="软件准备的直接链接" title="软件准备的直接链接">​</a></h2>
<p>当然，前提条件就是你需要下载MoneyPrinterPlus软件啦。</p>
<p>下载地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>用得好的朋友，不妨给个star支持一下。 在软件v4.0版本之后，MoneyPrinterPlus已经全面开始支持本地模型。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装chattts">安装chatTTS<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/010-money-printer-plus-chattts#%E5%AE%89%E8%A3%85chattts" class="hash-link" aria-label="安装chatTTS的直接链接" title="安装chatTTS的直接链接">​</a></h2>
<p>我们可以直接从chatTTS的官网上 <a href="https://github.com/2noise/ChatTTS" target="_blank" rel="noopener noreferrer">https://github.com/2noise/ChatTTS</a>  下载chatTTS的源代码：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/2noise/ChatTTS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cd ChatTTS</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>安装依赖：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip install --upgrade -r requirements.txt</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>运行web-UI：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">python examples/web/webui.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>运行api-server:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">fastapi dev examples/api/main.py --host 0.0.0.0 --port 8000</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里注意，web-ui的默认端口是8080， api-server的端口是8000。</p>
<p>MoneyPrinterPlus需要连接的是8000端口的api-server。</p>
<p>web-UI只是为了展示怎么配置音色的一个展示用的。</p>
<p>我们打开 <a href="http://localhost:8080/" target="_blank" rel="noopener noreferrer">http://localhost:8080/</a>  可以看到类似下面的页面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151733504.png" alt="image-20240715173317089" class="img_ev3q"></p>
<p>点击生成按钮，如果能够成功合成音频文件，那么说明你的chatTTS安装成功了。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="在moneyprinterplus中使用chattts">在MoneyPrinterPlus中使用ChatTTS<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/010-money-printer-plus-chattts#%E5%9C%A8moneyprinterplus%E4%B8%AD%E4%BD%BF%E7%94%A8chattts" class="hash-link" aria-label="在MoneyPrinterPlus中使用ChatTTS的直接链接" title="在MoneyPrinterPlus中使用ChatTTS的直接链接">​</a></h2>
<p>回到MoneyPrinterPlus，我们启动MoneyPrinterPlus，在基本配置页面我们可以看到:本地语音TTS的选项。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151734669.png" alt="image-20240715173442224" class="img_ev3q"></p>
<p>这里我们选择chatTTS，并且设置chatTTS api server的地址。</p>
<p>上面我们是以8000启动的api server，所以这里我们就输入：<a href="http://127.0.0.1:8000/%E3%80%82" target="_blank" rel="noopener noreferrer">http://127.0.0.1:8000/。</a></p>
<p>接下来点击视频混剪区，在视频配音区选择本地模型：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151736404.png" alt="image-20240715173642900" class="img_ev3q"></p>
<p>我们可以得到下面的界面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151737934.png" alt="image-20240715173714939" class="img_ev3q"></p>
<p>解释一下各个参数的作用：</p>
<p>是否口语化对应chatTTS的口语化开关，如果启动口语化，chatTTS会自动对输入的文案进行口语化调整。所以默认是不开启的。</p>
<p>Text Seed是控制口语化模型处理的种子，你可以随意调整。</p>
<p>Audio Temperature控制音频情感波动性，范围为 0-1，数字越大，波动性越大</p>
<p>top_P ：控制音频的情感相关性，范围为 0.1-0.9，数字越大，相关性越高</p>
<p>top_K ：控制音频的情感相似性，范围为 1-20，数字越小，相似性越高</p>
<p>Refine text Prompt是指在口语化过程中添加的一些参数。如果不懂的话可以不修改。</p>
<p>本地chatTTS音色目录，默认在项目的chattts目录中。</p>
<p>现在我在chattts目录中预先放置了2种音色文件。</p>
<p>一种是txt文件，一种是pt文件。</p>
<p>你可以自行添加更多的音色文件到chattts目录中。</p>
<p>那么有小伙伴要问了，txt或者pt文件是怎么来的呢？</p>
<p>先讲一个简单的pt文件，你可以在  <a href="https://modelscope.cn/studios/ttwwwaa/ChatTTS_Speaker" target="_blank" rel="noopener noreferrer">https://modelscope.cn/studios/ttwwwaa/ChatTTS_Speaker</a>  这个空间中试听和下载对应的语音文件：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151744934.png" alt="image-20240715174400937" class="img_ev3q"></p>
<p>把下载下来的pt文件，放在MoneyPrinterPlus中的chattts目录即可。</p>
<p>txt文件是怎么来的呢？</p>
<p>我们再次回到chatTTS的webUI界面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151745531.png" alt="image-20240715174512706" class="img_ev3q"></p>
<p>这个txt就是这里的Speaker Embedding的内容。</p>
<p>你可以点击右上角的拷贝按钮，新建一个utf-8编码的txt文件。 把这个txt文件放到MoneyPrinterPlus中的chattts目录即可。</p>
<p>如果你不想用已有的音色文件，那么可以点击使用随机声音按钮：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407151746352.png" alt="image-20240715174635106" class="img_ev3q"></p>
<p>会出现一个Audio Seed选项，这个seed就是用来控制Audio音色的。</p>
<p>有了这些配置之后，点击试听声音，如果能听到声音就说明你的chatTTS在MoneyPrinterPlus中配置成功了。</p>
<p>接下来就可以使用本地的chatTTS来合成语音啦。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[fasterWhisper和MoneyPrinterPlus无缝集成]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/011-money-printer-plus-fasterwhisper</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/011-money-printer-plus-fasterwhisper</guid>
            <pubDate>Sun, 04 Aug 2024 07:21:08 GMT</pubDate>
            <description><![CDATA[fasterWhisper是一款优秀的语音识别工具，现在它可以和MoneyPrinterPlus无缝集成了。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus之前使用的是各种云厂商的语音识别服务来进行语音的视频和字幕的识别工作。</p>
<p>但是很多小伙伴说云服务用不起。</p>
<p>那么没办法，MoneyPrinterPlus上线最新版本，支持fasterWhisper本地语音识别模型。</p>
<p>赶紧来体验吧。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="软件准备">软件准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/011-money-printer-plus-fasterwhisper#%E8%BD%AF%E4%BB%B6%E5%87%86%E5%A4%87" class="hash-link" aria-label="软件准备的直接链接" title="软件准备的直接链接">​</a></h2>
<p>当然，前提条件就是你需要下载MoneyPrinterPlus软件啦。</p>
<p>下载地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>用得好的朋友，不妨给个star支持一下。 在软件v4.1版本之后，MoneyPrinterPlus已经支持fasterWhisper本地语音识别模型。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装fasterwhipser的模型">安装fasterWhipser的模型<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/011-money-printer-plus-fasterwhisper#%E5%AE%89%E8%A3%85fasterwhipser%E7%9A%84%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="安装fasterWhipser的模型的直接链接" title="安装fasterWhipser的模型的直接链接">​</a></h2>
<p>fasterWhipser服务直接由MoneyPrinterPlus调用。所以不需要第三方的fasterWhisper服务。</p>
<p>但是我们需要下载对应的fasterWhipser模型到MoneyPrinterPlus中。</p>
<p>fasterWhisper模型下载地址：<a href="https://huggingface.co/Systran" target="_blank" rel="noopener noreferrer">https://huggingface.co/Systran</a></p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407241043190.png" alt="image-20240724104312078" class="img_ev3q"></p>
<p>可以看到里面有很多种模型，大家可以根据需要自行下载对应的模型。</p>
<p>怎么下载呢？</p>
<p>进入到MoneyPrinterPlus的fasterwhisper目录下：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> fasterwhisper</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>执行git clone命令：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://huggingface.co/Systran/faster-whisper-tiny tiny</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>目前MoneyPrinterPlus支持下面几种模型名称：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">'large-v3'</span><span class="token plain">,  </span><span class="token string" style="color:#e3116c">'large-v2'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'large-v1'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'distil-large-v3'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'distil-large-v2'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'medium'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'base'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'small'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'tiny'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到�剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>所以你在git clone的时候，需要把faster-whisper仓库中的模型目录重命名为MoneyPrinterPlus支持的模型名称。</p>
<p>比如faster-whisper-tiny, 对应的模型叫做tiny，所以我们git clone的时候同时做了重命名操作：</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://huggingface.co/Systran/faster-whisper-tiny tiny</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>上面的命令会在本地创建一个tiny的目录。目录里面包含了faster-whisper-tiny的所有模型内容。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="在moneyprinterplus中配置faster-whisper">在MoneyPrinterPlus中配置faster-whisper<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/011-money-printer-plus-fasterwhisper#%E5%9C%A8moneyprinterplus%E4%B8%AD%E9%85%8D%E7%BD%AEfaster-whisper" class="hash-link" aria-label="在MoneyPrinterPlus中配置faster-whisper的直接链接" title="在MoneyPrinterPlus中配置faster-whisper的直接链接">​</a></h2>
<p>我们启动MoneyPrinterPlus。</p>
<p>在基本配置区域：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407241049869.png" alt="image-20240724104858491" class="img_ev3q"></p>
<p>可以配置本地语音识别模型。</p>
<p>model name就是你下载下来的模型名字。</p>
<p>device type 可以选择cpu，cuda或者auto。</p>
<p>compute type 支持'int8','int8_float16','float16'这几种类型。</p>
<p>配置好之后，在AI视频区域。</p>
<p>语音识别配置中我们选择本地模型，即可使用到fasterWhisper了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407241057618.png" alt="image-20240724105725203" class="img_ev3q"></p>
<p>同样的在视频混剪区域，我们也可以选择本地模型，即可使用到fasterWhisper了。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/011-money-printer-plus-fasterwhisper#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>因为是本地运行的fasterWhisper，所以在运行中可能会出现一些环境的问题。大家可以参考fasterWhisper的说明来解决。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[福利来了！MoneyPrinterPlus可以自动配置环境和自动运行了]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup</guid>
            <pubDate>Wed, 10 Jul 2024 02:54:45 GMT</pubDate>
            <description><![CDATA[给小白用户提供一个方便的环境设置脚本和自动运行脚本，让不懂程序的人也能用上MoneyPrinterPlus]]></description>
            <content:encoded><![CDATA[<p>之前开源了MoneyPrinterPlus，可以实现批量混剪视频，一键生成视频和自动发布视频的功能。</p>
<p>但是经常会看到小伙伴在安装过程中遇到很多问题。所以这篇文章的目的就是告诉大家怎么使用MoneyPrinterPlus的自动环境配置工具和自动启动工具。</p>
<p>让小白用户也能用上这么好的AI工具。</p>
<p>都是满满的福利。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="软件准备">软件准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup#%E8%BD%AF%E4%BB%B6%E5%87%86%E5%A4%87" class="hash-link" aria-label="软件准备的直接链接" title="软件准备的直接链接">​</a></h2>
<p>当然，前提条件就是你需要下载MoneyPrinterPlus软件啦。</p>
<p>下载地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>用得好的朋友，不妨给个star支持一下。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自动环境配置">自动环境配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup#%E8%87%AA%E5%8A%A8%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="自动环境配置的直接链接" title="自动环境配置的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h3>
<p>最新的软件里面有自动环境配置脚本。但是，我们需要两个前提。</p>
<p>第一，就是要下载python环境。</p>
<p>我们需要python 3.10+版本来保证程序的运行。</p>
<p>如果是windows，那么可以自行从python的官网下载对应的版本。解压到本地。</p>
<p>然后把python的路径添加到系统的path中去。</p>
<p>如果是mac，直接执行 brew install python@3.11</p>
<p>然后把python3.11链接到python命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ln</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> /opt/homebrew/bin/python3.11  /opt/homebrew/bin/python</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>第二，我们需要安装ffmpeg。</p>
<p>如果你是windows，那么直接从ffmpeg的网站下载6.0版本解压缩到本地。</p>
<p>然后把ffmpeg的路径添加到系统的path中去。</p>
<p>如果是mac， 直接执行 brew install ffmpeg即可。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="运行自动环境设置脚本">运行自动环境设置脚本<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup#%E8%BF%90%E8%A1%8C%E8%87%AA%E5%8A%A8%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="运行自动环境设置脚本的直接链接" title="运行自动环境设置��脚本的直接链接">​</a></h3>
<p>有了前面的前提条件之后，现在就可以运行自动环境设置脚本了。</p>
<p>windows下直接双击setup.bat。</p>
<p>mac下，进入项目根目录，执行： sh setup.sh</p>
<p>你可以看到类似的下面的内容：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Switching to virtual Python environment.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">this will take some time,please wait.....</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python3.10 -m venv /Users/wayne/data/git/projects/hunjian/venv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Activate the virtual environment...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">setup python dependencies...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Python version is 3.10.13 (main, Aug 24 2023, 12:59:26) [Clang 15.0.0 (clang-1500.0.40.1)]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ffmpeg版本为6.0，满足要求。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Installing python dependencies. This could take a few minutes as it downloads files.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If this operation ever runs too long, you can rerun this script in verbose mode to check.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Package version found: pip 23.2.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Installing modules from requirements.txt...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这样，就是在安装对应的依赖环境了。</p>
<p>安装依赖环境可能有点慢，大家可以喝杯咖啡等待一下。</p>
<p>当你看到下面一段话的时候，就说明环境安装好了，接下来可以开始运行了。</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Setup finished! Run sh start.sh to start.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="自动启动脚本">自动启动脚本<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/007-money-printer-plus-auto-setup#%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="自动启动脚本的直接链接" title="自动启动脚本的直接链接">​</a></h2>
<p>自动启动脚本的运行前提是你之前使用了自动环境设置脚本来设置环境。</p>
<p>windows环境下，直接双击start.bat即可启动。</p>
<p>mac环境下，在项目根目录下面执行sh start.sh即可。</p>
<p>浏览器会自动打开MoneyPrinterPlus的首页。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407041032551.png" alt="image-20240628153020140" class="img_ev3q"></p>
<p>开始你的MoneyPrinterPlus之旅吧。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[重磅来袭!MoneyPrinterPlus一键发布短视频到视频号,抖音,快手,小红书上线了]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools</guid>
            <pubDate>Wed, 10 Jul 2024 02:54:45 GMT</pubDate>
            <description><![CDATA[一键发布短视频到视频号,抖音,快手,小红书，MoneyPrinterPlus解放你的双手。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus开源有一段时间了，已经实现了批量短视频混剪，一键生成短视频等功能。</p>
<p>有些小伙伴说了，我批量生成的短视频能不能一键上传到视频号,抖音,快手,小红书这些视频平台呢？答案是必须可以。</p>
<p>下面上干货。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="软件准备">软件准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E8%BD%AF%E4%BB%B6%E5%87%86%E5%A4%87" class="hash-link" aria-label="软件准备的直接链接" title="软件准备的直接链接">​</a></h2>
<p>当然，前提条件就是你需要下载MoneyPrinterPlus软件啦。</p>
<p>下载地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>用得好的朋友，不妨给个star支持一下。批量上传功能在v3.0版本已经支持了。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="工作原理">工作原理<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86" class="hash-link" aria-label="工作原理的直接链接" title="工作原理的直接链接">​</a></h2>
<p>自动发布工具的本质上是基于selenium这个自动化框架实现的。</p>
<p>通过模拟人工的点击操作，可以完成绝大多数需要人手工才能完成的工作。解放大家的双手。</p>
<p>另外这个自动化的实现方式有两种，一种是在运行程序的过程中启动一个浏览器。另外一种是依附到现有的浏览器上来操作现有浏览器的页面。</p>
<p>本工具选择的是依附到现有的浏览器上。</p>
<p>主要是因为有些视频平台需要用手机扫码二维码才能登录。所以在程序中很难模拟这种登录的过程。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>目前自动发布支持chrome和firfox两种浏览器。大家根据需要自行选择一种即可。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-chrome配置">1. chrome配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#1-chrome%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="1. chrome配置的直接链接" title="1. chrome配置的直接链接">​</a></h3>
<p>现在的主流浏览器肯定是chrome无疑了。所以我们首先聊一聊如何实现对chrome浏览器的支持。</p>
<ol>
<li>
<p>首先你需要下载安装<a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer">Chrome</a>，记住你的版本号，你可以从chrome官网上下载chrome，也可以从这个页面去下载 <a href="https://googlechromelabs.github.io/chrome-for-testing/" target="_blank" rel="noopener noreferrer">ChromeDriver下载页面</a>。</p>
</li>
<li>
<p>你需要从<a href="https://googlechromelabs.github.io/chrome-for-testing/" target="_blank" rel="noopener noreferrer">ChromeDriver下载页面</a>下载与你的Chrome浏览器版本相对应的ChromeDriver。确保你下载的是与你的操作系统和Chrome版本相匹配的版本。</p>
</li>
</ol>
<p>下载完毕之后，把chromeDriver解压到本地目录，目录的路径最好不要带中文。不能保证能正常运行。</p>
<ol start="3">
<li>chrome 以debug模式启动</li>
</ol>
<p>如果是mac电脑，那么可以先给chrome设置一个alias</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">alias</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">chrome</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>以debug模式启动chrome。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">chrome --remote-debugging-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9222</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>如果你是windows，可以在chrome的桌面快捷方式，右键目标中添加：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">--remote-debugging-port=9222</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407101036374.png" alt="image-20240710103643535" class="img_ev3q"></p>
<p>然后双击即可以debug模式打开chrome。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-firefox配置">2. firefox配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#2-firefox%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="2. firefox配置的直接链接" title="2. firefox配置的直接链接">​</a></h3>
<p>除了chrome之外，用的最多的应该就是firefox了。</p>
<p>所以我们也提供了对firefox的支持。</p>
<p>要想使用firefox，你需要下面几步：</p>
<ol>
<li>
<p>下载并安装 <a href="https://www.mozilla.org/en-US/firefox/new/" target="_blank" rel="noopener noreferrer">Firefox</a>。</p>
</li>
<li>
<p>下载<a href="https://github.com/mozilla/geckodriver/releases" target="_blank" rel="noopener noreferrer"><strong>geckodriver</strong></a> 驱动.下载与你的Firefox浏览器版本相对应的geckodriver。确保你下载的是与你的操作系统和Firefox版本相匹配的版本。</p>
<p>下载完毕之后，把geckodriver解压到本地目录，目录的路径最好不要带中文。不能保证能正常运行。</p>
</li>
<li>
<p>以debug模式启动firefox:</p>
<p>和chrome类似，我们在firefox的启动命令之后加上： <code> -marionette -start-debugger-server 2828</code></p>
</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405041205192.png" alt="image-20240504120509315" class="img_ev3q"></p>
<blockquote>
<p>注意，这里的端口一定要是2828,不能自定义。</p>
</blockquote>
<p>这时候你如果打开firefox,就会看到导航栏变成了红色，表示你已经启动了远程调试模式。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405041206516.png" alt="image-20240504120607831" class="img_ev3q"></p>
<p>输入<code>about:config</code></p>
<p>可以看到marionette.port的端口就是2828。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="开始使用">开始使用<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8" class="hash-link" aria-label="开始使用的直接链接" title="开始使用的直接链接">​</a></h2>
<p>如果你是刚刚下载MoneyPrinterPlus, 那么推荐你使用傻瓜方式安装运行。</p>
<p>最新的软件里面有自动环境配置脚本。但是，我们需要两个前提。</p>
<p>第一，就是要下载python环境。</p>
<p>我们需要python 3.10+版本来保证程序的运行。</p>
<p>如果是windows，那么可以自行从python的官网下载对应的版本。解压到本地。</p>
<p>然后把python的路径添加到系统的path中去。</p>
<p>如果是mac，直接执行 brew install python@3.11</p>
<p>然后把python3.11链接到python命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ln</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> /opt/homebrew/bin/python3.11  /opt/homebrew/bin/python</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>第二，我们需要安装ffmpeg。</p>
<p>如果你是windows，那么直接从ffmpeg的网站下载6.0版本解压缩到本地。</p>
<p>然后把ffmpeg的路径添加到系统的path中去。</p>
<p>如果是mac， 直接执行 brew install ffmpeg即可。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="运行自动环境设置脚本">运行自动环境设置脚本<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E8%BF%90%E8%A1%8C%E8%87%AA%E5%8A%A8%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="运行自动环境设置脚本的直接链接" title="运行自动环境设置脚本的直接链接">​</a></h3>
<p>有了前面的前提条件之后，现在就可以运行自动环境设置脚本了。</p>
<p>windows下直接双击setup.bat。</p>
<p>mac下，进入项目根目录，执行： sh setup.sh</p>
<p>你可以看到类似的下面的内容：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Switching to virtual Python environment.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">this will take some time,please wait.....</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python3.10 -m venv /Users/wayne/data/git/projects/hunjian/venv</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Activate the virtual environment...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">setup python dependencies...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Python version is 3.10.13 (main, Aug 24 2023, 12:59:26) [Clang 15.0.0 (clang-1500.0.40.1)]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ffmpeg版本为6.0，满足要求。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Installing python dependencies. This could take a few minutes as it downloads files.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">If this operation ever runs too long, you can rerun this script in verbose mode to check.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Package version found: pip 23.2.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Installing modules from requirements.txt...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这样，就是在安装对应的依赖环境了。</p>
<p>安装依赖环境可能有点慢，大家可以喝杯咖啡等待一下。</p>
<p>当你看到下面一段话的时候，就说明环境安装好了，接下来可以开始运行了。</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Setup finished! Run sh start.sh to start.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="运行自动启动脚本">运行自动启动脚本<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E8%BF%90%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="运行自动启动脚本的直接链接" title="运行自动启动脚本的直接链接">​</a></h3>
<p>自动启动脚本的运行前提是你之前使用了自动环境设置脚本来设置环境。</p>
<p>windows环境下，直接双击start.bat即可启动。</p>
<p>mac环境下，在项目根目录下面执行sh start.sh即可。</p>
<p>浏览器会自动打开MoneyPrinterPlus的首页。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407101042103.png" alt="image-20240710104233733" class="img_ev3q"></p>
<p>点击左边的视频自动发布工具，可以看到视频自动发布工具的页面。</p>
<p>你可以选择驱动类型。chrome还是firefox。</p>
<p>驱动位置就是之前下载的chromedirver或者geckodriver的位置。</p>
<p>视频内容所在目录，就是你想要发布的视频目录。</p>
<p>当你修改视频目录之后，会自动列出视频目录里面的视频文件和文本文件。</p>
<p>其中视频文件就是你要发布的视频内容。</p>
<p>文本文件是什么呢？</p>
<p>文本文件是和视频配套的文字内容。</p>
<p>举个例子， 我想要发布一个关于唐诗的视频到网站上，那么对应的文本文件内容如下：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">王维：酬郭给事</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">洞门高阁霭馀辉，桃李阴阴柳絮飞。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">禁里疏钟官舍晚，省中啼鸟吏人稀。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">晨摇玉佩趋金殿，夕奉天书拜琐闱。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">强欲从君无那老，将因卧病解朝衣。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>大家记住，第一行一定是视频的标题。</p>
<p>其他行的内容，大家自由决定。</p>
</blockquote>
<p>然后我们看下面的页面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407101047908.png" alt="image-20240710104725552" class="img_ev3q"></p>
<p>视频网站配置应该很直白了，上过幼儿园的朋友应该都能懂。</p>
<p>标题前缀：如果你需要额外给视频标题添加一些前缀，可以在这里设置。</p>
<p>合集名称：有些视频网站需要选择合集。这里就是合集的名字。（程序不会帮你创建合集，你需要自己提前在网站上创建。）</p>
<p>视频标签：很好理解了，就是标签，用空格分割。</p>
<p>快手还有一个额外的领域配置。</p>
<p>你可以选择是否开启抖音，快手，视频号或者小红书。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="环境检测">环境检测<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E7%8E%AF%E5%A2%83%E6%A3%80%E6%B5%8B" class="hash-link" aria-label="环境检测的直接链接" title="环境检测的直接链接">​</a></h3>
<p>接下来就可以准备发布视频了。</p>
<p>但是在发布之前，你可以点一下环境检测。</p>
<p>如果自动打开了我的主页，那么就说明你的环境配置是没问题的。接下来就可以发布视频了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="发布视频">发布视频<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E5%8F%91%E5%B8%83%E8%A7%86%E9%A2%91" class="hash-link" aria-label="发布视频的直接链接" title="发布视频的直接链接">​</a></h3>
<p>因为所有的视频网站都需要登录。所以在点击发布视频按钮之前，你需要打开对应的网站，登录你的账号先。</p>
<p>如果你的账号都登录完毕了，点击发布视频按钮吧。</p>
<p>开启你的自由之旅。</p>
<p>运行的界面大概如下：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202407101053683.png" alt="image-20240710105336580" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/008-money-printer-plus-auto-publish-tools#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>好了，自动发布功能就讲到这里。开源不易，大家点个赞吧。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[重磅!免费一键批量混剪工具它来了,一天上万短视频不是梦]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos</guid>
            <pubDate>Fri, 28 Jun 2024 01:55:37 GMT</pubDate>
            <description><![CDATA[详细介绍如何使用在MoneyPrinterPlus中是用批量混剪工具来自动快速生成短视频。]]></description>
            <content:encoded><![CDATA[<p>很多做短视频营销的朋友需要批量生成大量的短视频，但是市面上的工具一是不好用，二是要收费。</p>
<p>今天给大家介绍一款免费的，可以自动化批量生成短视频的工具MoneyPrinterPlus。 同时支持windows和linux平台。</p>
<p>有了它，一天生成上万短视频不是梦。</p>
<p>重点，它是开源，免费的！</p>
<p>再配合MoneyPrinterPlus的自动短视频上传工具，把批量生成的短视频再批量上传到各大视频平台。Money Printer不就来了吗？</p>
<p>项目已开源，代码地址：<a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai短视频混剪批量生成">AI短视频混剪批量生成<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#ai%E7%9F%AD%E8%A7%86%E9%A2%91%E6%B7%B7%E5%89%AA%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90" class="hash-link" aria-label="AI短视频混剪批量生成的直接链接" title="AI短视频混剪批量生成的直接链接">​</a></h2>
<p>基本的使用介绍这里就不多讲了，不会的朋友到我的github主页上，里面有详细的教程说明。</p>
<p>这里只讲关键的AI短视频混剪批量生成。</p>
<p>启动项目之后，左上角可以找到视频混剪区。</p>
<p>点击它，进入到视频批量混剪工具页面。</p>
<p>在视频混剪区，我们最多可以配置5个视频片段。</p>
<p>你可以通过点击添加片段或者删除片段来控制片段区域的多少。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406280938023.png" alt="image-20240628093854842" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="什么是视频片段">什么是视频片段？<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E4%BB%80%E4%B9%88%E6%98%AF%E8%A7%86%E9%A2%91%E7%89%87%E6%AE%B5" class="hash-link" aria-label="什么是视频片段？的直接链接" title="什么是视频片段？的直接链接">​</a></h3>
<p>那么有朋友会问了，什么是视频片段呢？</p>
<p>一个长视频，里面不可能只有一个视频主题，可能你的视频前半部分讲的是衣服的版型，后半部分讲的是衣服的材质。</p>
<p>那么衣服的版型就是片段1，材质就是片段2。</p>
<p>我们要做的就是收集衣服版型的素材，可以是mp4视频，也可以是jpg，png等图片资源。分辨率尽量大一点，否则后面生成的视频质量就不太好。</p>
<p>然后把衣服版型的素材放到视频片段1的资源目录中。</p>
<p>比如上图的资源目录中：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">d:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">downloads</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">work</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">scen1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>同样的，我们把衣服的材质的素材放到视频片段2的资源目录中。</p>
<p>如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406280947354.png" alt="image-20240628094702252" class="img_ev3q"></p>
<p>什么是视频资源文案呢？</p>
<p>视频资源文案就是你需要给这段视频片段配的文字描述。</p>
<p>你可以为一个片段准备很多条文案，然后把这些文案放在一个txt文件中。一条文案放在txt文件中的一行。</p>
<p>系统会随机从txt文件中挑选一行最为最终视频片段的文字描述。</p>
<p>下面是一个文案文件的例子：</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">精准的剪裁，流畅的线条，这款马甲的版型设计，完美贴合身形，无论是宽松还是修身，都能展现你的优雅姿态。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">我们的设计师们，将经典与现代完美融合。每一道线条，每一个剪裁，都是为了展现你的独特身形。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">每一刀剪裁，都经过精心计算，只为打造最适合你身形的版型。从肩部线条到腰部剪裁，每一处都彰显着你的独特风格。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">精准的剪裁，流畅的线条，这款马甲的版型设计，旨在让每一位穿着者都能感受到定制般的贴合。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">精准剪裁流畅线条，马甲版型设计完美贴合身形，宽松或修身皆展现优雅姿态。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">设计师将经典与现代融合，每道线条每个剪裁展现独特身形。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">精心计算每一刀剪裁，打造适合身形的版型，肩部线条至腰部剪裁彰显独特风格。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">剪裁精准流畅，马甲版型旨在定制般贴合，展现穿着者个性魅力。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">面料精选剪裁精致，马甲版型以优雅线条展现身形，正式或休闲皆完美。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">人体工学设计，马甲版型舒适透气，优雅线条展现身形，每次穿搭成焦点。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">经典版型现代演绎，马甲独特剪裁设计，穿着成展现个性品味舞台。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">细节精心打磨，马甲版型合体剪裁优雅设计，任何场合自信满满。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">舒适型格并存，马甲版型精致剪裁舒适面料，工作休闲展现最佳状态。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">时尚马甲版型多样，每款为你而生，经典剪裁现代设计，轻松驾驭各种风格。</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">优雅线条修身设计，马甲版型考究剪裁精致细节，任何场合成焦点，彰显个人风格。</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>配置好的你的视频片段跟视频文案。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="视频配音区">视频配音区<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E8%A7%86%E9%A2%91%E9%85%8D%E9%9F%B3%E5%8C%BA" class="hash-link" aria-label="视频配音区的直接链接" title="视频配音区的直接链接">​</a></h3>
<p>在视频配音区可以选择配音语言和对应的配音语言，目前支持100+配音语言。</p>
<p>还可以选择不同的配音语速，以支持不同使用场景。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162208006.png" alt="image-20240616220840076" class="img_ev3q"></p>
<p>如果你对配音不太确定，可以点击试听声音试听对应的配音语音。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="背景音乐">背景音乐<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90" class="hash-link" aria-label="背景音乐的直接链接" title="背景音乐的直接链接">​</a></h3>
<p>背景音乐放在项目下的bgmusic目录下面，你可以自行添加背景音乐文件到该文件夹下面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162210686.png" alt="image-20240616221041774" class="img_ev3q"></p>
<p>可以选择是否开启背景音乐，和默认的背景音乐音量。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="视频配置区">视频配置区<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E8%A7%86%E9%A2%91%E9%85%8D%E7%BD%AE%E5%8C%BA" class="hash-link" aria-label="视频配置区的直接链接" title="视频配置区的直接链接">​</a></h3>
<p>视频配置区可以选择视频布局：竖屏，横屏或者方形。</p>
<p>可以选择视频帧率，视频的尺寸。</p>
<p>还可以选择每个视频片段的最小长度和最大长度。</p>
<p>最最重要的，还可以开启视频转场特效。目前支持30+视频转场特效。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162211618.png" alt="image-20240616221116997" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="字幕配置">字幕配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E5%AD%97%E5%B9%95%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="字幕配置的直接链接" title="字幕配置的直接链接">​</a></h3>
<p>如果你需要字幕，那么可以点击开启字幕选项，可以设置字幕字体，字幕字体的大小和字幕颜色等。</p>
<p>如果你不知道怎么设置，选择默认即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162212891.png" alt="image-20240616221242812" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后的视频生成">最后的视频生成<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E6%9C%80%E5%90%8E%E7%9A%84%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90" class="hash-link" aria-label="最后的视频生成的直接链接" title="最后的视频生成的直接链接">​</a></h3>
<p>目前系统支持一次批量生成100个视频，根据你自己的需要自行调整。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406280951343.png" alt="image-20240628095137565" class="img_ev3q"></p>
<p>最后点击生成视频按钮即可生成视频。</p>
<p>页面会有相应的进度提醒。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162217977.png" alt="image-20240616221712173" class="img_ev3q"></p>
<p>最后生成的视频会展示在页面最下面，大家可以自行播放。</p>
<p>如果你生成了多个视频，可以在项目文件夹的final目录中找到你批量生成的视频。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="语音配置">语音配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E8%AF%AD%E9%9F%B3%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="语音配置的直接链接" title="语音配置的直接链接">​</a></h2>
<p>项目需要根据你的选择配置一些语音服务。</p>
<p>你可以选择Azure，腾讯云或者阿里云。</p>
<p>具体的配置可以参考我的github主页。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/006-money-printer-plus-auto-mix-videos#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>免费而又强大的批量短视频生成工具，你还等什么呢？快来使用吧。</p>
<p>让那些收费的工具见鬼去吧！</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[MoneyPrinterPlus:AI自动短视频生成工具-阿里云配置详解]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun</guid>
            <pubDate>Mon, 24 Jun 2024 06:18:21 GMT</pubDate>
            <description><![CDATA[详细介绍如何使用在MoneyPrinterPlus中配置使用阿里云语音服务，实现AI自动短视频生成。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus是一个很好的自动短视频生成工具，虽然是一个非常好的工具，但是有些小伙伴可能不太清楚具体应该如何配置才能让它跑起来。</p>
<p>因为MoneyPrinterPlus依赖一些具体的配置信息，所以还是很有必要给大家讲解清楚如何进行配置。</p>
<p>项目已开源，代码地址：<a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="阿里云的具体配置">阿里云的具体配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E9%98%BF%E9%87%8C%E4%BA%91%E7%9A%84%E5%85%B7%E4%BD%93%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="阿里云的具体配置的直接链接" title="阿里云的具体配置的直接链接">​</a></h2>
<p>MoneyPrinterPlus在生成视频过程中需要进行一些语音合成和语音识别工作。</p>
<p>为了保证最后生成视频的质量，所以我们会用到一些云厂商提供的语音合成和语音识别服务。</p>
<p>这里以阿里云为例，来讲解如何进行阿里云语音的配置。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="获取阿里云的access-key和secret">获取阿里云的access key和Secret<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E8%8E%B7%E5%8F%96%E9%98%BF%E9%87%8C%E4%BA%91%E7%9A%84access-key%E5%92%8Csecret" class="hash-link" aria-label="获取阿里云的access key和Secret的直接链接" title="获取阿里云的access key和Secret的直接链接">​</a></h3>
<p>首先我们到阿里云的官网上去注册一个账号，在右上角主账号的下方，会有一个accessKey管理。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162124097.png" alt="image-20240616212456323" class="img_ev3q"></p>
<p>点击这个accesskey管理，会进入一个管理页面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406201649359.png" alt="image-20240620164930498" class="img_ev3q"></p>
<p>点击创建accessKey就创建好了accesskey和Secret。</p>
<p>大家把这两个数据保存下来。我们后面在MoneyPrinterPlus中会用到这两个值。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="开通智能语音服务">开通智能语音服务<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E5%BC%80%E9%80%9A%E6%99%BA%E8%83%BD%E8%AF%AD%E9%9F%B3%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="开通智能语音服务的直接链接" title="开通智能语音服务的直接链接">​</a></h3>
<p>然后我们通过下面的链接进入到阿里云的智能语音服务页面：</p>
<p><a href="https://nls-portal.console.aliyun.com/" target="_blank" rel="noopener noreferrer">https://nls-portal.console.aliyun.com/</a></p>
<p>如果没有开通的话，可以点击开通。</p>
<p>现在里面大部分的服务都是免费试用的。</p>
<p>当然，如果收费的话应该也不是很贵。</p>
<p>在全部项目中，点击创建项目：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406201653134.png" alt="image-20240620165258320" class="img_ev3q"></p>
<p>创建一个新的项目，记住这个项目的appkey。我们在后面的配置中需要用到这个值。</p>
<p>接下来点击左边的服务管理与开通，在语音识别tab中选择录音文件识别（极速版），右边操作---》升级为商用版。</p>
<p>因为录音文件识别（极速版）没有免费试用版本，所以这里一定要升级成商用版本。否则后面使用可能会报错。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406201654194.png" alt="image-20240620165407063" class="img_ev3q"></p>
<p>在语音合成tab页面，需要开通语音合成和长文本语音合成功能。</p>
<p>因为阿里云基础的语音合成服务只能合成小于300字的语音，如果大于300字，则需要用到长文本语音合成服务。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406201655047.png" alt="image-20240620165541480" class="img_ev3q"></p>
<p>上面三项一定需要开通。切记切记。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="在moneyprinterplus中配置">在MoneyPrinterPlus中配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E5%9C%A8moneyprinterplus%E4%B8%AD%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="在MoneyPrinterPlus中配置的直接链接" title="在MoneyPrinterPlus中配置的直接链接">​</a></h3>
<p>启动我们的项目，在web页面点击最左边的基础配置，找到右边的配置音频库信息，选择Ali。</p>
<p>填入我们之前保存的Access Key ID ,Access Key Secret和App Key。</p>
<p>回车后，这样我们的配置就保存了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406201658230.png" alt="image-20240620165818526" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="其他的配置">其他的配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E5%85%B6%E4%BB%96%E7%9A%84%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="其他的配置的直接链接" title="其他的配置的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="资源库">资源库<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E8%B5%84%E6%BA%90%E5%BA%93" class="hash-link" aria-label="资源库的直接链接" title="资源库的直接链接">​</a></h3>
<p>资源库指的是我们从哪里获取视频或者图片信息，这里目前提供了两个资源提供方，分别是pexels和pixabay。</p>
<p>大家任意选择一个即可。</p>
<p>以pexels为例，我们登入pexels官网 <a href="https://www.pexels.com/zh-cn/" target="_blank" rel="noopener noreferrer">https://www.pexels.com/zh-cn/</a> ，注册一个账号。</p>
<p>在图片和视频API里面，可以查看自己的api密钥。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162116765.png" alt="image-20240616211609578" class="img_ev3q"></p>
<p>查看自己的API密钥：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162117120.png" alt="image-20240616211719443" class="img_ev3q"></p>
<p>把这个API密钥记下来，拷贝到MoneyPrinterPlus的配置即可。</p>
<p>![image-20240620170029227](/Users/wayne/Library/Application Support/typora-user-images/image-20240620170029227.png)</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="大模型配置">大模型配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="大模型配置的直接链接" title="大模型配置的直接链接">​</a></h3>
<p>目前支持Moonshot,openAI,Azure openAI,Baidu Qianfan, Baichuan,Tongyi Qwen, DeepSeek这些。</p>
<p>国内要用的话推荐Moonshot（最近发现moonshot不太稳定，大家可以考虑Baichuan或者DeepSeek）。</p>
<p>同样的到Moonshot开发者平台上注册一个key：<a href="https://platform.moonshot.cn/" target="_blank" rel="noopener noreferrer">https://platform.moonshot.cn/</a> 填入对应的配置即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162126626.png" alt="image-20240616212642905" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai短视频生成">AI短视频生成<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/003-money-printer-plus-how-to-use-aliyun#ai%E7%9F%AD%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90" class="hash-link" aria-label="AI短视频生成的直接链接" title="AI短视频生成的直接链接">​</a></h2>
<p>有了基础配置之后，就可以点击左边的AI视频进入AI视频生成页面。</p>
<ol>
<li>LLM视频文案生成</li>
</ol>
<p>在视频主题区输入你需要生成的视频主题，然后点击生成视频文案。</p>
<p>程序会自动使用大模型生成对应的视频文案和视频文案关键字：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162207402.png" alt="image-20240616220713534" class="img_ev3q"></p>
<p>如果你对视频文案或者关键字不满意，可以手动进行修改。</p>
<ol start="2">
<li>视频配音区</li>
</ol>
<p>在视频配音区可以选择配音语言和对应的配音语言，目前支持100+配音语言。</p>
<p>还可以选择不同的配音语速，以支持不同使用场景。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162208006.png" alt="image-20240616220840076" class="img_ev3q"></p>
<p>如果你对配音不太确定，可以点击试听声音试听对应的配音语音。</p>
<ol start="3">
<li>背景音乐</li>
</ol>
<p>背景音乐放在项目下的bgmusic目录下面，你可以自行添加背景音乐文件到该文件夹下面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162210686.png" alt="image-20240616221041774" class="img_ev3q"></p>
<p>可以选择是否开启背景音乐，和默认的背景音乐音量。</p>
<ol start="4">
<li>视频配置区</li>
</ol>
<p>视频配置区可以选择视频布局：竖屏，横屏或者方形。</p>
<p>可以选择视频帧率，视频的尺寸。</p>
<p>还可以选择每个视频片段的最小长度和最大长度。</p>
<p>最最重要的，还可以开启视频转场特效。目前支持30+视频转场特效。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162211618.png" alt="image-20240616221116997" class="img_ev3q"></p>
<ol start="5">
<li>字幕配置</li>
</ol>
<p>如果你需要字幕，那么可以点击开启字幕选项，可以设置字幕字体，字幕字体的大小和字幕颜色等。</p>
<p>如果你不知道怎么设置，选择默认即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162212891.png" alt="image-20240616221242812" class="img_ev3q"></p>
<ol start="6">
<li>最后的视频生成</li>
</ol>
<p>最后点击生成视频按钮即可生成视频。</p>
<p>页面会有相应的进度提醒。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162217977.png" alt="image-20240616221712173" class="img_ev3q"></p>
<p>最后生成的视频会展示在页面最下面，大家可以自行播放。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[MoneyPrinterPlus:AI自动短视频生成工具-腾讯云配置详解]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent</guid>
            <pubDate>Mon, 24 Jun 2024 06:18:21 GMT</pubDate>
            <description><![CDATA[详细介绍如何使用在MoneyPrinterPlus中配置使用腾讯云语音服务，实现AI自动短视频生成。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus可以使用大模型自动生成短视频，其中的语音合成和语音识别部分需要借助于一些第三发云厂商的语音服务。</p>
<p>很多小伙伴可能不知道应该如何配置，这里给大家提供一个详细的腾讯云语音服务的配置教程。</p>
<p>项目已开源，代码地址：<a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="腾讯云的具体配置">腾讯云的具体配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E8%85%BE%E8%AE%AF%E4%BA%91%E7%9A%84%E5%85%B7%E4%BD%93%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="腾讯云的具体配置的直接链接" title="腾讯云的具体配置的直接链接">​</a></h2>
<p>MoneyPrinterPlus在生成视频过程中需要进行一些语音合成和语音识别工作。</p>
<p>为了保证最后生成视频的质量，所以我们会用到一些云厂商提供的语音合成和语音识别服务。</p>
<p>这里腾讯云为例，来讲解如何进行腾讯云语音的配置。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="获取腾讯云的access-id和secret-key">获取腾讯云的access ID和Secret Key<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E8%8E%B7%E5%8F%96%E8%85%BE%E8%AE%AF%E4%BA%91%E7%9A%84access-id%E5%92%8Csecret-key" class="hash-link" aria-label="获取腾讯云的access ID和Secret Key的直接链接" title="获取腾讯云的access ID和Secret Key的直接链接">​</a></h3>
<p>首先我们到腾讯云的官网上去注册一个账号，在最上面的搜索框， 我们输入访问密钥，在下面的控制台入口，点击访问密钥，即可进入腾讯云的访问密钥控制台。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250924635.png" alt="image-20240625092440010" class="img_ev3q"></p>
<p>在API密钥管理部分，点击右边的新建密钥，即可生成APPID,SecretID和SecretKey这三个值。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250926388.png" alt="image-20240625092559083" class="img_ev3q"></p>
<p>大家把这三个数据保存下来。我们后面在MoneyPrinterPlus中会用到这三个值。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="开通智能语音服务">开通智能语音服务<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E5%BC%80%E9%80%9A%E6%99%BA%E8%83%BD%E8%AF%AD%E9%9F%B3%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="开通智能语音服务的直接链接" title="开通智能语音服务的直接链接">​</a></h3>
<p>同样的，我们在最上面的搜索框中输入语音合成，点击下方的控制台入口--》语音合成按钮，进入到语音合成界面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250928280.png" alt="image-20240625092812098" class="img_ev3q"></p>
<p>进入语音合成界面之后，我们找到左边的语音合成资源包，点击领取免费资源包，这样可以领取免费的语音合成资源。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250930029.png" alt="image-20240625093019426" class="img_ev3q"></p>
<p>如果你的资源包用完了，没关系， 我们点击左下角的语音合成设置，开通后付费服务即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250931618.png" alt="image-20240625093133476" class="img_ev3q"></p>
<p>同样的，对于语音识别功能，我们同样可以领取免费的语音识别资源包。</p>
<p>如果资源包不够用的话，可以在语音识别设置中开通后付费服务。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250932073.png" alt="image-20240625093246850" class="img_ev3q"></p>
<p>这样，我们在腾讯云的语音合成和语音识别服务就开通好了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="在moneyprinterplus中配置">在MoneyPrinterPlus中配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E5%9C%A8moneyprinterplus%E4%B8%AD%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="在MoneyPrinterPlus中配置的直接链接" title="在MoneyPrinterPlus中配置的直接链接">​</a></h3>
<p>启动我们的项目，在web页面点击最左边的基础配置，找到右边的配置音频库信息，选择Tencent。</p>
<p>填入我们之前保存的Access Key ID ,Access Key Secret和App Key。</p>
<p>回车后，这样我们的配置就保存了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406250935558.png" alt="image-20240625093454529" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="其他的配置">其他的配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E5%85%B6%E4%BB%96%E7%9A%84%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="其他的配置的直接链接" title="其他的配置的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="资源库">资源库<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E8%B5%84%E6%BA%90%E5%BA%93" class="hash-link" aria-label="资源库的直接链接" title="资源库的直接链接">​</a></h3>
<p>资源库指的是我们从哪里获取视频或者图片信息，这里目前提供了两个资源提供方，分别是pexels和pixabay。</p>
<p>大家任意选择一个即可。</p>
<p>以pexels为例，我们登入pexels官网 <a href="https://www.pexels.com/zh-cn/" target="_blank" rel="noopener noreferrer">https://www.pexels.com/zh-cn/</a> ，注册一个账号。</p>
<p>在图片和视频API里面，可以查看自己的api密钥。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162116765.png" alt="image-20240616211609578" class="img_ev3q"></p>
<p>查看自己的API密钥：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162117120.png" alt="image-20240616211719443" class="img_ev3q"></p>
<p>把这个API密钥记下来，拷贝到MoneyPrinterPlus的配置即可。</p>
<p>![image-20240620170029227](/Users/wayne/Library/Application Support/typora-user-images/image-20240620170029227.png)</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="大模型配置">大模型配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="大模型配置的直接链接" title="大模型配置的直接链接">​</a></h3>
<p>目前支持Moonshot,openAI,Azure openAI,Baidu Qianfan, Baichuan,Tongyi Qwen, DeepSeek这些。</p>
<p>国内要用的话推荐Moonshot（最近发现moonshot不太稳定，大家可以考虑Baichuan或者DeepSeek）。</p>
<p>同样的到Moonshot开发者平台上注册一个key：<a href="https://platform.moonshot.cn/" target="_blank" rel="noopener noreferrer">https://platform.moonshot.cn/</a> 填入对应的配置即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162126626.png" alt="image-20240616212642905" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai短视频生成">AI短视频生成<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/004-money-printer-plus-how-to-use-tencent#ai%E7%9F%AD%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90" class="hash-link" aria-label="AI短视频生成的直接链接" title="AI短视频生成的直接链接">​</a></h2>
<p>有了基础配置之后，就可以点击左边的AI视频进入AI视频生成页面。</p>
<ol>
<li>LLM视频文案生成</li>
</ol>
<p>在视频主题区输入你需要生成的视频主题，然后点击生成视频文案。</p>
<p>程序会自动使用大模型生成对应的视频文案和视频文案关键字：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162207402.png" alt="image-20240616220713534" class="img_ev3q"></p>
<p>如果你对视频文案或者关键字不满意，可以手动进行修改。</p>
<ol start="2">
<li>视频配音区</li>
</ol>
<p>在视频配音区可以选择配音语言和对应的配音语言，目前支持100+配音语言。</p>
<p>还可以选择不同的配音语速，以支持不同使用场景。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162208006.png" alt="image-20240616220840076" class="img_ev3q"></p>
<p>如果你对配音不太确定，可以点击试听声音试听对应的配音语音。</p>
<ol start="3">
<li>背景音乐</li>
</ol>
<p>背景音乐放在项目下的bgmusic目录下面，你可以自行添加背景音乐文件到该文件夹下面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162210686.png" alt="image-20240616221041774" class="img_ev3q"></p>
<p>可以选择是否开启背景音乐，和默认的背景音乐音量。</p>
<ol start="4">
<li>视频配置区</li>
</ol>
<p>视频配置区可以选择视频布局：竖屏，横屏或者方形。</p>
<p>可以选择视频帧率，视频的尺寸。</p>
<p>还可以选择每个视频片段的最小长度和最大长度。</p>
<p>最最重要的，还可以开启视频转场特效。目前支持30+视频转场特效。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162211618.png" alt="image-20240616221116997" class="img_ev3q"></p>
<ol start="5">
<li>字幕配置</li>
</ol>
<p>如果你需要字幕，那么可以点击开启字幕选项，可以设置字幕字体，字幕字体的大小和字幕颜色等。</p>
<p>如果你不知道怎么设置，选择默认即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162212891.png" alt="image-20240616221242812" class="img_ev3q"></p>
<ol start="6">
<li>最后的视频生成</li>
</ol>
<p>最后点击生成视频按钮即可生成视频。</p>
<p>页面会有相应的进度提醒。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162217977.png" alt="image-20240616221712173" class="img_ev3q"></p>
<p>最后生成的视频会展示在页面最下面，大家可以自行播放。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure</guid>
            <pubDate>Mon, 24 Jun 2024 06:18:21 GMT</pubDate>
            <description><![CDATA[详细介绍如何使用在MoneyPrinterPlus中配置使用微软云语音服务，实现AI自动短视频生成。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus可以使用大模型自动生成短视频，我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。</p>
<p>Azure的语音服务应该是我用过的效果最好的服务了，微软还得是微软。</p>
<p>很多小伙伴可能不知道应该如何配置，这里给大家提供一个详细的Azure语音服务的配置教程。</p>
<p>项目已开源，代码地址：<a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="azure的具体配置">Azure的具体配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#azure%E7%9A%84%E5%85%B7%E4%BD%93%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="Azure的具体配置的直接链接" title="Azure的具体配置的直接链接">​</a></h2>
<p>因为Azure的注册需要用到VISA，所以阻止了很多想要进一步探索的小伙伴。</p>
<p>其实，MoneyPrinterPlus也是支持国内的云厂商，比如阿里云和腾讯云。所以，如果注册Azure有困难的小伙伴，可以参考我的另外两篇使用阿里云和腾讯云的介绍文章。</p>
<p>这里Azure为例，来讲解如何进行Azure语音的配置。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="获取azure的speech-key和service-region">获取Azure的Speech Key和Service Region<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#%E8%8E%B7%E5%8F%96azure%E7%9A%84speech-key%E5%92%8Cservice-region" class="hash-link" aria-label="获取Azure的Speech Key和Service Region的直接链接" title="获取Azure的Speech Key和Service Region的直接链接">​</a></h3>
<p>首先我们到Azure的官网上去注册一个账号，怎么注册这里就不讲了，反正很简单，注册成功还可以免费使用一年的微软云服务,非常的棒。</p>
<p>有了账号，并且登录账号之后，在搜索框输入语音服务：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406261524063.png" alt="image-20240626152358026" class="img_ev3q"></p>
<p>点击下面的语音服务，进入到Azure的语音服务页面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406261525247.png" alt="image-20240626152540065" class="img_ev3q"></p>
<p>到语音服务这里，点击创建按钮，会进入创建语音服务页面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406261527137.png" alt="image-20240626152710532" class="img_ev3q"></p>
<p>填上必须的内容。点击审阅并创建，就可以创建好Azure的服务了。</p>
<p>记住你的密钥和region：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406261528445.png" alt="image-20240626152846707" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="在moneyprinterplus中配置">在MoneyPrinterPlus中配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#%E5%9C%A8moneyprinterplus%E4%B8%AD%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="在MoneyPrinterPlus中配置的直接链接" title="在MoneyPrinterPlus中配置的直接链接">​</a></h3>
<p>启动我们的项目，在web页面点击最左边的基础配置，找到右边的配置音频库信息，选择Tencent。</p>
<p>填入我们之前保存的密钥和region。</p>
<p>回车后，这样我们的配置就保存了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406261529921.png" alt="image-20240626152909378" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="其他的配置">其他的配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#%E5%85%B6%E4%BB%96%E7%9A%84%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="其他的配置的直接链接" title="其他的配置的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="资源库">资源库<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#%E8%B5%84%E6%BA%90%E5%BA%93" class="hash-link" aria-label="资源库的直接链接" title="资源库的直接链接">​</a></h3>
<p>资源库指的是我们从哪里获取视频或者图片信息，这里目前提供了两个资源提供方，分别是pexels和pixabay。</p>
<p>大家任意选择一个即可。</p>
<p>以pexels为例，我们登入pexels官网 <a href="https://www.pexels.com/zh-cn/" target="_blank" rel="noopener noreferrer">https://www.pexels.com/zh-cn/</a> ，注册一个账号。</p>
<p>在图片和视频API里面，可以查看自己的api密钥。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162116765.png" alt="image-20240616211609578" class="img_ev3q"></p>
<p>查看自己的API密钥：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162117120.png" alt="image-20240616211719443" class="img_ev3q"></p>
<p>把这个API密钥记下来，拷贝到MoneyPrinterPlus的配置即可。</p>
<p>![image-20240620170029227](/Users/wayne/Library/Application Support/typora-user-images/image-20240620170029227.png)</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="大模型配置">大模型配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="大模型配置的直接链接" title="大模型配置的直接链接">​</a></h3>
<p>目前支持Moonshot,openAI,Azure openAI,Baidu Qianfan, Baichuan,Tongyi Qwen, DeepSeek这些。</p>
<p>国内要用的话推荐Moonshot（最近发现moonshot不太稳定，大家可以考虑Baichuan或者DeepSeek）。</p>
<p>同样的到Moonshot开发者平台上注册一个key：<a href="https://platform.moonshot.cn/" target="_blank" rel="noopener noreferrer">https://platform.moonshot.cn/</a> 填入对应的配置即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162126626.png" alt="image-20240616212642905" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai短视频生成">AI短视频生成<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/005-money-printer-plus-how-to-use-azure#ai%E7%9F%AD%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90" class="hash-link" aria-label="AI短视频生成的直接链接" title="AI短视频生成的直接链接">​</a></h2>
<p>有了基础配置之后，就可以点击左边的AI视频进入AI视频生成页面。</p>
<ol>
<li>LLM视频文案生成</li>
</ol>
<p>在视频主题区输入你需要生成的视频主题，然后点击生成视频文案。</p>
<p>程序会自动使用大模型生成对应的视频文案和视频文案关键字：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162207402.png" alt="image-20240616220713534" class="img_ev3q"></p>
<p>如果你对视频文案或者关键字不满意，可以手动进行修改。</p>
<ol start="2">
<li>视频配音区</li>
</ol>
<p>在视频配音区可以选择配音语言和对应的配音语言，目前支持100+配音语言。</p>
<p>还可以选择不同的配音语速，以支持不同使用场景。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162208006.png" alt="image-20240616220840076" class="img_ev3q"></p>
<p>如果你对配音不太确定，可以点击试听声音试听对应的配音语音。</p>
<ol start="3">
<li>背景音乐</li>
</ol>
<p>背景音乐放在项目下的bgmusic目录下面，你可以自行添加背景音乐文件到该文件夹下面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162210686.png" alt="image-20240616221041774" class="img_ev3q"></p>
<p>可以选择是否开启背景音乐，和默认的背景音乐音量。</p>
<ol start="4">
<li>视频配置区</li>
</ol>
<p>视频配置区可以选择视频布局：竖屏，横屏或者方形。</p>
<p>可以选择视频帧率，视频的尺寸。</p>
<p>还可以选择每个视频片段的最小长度和最大长度。</p>
<p>最最重要的，还可以开启视频转场特效。目前支持30+视频转场特效。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162211618.png" alt="image-20240616221116997" class="img_ev3q"></p>
<ol start="5">
<li>字幕配置</li>
</ol>
<p>如果你需要字幕，那么可以点击开启字幕选项，可以设置字幕字体，字幕字体的大小和字幕颜色等。</p>
<p>如果你不知道怎么设置，选择默认即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162212891.png" alt="image-20240616221242812" class="img_ev3q"></p>
<ol start="6">
<li>最后的视频生成</li>
</ol>
<p>最后点击生成视频按钮即可生成视频。</p>
<p>页面会有相应的进度提醒。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162217977.png" alt="image-20240616221712173" class="img_ev3q"></p>
<p>最后生成的视频会展示在页面最下面，大家可以自行播放。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/002-money-printer-plus-how-to-use-one</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/002-money-printer-plus-how-to-use-one</guid>
            <pubDate>Sun, 16 Jun 2024 14:19:38 GMT</pubDate>
            <description><![CDATA[详细介绍如何使用MoneyPrinterPlus:AI自动短视频生成工具,一键批量生成各类短视频。一键混剪短视频。]]></description>
            <content:encoded><![CDATA[<p>MoneyPrinterPlus是一款使用AI大模型技术,一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上的轻松赚钱工具。</p>
<p>之前有出过一期基本的介绍，但是后台收到有些小伙伴说，不知道如何使用。</p>
<p>今天我将会手把手的详细介绍如何使用MoneyPrinterPlus快速生成短视频。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提准备">前提准备<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/002-money-printer-plus-how-to-use-one#%E5%89%8D%E6%8F%90%E5%87%86%E5%A4%87" class="hash-link" aria-label="前提准备的直接链接" title="前提准备的直接链接">​</a></h2>
<ol>
<li>
<p>首先需要下载MoneyPrinterPlus工具。开源地址如下：<a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
</li>
<li>
<p>因为这个工具依赖于ffmpeg工具，所以你需要下载安装ffmpeg工具。</p>
</li>
</ol>
<p>​	ffmpeg工具下载地址： <a href="https://ffmpeg.org/" target="_blank" rel="noopener noreferrer">https://ffmpeg.org/</a></p>
<p>​	安装完之后，需要把ffmpeg添加到系统路径中。</p>
<p>​	如果你在命令行中输入ffmepg得到类似下面的结果：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ffmpeg version </span><span class="token number" style="color:#36acaa">6.0</span><span class="token plain"> Copyright </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">c</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2000</span><span class="token plain">-2023 the FFmpeg developers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  built with Apple clang version </span><span class="token number" style="color:#36acaa">15.0</span><span class="token plain">.0 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clang-1500.0.40.1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  configuration: </span><span class="token parameter variable" style="color:#36acaa">--prefix</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/opt/homebrew/Cellar/ffmpeg/6.0-with-options_4 --enable-shared </span><span class="token parameter variable" style="color:#36acaa">--cc</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">clang --host-cflags</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> --host-ldflags</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'-Wl,-ld_classic'</span><span class="token plain"> --enable-gpl --enable-libaom --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-demuxer</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">dash --enable-opencl --enable-audiotoolbox --enable-videotoolbox --enable-neon --disable-htmlpages --enable-libopenjpeg --enable-librsvg</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>​	那么恭喜你，ffmpeg工具安装好了。否则的话还是要检查一下ffmpeg工具是否安装好。</p>
<ol start="3">
<li>
<p>系统依赖python环境，你需要包装至少安装python 3.10版本。</p>
<p>同样的，你也需要把python添加到系统路径中。</p>
<p>如果你在命令行中输入python得到下面的结果：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Python </span><span class="token number" style="color:#36acaa">3.11</span><span class="token plain">.5 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">main, Sep </span><span class="token number" style="color:#36acaa">11</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">, 08:31:25</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Clang </span><span class="token number" style="color:#36acaa">14.0</span><span class="token plain">.6 </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> on darwin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type </span><span class="token string" style="color:#e3116c">"help"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"copyright"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"credits"</span><span class="token plain"> or </span><span class="token string" style="color:#e3116c">"license"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">more</span><span class="token plain"> information.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>那么恭喜你python环境安装好了。</p>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装项目">安装项目<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/002-money-printer-plus-how-to-use-one#%E5%AE%89%E8%A3%85%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="安装项目的直接链接" title="安装项目的直接链接">​</a></h2>
<p>有了上面的前提准备工作，接下来就可以安装MoneyPrinterPlus工具了。</p>
<p>运行下面的命令，将会把MoneyPrinterPlus拷贝到你的本地目录。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/ddean2009/MoneyPrinterPlus</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>进入MoneyPrinterPlus目录，运行安装必须的依赖：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> requirements.txt</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后运行：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">streamlit run gui.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>会自动开启浏览器，进入MoneyPrinterPlus界面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162108034.png" alt="image-20240616210820039" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="基本配置">基本配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/002-money-printer-plus-how-to-use-one#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="基本配置的直接链接" title="基本配置的直接链接">​</a></h2>
<p>首先我们点击左边的基本配置，这里需要配置一些我们需要用到的资源信息。</p>
<ol>
<li>资源库</li>
</ol>
<p>资源库指的是我们从哪里获取视频或者图片信息，这里目前提供了两个资源提供方，分别是pexels和pixabay。</p>
<p>大家任意选择一个即可。</p>
<p>以pexels为例，我们登入pexels官网 <a href="https://www.pexels.com/zh-cn/" target="_blank" rel="noopener noreferrer">https://www.pexels.com/zh-cn/</a> ，注册一个账号。</p>
<p>在图片和视频API里面，可以查看自己的api密钥。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162116765.png" alt="image-20240616211609578" class="img_ev3q"></p>
<p>查看自己的API密钥：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162117120.png" alt="image-20240616211719443" class="img_ev3q"></p>
<p>把这个API密钥记下来，拷贝到MoneyPrinterPlus的配置即可。</p>
<ol start="2">
<li>音频库</li>
</ol>
<p>音频库目前支持微软云和阿里云两个平台。后面会添加腾讯云。</p>
<p>因为有些小伙伴注册微软云不太方便，所以这里特意介绍一下阿里云怎么设置。</p>
<p>首先注册个阿里云账号，然后开通智能语音交互服务：</p>
<p><a href="https://nls-portal.console.aliyun.com/" target="_blank" rel="noopener noreferrer">https://nls-portal.console.aliyun.com/</a></p>
<p>在全部项目---》点击创建项目，项目类型选择：语音识别 + 语音合成 + 语音分析即可。</p>
<p>然后你就会看到项目appkey，把这个appkey记录下来。后面需要用到。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162120894.png" alt="image-20240616212039562" class="img_ev3q"></p>
<p>另外，在项目总览部分，需要开通下面这几个服务：</p>
<p>分别是录音文件识别（极速版），语音合成，和长文本语音合成。</p>
<p>如果你要转换的文字内容不超过300个字的话，可以选择不开通长文本语音合成。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162123709.png" alt="image-20240616212319682" class="img_ev3q"></p>
<p>这样阿里云的语音服务已经开启成功了。</p>
<p>切记录音文件识别（极速版）没有免费版本，一定要升级到商业版。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406171705894.png" alt="image-20240617170539878" class="img_ev3q"></p>
<p>接下来到账号的AccessKey管理中创建一个新的AccessKey。记住对应的AccessKey ID 和 AccessKey Secret。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162124097.png" alt="image-20240616212456323" class="img_ev3q"></p>
<p>有了上面三个内容，就可以填写到MoneyPrinterPlus的配置里面了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162119522.png" alt="image-20240616211913847" class="img_ev3q"></p>
<p>接下来就是大模型配置了。</p>
<p>目前支持Moonshot,openAI,Azure openAI,Baidu Qianfan, Baichuan,Tongyi Qwen, DeepSeek这些。</p>
<p>国内要用的话推荐Moonshot（最近发现moonshot不太稳定，大家可以考虑Baichuan或者DeepSeek）。</p>
<p>同样的到Moonshot开发者平台上注册一个key：<a href="https://platform.moonshot.cn/" target="_blank" rel="noopener noreferrer">https://platform.moonshot.cn/</a> 填入对应的配置即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162126626.png" alt="image-20240616212642905" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai短视频生成">AI短视频生成<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/002-money-printer-plus-how-to-use-one#ai%E7%9F%AD%E8%A7%86%E9%A2%91%E7%94%9F%E6%88%90" class="hash-link" aria-label="AI短视频生成的直接链接" title="AI短视频生成的直接链接">​</a></h2>
<p>有了基础配置之后，就可以点击左边的AI视频进入AI视频生成页面。</p>
<ol>
<li>LLM视频文案生成</li>
</ol>
<p>在视频主题区输入你需要生成的视频主题，然后点击生成视频文案。</p>
<p>程序会自动使用大模型生成对应的视频文案和视频文案关键字：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162207402.png" alt="image-20240616220713534" class="img_ev3q"></p>
<p>如果你对视频文案或者关键字不满意，可以手动进行修改。</p>
<ol start="2">
<li>视频配音区</li>
</ol>
<p>在视频配音区可以选择配音语言和对应的配音语言，目前支持100+配音语言。</p>
<p>还可以选择不同的配音语速，以支持不同使用场景。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162208006.png" alt="image-20240616220840076" class="img_ev3q"></p>
<p>如果你对配音不太确定，可以点击试听声音试听对应的配音语音。</p>
<ol start="3">
<li>背景音乐</li>
</ol>
<p>背景音乐放在项目下的bgmusic目录下面，你可以自行添加背景音乐文件到该文件夹下面。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162210686.png" alt="image-20240616221041774" class="img_ev3q"></p>
<p>可以选择是否开启背景音乐，和默认的背景音乐音量。</p>
<ol start="4">
<li>视频配置区</li>
</ol>
<p>视频配置区可以选择视频布局：竖屏，横屏或者方形。</p>
<p>可以选择视频帧率，视频的尺寸。</p>
<p>还可以选择每个视频片段的最小长度和最大长度。</p>
<p>最最重要的，还可以开启视频转场特效。目前支持30+视频转场特效。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162211618.png" alt="image-20240616221116997" class="img_ev3q"></p>
<ol start="5">
<li>字幕配置</li>
</ol>
<p>如果你需要字幕，那么可以点击开启字幕选项，可以设置字幕字体，字幕字体的大小和字幕颜色等。</p>
<p>如果你不知道怎么设置，选择默认即可。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162212891.png" alt="image-20240616221242812" class="img_ev3q"></p>
<ol start="6">
<li>最后的视频生成</li>
</ol>
<p>最后点击生成视频按钮即可生成视频。</p>
<p>页面会有相应的进度提醒。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406162217977.png" alt="image-20240616221712173" class="img_ev3q"></p>
<p>最后生成的视频会展示在页面最下面，大家可以自行播放。</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过]]></title>
            <link>http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview</link>
            <guid>http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview</guid>
            <pubDate>Wed, 12 Jun 2024 07:00:56 GMT</pubDate>
            <description><![CDATA[MoneyPrinterPlus使用AI大模型技术,一键批量生成各类短视频。一键混剪短视频，批量生成短视频不是梦。自动把视频发布到抖音,快手,小红书,视频号上。]]></description>
            <content:encoded><![CDATA[<p>这是一个轻松赚钱的项目。</p>
<p>短视频时代，谁掌握了流量谁就掌握了Money!</p>
<p>所以给大家分享这个经过精心打造的MoneyPrinterPlus项目。</p>
<p>它可以：使用AI大模型技术,一键批量生成各类短视频。</p>
<p>它可以：一键混剪短视频，批量生成短视频不是梦。</p>
<p>它可以：自动把视频发布到抖音,快手,小红书,视频号上。</p>
<p>赚钱从来没有这么容易过!</p>
<p>项目地址： <a href="https://github.com/ddean2009/MoneyPrinterPlus" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/MoneyPrinterPlus</a></p>
<p>这个项目可以轻松实现各类视频的生成，横屏的是，竖屏的，正方形的。只有你想不到的没有它做不到的。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121516250.png" alt="image-20240612151635072" class="img_ev3q"></p>
<h1>使用方法</h1>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="环境要求">环境要求<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82" class="hash-link" aria-label="环境要求的直接链接" title="环境要求的直接链接">​</a></h2>
<ul>
<li>Python 3.10+</li>
<li>ffmpeg 6.0+</li>
<li>LLM api key</li>
<li>Azure语音api key</li>
</ul>
<blockquote>
<p>切记！！！！！ 一定要安装好ffmpeg,并把ffmpeg路径添加到环境变量中。</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="安装">安装<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E5%AE%89%E8%A3%85" class="hash-link" aria-label="安装的直接链接" title="安装的直接链接">​</a></h2>
<ol>
<li>确保你有Python 3.10+的运行环境。如果是windows, 请确保安装了python路径已经添加到了PATH中。</li>
<li>确保你有ffmpeg 6.0+的运行环境。如果是windows, 请确保安装了ffmpeg路径已经添加到了PATH中。没有安装ffmpeg的朋友，请通过 <a href="https://ffmpeg.org/" target="_blank" rel="noopener noreferrer">https://ffmpeg.org/</a> 来安装对应的版本。</li>
<li>如果python和ffmpeg环境都有了。那么就可以通过pip安装依赖包了。</li>
</ol>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> requirements.txt</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="运行">运行<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E8%BF%90%E8%A1%8C" class="hash-link" aria-label="运行的直接链接" title="运行的直接链接">​</a></h2>
<p>使用下面命令运行程序:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">streamlit run gui.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在日志文件中可以看到程序运行的日志信息。</p>
<p>里面有浏览器的地址，可以通过浏览器打开这个地址来访问程序。</p>
<p>打开之后，你会看到下面的界面：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121351010.png" alt="image-20240612135131890" class="img_ev3q"></p>
<p>左侧目前有三项配置， 分别是基本配置，AI视频和混剪视频(开发中)。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="基本配置">基本配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="基本配置的直接链接" title="基本配置的直接链接">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-资源库">1. 资源库<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#1-%E8%B5%84%E6%BA%90%E5%BA%93" class="hash-link" aria-label="1. 资源库的直接链接" title="1. 资源库的直接链接">​</a></h4>
<p>目前所有的资源都来自于pexels（<a href="http://www.pexels.com)/" target="_blank" rel="noopener noreferrer">www.pexels.com）</a>, <strong>Pexels</strong> 是世界上著名的免费图片，视频素材网站。</p>
<p>大家需要到pexels上注册一个key来实现API调用。</p>
<blockquote>
<p>后续会陆续添加其他资源库。如（pixabay.com，videvo.net，videezy.com 等）</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-音频库">2. 音频库<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#2-%E9%9F%B3%E9%A2%91%E5%BA%93" class="hash-link" aria-label="2. 音频库的直接链接" title="2. 音频库的直接链接">​</a></h4>
<p>目前文字转语音和语音识别功能使用的是Azure的cognitive-services服务。</p>
<p>大家需要到  <a href="https://speech.microsoft.com/portal" target="_blank" rel="noopener noreferrer">https://speech.microsoft.com/portal</a>  这里注册一个key。</p>
<p>Azure对新用户是1年免费的。费用也是比较便宜。</p>
<blockquote>
<p>后续会添加本地语音识别大模型。但是文字转语音还是微软的服务最为优秀。</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121356171.png" alt="image-20240612135624840" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3-llm大模型">3. LLM大模型<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#3-llm%E5%A4%A7%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="3. LLM大模型的直接链接" title="3. LLM大模型的直接链接">​</a></h4>
<p>大模型区目前支持Moonshot,openAI和Azure openAI三种。</p>
<blockquote>
<p>推荐使用Moonshot。</p>
<p>会陆续添加市面上其他流行的大模型。</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121402690.png" alt="image-20240612140227679" class="img_ev3q"></p>
<p>Moonshot API获取地址： <a href="https://platform.moonshot.cn/" target="_blank" rel="noopener noreferrer">https://platform.moonshot.cn/</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="ai视频">AI视频<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#ai%E8%A7%86%E9%A2%91" class="hash-link" aria-label="AI视频的直接链接" title="AI视频的直接链接">​</a></h2>
<p>基本配置设置完毕之后。就可以进入到AI视频了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="生成视频文案">生成视频文案<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E7%94%9F%E6%88%90%E8%A7%86%E9%A2%91%E6%96%87%E6%A1%88" class="hash-link" aria-label="生成视频文案的直接链接" title="生成视频文案的直接链接">​</a></h3>
<p>首先，我们给一个关键词，然后用大模型生成视频文案：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121404609.png" alt="image-20240612140441201" class="img_ev3q"></p>
<p>可以选择视频的文案语言，视频时长。</p>
<p>如果大家对视频文案和关键词不满意的话，可以手动修改。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="视频配音和背景音乐">视频配音和背景音乐<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E8%A7%86%E9%A2%91%E9%85%8D%E9%9F%B3%E5%92%8C%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90" class="hash-link" aria-label="视频配音和背景音乐的直接链接" title="视频配音和背景音乐的直接链接">​</a></h3>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121405554.png" alt="image-20240612140547283" class="img_ev3q"></p>
<p>可以选择配音的语言和配音的语音。</p>
<p>还支持配音语速调节。</p>
<blockquote>
<p>后续会支持语音试听功能。</p>
</blockquote>
<p>背景音乐放在项目的bgmusic文件夹中。</p>
<p>目前里面只有两个背景音乐。大家可以自行添加自己需要的背景应用。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="视频配置">视频配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E8%A7%86%E9%A2%91%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="视频配置的直接链接" title="视频配置的直接链接">​</a></h3>
<p>视频配置区，大家可以选择视频的布局，视频帧率，视频尺寸。</p>
<p>视频片段最小长度和最大长度。</p>
<p>还可以开启视频转场效果。目前支持30+转场效果。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121408177.png" alt="image-20240612140830765" class="img_ev3q"></p>
<blockquote>
<p>后续会添加使用本地视频资源功能。</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="字幕配置">字幕配置<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E5%AD%97%E5%B9%95%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="字幕配置的直接链接" title="字幕配置的直接链接">​</a></h3>
<p>字幕文件位于项目根目录的fonts文件夹。</p>
<p>目前支持宋体和苹方两个字体集合。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121410773.png" alt="image-20240612141000542" class="img_ev3q"></p>
<p>可以选择字幕位置，字幕颜色，字幕边框颜色和字幕边框宽度。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="生成视频">生成视频<a href="http://www.flydean.com/blog/projects/moneyPrinterPlus/001-money-printer-plus-overview#%E7%94%9F%E6%88%90%E8%A7%86%E9%A2%91" class="hash-link" aria-label="生成视频的直接链接" title="生成视频的直接链接">​</a></h3>
<p>最后，就可以点击生成视频生成视频了。</p>
<p>会在页面上列出具体的步骤名称和进度。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121414629.png" alt="image-20240612141446057" class="img_ev3q"></p>
<p>生成视频完成后，视频会显示在最下方，大家直接可以播放观看效果。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202406121415214.png" alt="image-20240612141532280" class="img_ev3q"></p>
<h1>未完待续</h1>
<p>当然，现在这个项目还在继续开发阶段，欢迎大家提出宝贵建议、</p>]]></content:encoded>
            <category>工具</category>
            <category>AI</category>
            <category>AIGC</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(腾讯云篇)]]></title>
            <link>http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud</link>
            <guid>http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud</guid>
            <pubDate>Sun, 19 May 2024 05:10:52 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到腾讯云上。]]></description>
            <content:encoded><![CDATA[<p>之前说过blog-auto-publishing-tools的实现方式是连到现有的浏览器中，而不是使用内置的浏览器。</p>
<p>其中一个很大程度的原因是像腾讯云这种博客发布平台几乎每天都需要重新登录一次，登录还需要手机扫码。所以自动化实现起来非常复杂。</p>
<p>所以，我们需要一个已经登录好的浏览器，来实现自动化功能。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="腾讯云的实现">腾讯云的实现<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E8%85%BE%E8%AE%AF%E4%BA%91%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="腾讯云的实现的直接链接" title="腾讯云的实现的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="切换到markdown编辑器">切换到markdown编辑器<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E5%88%87%E6%8D%A2%E5%88%B0markdown%E7%BC%96%E8%BE%91%E5%99%A8" class="hash-link" aria-label="切换到markdown编辑器的直接链接" title="切换到markdown编辑器的直接链接">​</a></h3>
<p>腾讯云有两个编辑器，一个是markdown，一个是富文本。</p>
<p>这个两个选项是没法设置的，我感觉是随机的，所以我们需要一个机制来保证我们现在是在markdown编辑器中。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405092114691.png" alt="image-20240509211357943" class="img_ev3q"></p>
<p>可以看到这个切换到富文本编辑器是一个div，里面包含了一个img和一个a标签。</p>
<p>我们可以通过判断a标签中的文字来确定现在是在富文本编辑器中，还是在markdown编辑器中。</p>
<p>实现方式如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 切换到markdown编辑器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    a_switch </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="col-editor-switch"]//a'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 获取a元素的文本内容</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    text_content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> a_switch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> text_content </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'切换到Markdown编辑器'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        a_switch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>拿到元素之后，获取他的text，然后判断text的内容。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章标题">文章标题<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%96%87%E7%AB%A0%E6%A0%87%E9%A2%98" class="hash-link" aria-label="文章标题的直接链接" title="文章标题的直接链接">​</a></h3>
<p>腾讯云的文章标题是一个textarea，我们可以通过placeholder来定位到这个元素：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//textarea[@placeholder="请输入标题"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章内容">文章内容<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9" class="hash-link" aria-label="文章内容的直接链接" title="文章内容的直接链接">​</a></h3>
<p>腾讯云的文章内容编辑器是一个叫做monaco-editor的东西。</p>
<p>这种编辑器会根据文章内容，动态变化html的内容。所以对于这种编辑器来说，我们需要使用到拷贝粘贴的方法。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 文章内容 markdown版本, 腾讯云不能有引流链接</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    file_content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> read_file</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 用的是CodeMirror,不能用元素赋值的方法，所以我们使用拷贝的方法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cmd_ctrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">COMMAND </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">platform </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'darwin'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CONTROL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 将要粘贴的文本内容复制到剪贴板</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pyperclip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file_content</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"draft-markdown-editor")]//div[@class="view-line"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟实际的粘贴操作</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>粘贴的时候需要定位到文章编辑器的位置，点击一下，然后才能进行粘贴。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="�发布文章">发布文章<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0" class="hash-link" aria-label="发布文章的直接链接" title="发布文章的直接链接">​</a></h3>
<p>接下来就可以点击发布文章按钮了。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 发布文章</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    send_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[contains(@class, "c-btn") and contains(text(),"发布")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    send_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>点击发布按钮之后，会在侧边栏弹出一个对话框，如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405092148341.png" alt="image-20240509214834483" class="img_ev3q"></p>
<p>这里可以选择文章来源，文章分类，文章标签和自定义关键字这些内容。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章来源">文章来源<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%96%87%E7%AB%A0%E6%9D%A5%E6%BA%90" class="hash-link" aria-label="文章来源的直接链接" title="文章来源的直接链接">​</a></h3>
<p>文章来源我们就选择原创了，文章来源是一个input，我们可以使用下面的方法来定位：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章来源</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    source </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//ul[@class="com-check-list"]/li/label/span[contains(text(),"原创")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章分类">文章分类<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%96%87%E7%AB%A0%E5%88%86%E7%B1%BB" class="hash-link" aria-label="文章分类的直接链接" title="文章分类的直接链接">​</a></h3>
<p>文章分类比较复杂点。</p>
<p>我们需要先点击文章分类下拉框，然后在输入框中输入要设置的文章分类。</p>
<p>实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        article_type_select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//section[@class="col-editor-sidebar publish"]//div[@class="tea-dropdown col-editor-classify is-expanded"]/div'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        article_type_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        article_type_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string-interpolation string" style="color:#e3116c">f'//div[@class="tea-dropdown-box"]//ul//li//label//span[text()="</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">article_type</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        article_type_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章标签">文章标签<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%96%87%E7%AB%A0%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="文章标签的直接链接" title="文章标签的直接链接">​</a></h3>
<p>文章标签需要选择标签输入框，然后根据设置好的标签内容，输入到输入框中，然后回车即可：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        tag_label </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                        </span><span class="token string" style="color:#e3116c">'//div[@class="com-2-tag-cont"]/label[contains(text(),"搜索并选择合适的标签")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tag_label</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'../input[@class="com-2-tag-input"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> tag </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ENTER</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="关键词">关键词<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E5%85%B3%E9%94%AE%E8%AF%8D" class="hash-link" aria-label="关键词的直接链接" title="关键词的直接链接">​</a></h3>
<p>自定义关键词和文章标签的实现方式很类似，也是先找到自定义关键词框，点击，然后输入，最后回车即可：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        keyword_label </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="com-2-tag-cont"]/label[contains(text(),"最多5个关键词")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        keyword_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> keyword_label</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'../input[@class="com-2-tag-input"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> keyword </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> keywords</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            keyword_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">keyword</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            keyword_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ENTER</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="专栏">专栏<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E4%B8%93%E6%A0%8F" class="hash-link" aria-label="专栏的直接链接" title="专栏的直接链接">​</a></h3>
<p>腾讯云的专栏是一个个的checkbox，我们可以通过他的具体内容来选择：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        zhuanlan_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//span[@class="col-editor-create-name" and contains(text(),"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">zhuanlan</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        zhuanlan_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="封面图片">封面图片<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E5%B0%81%E9%9D%A2%E5%9B%BE%E7%89%87" class="hash-link" aria-label="封面图片的直接链接" title="封面图片的直接链接">​</a></h3>
<p>腾讯云的封面图片是一个input，带有id的，所以实现起来比较简单：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        file_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"editor-upload-input"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 文件上传不支持远程文件上传，所以需要把图片下载到本地</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        file_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">download_image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后的发布按钮">最后的发布按钮<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%9C%80%E5%90%8E%E7%9A%84%E5%8F%91%E5%B8%83%E6%8C%89%E9%92%AE" class="hash-link" aria-label="最后的发布按钮的直接链接" title="最后的发布按钮的直接链接">​</a></h3>
<p>最后就是发布按钮了：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"block c-btn") and contains(text(),"确认发布")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我们通过包含的text来选择。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/011-auto-blog-publish-tool-txcloud#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>腾讯云的选项比较多，实现起来也比较复杂。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(头条篇)]]></title>
            <link>http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao</link>
            <guid>http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao</guid>
            <pubDate>Sun, 19 May 2024 05:10:52 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到头条上。]]></description>
            <content:encoded><![CDATA[<p>虽然头条现在非常强大，但是我还是不得不吐槽一下头条的博客发布，居然不支持markdown格式。</p>
<p>并且在某些浏览器上还会出现编辑页面打不开的情况，让我一度怀疑是我浏览器的问题。</p>
<p>不过，这都不重要，重要的是blog-auto-publishing-tools这个工具可以实现头条的自动化。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="头条的实现">头条的实现<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E5%A4%B4%E6%9D%A1%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="头条的实现的直接链接" title="头条的实现的直接链接">​</a></h2>
<p>头条需要填写的内容也是挺多的。</p>
<p>我们接下来一个个来实现。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="标题">标题<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E6%A0%87%E9%A2%98" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接">​</a></h3>
<p>虽然头条的标题是一个textarea，但是没有id或者name，所以我们只能通过placeholder来获得这个标题：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="publish-editor-title-inner"]//textarea[contains(@placeholder,"请输入文章标题")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="正文">正文<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E6%AD%A3%E6%96%87" class="hash-link" aria-label="正文的直接链接" title="正文的直接链接">​</a></h3>
<p>头条的正文用的也是ProseMirror，这是一个动态的文本编辑器，会随着你输入的内容动态更新html。所以不能用传统的textArea的方式来实现。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405101131044.png" alt="image-20240510113139564" class="img_ev3q"></p>
<p>在实现上我们可以使用拷贝粘贴的方式来实现。</p>
<p>现在还剩一个大问题，就是头条不支持markdown格式。</p>
<p>我们还需要考虑先把markdown格式转换成html，然后直接拷贝html到正文的内容里面。</p>
<p>网上有很多把markdown转换成html的工具，其中一个比较出名的就是pandoc。</p>
<p>pandoc的功能很强大，可以转换很多格式的文本。</p>
<p>对于markdown转换成html，可以使用下面的命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> pandoc </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> markdown </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> html5 input.md </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> output.html</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>当然为了拷贝出来的样式好看一些，这里我还添加了css文件。</p>
<p>实现方法都写在了convert_md_to_html方法里面了。</p>
<p>感兴趣的朋友可以去看看。</p>
<p>最后我们的实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章内容 html版本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_file </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_file_html </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> convert_md_to_html</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content_file</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    get_html_web_content</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content_file_html</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待2秒</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">switch_to</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window_handles</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待1秒</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 用tab定位，然后拷贝</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cmd_ctrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">COMMAND </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">platform </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'darwin'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CONTROL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟实际的粘贴操作（在某些情况下可能更合适）：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 定位到要粘贴的位置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="publish-editor"]//div[@class="ProseMirror"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>解释下实现的逻辑。</p>
<p>convert_md_to_html是把markdown转换成了html。</p>
<p>get_html_web_content是在新的web tab中打开这个html文件，然后使用系统的复制功能把html内容拷贝到剪贴板上。</p>
<p>然后再定位到要粘贴的位置，使用系统的粘贴功能把内容粘贴到内容框中。</p>
<p>是不是很复杂？</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="标题设置">标题设置<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E6%A0%87%E9%A2%98%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="标题设置的直接链接" title="标题设置的直接链接">​</a></h3>
<p>一般来说头条会自动为我们设置标题。所以这里就不选择了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="展示封面">展示封面<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E5%B1%95%E7%A4%BA%E5%B0%81%E9%9D%A2" class="hash-link" aria-label="展示封面的直接链接" title="展示封面的直接链接">​</a></h3>
<p>目前还没看到头条的封面上传的input标签，所以这个功能展示还没实现。</p>
<p>大家就手动上传封面吧~~~</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="摘要">摘要<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E6%91%98%E8%A6%81" class="hash-link" aria-label="摘要的直接链接" title="摘要的直接链接">​</a></h3>
<p>摘要是一个textarea，我们根据placeholder来定位到这个元素：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="multi-abstract-cell-content-input"]//textarea[contains(@placeholder,"好的摘要比标题更吸引读者")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="原创首发">原创首发<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E5%8E%9F%E5%88%9B%E9%A6%96%E5%8F%91" class="hash-link" aria-label="原创首发的直接链接" title="原创首发的直接链接">​</a></h3>
<p>当然，我们要设置成原创：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    original_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="original-tag"]//span[contains(text(),"声明原创")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    original_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里用xpath定位，判断text中是否包含声明原创这几个字。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最终发布">最终发布<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E6%9C%80%E7%BB%88%E5%8F%91%E5%B8%83" class="hash-link" aria-label="最终发布的直接链接" title="最终发布的直接链接">​</a></h3>
<p>最后就是最终的发布按钮了，我们通过class中是否包含publish-btn-last来判断。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"publish-btn-last")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/012-auto-blog-publish-tool-toutiao#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>头条页面设计的基本上没啥规范，所以获取元素比较困难，大部分都是需要通过xpath来定位才行。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(知乎篇)]]></title>
            <link>http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu</link>
            <guid>http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu</guid>
            <pubDate>Sun, 19 May 2024 05:10:52 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到知乎上。]]></description>
            <content:encoded><![CDATA[<p>我们已经学习了很多自动化的知识了，接下来让我们看看在blog-auto-publishing-tools中是如何实现自动发送博文到知乎的。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="知乎的实现">知乎的实现<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E7%9F%A5%E4%B9%8E%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="知乎的实现的直接链接" title="知乎的实现的直接链接">​</a></h2>
<p>知乎的字段不是太多，算是中规中矩。但是有些实现还是需要一些技巧的。一起来看看吧。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置标题">设置标题<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E8%AE%BE%E7%BD%AE%E6%A0%87%E9%A2%98" class="hash-link" aria-label="设置标题的直接链接" title="设置标题的直接链接">​</a></h3>
<p>知乎的标题是一个textarea,可以看到知乎的textarea有class,placeholder这些属性。class后面的那一长串是自动生成的。</p>
<p>所以可以使用的字段就只有placeholder这个属性了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405102138991.png" alt="image-20240510213849893" class="img_ev3q"></p>
<p>所以，我们可以这样来定位标题字段：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//textarea[contains(@placeholder, "请输入标题")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置内容">设置内容<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E8%AE%BE%E7%BD%AE%E5%86%85%E5%AE%B9" class="hash-link" aria-label="设置内容的直接链接" title="设置内容的直接链接">​</a></h3>
<p>知乎的内容部分也是动态的，通过调试可以看到，好像是用的是一个叫做DraftEditor的东西（不太确定）。</p>
<p>基本上和之前讲过的CodeMirror是类似的东西。</p>
<p>如果你看过我之前的文章，那么就可以知道类似这种动态的标签，我们可以使用拷贝和粘贴的方法来实现内容的输入。</p>
<p>另外，知乎是不支持markdown格式的。</p>
<blockquote>
<p>虽然知乎有个识别markdown格式的东西，但是如果你试过就会发现，markdown在知乎并不好使。</p>
</blockquote>
<p>所以，我们在拷贝之前，需要把markdown格式转换成为html格式。</p>
<p>网上有很多把markdown转换成html的工具，其中一个比较出名的就是pandoc。</p>
<p>pandoc的功能很强大，可以转换很多格式的文本。</p>
<p>对于markdown转换成html，可以使用下面的命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> pandoc </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> markdown </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> html5 input.md </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> output.html</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>当然为了拷贝出来的样式好看一些，这里我还添加了css文件。</p>
<p>实现方法都写在了convert_md_to_html方法里面了。</p>
<p>感兴趣的朋友可以去看看。</p>
<p>最后我们的实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 文章内容 html版本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_file </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 注意，zhihu 不能识别转换过后的代码块格式</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_file_html </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> convert_md_to_html</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content_file</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    get_html_web_content</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content_file_html</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待2秒</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">switch_to</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window_handles</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待1秒</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 不能用元素赋值的方法，所以我们使用拷贝的方法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cmd_ctrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">COMMAND </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">platform </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'darwin'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CONTROL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 点击内容元素</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="DraftEditor-editorContainer"]//div[@class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟实际的粘贴操作</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待5秒 不需要进行图片解析</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>解释下实现的逻辑。</p>
<p>convert_md_to_html是把markdown转换成了html。</p>
<p>get_html_web_content是在新的web tab中打开这个html文件，然后使用系统的复制功能把html内容拷贝到剪贴板上。</p>
<p>然后再定位到要粘贴的位置，使用系统的粘贴功能把内容粘贴到内容框中。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置封面">设置封面<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E8%AE%BE%E7%BD%AE%E5%B0%81%E9%9D%A2" class="hash-link" aria-label="设置封面的直接链接" title="设置封面的直接链接">​</a></h3>
<p>很棒的是知乎的的上传封面有一个input标签，如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405172340069.png" alt="image-20240517234037280" class="img_ev3q"></p>
<p>所以我们可以使用selenium的input上传功能，来上传封面。</p>
<p>封面数据可以写到markdown文件的YAML Front Matter中，如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071548984.png" alt="image-20240507154807745" class="img_ev3q"></p>
<p>具体的实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        file_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"//input[@type='file']"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 文件上传不支持远程文件上传，所以需要把图片下载到本地</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        file_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">download_image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="投稿至问题">投稿至问题<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E6%8A%95%E7%A8%BF%E8%87%B3%E9%97%AE%E9%A2%98" class="hash-link" aria-label="投稿至问题的直接链接" title="投稿至问题的直接链接">​</a></h3>
<p>说实话，这个我真的不知道怎么实现，因为每个文章对应的问题是不一样的。</p>
<p>所以这个作为待解决的问题。如果有朋友希望我实现这个功能，可以跟我说。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章话题">文章话题<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E6%96%87%E7%AB%A0%E8%AF%9D%E9%A2%98" class="hash-link" aria-label="文章话题的直接链接" title="文章话题的直接链接">​</a></h3>
<p>知乎这个文章话题实现起来比较困难。</p>
<p>因为知乎会自动给你文件打上话题。如果要自定义话题的话，需要先删除已有的话题，然后再添加上自己的话题。</p>
<p>这个这里就不实现了。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="专栏收录">专栏收录<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E4%B8%93%E6%A0%8F%E6%94%B6%E5%BD%95" class="hash-link" aria-label="专栏收录的直接链接" title="专栏收录的直接链接">​</a></h3>
<p>专栏当然要收录在自己的专栏里面啦。</p>
<p>所以我们需要点击发布到专栏按钮。</p>
<p>还好，知乎的的专栏按钮是有一个id的。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 专栏收录</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pubish_panel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'PublishPanel-columnLabel-1'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pubish_panel</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后的发布">最后的发布<a href="http://www.flydean.com/blog/projects/013-auto-blog-publish-tool-zhihu#%E6%9C%80%E5%90%8E%E7%9A%84%E5%8F%91%E5%B8%83" class="hash-link" aria-label="最后的发布的直接链接" title="最后的发布的直接链接">​</a></h3>
<p>最后就是确认发布了。我们找到最后的发布按钮，点击即可。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[contains(text(), "发布")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(公众号篇)]]></title>
            <link>http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin</link>
            <guid>http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin</guid>
            <pubDate>Sun, 19 May 2024 05:10:52 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到公众号篇上。]]></description>
            <content:encoded><![CDATA[<p>之前收到很多朋友的要求，说是需要一个公众号的自动发布工具。</p>
<p>现在，它来了。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="公众号的实现">公众号的实现<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E5%85%AC%E4%BC%97%E5%8F%B7%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="公众号的实现的直接链接" title="公众号的实现的直接链接">​</a></h2>
<p>因为公众号每隔一段时间就会登录失效，所以在使用自动发布公众号之前，一定要确保你的公众号是登录状态。</p>
<p>否则没办法自动发布公众号消息。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="登录到首页">登录到首页<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E7%99%BB%E5%BD%95%E5%88%B0%E9%A6%96%E9%A1%B5" class="hash-link" aria-label="登录到首页的直接链接" title="登录到首页的直接链接">​</a></h3>
<p>如果你已经登录过公众号，那么可以直接访问<a href="https://mp.weixin.qq.com/%EF%BC%8C" target="_blank" rel="noopener noreferrer">https://mp.weixin.qq.com/，</a> 这样会直接跳转到公众号的后台发布界面。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="点击图文消息">点击图文消息<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E7%82%B9%E5%87%BB%E5%9B%BE%E6%96%87%E6%B6%88%E6%81%AF" class="hash-link" aria-label="点击图文消息的直接链接" title="点击图文消息的直接链接">​</a></h3>
<p>到了首页之后，我们就可以点击图文消息这个按钮，开始我们的创作了。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405191102525.png" alt="image-20240519110216544" class="img_ev3q"></p>
<p>公众号的图文消息实现的比较复杂。我们只能通过xpath来定位到这个元素。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 点击图文消息</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pic_and_article_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="new-creation__menu-item"]//div[@class="new-creation__menu-title" and contains(text(), "图文消息")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pic_and_article_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>点击之后，就会跳转到公众号创作页面。</p>
<p>所以，我们需要切换一下tab：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 切换到新的tab</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">switch_to</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window_handles</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="输入标题">输入标题<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E8%BE%93%E5%85%A5%E6%A0%87%E9%A2%98" class="hash-link" aria-label="输入标题的直接链接" title="输入标题的直接链接">​</a></h3>
<p>公众号的标题是带有title id的，所以我们可以直接通过id来获取。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="输入作者">输入作者<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E8%BE%93%E5%85%A5%E4%BD%9C%E8%80%85" class="hash-link" aria-label="输入作者的直接链接" title="输入作者的直接链接">​</a></h3>
<p>公众号的作者也是带有author id的。</p>
<p>这里有两种方法来配置作者ID，第一种，也是推荐的一种就是把作者，title，图片等信息写到markdown文件的YAML Front Matter中，如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071548984.png" alt="image-20240507154807745" class="img_ev3q"></p>
<p>第二种就是在mpweixin自己的配置文件中设置author这个字段。</p>
<p>两种都可以，但是我个人推荐第一种。</p>
<p>实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章作者</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    author </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'author'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'authors'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'authors'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        author</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'authors'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        author</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">mpweixin_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'author'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章内容">文章内容<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9" class="hash-link" aria-label="文章内容的直接链接" title="文章内容的直接链接">​</a></h3>
<p>说实话，我不知道腾讯到底是怎么想的，这里的文章内容居然是一个嵌入的iframe：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405191111391.png" alt="image-20240519111141051" class="img_ev3q"></p>
<p>说不上为什么，但是总是感觉怪怪的。</p>
<p>不过没关系，我们还是能够实现。</p>
<p>当然，这种就不能像传统方式那样来设置内容了。</p>
<p>我们只能使用拷贝粘贴的方式。</p>
<p>另外，微信公众号不能识别markdown，所以我们必须把markdown转换成为html。</p>
<p>网上有很多把markdown转换成html的工具，其中一个比较出名的就是pandoc。</p>
<p>pandoc的功能很强大，可以转换很多格式的文本。</p>
<p>对于markdown转换成html，可以使用下面的命令：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> pandoc </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> markdown </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> html5 input.md </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> output.html</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>当然为了拷贝出来的样式好看一些，这里我还添加了css文件。</p>
<p>实现方法都写在了convert_md_to_html方法里面了。</p>
<p>感兴趣的朋友可以去看看。</p>
<p>最后我们的实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章内容 html版本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_file </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 注意，zhihu 不能识别转换过后的代码块格式</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_file_html </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> convert_md_to_html</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content_file</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    get_html_web_content</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content_file_html</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待2秒</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">switch_to</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window_handles</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待1秒</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 不能用元素赋值的方法，所以我们使用拷贝的方法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cmd_ctrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">COMMAND </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">platform </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'darwin'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CONTROL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 点击内容元素</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'edui1_contentplaceholder'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">content_element</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟实际的粘贴操作</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待5秒 不需要进行图片解析</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="添加封面">添加封面<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E6%B7%BB%E5%8A%A0%E5%B0%81%E9%9D%A2" class="hash-link" aria-label="添加封面的直接链接" title="添加封面的直接链接">​</a></h3>
<p>公众号的这个添加封面比较复杂，目前我还没找到它对应的input上传tag。所以这个功能展示就没实现。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="原创声明">原创声明<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E5%8E%9F%E5%88%9B%E5%A3%B0%E6%98%8E" class="hash-link" aria-label="原创声明的直接链接" title="原创声明的直接链接">​</a></h3>
<p>一般来说，大家应该都是原创的。</p>
<p>所以原创声明这个功能我实现了。</p>
<p>首先我们需要点击原创这个label：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        original_statement </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'js_original'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        original_statement</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后在弹出的对话框中点击确认按钮：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">## 点击确认按钮</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="weui-desktop-dialog"]//div[@class="weui-desktop-btn_wrp"]//button[contains(text(), "确定")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="开启赞赏">开启赞赏<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E5%BC%80%E5%90%AF%E8%B5%9E%E8%B5%8F" class="hash-link" aria-label="开启赞赏的直接链接" title="开启赞赏的直接链接">​</a></h3>
<p>只有声明原创之后才能开启赞赏。</p>
<p>所以我们把赞赏放在和原创声明一起。</p>
<p>同样的，赞赏需要点击赞赏的按钮，这里可以通过id来获得：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 赞赏</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        zhanshang_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'js_reward_setting_area'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        zhanshang_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后在弹出的对话框中，点击确认按钮：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">## 点击确认按钮</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="reward-setting-dialog__footer"]//div[@class="weui-desktop-btn_wrp"]//button[contains(text(), "确定")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置合集">设置合集<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E8%AE%BE%E7%BD%AE%E5%90%88%E9%9B%86" class="hash-link" aria-label="设置合集的直接链接" title="设置合集的直接链接">​</a></h3>
<p>然后需要设置的应该就是合集了。</p>
<p>合集我们需要先找到合集的可以点击的区域：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405191307247.png" alt="image-20240519130700907" class="img_ev3q"></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        tag_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@id="js_article_tags_area"]//div[contains(@class,"js_article_tags_label")]/span[text()="未添加"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">move_to_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag_button</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag_button</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里不能用tag_button.click方法，会直接报错。</p>
<p>所以我们可以用ActionChains来模拟鼠标的点击操作。</p>
<p>在弹出框中，我们找到tag input，一个个输入，然后点击回车：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 输入标签</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                        </span><span class="token string" style="color:#e3116c">'//span[@class="weui-desktop-form-tag__area"]//input[@placeholder="输入后按回车分割"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> tag </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ENTER</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>最后，点击确认按钮：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 点击确定按钮</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="weui-desktop-btn_wrp"]//button[contains(text(), "确定")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        confirm_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后的发布">最后的发布<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E6%9C%80%E5%90%8E%E7%9A%84%E5%8F%91%E5%B8%83" class="hash-link" aria-label="最后的发布的直接链接" title="最后的发布的直接链接">​</a></h3>
<p>好了，终于到了最后的发布时候了，找到按钮点击即可：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">confirm_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'js_send'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">confirm_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>在弹出框中再点一次确认：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">send_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="weui-desktop-btn_wrp"]/button[text()="发表"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">send_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/014-auto-blog-publish-tool-mpweixin#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>公众号的基本功能完成了，实际上还有一些细节内容并没有实现。因为我觉得通常情况下没啥用。</p>
<p>大家如果有需要的话，可以告诉我。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(掘金篇)]]></title>
            <link>http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin</link>
            <guid>http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin</guid>
            <pubDate>Thu, 16 May 2024 09:55:39 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到掘金上。]]></description>
            <content:encoded><![CDATA[<p>终于要讲解我们亲爱的掘金了。掘金是一个非常不错的平台。所以很多朋友会把博客发布到掘金上。</p>
<p>发布到掘金要填写的内容也比较多。今天给大家介绍一下如何用blog-auto-publishing-tools这个工具自动把博客发布到掘金平台上去。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="掘金的实现">掘金的实现<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E6%8E%98%E9%87%91%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="掘金的实现的直接链接" title="掘金的实现的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="点击写文章按钮">点击写文章按钮<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E7%82%B9%E5%87%BB%E5%86%99%E6%96%87%E7%AB%A0%E6%8C%89%E9%92%AE" class="hash-link" aria-label="点击写文章按钮的直接链接" title="点击写文章按钮的直接链接">​</a></h3>
<p>要进入掘金的写文章页面，我们需要先点击掘金的发布文章按钮。</p>
<p>找到写文章按钮比较简单，我们直接通过class name定位到写文章按钮，点击即可。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 写文章按钮</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    write_btn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CLASS_NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'send-button'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    write_btn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>点击写文章按钮之后，会开启一个新的tab页面。</p>
<p>所以接下来我们需要切换到这个新的tab页面，然后等待输入文章标题的title出现。</p>
<p>切换tab可以调用driver.switch_to.window方法。</p>
<p>然后我们调用wait.until来等待新标签完成加载内容。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 切换到新的tab</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">switch_to</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">window_handles</span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 等待新标签页完成加载内容</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    wait</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">until</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">EC</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">presence_of_element_located</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//input[@placeholder="输入文章标题..."]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="输入文章标题">输入文章标题<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E8%BE%93%E5%85%A5%E6%96%87%E7%AB%A0%E6%A0%87%E9%A2%98" class="hash-link" aria-label="输入文章标题的直接链接" title="输入文章标题的直接链接">​</a></h3>
<p>掘金的文章标题没有id，所以我们只能通过xpth来定位。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//input[@placeholder="输入文章标题..."]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="输入文章内容">输入文章内容<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E8%BE%93%E5%85%A5%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9" class="hash-link" aria-label="��输入文章内容的直接链接" title="输入文章内容的直接链接">​</a></h3>
<p>从debug上来看，掘金的文章内容部分用的是CodeMirror这个富文本编辑工具。</p>
<p>CodeMirror的特点就是html内容会随着你的输入而动态变化。</p>
<p>所以这里我们不能拿到某个元素用send_keys方法，来输入文章内容。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405091805615.png" alt="image-20240509180511628" class="img_ev3q"></p>
<p>我们需要转变一下思路。</p>
<p>除了send_keys方法之外，我们还可以选择把文章内容拷贝到系统的剪贴板上，然后把鼠标定位到文章内容部分之后，再调用系统的粘贴命令把文章粘贴到指定的位置。</p>
<p>对，就这么干：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章内容</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    file_content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> read_file_with_footer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 掘金比较特殊，不能用元素赋值的方法，所以我们使用拷贝的方法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cmd_ctrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">COMMAND </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">platform </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'darwin'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CONTROL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 将要粘贴的文本内容复制到剪贴板</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pyperclip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file_content</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="CodeMirror-code"]//span[@role="presentation"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟实际的粘贴操作（在某些情况下可能更合适）：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待15秒 图片解析需要花比较长时间</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里要注意的是，掘金会尝试重新上传图片，如果你的图片内容比较多的话，需要耗费比较长的时间。</p>
<p>所以这里我sleep了15秒钟。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="点击发布按钮">点击发布按钮<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E7%82%B9%E5%87%BB%E5%8F%91%E5%B8%83%E6%8C%89%E9%92%AE" class="hash-link" aria-label="点击发布按钮的直接链接" title="点击发布按钮的直接链接">​</a></h3>
<p>接下来就可以点击发布按钮了。</p>
<p>点击发布按钮之后，会有一个弹出框：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405091810755.png" alt="image-20240509181037744" class="img_ev3q"></p>
<p>这里我们可以填写类型，标签，封面，专栏，话题和摘要。接下来我们一个个来看看怎么实现。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章分类">文章分类<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E6%96%87%E7%AB%A0%E5%88%86%E7%B1%BB" class="hash-link" aria-label="文章分类的直接链接" title="文章分类的直接链接">​</a></h3>
<p>分类可以在class为category-list的div下面查找对应文字内容的category，如下所示：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 分类</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    category </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> juejin_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'category'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> category</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        category_btn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//div[@class="form-item-content category-list"]//div[contains(text(), "</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">category</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        category_btn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="添加标签">添加标签<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E6%B7%BB%E5%8A%A0%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="添加标签的直接链接" title="添加标签的直接链接">​</a></h3>
<p>添加标签需要首先点击标签下拉框：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> tag_btn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"byte-select__placeholder") and contains(text(), "请搜索添加标签")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> tag_btn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>然后需要在输入框里面输入你需要添加的标签，等标签出现在下拉框的时候，输入回车就可以选中了对应的标签了。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 使用复制粘贴的方式</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        pyperclip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 从下拉框中选择对应的tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//li[contains(@class,"byte-select-option") and contains(text(), "</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">tag</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>注意，这里我们的输入比较好的方式就是使用复制粘贴，这样不需要定位到输入元素也可以进行。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置文章封面">设置文章封面<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E8%AE%BE%E7%BD%AE%E6%96%87%E7%AB%A0%E5%B0%81%E9%9D%A2" class="hash-link" aria-label="设置文章封面的直接链接" title="设置文章封面的直接链接">​</a></h3>
<p>文章封面有一个input标签，所以我们可以使用selenium的上传图片功能来实现：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章封面</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'image'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        file_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"//input[@type='file']"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 文件上传不支持远程文件上传，所以需要把图片下载到本地</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        file_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">download_image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>注意，这里的图片是在markdown文件的yaml front matter中设置的。如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071548984.png" alt="image-20240507154807745" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="收录至专栏">收录至专栏<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E6%94%B6%E5%BD%95%E8%87%B3%E4%B8%93%E6%A0%8F" class="hash-link" aria-label="收录至专栏的直接链接" title="收录至专栏的直接链接">​</a></h3>
<p>收录至专栏需要定位到专栏输入框，输入对应的专栏，然后回车即可。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 收录至专栏</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    collections </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> juejin_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'collections'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    collection_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"byte-select__placeholder") and contains(text(), "请搜索添加专栏，同一篇文章最多添加三个专栏")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    collection_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> coll </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> collections</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 使用复制粘贴的方式</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        pyperclip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">coll</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 从下拉框中选择对应的tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        coll_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//li[contains(@class,"byte-select-option") and contains(text(), "</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">coll</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        coll_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>同样的，我们也使用的是复制粘贴的方法进行输入。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="创作话题">创作话题<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E5%88%9B%E4%BD%9C%E8%AF%9D%E9%A2%98" class="hash-link" aria-label="创作话题的直接链接" title="创作话题的直接链接">​</a></h3>
<p>话题跟专栏的实现方式类似，也是先定位，然后输入，之后回车选择。</p>
<p>代码如下所示:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 创作话题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    topic </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> juejin_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'topic'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_btn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"byte-select__placeholder") and contains(text(), "请搜索添加话题，最多添加1个话题")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_btn</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 使用复制粘贴的方式</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        pyperclip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">topic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 从下拉框中选择对应的tag</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//li[@class="byte-select-option"]//span[contains(text(), "</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里也使用的是复制粘贴的方式。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置摘要">设置摘要<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E8%AE%BE%E7%BD%AE%E6%91%98%E8%A6%81" class="hash-link" aria-label="设置摘要的直接链接" title="设置摘要的直接链接">​</a></h3>
<p>摘要是一个textarea，我们通过xpath来定位它：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_ui </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//textarea[@class="byte-input__textarea"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_ui</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_ui</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最终的发布">最终的发布<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E6%9C%80%E7%BB%88%E7%9A%84%E5%8F%91%E5%B8%83" class="hash-link" aria-label="最终的发布的直接链接" title="最终的发布的直接链接">​</a></h3>
<p>最后就是发布了。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">publish_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[contains(text(), "确定并发布")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">publish_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>同样的，我们通过xpath来定位到发布按钮。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/010-auto-blog-publish-tool-juejin#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直�接链接" title="总结的直接链接">​</a></h2>
<p>掘金相对而言实现是比较复杂的。大家可以仔细研究一下具体的实现细节。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(51cto篇)]]></title>
            <link>http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto</link>
            <guid>http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto</guid>
            <pubDate>Wed, 15 May 2024 05:38:17 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到51cto上。]]></description>
            <content:encoded><![CDATA[<p>51cto是一个优秀的博客平台，今天给大家讲解一下blog-auto-publishing-tools如何自动发布博客到51cto上。</p>
<p>当然在实现过程中有可能会遇到各种困难，不过不用担心，我们一个个来解决。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="51cto的实现">51cto的实现<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#51cto%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="51cto的实现的直接链接" title="51cto的实现的直接链接">​</a></h2>
<p>51cto的实现相对而言比较复杂一点，因为他的选项比较多，实现方式跟其他平台也不太一样。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="标题输入">标题输入<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E6%A0%87%E9%A2%98%E8%BE%93%E5%85%A5" class="hash-link" aria-label="标题输入的直接链接" title="标题输入的直接链接">​</a></h3>
<p>首先来看下它的标题。</p>
<p>51cto的标题还是比较标准的，他带有一个id，所以我们可以直接通过ID来定位到标题元素，从而输入内容：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405082312167.png" alt="image-20240508231222877" class="img_ev3q"></p>
<p>具体的代码实现如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章内容">文章内容<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9" class="hash-link" aria-label="文章内容的直接链接" title="文章内容的直接链接">​</a></h3>
<p>接下来就是文章内容了.51cto用的是一个textArea,并没有用到codeMirror之类的动态编辑工具。</p>
<p>所以我们可以简单的调用textArea的send_keys方法，来填充内容：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章内容 markdown版本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    file_content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> read_file_with_footer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 找到初始的内容描述文字</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//textarea[@placeholder="请输入正文"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file_content</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">15</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待15秒 需要进行图片解析</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里的textarea通过xpath来定位。</p>
<blockquote>
<p>注意，一旦你输入文章内容之后，51cto会做一个保存草稿的操作，如果你的内容里面有图的话，会耗时比较长的时间。</p>
<p>所以这里我选择的是sleep15秒钟。</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="发布文章">发布文章<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0" class="hash-link" aria-label="发布文章的直接链接" title="发布文章的直接链接">​</a></h3>
<p>接下来我们就可以点击发布文章按钮了。</p>
<p>我们通过xpath找到发布文章按钮。然后点击他。</p>
<p>这里要注意的是，如果你直接通过send_button.click来点击这个按钮实际上是不行的。</p>
<p>所以，我们使用了一个小技巧。这里我们使用ActionChains来模拟鼠标的点击，来实现：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 发布文章</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    send_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[contains(@class, "edit-submit")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">send_button</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>点击这个按钮之后，会弹出一个比较复杂的框：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405082344245.png" alt="image-20240508234358681" class="img_ev3q"></p>
<p>这里我们需要填写分类，标签等数据。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置分类">设置分类<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E8%AE%BE%E7%BD%AE%E5%88%86%E7%B1%BB" class="hash-link" aria-label="设置分类的直接链接" title="设置分类的直接链接">​</a></h3>
<p>文章分类没什么好说的，就是通过xpath来定位到要选择的type元素。</p>
<p>然后触发click操作。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章分类</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin">type</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cto51_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'type'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    type_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//div[@class="types-select-box"]//span[contains(text(),"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation builtin">type</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    type_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这里的type是在config/51cto.yaml文件中定义的。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置个人分类">设置个人分类<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E8%AE%BE%E7%BD%AE%E4%B8%AA%E4%BA%BA%E5%88%86%E7%B1%BB" class="hash-link" aria-label="设置个人分类的直接链接" title="设置个人分类的直接链接">​</a></h3>
<p>个人分类是一个下拉框，这里我们需要分两步实现。</p>
<p>第一步点击个人分类下拉框。</p>
<p>第二步从下拉框中选择出你要设置的个人分类。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405091023008.png" alt="image-20240509102330107" class="img_ev3q"></p>
<p>这里的个人分类下拉框还是有些难度的，选择起来比较复杂，大家可以看看我的实现代码：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 个人分类</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    personal_type </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cto51_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'personal_type'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    personal_type_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'selfType'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    personal_type_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    personal_type_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string-interpolation string" style="color:#e3116c">f'//div[@class="el-select classification person-type"]//li[@class="el-select-dropdown__item"]/span[text()="</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">personal_type</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    personal_type_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置个人标签">设置个人标签<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E8%AE%BE%E7%BD%AE%E4%B8%AA%E4%BA%BA%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="设置个人标签的直接链接" title="设置个人标签的直接链接">​</a></h3>
<p>个人标签可以先找到标签输入框，然后输入对应的标签，回车就可以输入标签了。</p>
<p>具体的代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 标签</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tags'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cto51_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tag-input'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> tag </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ENTER</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>实际运行过程中，你会发现51cto会自动帮你设置一些标签，如下所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405091213539.png" alt="image-20240509121303976" class="img_ev3q"></p>
<p>所以，我们需要先把自动设置的标签清理掉，然后再添加上我们自己的标签。</p>
<p>上面代码中的tag_input.clear() 是没有效果的。</p>
<p>我们需要这样做：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">tag_list_div </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'preceding-sibling::div'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用 JavaScript 删除子元素</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">execute_script</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"arguments[0].innerHTML = '';"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> tag_list_div</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>通过定位到tag_input上面的tag_list_div元素，然后借用JS方法来清除里面的子元素。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置摘要">设置摘要<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E8%AE%BE%E7%BD%AE%E6%91%98%E8%A6%81" class="hash-link" aria-label="设置摘要的直接链接" title="设置摘要的直接链接">​</a></h3>
<p>51cto的文章摘要是一个textarea，带ID的那种。</p>
<p>所以设置摘要还是很简单的：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 摘要</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'description'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'summary'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'abstractData'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置话题">设置话题<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E8%AE%BE%E7%BD%AE%E8%AF%9D%E9%A2%98" class="hash-link" aria-label="设置话题的直接链接" title="设置话题的直接链接">​</a></h3>
<p>最后就是设置话题了。</p>
<p>同样的，需要先点击设置话题下拉框，然后再从下拉选项中选中要设置的话题，点击即可。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 话题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    topic </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cto51_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'topic'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'subjuct'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        list_item_list </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'listItemList'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        list_item_list</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//li[contains(text(),"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">topic</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后发布按钮">最后发布按钮<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E6%9C%80%E5%90%8E%E5%8F%91%E5%B8%83%E6%8C%89%E9%92%AE" class="hash-link" aria-label="最后发布按钮的�直接链接" title="最后发布按钮的直接链接">​</a></h3>
<p>如果一切都设置完毕之后，就可以点击发布按钮了。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 发布</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> auto_publish</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'submitForm'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/009-auto-blog-publish-tool-51cto#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>51cto需要填写的选项还是比较多的，大家在实现的过程中需要注意。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(csdn篇)]]></title>
            <link>http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn</link>
            <guid>http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn</guid>
            <pubDate>Mon, 13 May 2024 07:23:20 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到csdn上。]]></description>
            <content:encoded><![CDATA[<p>CSDN应该是大家接触到最多的博客平台了，所以一款能够发布到CSDN的自动化工具还是非常有必要的。</p>
<p>今天给大家讲讲自动化CSDN博客发布的思路和一些问题的解决办法。</p>
<blockquote>
<p>解决问题的思路一定是最重要的，知识是死的，问题是活的，如何在工作中解决遇到的问题是我们需要面临的大问题。</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="csdn的实现">CSDN的实现<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#csdn%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="CSDN的实现的直接链接" title="CSDN的实现的直接链接">​</a></h2>
<p>csdn的文章编辑页面进入很简单，在你已经登录的情况下，直接访问<a href="https://editor.csdn.net/md/%E5%B0%B1%E5%8F%AF%E4%BB%A5%E8%BF%9B%E5%85%A5%E4%BB%96%E7%9A%84%E5%8D%9A%E5%AE%A2%E5%8F%91%E5%B8%83%E9%A1%B5%E9%9D%A2%E4%BA%86%E3%80%82" target="_blank" rel="noopener noreferrer">https://editor.csdn.net/md/就可以进入他的博客发布页面了。</a></p>
<p>具体实现的代码在publisher/csdn_publisher.py中。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="标题">标题<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E6%A0%87%E9%A2%98" class="hash-link" aria-label="标题的直接链接" title="标题的直接链接">​</a></h3>
<p>csdn的标题部分，没有ID，也没有name，只有一个孤零零的input。</p>
<p>那么我们怎么找到这个元素呢？</p>
<p>一个常用的办法是通过xpath和placeholder来定位到这个input元素。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405081019004.png" alt="image-20240508101945309" class="img_ev3q"></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[contains(@class,"article-bar")]//input[contains(@placeholder,"请输入文章标题")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章内容">文章内容<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9" class="hash-link" aria-label="文章内容的直接链接" title="文章内容的直接链接">​</a></h3>
<p>csdn的文章内容部分也是动态变动的，不是一个固定的textarea，但是看了它的代码，用的也不是常见的CodeMirror，我猜应该是自己实现的一个动态编辑器。</p>
<p>不过没关系，万变不离其宗。</p>
<p>既然不用使用send_keys来添加内容，我们就是用复制和拷贝大法来实现这个功能。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章内容 markdown版本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    file_content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> read_file_with_footer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 用的是CodeMirror,不能用元素赋值的方法，所以我们使用拷贝的方法</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    cmd_ctrl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">COMMAND </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> sys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">platform </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'darwin'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">CONTROL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 将要粘贴的文本内容复制到剪贴板</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pyperclip</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">copy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file_content</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> webdriver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="editor"]//div[@class="cledit-section"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 模拟实际的粘贴操作</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    action_chains</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_down</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'v'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">key_up</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd_ctrl</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待3秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>拷贝就是通用的流程了。</p>
<p>但是拷贝之前，我们需要先定位到拷贝的地址。</p>
<p>这里我用的是xpath定位到editor class下面的cledit-section。</p>
<p>定位之后，按下click按钮，然后直接粘贴内容即可。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="发布文章按钮">发布文章按钮<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0%E6%8C%89%E9%92%AE" class="hash-link" aria-label="发布文章按钮的直接链接" title="发布文章按钮的直接链接">​</a></h3>
<p>内容都输入好之后，我们就可以点击右边的发布文章按钮了。</p>
<p>csdn的按钮没有id，所以我们还是得使用xpath来定位到这个button。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 发布文章</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    send_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[contains(@class, "btn-publish") and contains(text(),"发布文章")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    send_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>点击发布文章后，会有一个弹窗框：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405081054788.png" alt="image-20240508105432619" class="img_ev3q"></p>
<p>这个弹出框里面是需要填写的一些额外信息。比如文章标签，添加封面，文章摘要，分类专栏，文章类型和可见范围等等内容。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章标签">文章标签<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E6%96%87%E7%AB%A0%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="文章标签的直接链接" title="文章标签的直接链接">​</a></h3>
<p>添加文章标签的路径有点复杂。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405081103694.png" alt="image-20240508110312590" class="img_ev3q"></p>
<p>首先我们点击添加文章标签按钮，这时候又会弹出一个对话框。</p>
<p>在这个对话框里面，我们需要文字搜索框，输入tag，然后回车，然后继续输入tag，继续回车。</p>
<p>做完所有的操作之后，还需要点击右上角的x关闭按钮，把这个弹出框关闭。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标签</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tags'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> csdn_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        add_tag </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                                        </span><span class="token string" style="color:#e3116c">'//div[@class="mark_selection"]//button[@class="tag__btn-tag" and contains(text(),"添加文章标签")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        add_tag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="mark_selection_box"]//input[contains(@placeholder,"请输入文字搜索")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> tag </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ENTER</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 关闭按钮</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        close_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="mark_selection_box"]//button[@title="关闭"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        close_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="添加封面">添加封面<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E6%B7%BB%E5%8A%A0%E5%B0%81%E9%9D%A2" class="hash-link" aria-label="添加封面的直接链接" title="添加封面的直接链接">​</a></h3>
<p>CSDN的封面会自动检测文章内容中的图片，把这些图片设置为文章的封面。</p>
<p>当然我们也可以自行设置。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'image'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        file_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"//input[@type='file']"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 文件上传不支持远程文件上传，所以需要把图片下载到本地</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        file_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">download_image</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'image'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>要注意的是，这里的image地址是在markdown文件中的yaml front matter中设置的。</p>
</blockquote>
<p>如图所示：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071548984.png" alt="image-20240507154807745" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="设置摘要">设置摘要<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E8%AE%BE%E7%BD%AE%E6%91%98%E8%A6%81" class="hash-link" aria-label="设置摘要的直接链接" title="设置摘要的直接链接">​</a></h3>
<p>csdn的摘要部分也没有ID，还是需要通过xpath来进行获取。</p>
<p>这里通过textarea的placeholder来进行获取。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 摘要</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'description'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'description'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'summary'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="desc-box"]//textarea[contains(@placeholder,"摘要：会在推荐、列表等场景外露")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        summary_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="分类专栏">分类专栏<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E5%88%86%E7%B1%BB%E4%B8%93%E6%A0%8F" class="hash-link" aria-label="分类专栏的直接链接" title="分类专栏的直接链接">​</a></h3>
<p>csdn的分类专栏需要提前创建好。</p>
<p>每个专栏都是一个checkbox，我们可以通过checkbox的value来定位到这个专栏选项。</p>
<p>实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 分类专栏</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    categories </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> csdn_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'categories'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> categories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> category </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> categories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            category_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//input[@type="checkbox" and @value="</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">category</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"]/..'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            category_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="可见范围">可见范围<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E5%8F%AF%E8%A7%81%E8%8C%83%E5%9B%B4" class="hash-link" aria-label="可见范围的直接链接" title="可见范围的直接链接">​</a></h3>
<p>最后可以设置的就是文字的可见范围了。</p>
<p>可见范围是有id的，我们可以根据id来获取到这个input，然后点击他。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 可见范围</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    visibility </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> csdn_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'visibility'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> visibility</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        visibility_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> visibility</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        visibility_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最后的发布">最后的发布<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E6%9C%80%E5%90%8E%E7%9A%84%E5%8F%91%E5%B8%83" class="hash-link" aria-label="最后的发布的直接链接" title="最后的发布的直接链接">​</a></h3>
<p>最后，我们终于可以发布了。</p>
<p>csdn的发布按钮也没有id，我们只能通过对应的class和button的text内容来定位到发布按钮。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 发布</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> auto_publish</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//div[@class="modal__button-bar")]//button[contains(text(),"发布文章")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        publish_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/008-auto-blog-publish-tool-csdn#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>CSDN的实现还是比较复杂的，因为涉及到的东西比较多。大家可以好好琢磨琢磨。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
        <item>
            <title><![CDATA[一键自动化博客发布工具,用过的人都说好(cnblogs篇)]]></title>
            <link>http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs</link>
            <guid>http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs</guid>
            <pubDate>Thu, 09 May 2024 04:25:00 GMT</pubDate>
            <description><![CDATA[使用一键自动化博客发布工具blog-auto-publishing-tools把博客发布到cnblogs上。]]></description>
            <content:encoded><![CDATA[<p>cnblogs和其他的博客平台相比会比较复杂，需要设置的项目也比较多一些，弄懂了cnblogs的实现方式，那么你应该对selenium的整个框架使用已经烂熟于心了。</p>
<p>除了正常的标题，内容，摘要之外，cnblogs还需要设置个人分类，合集，投稿选项，投稿至网站分类，tags标签等内容。</p>
<p>要填的东西比较多，比较复杂。接下来我们会一项项的介绍cnblogs的具体实现方式。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="前提条件">前提条件<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6" class="hash-link" aria-label="前提条件的直接链接" title="前提条件的直接链接">​</a></h2>
<p>前提条件当然是先下载 blog-auto-publishing-tools这个博客自动发布工具,地址如下：<a href="https://github.com/ddean2009/blog-auto-publishing-tools" target="_blank" rel="noopener noreferrer">https://github.com/ddean2009/blog-auto-publishing-tools</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="cnblogs的实现">cnblogs的实现<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#cnblogs%E7%9A%84%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="cnblogs的实现的直接链接" title="cnblogs的实现的直接链接">​</a></h2>
<p>因为需要设置个人分类，合集，投稿选项，投稿至网站分类，tags标签等内容，所以我们需要在配置文件中提供这些内容。</p>
<p>配置文件在config/cnblogs.yaml中。</p>
<p>首先是个人分类和合集部分：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 个人分类  工具技巧 AIGC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">categories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 工具技巧</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 添加到合集: 工具技巧 AIGC</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">collections</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 工具技巧</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>这两个部分都是需要你自己提前在cnblogs中创建好的。否则你会找不到这些内容,对应的界面地址如下：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071713544.png" alt="image-20240507171326499" class="img_ev3q"></p>
<p>接下来是投顾至网站分类：</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071718558.png" alt="image-20240507171845646" class="img_ev3q"></p>
<p>cnblogs的这些网站分类是直接用文字来说明的，所以我们需要在配置文件中再定义一个网站分类：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 开源研究</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>最后就是tag标签了，我们直接设置即可：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 人工智能</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> aigc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> openai</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> ai开发</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 程序那些事</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071720067.png" alt="image-20240507172029658" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章标题">文章标题<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%96%87%E7%AB%A0%E6%A0%87%E9%A2%98" class="hash-link" aria-label="文章标题的直接链接" title="文章标题的直接链接">​</a></h3>
<p>不得不说cnblogs的实现就是正规，cnblogs几乎每个输入的标签都是带有ID的，所以我们实现起来特别的简单，这里要给cnblogs点个赞。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章标题</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'post-title'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clear</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'title'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">front_matter</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        title</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'title'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待2秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我们找到ID，直接调用send_keys方法即可。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="文章内容">文章内容<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%96%87%E7%AB%A0%E5%86%85%E5%AE%B9" class="hash-link" aria-label="文章内容的直接链接" title="文章内容的直接链接">​</a></h3>
<p>cnblogs的文章内容是一个textarea,也是带有ID的，所以我们直接根据ID获取即可：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 文章内容</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    file_content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> read_file_with_footer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'content'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'md-editor'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    content</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">file_content</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 等待5秒</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="页面滚动">页面滚动<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E9%A1%B5%E9%9D%A2%E6%BB%9A%E5%8A%A8" class="hash-link" aria-label="页面滚动的直接链接" title="页面滚动的直接链接">​</a></h3>
<p>如果你观察cnblogs的页面，可以看到文章内容之后已经占满了整个屏幕，如果我们还需要继续处理后面的内容的话，就需要对页面进行一个滚动操作。</p>
<p>这里我们借用了ActionChains的scroll to element方法。</p>
<p>首先我们找到最下面的发布按钮，然后直接滚动到这个发布按钮即可。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 滚轮滚到最下面的位置</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    submit_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[@data-el-locator="publishBtn"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ActionChains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">driver</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">scroll_to_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">submit_button</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">perform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="个人分类">个人分类<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E4%B8%AA%E4%BA%BA%E5%88%86%E7%B1%BB" class="hash-link" aria-label="个人分类的直接链接" title="个人分类的直接链接">​</a></h3>
<p>个人分类是一个下拉框。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071730918.png" alt="image-20240507173020475" class="img_ev3q"></p>
<p>他有一个比较特别的tag name叫做cnb-post-category-select。</p>
<p>所以我们可以通过这个tag name找到这个元素，然后点击他。</p>
<p>因为所有的要选择的元素都是在cnb-post-category-select这个tag内部的，所以我们调用post_category_select.find_element来查找它内部的input元素。</p>
<p>找到之后，我们输入个人分类，然后从下拉框中选择对应的个人分类tag，然后点击回车。</p>
<p>所有的个人分类都选择完毕之后，我们再次点击post_category_select，以关闭下拉框。</p>
<p>对应的代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 个人分类</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    categories </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cnblogs_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'categories'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> categories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post_category_select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TAG_NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cnb-post-category-select'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post_category_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> category </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> categories</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            category_search </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> post_category_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//nz-select-search/input'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            category_search</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">category</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            category_select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> post_category_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//nz-tree-node-title[contains(@title, "</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">category</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]/div'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            category_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post_category_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="添加到合集">添加到合集<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%B7%BB%E5%8A%A0%E5%88%B0%E5%90%88%E9%9B%86" class="hash-link" aria-label="添加到合集的直接链接" title="添加到合集的直接链接">​</a></h3>
<p>添加到合集的实现方式跟个人分类有些类似。</p>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071738966.png" alt="image-20240507173806856" class="img_ev3q"></p>
<p>默认情况下，添加到合集这个选项中的内容是隐藏的，所以我们需要首先点击这个选项头，让对应的选项露出来。</p>
<p>这里可以通过name来获取到这个元素。然后点击。</p>
<p>接下来就是通过text属性来查找collection_select中要选择的合集元素，然后点击他们。</p>
<blockquote>
<p>注意，这里如果选择的是包含合集文字的span，如下所示。这个span是不可被点击的。</p>
<p>所以我们的解决办法就是找到它的父元素。</p>
<p>通过： collection_item.find_element(By.XPATH, '..') 来实现。</p>
<p>然后点击他的父元素即可。</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://flydean-1301049335.cos.ap-guangzhou.myqcloud.com/img/202405071741336.png" alt="image-20240507174113523" class="img_ev3q"></p>
<p>最终的实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 添加到合集</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    collections </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cnblogs_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'collections'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> collections</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        collection_select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'添加到合集'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        collection_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># print(collection_select.get_attribute('innerHTML'))</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> collection </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> collections</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            collection_item </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> collection_select</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'//span[contains(@class,"item__text") and contains(text(), "</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">collection</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">")]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            parent_element </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> collection_item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'..'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># print(parent_element.tag_name)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            parent_element</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="投稿选项">投稿选项<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%8A%95%E7%A8%BF%E9%80%89%E9%A1%B9" class="hash-link" aria-label="投稿选项的直接链接" title="投稿选项的直接链接">​</a></h3>
<p>投稿选项比较简单，直接通过ID选择即可：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 投稿选项</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    post_type </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'site-publish-site-home'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    post_type</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="投顾至网站分类">投顾至网站分类<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%8A%95%E9%A1%BE%E8%87%B3%E7%BD%91%E7%AB%99%E5%88%86%E7%B1%BB" class="hash-link" aria-label="投顾至网站分类的直接链接" title="投顾至网站分类的直接链接">​</a></h3>
<p>网站分类的ID就是分类的名字，所以，我们可以下面代码来实现：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 投顾至网站分类</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    topic </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cnblogs_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'topic'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> topic</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post_type_detail </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'投稿至网站分类'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        post_type_detail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_item </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> topic</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        topic_item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="摘要">摘要<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%91%98%E8%A6%81" class="hash-link" aria-label="摘要的直接链接" title="摘要的直接链接">​</a></h3>
<p>摘要也是通过ID来获取的，代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 摘要</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    summary </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> common_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'summary'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    summary_item </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'summary'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    summary_item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">summary</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tag标签">tag标签<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#tag%E6%A0%87%E7%AD%BE" class="hash-link" aria-label="tag标签的直接链接" title="tag标签的直接链接">​</a></h3>
<p>tag标签是一个输入框。所以我们先定位到这个输入框，然后输入tag，等待网站的tag列表出来之后，直接回车即可。</p>
<p>实现代码如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># tag标签</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    tags </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> cnblogs_config</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_item </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'tags'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        tag_item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> tag </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> tag_item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TAG_NAME</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'input'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tag</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            tag_input</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send_keys</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Keys</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ENTER</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="提交文章">提交文章<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%8F%90%E4%BA%A4%E6%96%87%E7%AB%A0" class="hash-link" aria-label="提交文章的直接链接" title="提交文章的直接链接">​</a></h3>
<p>最后就是提交文章啦，这个提交按钮需要根据xpath来获取：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 提交文章</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> auto_publish</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        submit_button </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> driver</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">find_element</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">By</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">XPATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'//button[@data-el-locator="publishBtn"]'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        submit_button</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">click</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="总结">总结<a href="http://www.flydean.com/blog/projects/006-auto-blog-publish-tool-cnblogs#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h2>
<p>cnblogs的实现还是比较规范的，主要就是各项内容会比较多一些，需要耗费一些时间来实现。</p>]]></content:encoded>
            <category>工具</category>
            <category>自动化</category>
            <category>自动发布</category>
            <category>程序那些事</category>
        </item>
    </channel>
</rss>