<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>自動化 on IT 空間</title><link>https://blog.jiatool.com/tags/%E8%87%AA%E5%8B%95%E5%8C%96/</link><description>Recent content in 自動化 on IT 空間</description><generator>Hugo -- gohugo.io</generator><language>zh</language><managingEditor>jia@jiatool.com (Jia)</managingEditor><webMaster>jia@jiatool.com (Jia)</webMaster><copyright>&amp;copy;{year}, Jia All Rights Reserved</copyright><lastBuildDate>Sat, 20 Nov 2021 21:00:00 +0800</lastBuildDate><atom:link href="https://blog.jiatool.com/tags/%E8%87%AA%E5%8B%95%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>Playwright 瀏覽器自動化工具，應用於網路爬蟲和測試</title><link>https://blog.jiatool.com/posts/playwright/</link><pubDate>Sat, 20 Nov 2021 21:00:00 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sat, 20 Nov 2021 21:00:00 +0800</atom:modified><guid>https://blog.jiatool.com/posts/playwright/</guid><description>前言 你還在使用 Selenium 來網路爬蟲或自動化測試嗎？或許你可以來試試另一個工具 — Playwright。 (圖片來源：Unsplash) [小廣告] 我製作了</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>你還在使用 Selenium 來網路爬蟲或自動化測試嗎？或許你可以來試試另一個工具 — Playwright。&lt;/p>
&lt;figure >
&lt;img data-src="https://images.unsplash.com/photo-1486312338219-ce68d2c6f44d?w=600&amp;amp;q=50" alt="(圖片來源：Unsplash)" data-caption="(圖片來源：Unsplash)" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
(圖片來源：Unsplash)
&lt;/figcaption>
&lt;/figure>
&lt;br/>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">[小廣告] 我製作了一款可愛的「&lt;a href="https://blog.jiatool.com/posts/penguin_wizard_sticker">企鵝魔法師&lt;/a>」貼圖~&lt;br />
歡迎下載：&lt;a href="https://line.me/S/sticker/31703222">LINE 貼圖&lt;/a>、&lt;a href="https://t.me/addstickers/penguin_wizard">Telegram 貼圖 (免費)&lt;/a>&lt;/p>
&lt;img src="https://res.cloudinary.com/jiablog/penguin_wizard_sticker/show.png" caption="企鵝魔法師" width="600px" position="center">&lt;/div>
&lt;h2 id="playwright-套件簡介">Playwright 套件簡介&lt;/h2>
&lt;p>Playwright 是微軟 Microsoft 開發的一個開源瀏覽器自動化工具，可以選擇 Chromium、Firefox、WebKit 瀏覽器，目前有 Python、JavaScript、TypeScript、.NET、Java 的 API 可供使用。&lt;/p>
&lt;p>* 本篇文章以 Python 為範例，但各程式語言的 API 應該是差不多的。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>Linux&lt;/th>
&lt;th>macOS&lt;/th>
&lt;th>Windows&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Chromium 98.0.4708.0&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WebKit 15.4&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Firefox 94.0.1&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>* 此版本會持續更新，以官方文檔為主。&lt;/p>
&lt;br/>
&lt;p>Playwright 第一次輸入指令就會自動下載瀏覽器，與自己使用的瀏覽器是分開的。不用像 Selenium 要手動下載，版本更新還要去更新驅動。&lt;/p>
&lt;br/>
&lt;p>Playwright 在對元素(elements)操作之前，會自動等待元素準備完成(可見的、啟用的&amp;hellip;)，不用怕元素還沒載入就執行造成錯誤，也不需要自己加等待。&lt;/p>
&lt;p>就像省去了 Selenium 內的 WebDriverWait：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">WebDriverWait&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">driver&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timeout&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">until&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">EC&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">presence_of_element_located&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">By&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">CSS_SELECTOR&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;#search&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>* 詳細可以參考官方文檔：&lt;a href="https://playwright.dev/python/docs/actionability">https://playwright.dev/python/docs/actionability&lt;/a>&lt;/p>
&lt;br/>
&lt;p>* Playwright 支援同步和異步(搭配 asyncio)，本篇文章皆使用同步來示範。&lt;br />
* Playwright 甚至能自動產生程式碼，這部分可以參考大數學堂的影片教學：&lt;a href="https://www.youtube.com/watch?v=moeAmM-7ybE" target="_blank" rel="noopener">
[爬蟲實戰] 如何不寫任何一行程式碼透過低代碼Low-Code / No-Code 工具 Playwright撰寫網頁自動化瀏覽程式
&lt;/a>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://playwright.dev/python/" target="_blank" rel="noopener">
Playwright 官方網站
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://playwright.dev/python/docs/intro" target="_blank" rel="noopener">
Playwright 文檔
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://playwright.dev/python/docs/api/class-playwright" target="_blank" rel="noopener">
Playwright API
&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/microsoft/playwright-python" target="_blank" rel="noopener">
Playwright for Python GitHub
&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;br/>
&lt;h2 id="教學">教學&lt;/h2>
&lt;p>先來試試官方文檔內的基本程式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="kn">from&lt;/span> &lt;span class="nn">playwright.sync_api&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">sync_playwright&lt;/span>
&lt;span class="k">with&lt;/span> &lt;span class="n">sync_playwright&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="n">browser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chromium&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">page&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">browser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">new_page&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">goto&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;http://playwright.dev&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="k">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">title&lt;/span>&lt;span class="p">())&lt;/span>
&lt;span class="n">browser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">close&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>首先創造一個瀏覽器實例，開新分頁，再來前往 &lt;code>http://playwright.dev&lt;/code> 網頁，並取得網頁的 title，最後關閉瀏覽器。&lt;/p>
&lt;br/>
&lt;p>它預設是以「無頭模式」啟動，但為了在寫程式時觀察它運作，我們可以先將其關閉：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">browser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chromium&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">headless&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="bp">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="常見的基本操作">常見的基本操作&lt;/h3>
&lt;p>以下是幾種常見的網頁基本操作：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 點擊&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;div&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 輸入文字&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#search&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 複選框和單選按鈕&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">check&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#agree&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 下拉選擇欄&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">select_option&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;select#colors&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;blue&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>更多進階用法與參數可參考官方文檔：&lt;/p>
&lt;ul>
&lt;li>滑鼠 Mouse：&lt;a href="https://playwright.dev/python/docs/api/class-mouse">https://playwright.dev/python/docs/api/class-mouse&lt;/a>&lt;/li>
&lt;li>鍵盤 Keyboard：&lt;a href="https://playwright.dev/python/docs/api/class-keyboard">https://playwright.dev/python/docs/api/class-keyboard&lt;/a>&lt;/li>
&lt;/ul>
&lt;br/>
&lt;h3 id="元素定位">元素定位&lt;/h3>
&lt;p>基本操作或取得元素皆使用 CSS Selector 元素定位。&lt;/p>
&lt;div class="alert alert-info" role="alert" data-dir="ltr">關於 CSS Selector (選擇器)的寫法可以參考我以前整理的文章：&lt;br />
&lt;a href="https://blog.jiatool.com/posts/sorted-out-css-selector/">常用網頁 CSS Selector (選擇器)取得元素，搭配 Python BeautifulSoup 套件&lt;/a>&lt;/div>
&lt;br/>
&lt;p>Playwright 除了有一般的 Selector 用法以外，還有個比較特別且好用的 &amp;quot;文字(text)&amp;quot; 選擇方式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 取得包含此段文字的元素 (不分大小寫)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;text=Log in&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 取得與此段文字一模一樣的元素 (注意裡面還有引號)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;text=&amp;#34;Log in&amp;#34;&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 如果要與 CSS Selector 結合，要使用以下方式&lt;/span>
&lt;span class="c1"># 概念同等於上方的 &amp;#39;text=Log in&amp;#39;，包含此段文字 (不分大小寫)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;button:text(&amp;#34;Log in&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 概念同等於上方的 &amp;#39;text=&amp;#34;Log in&amp;#34;&amp;#39;，文字要完全一樣&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;button:text-is(&amp;#34;Log in&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 使用正則表達式&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;button:text-matches(&amp;#34;[+-]?&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s1">d+&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 還有一種是匹配內部包含文字的任何元素，可能在子元素或後代元素中&lt;/span>
&lt;span class="c1"># 例如底下會匹配 &amp;lt;article&amp;gt;&amp;lt;div&amp;gt;Playwright&amp;lt;/div&amp;gt;&amp;lt;/article&amp;gt;。&lt;/span>
&lt;span class="n">element&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">wait_for_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;article:has-text(&amp;#34;Playwright&amp;#34;)&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>在文字匹配會對空格進行正規化，例如將多個空格轉換為一個，將換行符變成空格並忽略開頭和結尾的空格。&lt;/p>
&lt;p>因為這部分有多種狀況、較複雜，我只是初步嘗試，如有錯誤歡迎底下留言告知。&lt;br />
參考：&lt;a href="https://playwright.dev/python/docs/selectors/#text-selector">https://playwright.dev/python/docs/selectors/#text-selector&lt;/a>&lt;/p>
&lt;br/>
&lt;p>以及一些其他的選擇方式：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 返回 &amp;lt;article&amp;gt; 具有 &amp;lt;div class=promo&amp;gt; 內部元素的文本內容&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text_content&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;article:has(div.promo)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 僅點擊可見 class=button 的元素&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">click&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;.button:visible&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="選取元素">選取元素&lt;/h3>
&lt;p>如果要取得元素，可以使用：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 取得元素&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#promo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 取得元素，加入等待&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">wait_for_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#promo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;p>獲取元素的文字及屬性：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 取得元素的文字&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;h3&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text_content&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="c1"># 取得元素的屬性(attribute)&lt;/span>
&lt;span class="n">page&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query_selector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;section&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_attribute&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;class&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;h3 id="瀏覽器參數">瀏覽器參數&lt;/h3>
&lt;p>在教學一開始說到無頭模式，在 &lt;code>launch&lt;/code> 加入 &lt;code>headless=False&lt;/code>，它還有其他參數可以設定。&lt;br />
詳見：&lt;a href="https://playwright.dev/python/docs/api/class-browsertype#browser-type-launch">https://playwright.dev/python/docs/api/class-browsertype#browser-type-launch&lt;/a>&lt;/p>
&lt;p>像是傳遞給瀏覽器實例的附加參數，想讓它靜音就使用：&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="n">browser&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">playwright&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chromium&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">launch&lt;/span>&lt;span class="p">(&lt;/span>
&lt;span class="n">args&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;--mute-audio&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="c1"># 靜音&lt;/span>
&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>更多 Chromium flags 的列表：&lt;a href="https://peter.sh/experiments/chromium-command-line-switches/">https://peter.sh/experiments/chromium-command-line-switches/&lt;/a>&lt;/p>
&lt;br/>
&lt;h3 id="cookies-和-local-storage">Cookies 和 Local Storage&lt;/h3>
&lt;p>儲存與載入 Cookies 和 Local Storage，可以用作保存登入狀態。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre class="chroma">&lt;code class="language-Python" data-lang="Python">&lt;span class="c1"># 將存儲狀態保存到文件中&lt;/span>
&lt;span class="n">storage&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">storage_state&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">path&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;state.json&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="c1"># 使用保存的存儲狀態創建新上下文(context)&lt;/span>
&lt;span class="n">context&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">browser&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">new_context&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">storage_state&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;state.json&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;br/>
&lt;!--adsense-->
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>它還有個 GUI 工具 Trace Viewer，可以在程式執行後幫助探索操作過程，感覺非常的厲害，但這部分我就還沒嘗試過，有興趣可以參考：&lt;a href="https://playwright.dev/python/docs/trace-viewer">https://playwright.dev/python/docs/trace-viewer&lt;/a>&lt;/p>
&lt;br/>
&lt;p>Playwright 相比 Selenium 來說是比較新出來的工具(不過都已經是正式版了)，許多功能更好用，如果你原先是使用 Selenium 來寫網路爬蟲或做自動化測試，或許可以試試 Playwright，搞不好你就會愛上囉。😆&lt;/p>
&lt;br/>
&lt;p>歡迎追蹤『&lt;a href="https://www.facebook.com/jiatool" target="_blank" rel="noopener">
IT空間
&lt;/a>』FB 粉專，取得最新發文通知🔔&lt;/p>
&lt;br/>
&lt;br/>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://playwright.dev/python/" target="_blank" rel="noopener">
Playwright 官方網站
&lt;/a>&lt;br />
&lt;a href="https://playwright.dev/python/docs/intro" target="_blank" rel="noopener">
Playwright 文檔
&lt;/a>&lt;br />
&lt;a href="https://playwright.dev/python/docs/api/class-playwright" target="_blank" rel="noopener">
Playwright API
&lt;/a>&lt;br />
&lt;a href="https://github.com/microsoft/playwright-python" target="_blank" rel="noopener">
Playwright for Python GitHub
&lt;/a>&lt;/p>
&lt;br/>
&lt;blockquote>
&lt;p>對於自己想做的事，就放手去挑戰吧！不是因為覺得能成功就去做，而是發自內心的想要嘗試看看，這樣不管結果如何，自己都不會後悔。&lt;/p>
&lt;p align="right">—— 鈴木一朗 (棒球選手)&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/playwright.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><media:content url="https://blog.jiatool.comimages/posts/playwright_meta.jpg" medium="image"><media:title type="html">meta image</media:title></media:content><category>Playwright</category><category>瀏覽器</category><category>自動化</category><category>套件</category><category>Python</category><category>分享</category><category>Python套件</category></item><item><title>免費遊戲自動通知 (IFTTT + RSS)</title><link>https://blog.jiatool.com/posts/ifttt-rss/</link><pubDate>Sun, 12 Jul 2020 21:30:30 +0800</pubDate><author>jia@jiatool.com (Jia)</author><atom:modified>Sun, 12 Jul 2020 21:30:30 +0800</atom:modified><guid>https://blog.jiatool.com/posts/ifttt-rss/</guid><description>前言 想要免費遊戲，但要自己每天上網找，好麻煩? 教你啦~架個伺服器、寫個爬蟲程式、連結LINE Bot&amp;hellip; 這也太麻煩了吧&amp;gt;&amp;lt; 不！不用程式！！</description><content:encoded>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>想要免費遊戲，但要自己每天上網找，好麻煩?&lt;br />
教你啦~架個伺服器、寫個爬蟲程式、連結LINE Bot&amp;hellip;&lt;br />
這也太麻煩了吧&amp;gt;&amp;lt;&lt;/p>
&lt;p>不！不用程式！！&lt;br />
只要結合 IFTTT 跟網站提供的 RSS 即可，在網站貼出免費遊戲消息時，自動傳到Line、Telegram&amp;hellip;通知你！&lt;/p>
&lt;h2 id="資料來源">資料來源&lt;/h2>
&lt;p>在這篇我們是要使用網站提供的RSS，因此要先取得此網站的RSS。&lt;br />
在此以 &lt;a href="https://www.4gamers.com.tw/" target="_blank" rel="noopener">
4Gamers
&lt;/a> 為例，目前我知道要找到網站本身提供的RSS有三種方式：&lt;/p>
&lt;ol>
&lt;li>找找網站本身的RSS按鈕&lt;/li>
&lt;li>試著在網站網址後方加上rss。例如：https://www.4gamers.com.tw/rss、https://gnn.gamer.com.tw/rss.xml&lt;/li>
&lt;li>google看看是否有人知道&lt;/li>
&lt;/ol>
&lt;br/>
&lt;p>我試著在瀏覽器的網址欄輸入&lt;code>https://www.4gamers.com.tw/rss&lt;/code>，結果他自動跳轉到&lt;code>https://www.4gamers.com.tw/rss/latest-news&lt;/code>，那之後就使用此RSS網址。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/4Gamers_rss.png" alt="4Gamers RSS網址" data-caption="4Gamers RSS網址" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
4Gamers RSS網址
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;h2 id="流程">流程&lt;/h2>
&lt;p>前往 &lt;a href="https://ifttt.com/" target="_blank" rel="noopener">
IFTTT
&lt;/a> 註冊自己的帳號，&lt;br />
點擊 Create 創建一個程序(Applets)&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt01.png" alt="點擊 Create 創建 Applets" data-caption="點擊 Create 創建 Applets" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
點擊 Create 創建 Applets
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>&lt;code>If This Then That&lt;/code> 意思是如果這樣就那樣，&lt;br />
&lt;code>This&lt;/code>就是觸發條件；&lt;code>That&lt;/code>就是執行動作。&lt;br />
例如我們想要的&amp;quot;如果有免費相關的文章，就寄通知給我&amp;quot;。&lt;br />
點擊 This 來設定觸發條件&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt02.png" alt="設定觸發條件" data-caption="設定觸發條件" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
設定觸發條件
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>我這邊使用RSS來訂閱網站的文章，所以搜尋&lt;code>RSS&lt;/code>。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt03.png" alt="搜尋RSS" data-caption="搜尋RSS" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='500px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:500px;height:;"/>
&lt;figcaption style="text-align: center;">
搜尋RSS
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>因為我只想接收有包含特定關鍵字的文章，不想全部都接收，&lt;br />
(我窮，有錢的不要，只要免費的！！)&lt;br />
所以選擇&amp;quot;New feed item matches&amp;quot;。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt04.png" alt="選擇 New feed item matches" data-caption="選擇 New feed item matches" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
選擇 New feed item matches
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>設定想要接收的關鍵字&lt;br />
&lt;code>Keyword&lt;/code>輸入&lt;code>免費&lt;/code>；&lt;br />
&lt;code>Feed URL&lt;/code>輸入4Gamers的RSS網址 &lt;code>https://www.4gamers.com.tw/rss/latest-news&lt;/code>&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt05.png" alt="設定關鍵字及RSS網址" data-caption="設定關鍵字及RSS網址" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
設定關鍵字及RSS網址
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>接下來換設定 That 執行動作。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt06.png" alt="設定執行動作" data-caption="設定執行動作" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
設定執行動作
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>看你要使用什麼接收通知都可以，例如LINE、Telegram、Email。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt07_8.png" alt="LINE or Telegram" data-caption="LINE or Telegram" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
LINE or Telegram
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>這邊以目前台灣較多人使用的LINE來示範。&lt;/p>
&lt;p>第一次連結時會需要登入驗證，之後就不需要這個手續了。&lt;/p>
&lt;p>Send message 寄送訊息&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt09.png" alt="設定寄送訊息" data-caption="設定寄送訊息" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='700px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:700px;height:;"/>
&lt;figcaption style="text-align: center;">
設定寄送訊息
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>Recipient(接收者)可以設定自己或指定群組，&lt;br />
自己指的是它會透過一個官方帳號LINE Notify來傳送，因此要先加LINE Notify為好友(和確保沒有封鎖它XD)。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt10.png" alt="設定寄送訊息" data-caption="設定寄送訊息" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='300px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:300px;height:;"/>
&lt;figcaption style="text-align: center;">
設定寄送訊息
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>底下的message是指接收到訊息的格式，點擊右下方Add ingredient 有一些RSS的變數可加進來。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt11.png" alt="設定寄送訊息" data-caption="設定寄送訊息" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='300px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:300px;height:;"/>
&lt;figcaption style="text-align: center;">
設定寄送訊息
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>最後一步，改個容易辨識的名稱，就完成囉~&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt12.png" alt="設定 Applets 名稱" data-caption="設定 Applets 名稱" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='300px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:300px;height:;"/>
&lt;figcaption style="text-align: center;">
設定 Applets 名稱
&lt;/figcaption>
&lt;/figure>&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt13.png" alt="完成" data-caption="完成" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='600px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:600px;height:;"/>
&lt;figcaption style="text-align: center;">
完成
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>點擊IFTT網頁右上角 &amp;gt; My Applets，可以查看自己全部設定過的程序。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/ifttt14.png" alt="查看自己全部的程序" data-caption="查看自己全部的程序" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='250px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:250px;height:;"/>
&lt;figcaption style="text-align: center;">
查看自己全部的程序
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;p>接下來就&amp;hellip;等&amp;hellip;恩&amp;hellip;等(╯▽╰ )，等到有包含&amp;quot;免費&amp;quot;的文章，就會在LINE中的 LINE Notify聊天室 收到如下的通知。&lt;br />
&lt;figure >
&lt;img data-src="https://res.cloudinary.com/jiablog/ifttt-rss/message.jpg" alt="LINE 收到通知囉~" data-caption="LINE 收到通知囉~" src="data:image/svg+xml,%0A%3Csvg xmlns='http://www.w3.org/2000/svg' width='400px' height='' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0V0z'/%3E%3Cpath fill='%23aaa' d='M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-1 16H6c-.55 0-1-.45-1-1V6c0-.55.45-1 1-1h12c.55 0 1 .45 1 1v12c0 .55-.45 1-1 1zm-4.44-6.19l-2.35 3.02-1.56-1.88c-.2-.25-.58-.24-.78.01l-1.74 2.23c-.26.33-.02.81.39.81h8.98c.41 0 .65-.47.4-.8l-2.55-3.39c-.19-.26-.59-.26-.79 0z'/%3E%3C/svg%3E" class="lazyload" style="width:400px;height:;"/>
&lt;figcaption style="text-align: center;">
LINE 收到通知囉~
&lt;/figcaption>
&lt;/figure>&lt;/p>
&lt;h2 id="結語">結語&lt;/h2>
&lt;p>怎樣😉 有沒有很簡單啊~&lt;/p>
&lt;p>IFTTT裡頭還有非常多可以連結的平台，透過這篇文章學到了基礎，自己舉一反三還可以創造許多實用、有趣的功能呢~&lt;br />
IFTTT還有另一個很大的應用是在自動化智慧居家的部分。&lt;/p>
&lt;br/>
&lt;br/>
&lt;br/>
&lt;p>如有遇到其他問題，或文章內容有誤，歡迎底下留言~😙&lt;/p>
&lt;hr />
&lt;p>參考：&lt;br />
&lt;a href="https://ifttt.com/" target="_blank" rel="noopener">
IFTTT 官網
&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>莫札特曾經說過大膽地踏上旅途吧，我不知道路途的前方究竟有什麼，&lt;br />
但是，我們還是邁出了步伐，我們仍在旅途之中。&lt;/p>
&lt;p align="right">—— 四月是你的謊言&lt;/p>
&lt;/blockquote></content:encoded><dc:creator>Jia</dc:creator><media:content url="https://blog.jiatool.comimages/cover/ifttt-rss.jpg" medium="image"><media:title type="html">featured image</media:title></media:content><category>rss</category><category>LINE</category><category>自動化</category><category>其他</category></item></channel></rss>