

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BOT &#8211; Max的程式語言筆記</title>
	<atom:link href="https://stackoverflow.max-everyday.com/tag/bot/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Tue, 11 Apr 2023 07:48:09 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://stackoverflow.max-everyday.com/wp-content/uploads/2017/02/max-stackoverflow-256.png</url>
	<title>BOT &#8211; Max的程式語言筆記</title>
	<link>https://stackoverflow.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Selenium 使用 Firefox 瀏覽器 webdriver</title>
		<link>https://stackoverflow.max-everyday.com/2018/11/selenium-firefox-webdriver/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/11/selenium-firefox-webdriver/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 29 Nov 2018 07:05:52 +0000</pubDate>
				<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[BOT]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[selenium]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2483</guid>

					<description><![CDATA[如果你不會寫程式，可以匯錢給我下載執行檔。目前是...]]></description>
										<content:encoded><![CDATA[
<p>如果你不會寫程式，可以匯錢給我下載執行檔。目前是套用在 Firefox瀏覽器，如果你是chrome瀏覽器的愛好者請參考這一篇：Selenium 使用 Chrome 瀏覽器 webdriver<br><a href="https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/">https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/</a></p>



<p>使用Firefox 搶票的執行畫面：拓元售票系統使用Firefox+Max自動搶票機器人(2018/11/29)<br><a href="https://www.youtube.com/watch?v=umjVjW0b4cc">https://www.youtube.com/watch?v=umjVjW0b4cc</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="拓元售票系統使用Firefox+Max自動搶票機器人(2018/11/29)" width="640" height="480" src="https://www.youtube.com/embed/umjVjW0b4cc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>附註：使用 Firefox + webdriver 時會造成 javascript 的彈出式詢問對話框(confirm dialog) 無法正常使用，請點選「訂單查詢」在第2個分頁裡去取消或結帳。</p>



<p>接下來的步驟是寫給想要「練功」或「有一些電腦基礎」而且有辦法在「命令提示字元」(Windows平台)或的終端機(Linux/Mac平台）執行指令的人。</p>



<hr class="wp-block-separator"/>



<p>Step 1：要安裝 python</p>



<p>附註1：如果是 Linux 或 MacOS 平台，可以略過 Step1，因為內建就有 python, python2 或 python3 都可以，不限定版本。<br>附註2：除了python 如果你懂其他程式語言(例如：java)也可以實作，不限於python程式語言，大同小異）</p>



<p>Step 2：要安裝 pip</p>



<p>附註：這個太簡單，如果你的電腦裡沒有pip 指令，自行google 看看如何安裝。</p>



<p>Step 3：安裝selenium套件，請執行指令：</p>



<pre class="wp-block-preformatted"> pip install selenium</pre>



<hr class="wp-block-separator"/>



<p>如果在 Linux 或 MacOS 平台裡執行pip install 失敗，請先pip install virtualenv. 我自己本身是使用&nbsp; macOS, 一開始是無法安裝，使用 virtualenv，是一定可以跑，後來不知道修改到什麼，變成不用進入 venv 環境裡也可以直接執行。</p>



<p>如果是 Windows平台，請直接跳到 Step 4.</p>



<p>virtualenv 基礎教學：<br><a href="http://docs.python-guide.org/en/latest/dev/virtualenvs/">http://docs.python-guide.org/en/latest/dev/virtualenvs/</a></p>



<hr class="wp-block-separator"/>



<p>Step 4：下載 geckodriver (WebDriver for Firefox)</p>



<p>geckodriver 下載頁面：</p>



<p><a href="https://github.com/mozilla/geckodriver/releases">https://github.com/mozilla/geckodriver/releases</a></p>



<p>附註1：geckodriver 目前有支援 Linux 64bit / macOS 64bit / Windows 32bit (64bit 也可以執行 32bit程式） / Windows 64bit 等版本。Linux 是有推出 32bit 的，但這個年代幾乎沒有人再去安裝 32bit 的作業系統了。</p>



<p>太舊的 Firefox 執行起來會有問題，請先更新Firefox瀏覽器為最近的版本。</p>



<p>附註：firefox 有分 32bit 和 64bit, 請下載正確的版本，要知道firefox&nbsp; 的版本在「說明」-「關於FireFox」裡可以看到。</p>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="1252" height="724" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/11/Screen-Shot-2019-01-25-at-04.39.30.jpg" alt="" class="wp-image-2607" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/11/Screen-Shot-2019-01-25-at-04.39.30.jpg 1252w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/11/Screen-Shot-2019-01-25-at-04.39.30-600x347.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/11/Screen-Shot-2019-01-25-at-04.39.30-768x444.jpg 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/11/Screen-Shot-2019-01-25-at-04.39.30-1024x592.jpg 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></figure>



<p>完成 step 3 的 selenium 的安裝，和 step 4 下載geckodriver 之後，先試看看這個sample code:</p>



<pre class="wp-block-preformatted">from selenium import webdriver
# for selenium 4
from selenium.webdriver.chrome.service import Service

driverpath = "/Users/max/Documents/chromedriver"
firefox_service = Service(<meta charset="utf-8">driverpath)
driver = webdriver.Firefox(service=<meta charset="utf-8">firefox_service)
driver.get("http://tw.yahoo.com/")</pre>



<p>說明1：這個driverpath 路徑請換成您電腦實際下載的資料夾。</p>



<p>說明2：這個範例會開一個新的 Firefox 視窗並連到網址&nbsp;http://tw.yahoo.com/</p>



<p>附註：目前的範例是透過 python 去控制 selenium ＋ geckodriver，如果你懂其他的程式語言，也是可以實作的出來，異曲同工。</p>



<hr class="wp-block-separator"/>



<p>範例 2 號：</p>



<pre class="wp-block-preformatted">from selenium import webdriver
# for selenium 4
from selenium.webdriver.chrome.service import Service

driverpath = "/Users/max/Documents/chromedriver"
firefox_service = Service(driverpath)
driver = webdriver.Firefox(service=firefox_service)</pre>



<pre class="wp-block-preformatted">driver.get('http://www.cwb.gov.tw/V7/')
driver.set_window_position(0,0) #瀏覽器位置
driver.set_window_size(700,700) #瀏覽器大小

driver.find_element_by_link_text('天氣預報').click() #點擊頁面上"天氣預報"的連結</pre>



<hr class="wp-block-separator"/>



<p>因為 webdriver 的使用方式相同，所以接下來的介紹請參考這一篇：<br><a href="https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/">https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/</a></p>



<p>現在已經來到 selenium 4.0 之後的版本，網路上部份舊版的範例是使用 executable_path 參數，會顯示提示的訊息說直接使用上面的範例可能會顯示錯誤訊息，因為 selenium 需要傳遞 service :</p>



<pre class="wp-block-preformatted">DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Firefox(executable_path=driver_path)</pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/11/selenium-firefox-webdriver/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Selenium 使用 Chrome 瀏覽器 webdriver</title>
		<link>https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/#comments</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 01 Mar 2018 06:54:24 +0000</pubDate>
				<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[BOT]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[selenium]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2093</guid>

					<description><![CDATA[這篇文章要分享如何實作你己的搶票機器人，如果你不...]]></description>
										<content:encoded><![CDATA[
<p>這篇文章要分享如何實作你己的搶票機器人，如果你不會寫程式，針對電腦只會使用滑鼠的使用者，目前我們有提供點2下就可以動的執行檔，請參考教學影片：</p>



<p>拓元售票系統使用Max自動搶票機器人(2018/11/23)<br><a href="https://www.youtube.com/watch?v=QX8u2iF1Gm8">https://www.youtube.com/watch?v=QX8u2iF1Gm8</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="拓元售票系統使用Max自動搶票機器人(2018/11/23)" width="640" height="480" src="https://www.youtube.com/embed/QX8u2iF1Gm8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>上面影片裡的exe執行檔的下載點：Max的拓元搶票機器人<br><a href="https://max-everyday.com/2018/03/tixcraft-bot/">https://max-everyday.com/2018/03/tixcraft-bot/</a></p>



<p>Max搶票機器人的Facebook粉絲團：<br><a href="https://www.facebook.com/maxbot.ticket/">https://www.facebook.com/maxbot.ticket/</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<p>2018-12-14 的版本可以指定日期和區域：<a href="https://www.youtube.com/watch?v=tSOBgcrMmuA">https://www.youtube.com/watch?v=tSOBgcrMmuA</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="拓元售票系統使用Max自動搶票機器人(2018/12/14)" width="640" height="480" src="https://www.youtube.com/embed/tSOBgcrMmuA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<hr class="wp-block-separator has-css-opacity"/>



<p>如果你是Firefox瀏覽器的愛好者請參考這一篇：Selenium 使用Firefox 瀏覽器 webdriver<br><a href="https://stackoverflow.max-everyday.com/2018/11/selenium-firefox-webdriver/">https://stackoverflow.max-everyday.com/2018/11/selenium-firefox-webdriver/</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<p>接下來文章內容是要寫給想要「練功」(寫程式)或「有一些電腦基礎」而且有辦法在「命令提示字元」(Windows平台)或的終端機(Linux/Mac平台）執行指令的人。</p>



<hr class="wp-block-separator has-css-opacity"/>



<p><strong>Step 1：安裝 python</strong></p>



<p>如果是 Linux 或 MacOS 平台，如果內建的版本是 python 2 的的，因為目前已經不支援，請下載並安裝 python 3 ，不限定版本，建議到 python 的官方網站下載並安裝最新 python 3.x 的版本。目前(2023年4月)比較穩定的版本似乎  python 3.9 或 python 3.10, 而 python 3.11 似乎太新了, 相容性還沒有很好。 </p>



<p>除了python 如果你懂其他程式語言(例如：java 或 C#)也可以實作，不限於python程式語言，各個程式語言之間大同小異）</p>



<p>selenium 可以支援的程式語言，參考看看:<br><a href="https://www.selenium.dev/documentation/">https://www.selenium.dev/documentation/</a></p>



<p><strong>Step 2：安裝 pip</strong></p>



<p>附註：這個太簡單，如果你的電腦裡沒有pip 指令，自行google 看看如何安裝。</p>



<p><strong>Step 3：安裝selenium套件，請執行指令：</strong></p>



<pre class="wp-block-preformatted">pip install selenium</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>如果在 Linux 或 MacOS 平台裡執行pip install 失敗，請先pip install virtualenv. 我自己本身是使用  macOS, 一開始是無法安裝，使用 virtualenv，是一定可以跑，後來不知道修改到什麼，變成不用進入 venv 環境裡也可以直接執行。</p>



<p>沒有使用 venv 也是可以的，但用過 venv 的人都很推薦使用，因為比較不會被其他專案使用的元件影響到，也不會去影響到其他專案。</p>



<p>如果是 Windows平台，請直接跳到 Step 4.</p>



<p>virtualenv 基礎教學：<br><a href="http://docs.python-guide.org/en/latest/dev/virtualenvs/">http://docs.python-guide.org/en/latest/dev/virtualenvs/</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<p><strong>Step 4：下載ChromeDriver</strong></p>



<p>ChromeDriver 說明：</p>



<p>ChromeDriver 可以讓 Selenium Server 呼叫 Google Chrome 執行，ChromeDriver 網站：<br><a href="https://sites.google.com/a/chromium.org/chromedriver/">https://sites.google.com/a/chromium.org/chromedriver/</a></p>



<p>ChromeDriver 下載頁面：</p>



<p><a href="https://sites.google.com/a/chromium.org/chromedriver/downloads">https://sites.google.com/a/chromium.org/chromedriver/downloads</a></p>



<p>附註1：ChromeDriver目前有支援 Linux 64bit / macOS 64bit / Windows 32bit (64bit 也可以執行 32bit程式）</p>



<p>附註2：除了有&nbsp;ChromeDriver 還有&nbsp;<a href="https://developer.apple.com/documentation/webkit/testing_with_webdriver_in_safari">SafariDriver</a>&nbsp;可以讓 Selenium Server 呼叫 Safari 瀏覽器來執行，參考看看 Safari Extension，建議使用ChromeDriver即可。</p>



<p>太舊的 chrome 執行起來會有問題，請先更新chrome瀏覽器為最近的版本，更新方式為：「設定」-&gt;「關於Chrome」。</p>



<figure class="wp-block-image"><img decoding="async" width="1024" height="671" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-11-09-16.55.07.jpg" alt="" class="wp-image-2470" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-11-09-16.55.07.jpg 1024w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-11-09-16.55.07-600x393.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-11-09-16.55.07-768x503.jpg 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-11-09-16.55.07-380x250.jpg 380w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>完成 step 3 的 selenium 的安裝，和 step 4 下載ChromeDriver 之後，先試看看這個sample code:</p>



<pre class="wp-block-preformatted">from selenium import webdriver   <br>chromedriver = "/Users/max/Documents/chromedriver"<br>driver = webdriver.Chrome(chromedriver)<br>driver.get("http://tw.yahoo.com/")</pre>



<ul class="wp-block-list">
<li>說明1：這個ChromeDriver 路徑請換成您電腦實際下載的資料夾。</li>



<li>說明2：這個範例會開一個新的 chrome 視窗並連到網址&nbsp;http://tw.yahoo.com/</li>



<li>附註：目前的範例是透過 python 去控制 selenium ＋ chromedriver，如果你懂其他的程式語言，也是可以實作的出來。</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<p>範例 2 號：</p>



<pre class="wp-block-preformatted">from selenium import webdriver
 
chromedriver = "/Users/max/Documents/chromedriver"
driver = webdriver.Chrome(chromedriver)</pre>



<pre class="wp-block-preformatted">driver.get('http://www.cwb.gov.tw/V7/')
driver.set_window_position(0,0) #瀏覽器位置
driver.set_window_size(700,700) #瀏覽器大小

driver.find_element_by_link_text('天氣預報').click() #點擊頁面上"天氣預報"的連結
</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>webdriver有許多方法，</p>



<p>範例 2 號使用的是find_element_by_link_text()，還有許多方法如下：</p>



<pre class="wp-block-preformatted">find_element_by_name()
find_element_by_id()
find_element_by_tag_name()
find_element_by_partial_link_text()
find_element_by_css_selector()</pre>



<p>另一種用法：</p>



<p>area = el.find_element(By.TAG_NAME, &#8220;a&#8221;)</p>



<ul class="wp-block-list">
<li>
By.TAG_NAME
</li>



<li>
By.CSS_SELECTOR
</li>
</ul>



<p>用法可以參考SeleniumHQ：</p>



<p><a href="http://www.seleniumhq.org/docs/03_webdriver.jsp">http://www.seleniumhq.org/docs/03_webdriver.jsp</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<p>關於 macOS 的 Safari’s WebDriver</p>



<p>如果 macOS 版本是<strong>High Sierra and later</strong>，請Run: </p>



<p><code>safaridriver --enable</code> </p>



<p>once. (If you’re upgrading from a previous macOS release, you may need to use sudo.)</p>



<p>如果 macOS 版本是 <strong>Sierra and earlier:</strong></p>



<ol class="wp-block-list">
<li>If you haven’t already done so, make the Develop menu available. Choose Safari &gt; Preferences, and on the Advanced tab, select “<strong>Show Develop menu in menu bar</strong>.” For details, see&nbsp;<a href="https://support.apple.com/guide/safari/welcome">Safari Help</a>.</li>



<li>Choose Develop &gt; Allow Remote Automation.</li>



<li>Authorize&nbsp;<code>safaridriver</code>&nbsp;to launch the XPC service that hosts the local web server. To permit this, manually run&nbsp;<code>/usr/bin/safaridriver</code>&nbsp;once and follow the authentication prompt.</li>
</ol>



<hr class="wp-block-separator has-css-opacity"/>



<h4 class="wp-block-heading">常見問題(Q&amp;A)</h4>



<p><strong>Q:網速到底有沒有差?</strong><br>光世代有分300M/100M，100m/40m，請知道的是如果在同樣的操作環境，人也一樣，那300m的會不會比100m的更高的機率買到票? 到底什麼是比別人快買到票的關鍵因素?? 售票系統的運作原理是什麼? 為何我的手速也很快了，但為什麼一進去票就是都被買了?他們到底是什麼原因比我快進去，快送出購票請求??</p>



<p>A：高速的網路下載速度是有差異的，也許差幾個毫秒吧，以100Mbps和20Mbps來說下載一個拓元的網頁可能差異不大。</p>



<p>買票前建議先試著去買其他表演，事先下載好購票網頁會使用到的 javascript 和 css 檔案，可以透過離線檔案的快取(cache) 加速網頁的反應時間。</p>



<p>建議使用chrome 瀏覽器來搶票，反應時間會快一點。</p>



<p>「售票系統的運作原理」不難，google 一下就可以看到大量的實作和原理教學，在這裡就不詳述。以目前常見的網頁相關技術來說，在網路上大型的網站實作原理都大同小異，大致上會使用負載平衡（load balance）架構分散主機的網頁流量和要求，通常是（但不是絕對）在資料庫的伺服器那一段程式碼來決定那一個要求可以買到票的，大多數伺服器在處理排隊(queue)的要求是先進先出(first in first out)，所以如果你的網路早一點下載完網頁，早一點執行完javascript，早一點送出搶票的要求，理論上搶到票的機率會高一點。</p>



<p><strong>Q：您提到，拓元有分 detail 和 game, 連到game的網址，搶票才會快，假如一開始時間還沒到，「立即購票」的按鈕根本還沒出現，用這個方法，要怎麼使用呢??</strong><br>A：detail 網址和 game 網址是一樣的，是獨立的，在購票流程裡你可以對可以購票的場次各使用 detail 和 game 網址去訂一次票，就可以知道其中差異，速度上 game 網址也可以買到票，由於傳回的網頁裡的資訊還有所執行的javascript較少，理論上也許會快幾個毫秒。</p>



<p><strong>Q：用搶票機器人，跟手動的差別? 這個問題主要是問，機器人的速度跟用手動的速度，會差距明</strong>顯嗎?手的速度能不能贏過機器人?<br>A：我有放示範用的youtube影片，那個反應時間以人類手指和眼球速度應該無法超越。</p>



<p><strong>Q：能開發軟體嗎?讓不懂程式的人也可以用? </strong><br>A：<br>目前有執行檔，不懂程式的人可以在 Windows/Mac/Linux 平台上可以直接執行。<br>附註1：「搶票軟體」無法保證可以買的到票，也許還有很多其他人使用了機器人來搶票。<br>問題2：「搶票軟體」拓元網頁會改版，也許會造成功能不正常。</p>



<p><strong>Q：有試著安裝及研究python，也成執行了webdriver幾個範例，但是還是不了解要如何寫出與您所說一支小程式來搶票?</strong></p>



<p>A：請先學會如何透過python 程式自動去點畫面上的按鈕，或使用點2下就可以跑的執行檔。</p>



<p><strong>Q：怎麼像你一樣在已開啟及已登入的視窗執行python?</strong></p>



<p>A：python會全開啟一個全新的視窗，請使用該視窗去登入 Google/Facebook/Pixel Pin.</p>



<p><strong>Q：你的教程中，電腦用的是Linux的系統，Windows系統是無法使用嗎？</strong></p>



<p>A：Windows 也可以使用哦。而且語法相同。ChromeDriver目前有支援 Linux 64bit / macOS 64bit / Windows 32bit (64bit 也可以執行 32bit程式）檔案下載：<br><a href="http://chromedriver.chromium.org/downloads">http://chromedriver.chromium.org/downloads</a></p>



<figure class="wp-block-image"><img decoding="async" width="1256" height="662" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-10-22.29.13.jpg" alt="" class="wp-image-2328" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-10-22.29.13.jpg 1256w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-10-22.29.13-600x316.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-10-22.29.13-768x405.jpg 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-10-22.29.13-1024x540.jpg 1024w" sizes="(max-width: 1256px) 100vw, 1256px" /></figure>



<p><strong>Q：如何判斷某一個網址，去做特定事情？</strong><br>A：</p>



<pre class="wp-block-preformatted">while True:
    time.sleep(0.2)
    url = ""
    try:
        url = driver.current_url
    except Exception as exc:
        pass

    if url is None:
        continue
    else:
        if len(url) == 0:
            continue
    print(url)
</pre>



<p><strong>Q：google提供的擴充附件外掛 官方是不是會查出來?</strong></p>



<p>A：這不是google提供。不確定官方是不是查的出來，要查的出來的可能很低，難度也很高，難在伺服器端很難判斷用戶是否為機器人。</p>



<p><strong>Q：環境是Win10 64bit 執行畫面顯示，我雙擊 chromedriver 後，畫面顯示「Only local connections are allowed.」，是不是這個機械人不設海外購票？</strong></p>



<p>A：</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="764" height="161" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Chromediver.jpg" alt="" class="wp-image-2477" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Chromediver.jpg 764w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Chromediver-600x126.jpg 600w" sizes="(max-width: 764px) 100vw, 764px" /></figure>



<p>Starting ChromeDriver 2.44(&#8230;&#8230;) on port 9515<br>Only local connections are allowed.</p>



<p>直接執行&nbsp;chromedriver.exe 是會顯示上面的訊息沒錯，ChromeDriver 的架構如下：</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="877" height="103" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/architecture2.png" alt="" class="wp-image-2478" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/architecture2.png 877w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/architecture2-600x70.png 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/architecture2-768x90.png 768w" sizes="(max-width: 877px) 100vw, 877px" /></figure>



<p>說明：上面三個正方形各代表一個執行檔，你雙擊&nbsp;chromedriver.exe 是執行上面第二個正方形，最右邊的是chrome瀏覽器，最左邊的是我們寫的python應用程式，透過ChromeDriver可以認識的指令去操作ChromeDriver,&nbsp;ChromeDriver 進而在同一台電腦裡遠端去控制chrome瀏覽器。</p>



<hr class="wp-block-separator has-css-opacity"/>



<p>實際範例：</p>



<p>如果有一個html 長的像醬子：</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="887" height="108" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-04-09.55.11.jpg" alt="" class="wp-image-2301" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-04-09.55.11.jpg 887w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-04-09.55.11-600x73.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-05-04-09.55.11-768x94.jpg 768w" sizes="(max-width: 887px) 100vw, 887px" /></figure>



<p>該按鈕的 html code:</p>



<pre class="wp-block-preformatted">&lt;input class="btn btn-next" data-href="/ticket/area/18_RBTW/4029" name="yt0" type="button" value="立即訂購"&gt;</pre>



<p>要取到該按鈕的 python code:</p>



<pre class="wp-block-preformatted">el = driver.find_element_by_css_selector('.btn-next')</pre>



<p>讓按鈕產生點擊的事件的 python code:</p>



<pre class="wp-block-preformatted">el.click()</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>有可能會找不到element</p>



<p>How to use the try/except with Selenium Webdriver when having Exceptions on Python</p>



<p>To be able to use&nbsp;<a href="http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions">required exception</a>&nbsp;you have to import it first with correct name (<code>NoSuchElement</code>&nbsp;-&gt;&nbsp;<code>NoSuchElementException</code>):</p>



<pre class="wp-block-code"><code>from selenium.common.exceptions import NoSuchElementException

try:
    WebDriver.find_element_by_css_selector('div&#91;class="..."')
except NoSuchElementException:
    ActionToRunInCaseNoSuchElementTrue</code></pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>Using JavaScript</p>



<pre class="wp-block-preformatted">element = driver.execute_script("return $('.cheese')[0]")</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>設定 select 裡的值：</p>



<pre class="wp-block-preformatted">from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_tag_name("select"))
select.select_by_visible_text("Edam")</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>勾選 checkbox ：</p>



<p>You can “toggle” the state of checkboxes, and you can use “click” to set</p>



<p>html:</p>



<pre class="wp-block-preformatted">&lt;input type="checkbox" value="1" name="TicketForm[agree]" id="TicketForm_agree"&gt;</pre>



<p>python code:</p>



<pre class="wp-block-preformatted">el = driver.find_element(By.CSS_SELECTOR, '#TicketForm_agree')
</pre>



<p>or</p>



<pre class="wp-block-preformatted">driver.execute_script("$('#TicketForm_agree').prop('checked', true);")</pre>



<p>附註：讓輸入框focus 請用 javascript：</p>



<pre class="wp-block-preformatted">$('#TicketForm_verifyCode').focus()</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>WebDriver Status<br><a href="https://chromium.googlesource.com/chromium/src/+/master/docs/chromedriver_status.md">https://chromium.googlesource.com/chromium/src/+/master/docs/chromedriver_status.md</a></p>



<p>這些是目前 WebDriver 支援的指令。</p>



<hr class="wp-block-separator has-css-opacity"/>



<p>從目前的 source code 可以清楚的看到如何去使用 webdriver 物件。</p>



<p>下面的這個 chromedriver 切換 frame 的功能，如果你要是搶「熱門」的票，是遇不到的，熱門的場次都是「自動畫位」，所以不必自己去選坐位，自動選坐位會彈出在 iframe 裡，可以使用下面這行指令即可切換到選位的 iframe:</p>



<pre class="wp-block-preformatted">driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'/ticket/selectSeat/')]"))</pre>



<p>selenium定位页面元素的时候会遇到定位不到的问题，明明元素就在那儿，用檢視原素也可以看到，就是定位不到，这种情况很有可能是frame在搞鬼。</p>



<p>frame标签有frameset、frame、iframe三种，frameset跟其他普通标签没有区别，不会影响到正常的定位，而frame与iframe对selenium定位而言是一样的，selenium有一组方法对frame进行操作。</p>



<h4 class="wp-block-heading">1.怎麼切到frame中(switch_to.frame())</h4>



<p>selenium提供了switch_to.frame()方法来切换frame</p>



<pre class="wp-block-preformatted">switch_to.frame(reference)</pre>



<p>reference是传入的参数，用来定位frame，可以传入id、name、index以及selenium的WebElement对象，假设有如下HTML代码 index.html：</p>



<pre class="wp-block-preformatted">&lt;html lang="en"&gt;
&lt;head&gt;
 &lt;title&gt;FrameTest&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;iframe src="a.html" id="frame1" name="myframe"&gt;&lt;/iframe&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>



<p>想要定位其中的iframe并切进去，可以通过如下代码：</p>



<pre class="wp-block-preformatted">from selenium import webdriver
driver = webdriver.Firefox()
driver.switch_to.frame(0) # 1.用frame的index来定位，第一个是0
# driver.switch_to.frame("frame1") # 2.用id来定位
# driver.switch_to.frame("myframe") # 3.用name来定位
# driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) # 4.用WebElement对象来定位</pre>



<p>通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性，则可以用index和WebElement来定位：</p>



<p>index从0开始，传入整型参数即判定为用index定位，传入str参数则判定为用id/name定位<br>WebElement对象，即用find_element系列方法所取得的对象，我们可以用tag_name、xpath等来定位frame对象<br>举个例子：</p>



<pre class="wp-block-preformatted">&lt;iframe src="myframetest.html" /&gt;</pre>



<p>用xpath定位，传入WebElement对象：</p>



<pre class="wp-block-preformatted">driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'myframe')]"))</pre>



<h4 class="wp-block-heading">2.從frame中切回主文件(switch_to.default_content())</h4>



<p>切到frame中之后，我们便不能继续操作主文档的元素，这时如果想操作主文档内容，则需切回主文档。</p>



<pre class="wp-block-preformatted">driver.switch_to.default_content()</pre>



<h4 class="wp-block-heading">3.iframe的操作(switch_to.parent_frame())</h4>



<p>有时候我们会遇到嵌套的frame，如下：</p>



<pre class="wp-block-preformatted">&lt;html&gt;
 &lt;iframe id="frame1"&gt;
 &lt;iframe id="frame2" / &gt;
 &lt;/iframe&gt;
&lt;/html&gt;</pre>



<p>1.從主文件切到frame2，一層層切進去</p>



<pre class="wp-block-preformatted">driver.switch_to.frame("frame1")
driver.switch_to.frame("frame2")</pre>



<p>2.從frame2再切回frame1，這裡selenium給我們提供了一個方法能夠從子frame切回到父frame，而不用我們切回主文件再切進來。</p>



<pre class="wp-block-preformatted">driver.switch_to.parent_frame() # 如果当前已是主文档，则无效果</pre>



<p>有了parent_frame()這個相當於後退的方法，我們可以隨意切換不同的frame，隨意的跳來跳去了。解法：</p>



<pre class="wp-block-preformatted">driver.switch_to.frame(reference)
driver.switch_to.parent_frame()
driver.switch_to.default_content()</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>如何在Server side（伺服器端）檢查使用者有沒開 chromedriver？</p>



<p>Can a website detect when you are using selenium with chromedriver?<br><a href="https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver">https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver</a></p>



<p>上面文章不用去看了，我檢查過新的版本的 selenium 完全不會多產生上面的 key 值。</p>



<hr class="wp-block-separator has-css-opacity"/>



<p>拓元在 2018-05-12 之後更新的javascript 如下：</p>



<pre class="wp-block-preformatted">function order_check() {
 var count = valueCount(["WMeBWmQEOdoAKQq0wKU8kv4k5VcwA3GjyISDUmtPZek="]),
 maxQuota = 4;

if(!$("#TicketForm_agree").prop("checked")) {
 alert("\u8acb\u5148\u8a73\u95b1\u4e14\u540c\u610f\u6703\u54e1\u670d\u52d9\u689d\u6b3e\u5f8c\u518d\u884c\u9001\u51fa\u52d5\u4f5c\u3002");
 } else if (count &gt; maxQuota) {
 alert("\u55ae\u7b46\u4ea4\u6613\u6700\u591a\u53ef\u8cb7 \" + maxQuota + \" \u5f35");
 } else if (count == 0) {
 alert("\u8acb\u81f3\u5c11\u9078\u64c7\u4e00\u7a2e\u7968\u7a2e");
 
 } else {
 var ticketType = ["WMeBWmQEOdoAKQq0wKU8kv4k5VcwA3GjyISDUmtPZek="],
 ticketTypeSelector = $("[name=\"" + ticketType.join("\"], [name=\"") + "\"]");

ticketTypeSelector.each(function() {
 $(this).attr("name", "TicketForm[ticketPrice][" + $(this).get(0).name + "]");
 });
 return true;
 }

return false;
}

function valueCount(elements) {
 elements = countValById(elements);
 return elements.reduce(function(total, element) {
 return total + element;
 }, 0);
}

$("select[id=\"WMeBWmQEOdoAKQq0wKU8kv4k5VcwA3GjyISDUmtPZek=\"]").on("click", function(event) {
 if (!!event.originalEvent.isTrusted &amp;&amp; !event.isTrigger) {
 $("#TicketForm_checked").attr("name", "TicketForm[ticketPrice][vQmwBD+sVq5AOWaOJrdiOQ5oIjAlhU38AxsBgnL1qkU=]");
 }
});
$("#TicketForm_agree").on("click", function(event) {
 if (!!event.originalEvent.isTrusted &amp;&amp; !$(this).checked &amp;&amp; !event.isTrigger) {
 $(this).attr("name", "TicketForm[agree][YnuMm9Vok/JcdY82p5pho4QaTg8m+p735VSWpPyjOfE=]");
 }
})

$("#TicketForm").on("change", function(event) {
 var ticketType = ["WMeBWmQEOdoAKQq0wKU8kv4k5VcwA3GjyISDUmtPZek="];

if (ticketType.indexOf(event.target.id) != -1) {
 var count = valueCount(ticketType),
 maxQuota = 4;

if (count &gt; maxQuota) {
 var num = parseInt($(event.target).val()) + (maxQuota - count);

alert("\u55ae\u7b46\u4ea4\u6613\u6700\u591a\u53ef\u8cb7 \" + maxQuota + \" \u5f35\uff0c\u60a8\u5171\u9078\u64c7\u4e86 \" + count + \" \u5f35");

while ($(event.target).find("option[value=" + num + "]").length &lt; 1 &amp;&amp; num != 0) {
 num--;
 }

$(event.target).val(num);
 }

$("#ticketQuota").text(maxQuota - valueCount(ticketType));
 }
});

$("#TicketForm select").change();</pre>



<hr class="wp-block-separator has-css-opacity"/>



<pre class="wp-block-preformatted"> &lt;select class="mobile-select" name="WMeBWmQEOdoAKQq0wKU8kv4k5VcwA3GjyISDUmtPZek=" id="WMeBWmQEOdoAKQq0wKU8kv4k5VcwA3GjyISDUmtPZek="&gt;
&lt;option value="0"&gt;0&lt;/option&gt;
&lt;option value="1"&gt;1&lt;/option&gt;
&lt;option value="2"&gt;2&lt;/option&gt;
&lt;option value="3"&gt;3&lt;/option&gt;
&lt;option value="4"&gt;4&lt;/option&gt;
 &lt;/select&gt;</pre>



<p>針對上面的程式碼，如果使用</p>



<pre class="wp-block-preformatted">driver.execute_script("$('#TicketForm_agree').prop('checked', true);")</pre>



<p>並不會觸發 onclick 事件。請改服用：</p>



<pre class="wp-block-preformatted">form_checkbox = None
try:
 form_checkbox = driver.find_element(By.ID, 'TicketForm_agree')
 if form_checkbox is not None:
 try:
 form_checkbox.click()
 except Exception as exc:
 print "click TicketForm_agree fail"
 pass
except NoSuchElementException:
 print "find TicketForm_agree fail"</pre>



<p>附註， select box 比照 checkbox 的 code, 先產生 click 再去選取預期的張數即可。</p>



<hr class="wp-block-separator has-css-opacity"/>



<p>2018年09月某一天 發現拓元的 javascript 又增加了幾個新的檢查點，javascript 如下：</p>



<pre class="wp-block-preformatted">function countValById(arr) {
    return arr.map(function(val) {
        return parseInt($("[id=\"" + val + "\"]").val());
    });
}

function order_check() {
    var count = valueCount(["gqQB0FXCgar2OyOvqUFZR1xujK9R1sO+OR6V6m\/unzY="]),
        maxQuota = 4;

    if(!$("#TicketForm_agree").prop("checked")) {
        alert("\u8acb\u5148\u8a73\u95b1\u4e14\u540c\u610f\u6703\u54e1\u670d\u52d9\u689d\u6b3e\u5f8c\u518d\u884c\u9001\u51fa\u52d5\u4f5c\u3002");
    } else if (count &gt; maxQuota) {
        alert("單筆交易最多可買 " + maxQuota + " 張");
    } else if (count == 0) {
        alert("\u8acb\u81f3\u5c11\u9078\u64c7\u4e00\u7a2e\u7968\u7a2e");
    
    } else {
        var ticketType = ["gqQB0FXCgar2OyOvqUFZR1xujK9R1sO+OR6V6m\/unzY="],
            ticketTypeSelector = $("[name=\"" + ticketType.join("\"], [name=\"") + "\"]");

        ticketTypeSelector.each(function() {
            $(this).attr("name", "TicketForm[ticketPrice][" + $(this).get(0).name + "]");
        });
        return true;
    }

    return false;
}

function valueCount(elements) {
    elements = countValById(elements);
    return elements.reduce(function(total, element) {
        return total + element;
    }, 0);
}

$(document).ready(function() {
    var ticketType = ["gqQB0FXCgar2OyOvqUFZR1xujK9R1sO+OR6V6m\/unzY="],
        ticketTypeSelector = "[id='" + ticketType.join("'], [id='") + "']";

    $("#TicketForm_agree").attr("name", "TicketForm[agrees]");
    $("#TicketForm_checked").attr("name", "TicketForm[ticketPrice][checks][ + $(ticketTypeSelector).length + ]");

    ravenCheck(ticketTypeSelector);

    $("#TicketForm").on("mousedown click touchstart", ticketTypeSelector, function(event) {
        $("#TicketForm_checked").attr("name", "s_" + event.originalEvent.isTrusted + "_" + event.isTrigger);
        if (event.originalEvent.isTrusted !== false &amp;&amp; !event.isTrigger) {
            $("#TicketForm_checked").attr("name", "TicketForm[ticketPrice][5BQBWTBCQoAEPama/ehw8qJhA1lkdF0fH8J5eua5HSw=]");
        }
    }).on("mousedown click touchstart", "#TicketForm_agree", function(event) {
        $(this).attr("name", "s_" + event.originalEvent.isTrusted + "_" + event.isTrigger);
        if (event.originalEvent.isTrusted !== false &amp;&amp; !$(this).checked &amp;&amp; !event.isTrigger) {
            $(this).attr("name", "TicketForm[agree][Dbk4t/2b/yoQPK0qAnhBljhX0JBLgehzAlwuEOBdEik=]");
        }
    }).on("change", function(event) {
        if (ticketType.indexOf(event.target.id) != -1) {
            var count = valueCount(ticketType),
                maxQuota = 4;

            if (count &gt; maxQuota) {
                var num = parseInt($(event.target).val()) + (maxQuota - count);

                alert("單筆交易最多可買 " + maxQuota + " 張，您共選擇了 " + count + " 張");

                while ($(event.target).find("option[value=" + num + "]").length &lt; 1 &amp;&amp; num != 0) {
                    num--;
                }

                $(event.target).val(num);
            }

            $("#ticketQuota").text(maxQuota - valueCount(ticketType));
        }
    });

    $("#TicketForm select").change();
});

jQuery(document).on('click', '#yw0', function(){
    jQuery.ajax({
        url: "\/ticket\/captcha?refresh=1",
        dataType: 'json',
        cache: false,
        success: function(data) {
            jQuery('#yw0').attr('src', data['url']);
            jQuery('body').data('captcha.hash', [data['hash1'], data['hash2']]);
        }
    });
    return false;
});</pre>



<hr class="wp-block-separator has-css-opacity"/>



<h4 class="wp-block-heading">event.originalEvent.isTrusted</h4>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Event 介面的 isTrusted 唯讀屬性為一個布林值，若事件物件是由使用者操作而產生，則 isTrusted 值為 true。若事件物件是由程式碼所建立、修改，或是透過 EventTarget.dispatchEvent() 來觸發，則 isTrusted 值為 false。</p>
</blockquote>



<h4 class="wp-block-heading">Event.isTrusted</h4>



<p>The&nbsp;<code>isTrusted</code>&nbsp;read-only property of the&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/API/Event"><code>Event</code></a>&nbsp;interface is a&nbsp;<code>Boolean</code>&nbsp;that is&nbsp;<code>true</code>when the event was generated by a user action such as mouse click, and&nbsp;<code>false</code>&nbsp;when the event was scripted or invoked via&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent"><code>dispatchEvent</code></a>.</p>



<p>This new property is intended primarily for use by browser extensions, to determine if an event was dispatched by a script running in the main world or not.</p>



<p>如果單純使用之前的程式，會讓&nbsp;$(&#8220;#TicketForm_checked&#8221;).attr(&#8220;name&#8221;); 取得的結果為：</p>



<pre class="wp-block-preformatted">s_false_undefined</pre>



<p>然後會造成搶票失敗，帳號會被登出。解法：</p>



<p>其實大多的情況下&nbsp;Selenium 讓&nbsp;Event.isTrusted 的結果是 True，調整一下網頁裡事件的執行順序就解決了，拓元很難透過網頁檢測是使用者透過機器人來輔助買票，如果你寫的程式可以被驗測到，代表調整一下順序應該就可以跳過檢查。</p>



<hr class="wp-block-separator has-css-opacity"/>



<p>上面對很多沒學過 javascript 的應該看起來像是火星文，建議先學一下簡單的 javascript 和 jQuery.</p>



<p>不能確定下次開演唱會時，Max的搶票程式是否可以使用，因為拓元定期會改版。</p>



<p>selenium 的程式有一些限制，必需先知道：</p>



<ul class="wp-block-list">
<li>1：會開出新的「視窗」，所以需要重新登入帳號。</li>



<li>2：不能使用新的「分頁」，程式只能控制第一個分頁，所以建議你開2～3個 selenium，放在背景，而且先都登入好會員，如果第一個視窗在搶票時遇到圈圈狂轉，這時候趕快派2號視窗上場救援。<br>（附註：其實是可以控制其他分頁，會比較麻煩一點，難度也會比較高，只處理第一個分頁會簡單很多。）</li>



<li>3：想看我的程式可以匯錢給我，歡迎與我聯絡：<a href="mailto:weng.32002@gmail.com">weng.32002@gmail.com</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<p>自動關掉 alert 對話框的工具：<br><a href="https://chrome.google.com/webstore/detail/alert-control/ofjjanaennfbgpccfpbghnmblpdblbef">https://chrome.google.com/webstore/detail/alert-control/ofjjanaennfbgpccfpbghnmblpdblbef</a></p>



<p>如果有討人厭的alert 彈出式的javascript 語法，可以節省大約一秒的時間。</p>



<p>要下載 chrome extension 可以使用 &#8220;Get CRX&#8221; extension 來取得：<br><a href="https://chrome.google.com/webstore/detail/get-crx/dijpllakibenlejkbajahncialkbdkjc">https://chrome.google.com/webstore/detail/get-crx/dijpllakibenlejkbajahncialkbdkjc</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<p>在 selenium 裡載入 extension 程式碼：</p>



<pre class="wp-block-preformatted">extension_path = Root_Dir + "webdriver/Alert_Control.crx"
chrome_options = webdriver.ChromeOptions()
chrome_options.add_extension(extension_path)
chromedriver_path =Root_Dir+ "webdriver/chromedriver"
driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chromedriver_path)</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>Q：Selenium 支持那些程式語言？<br>A：參考看看<a href="https://www.selenium.dev/downloads/">https://www.selenium.dev/downloads/</a></p>



<ul class="wp-block-list">
<li>Ruby</li>



<li>Java</li>



<li>Python</li>



<li>C#</li>



<li>JavaScript</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<p>當人們在網站註冊或購物時，經常會出現圖像驗證碼的輸入要求，為了區分「真人」與「機器人」，圖片會出現線條及扭曲分隔開的文字，讓電腦程式的機器人難以辨識，目前Max的搶票機器人沒有辦法處理「驗證碼」的部份，需要人工去輸入，機器人幫忙處理其他的欄位的輸入。</p>



<p>人外有人，天外有天，驗證碼的部份應該也可以透過程式識別，識別也是有分難度的，簡單的驗證碼可以透過去切割圖片，再把切割好的圖片採用深度學習（Deep learning）的方式去訓練就可以有效提升識別率。難一點的驗證碼就是字元會變形、重疊還有雜訊。拓元網站是屬於中上等級，只有變形和重疊。</p>



<p>沒有推薦的實作方向，因為我也沒有研究過。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h4 class="wp-block-heading">相關文章：</h4>



<p>Max的拓元搶票機器人<br><a href="http://max-everyday.com/2018/03/tixcraft-bot/">http://max-everyday.com/2018/03/tixcraft-bot/</a></p>



<p>Max自動掛號機器人<br><a href="http://max-everyday.com/2018/08/max-auto-reg-bot/">http://max-everyday.com/2018/08/max-auto-reg-bot/</a></p>



<p>Max 學習 tkinter：<br><a href="https://stackoverflow.max-everyday.com/tag/tkinter/">https://stackoverflow.max-everyday.com/tag/tkinter/</a></p>



<p>Max 學習 selenium：<br><a href="https://stackoverflow.max-everyday.com/tag/selenium/">https://stackoverflow.max-everyday.com/tag/selenium/</a></p>



<p>[Python] 如何取出字串中的選項<br><a href="https://stackoverflow.max-everyday.com/2018/12/python-regular-expression-findall/">https://stackoverflow.max-everyday.com/2018/12/python-regular-expression-findall/</a><br>這篇文章目是透過程式取得「驗證問題」裡的選項，再用程式來自動把選項用來回答問題。</p>



<p>實作基於CNN的台鐵訂票驗證碼辨識以及透過模仿及資料增強的訓練集產生器<br>(Simple captcha solver based on CNN and a training set generator by imitating the style of captcha and data augmentation)<br><a href="https://github.com/JasonLiTW/simple-railway-captcha-solver">https://github.com/JasonLiTW/simple-railway-captcha-solver</a><br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/03/selenium-chrome-webdriver/feed/</wfw:commentRss>
			<slash:comments>82</slash:comments>
		
		
			</item>
		<item>
		<title>購物網站監視器</title>
		<link>https://stackoverflow.max-everyday.com/2017/05/slake-bot/</link>
					<comments>https://stackoverflow.max-everyday.com/2017/05/slake-bot/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 03 May 2017 04:11:51 +0000</pubDate>
				<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[電腦相關應用]]></category>
		<category><![CDATA[BOT]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=618</guid>

					<description><![CDATA[今天看到一個有趣的需求，發現還滿簡單的，而且可以...]]></description>
										<content:encoded><![CDATA[<p>今天看到一個有趣的需求，發現還滿簡單的，而且可以套用到很多的個案上面。</p>
<p>個案：</p>
<ul>
<li>案件金額：5千以內</li>
<li>徵求期限：10 天 【一般案件】執行內容：</li>
<li>配合時間：2017年05月底前完成</li>
<li>配合地點：在家作業，以E-mail溝通聯繫、進度回報</li>
<li>案件說明：使用PYTHON 或 NODE 監視網站發出的新產品然後搭配SLACK APP做詳細產品的通知</li>
</ul>
<hr />
<p>用php 或 python （或其他程式語言）透過排程（或crontab）去 parse 別人的網頁滿簡單的，把 parse 完的結果放在database 裡，發現有差異是送出通知。用來搶預售票或是比價網站用來監控競爭對手價格，避免我們的客人買貴。Apple 新機特買。</p>
<p>以往是Email送出通知，但現代人們人手一機，改用即時通訊軟體會好一點，即時通訊軟體大多可以提供聊天機器人，雖然LINE 的bot 很簡單，但官方不給用，LINE 官方允許的bot 又限制超多，改用FB bot 或 Slack BOT 會簡單一點。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-621" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2017/05/tools@2x.png" alt="" width="678" height="634" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2017/05/tools@2x.png 678w, https://stackoverflow.max-everyday.com/wp-content/uploads/2017/05/tools@2x-600x561.png 600w" sizes="(max-width: 678px) 100vw, 678px" /></p>
<p>Slackbot<br />
<a href="https://github.com/lins05/slackbot">https://github.com/lins05/slackbot</a></p>
<p>Slack App 簡介：<br />
<a href="http://www.playpcesor.com/2015/06/slack.html">http://www.playpcesor.com/2015/06/slack.html</a></p>
<p>Slack 官網：<br />
<a href="https://slack.com/is">https://slack.com/is</a></p>
<p>（Android）Slack App 下載：<br />
<a href="https://play.google.com/store/apps/details?id=com.Slack">https://play.google.com/store/apps/details?id=com.Slack</a></p>
<p>（iOS）Slack App 下載：<br />
<a href="https://itunes.apple.com/app/slack-app/id618783545?ls=1&amp;mt=8">https://itunes.apple.com/app/slack-app/id618783545?ls=1&amp;mt=8</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2017/05/slake-bot/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[Android] 實作LINE Login，增加按鈕到PreferenceFragment</title>
		<link>https://stackoverflow.max-everyday.com/2016/08/add-buttons-to-preferencefragment/</link>
					<comments>https://stackoverflow.max-everyday.com/2016/08/add-buttons-to-preferencefragment/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 02 Aug 2016 16:47:06 +0000</pubDate>
				<category><![CDATA[Android筆記]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[BOT]]></category>
		<category><![CDATA[LINE]]></category>
		<category><![CDATA[UI]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=56</guid>

					<description><![CDATA[在實作 LINE Login 時，送出要切換 c...]]></description>
										<content:encoded><![CDATA[<p>在實作 LINE Login 時，送出要切換 channel 從 developing 為 published 的申請，LINE 官方回email說需要在畫面上看到 LINE Loing 的 button, 由於是把 line login 放在  perferencefragment裡，但是很久很久以前在實作 PreferenceFragment 時, 發現沒有 button 可以用, 無法做設定參數以外的事情,很久以前的解法是要分成2個 xml 檔案，或同一個xml 放2個 layout，解決完的畫面如下:</p>
<p><a href="http://max-everyday.com/wp-content/uploads/2016/08/Screenshot_2014-10-15-19-30-41.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1065 size-medium" src="http://max-everyday.com/wp-content/uploads/2016/08/Screenshot_2014-10-15-19-30-41-500x500.png" alt="Screenshot_2014-10-15-19-30-41" width="500" height="500" /></a></p>
<p>在研究了一下 <a href="https://github.com/haiwen/seadroid">seafile</a> 的作法，他也沒有解決這個問題，可能是沒有這個需求，seafile 的作法在是 layout/preference_list_fragment.xml 裡放多個 layout, listview 的部份留給 preference fragment 使用。</p>
<hr />
<p>我發現，照著 solar/<a href="https://gist.github.com/solar/1002049/">IconPreference.java</a> 使用的範例，可以做出 button preference 也可以在程式碼裡動態地修改 button 裡的文字。解決完的畫面如下:</p>
<p><a href="http://max-everyday.com/wp-content/uploads/2016/08/Screenshot_2016-08-03-03-37-03_com.miui_.home_.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1066 size-medium" src="http://max-everyday.com/wp-content/uploads/2016/08/Screenshot_2016-08-03-03-37-03_com.miui_.home_-281x500.png" alt="Screenshot_2016-08-03-03-37-03_com.miui.home" width="281" height="500" /></a></p>
<p>只是，比較特別的是 Fragment 裡的 ListView 用來顯示 Preference, Preference 被建立後 protected void onBindView(View view) 的時間點在 Fragment onCreate() 或  Fragment 的 onCreateView 之後，所以無法直接塞 onClick 事件給自定設定的 ButtonPreference 來使用，解法是把要做的事件先放到 新建立的ButtonPreference 裡，等 ButtonPreference 在 onBindView 後，並存取到 button 時，再用 setOnClickListener() 來執行該方法。</p>
<p>從畫面可以看到，原本有button 的應該長的像他上面那行，用Facebook 登入，是用文字。會想挑戰這個解法是因為 LINE Developer 回信給我，說「LINE Login」 的按鈕，規格不符。於是我就從<a href="https://developers.line.me/web-login/setting-up-login-button">網頁版</a>下載了圖片＋文字來用，但很怪，LINE 他們只提供了&#8221;Log In&#8221; 的多國語言字串，卻沒提供 Log Out 的。</p>
<p>整組程式都寫好，最後要送出申請為「已發佈」(Published) 被 LINE 的人打搶，被打搶的Email:</p>
<p><figure id="attachment_2286" aria-describedby="caption-attachment-2286" style="width: 1344px" class="wp-caption alignnone"><a href="http://max-everyday.com/wp-content/uploads/2016/08/Screenshot-2017-01-04-17.21.45.jpg"><img loading="lazy" decoding="async" class="wp-image-2286 size-full" src="http://max-everyday.com/wp-content/uploads/2016/08/Screenshot-2017-01-04-17.21.45.jpg" width="1344" height="1156" /></a><figcaption id="caption-attachment-2286" class="wp-caption-text">Request was reject by our review criteria.</figcaption></figure></p>
<p>Facebook login 和 LINE Login 相比：</p>
<ul>
<li>Facebook在設定開發者的憑證(Android Package Signature) 上面比LINE 方便，可以同時設定 developing ／released 的碼.</li>
<li>Facebook 使用者多。</li>
<li>Facebook 允許developer 拿到 user 公開的 id, photo 和 email, LINE 不能拿到公開 LINE ID。</li>
<li>Facebook 的 status 從 developing 切換到 published 不需要「先」通過人工審核，切換一下很快，所有的人都可以存取我們的App，並立即取得facebook 帳號的授權。</li>
<li>比較特別的是當使用我們facebook App 的人多了，facebook 會寄通知信來，要求在 facebook 的設定裡增加隱私權的宣告，那也很簡單，網路上有很多產生獸，點一點就完成了。</li>
</ul>
<hr />
<h4>相關網址：</h4>
<ul>
<li><a href="https://developers.line.me/line-login/overview">https://developers.line.me/line-login/overview</a></li>
<li><a href="https://developers.line.me/web-login/setting-up-login-button">https://developers.line.me/web-login/setting-up-login-button</a></li>
<li><a href="https://developers.line.me/channel-console/publish-app">https://developers.line.me/channel-console/publish-app<br />
</a>Every Channel has a status. To publish your application, you must change the status of your Channel to PUBLISHED.</li>
<li>[Android]實作Facebook login<br />
<a href="http://max-everyday.com/2016/09/android-facebook-login/">http://max-everyday.com/2016/09/android-facebook-login/</a></li>
<li>關於LineBot(7) &#8211; 使用Line Login實現oAuth SSO(單一登入)<br />
<a href="http://studyhost.blogspot.tw/2016/12/linebot7-line-loginoauth-sso.html">http://studyhost.blogspot.tw/2016/12/linebot7-line-loginoauth-sso.html</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2016/08/add-buttons-to-preferencefragment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>用python 檢查LINE ID 是不是存在</title>
		<link>https://stackoverflow.max-everyday.com/2016/07/python-line-bot-find-userid/</link>
					<comments>https://stackoverflow.max-everyday.com/2016/07/python-line-bot-find-userid/#comments</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Fri, 29 Jul 2016 17:20:32 +0000</pubDate>
				<category><![CDATA[Python筆記]]></category>
		<category><![CDATA[BOT]]></category>
		<category><![CDATA[LINE]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=84</guid>

					<description><![CDATA[我想知道某一個 LINE ID, 是不是存在的，...]]></description>
										<content:encoded><![CDATA[<p>我想知道某一個 LINE ID, 是不是存在的，研究了LINE官方的 LINE BOT:<br />
<a href="https://developers.line.me/restful-api/overview">https://developers.line.me/restful-api/overview</a></p>
<p>發現並對我而言，官方目前提供的API我都用不到，這些API似乎是開放給一般的公司行號用，針對LINE官方的BOT這一篇寫的還不錯：</p>
<p>[教學] Line BOT API<br />
<a href="http://huli.logdown.com/posts/726082-line-bot-api-tutorial">http://huli.logdown.com/posts/726082-line-bot-api-tutorial</a></p>
<hr />
<h4>相關文章：</h4>
<p>用 LINE API 打造自動回話機器人-2015/8/24更新<br />
<a href="https://www.mxp.tw/2015/04/30/%E7%94%A8-line-api-%E6%89%93%E9%80%A0%E8%87%AA%E5%8B%95%E5%9B%9E%E8%A9%B1%E6%A9%9F%E5%99%A8%E4%BA%BA/">https://www.mxp.tw/2015/04/30/%E7%94%A8-line-api-%E6%89%93%E9%80%A0%E8%87%AA%E5%8B%95%E5%9B%9E%E8%A9%B1%E6%A9%9F%E5%99%A8%E4%BA%BA/</a></p>
<p>Python Line API<br />
<a href="http://dev.im-bot.com/line/">http://dev.im-bot.com/line/</a></p>
<p>韓國神人 Taehoon Kim 的 LINE BOT：<a href="https://github.com/carpedm20/LINE"><br />
https://github.com/carpedm20/LINE</a></p>
<p>Documentation : <a href="http://carpedm20.github.io/line/">http://carpedm20.github.io/line/</a><br />
Developer Mailing List: <a href="https://groups.google.com/forum/#!forum/line-python-developer">Google Group</a></p>
<p>使用 LINE API 傳送訊息，但目前仍有 authToken 時間過期問題<br />
<a href="http://ssorc.tw/5907">http://ssorc.tw/5907</a></p>
<p>[心得] Cacti+Line群組告警<br />
<a href="https://www.ptt.cc/bbs/MIS/M.1414213987.A.7EF.html">https://www.ptt.cc/bbs/MIS/M.1414213987.A.7EF.html</a></p>
<p>但是最新版的程式被LINE公司要求移除一些code所以無法使用賬號密碼登入<br />
只能用authtoken登入,所以我們改用舊版一點的程式<br />
<a href="https://pypi.python.org/pypi/line/0.0.8">https://pypi.python.org/pypi/line/0.0.8</a></p>
<p>一些被刪掉的code, 在 0.0.8 版裡找的到。目前我是用 <a href="https://pypi.python.org/pypi/line">0.8.0</a> 版。</p>
<p>切換到 0.0.8 或是 <a href="https://pypi.python.org/pypi/line/0.7.1">0.7.1</a> 或是 0.8.0 都有不同的問題要決解。</p>
<ul>
<li>首先第1步要解決的登入問題，新版沒辦法登入，無法跑出要求手機輸入驗證碼，我是用 0.7.1 的 code, 讓驗證碼顯示到手機上。</li>
<li>接著是取得 access token，這個我也是用 0.7.1 或 用 <a href="https://pypi.python.org/pypi/line/0.5.2">0.5.2</a> 都可以。</li>
<li>最後，是要從 0.0.8 版取得部份被刪除的程式碼到 0.8.0 版來用。</li>
</ul>
<hr />
<p>我遇到的問題，和下面這篇文章遇到的問題一樣：</p>
<p>why make private method ? some thing like _findContactByUserid() in client.py<br />
<a href="https://groups.google.com/forum/#!searchin/line-python-developer/userid/line-python-developer/9b0MuBlkozs/4-M8hRQXBgAJ">https://groups.google.com/forum/#!searchin/line-python-developer/userid/line-python-developer/9b0MuBlkozs/4-M8hRQXBgAJ</a></p>
<hr />
<p>I got the same error in this method:</p>
<p><a href="http://max-everyday.com/wp-content/uploads/2016/07/Screen-Shot-2016-07-30-at-04.51.17.jpg"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1047" src="http://max-everyday.com/wp-content/uploads/2016/07/Screen-Shot-2016-07-30-at-04.51.17.jpg" alt="Screen Shot 2016-07-30 at 04.51.17" width="958" height="198" /></a><br />
Error: maximum recursion depth exceeded</p>
<p>I fixed this error by copy findContactByUserid as a new method in client.py, api.py, CurveThrift.py</p>
<p>I add new debug code to print message in CurveThrift.py in method:<br />
def findContactByUserid(self, userid):</p>
<p>but the result is code not be executed, after copy exist code to new method the new method is executed!<br />
after fix, userid could be search:</p>
<p><a href="http://max-everyday.com/wp-content/uploads/2016/07/Screen-Shot-2016-07-30-at-04.55.32.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-1046" src="http://max-everyday.com/wp-content/uploads/2016/07/Screen-Shot-2016-07-30-at-04.55.32-1024x355.jpg" alt="Screen Shot 2016-07-30 at 04.55.32" width="740" height="257" /></a></p>
<p>修改好後，就可以查 LINE ID 了，查失敗的結果會是有專門的 exception:</p>
<p>Error: Cannot find userid: XXX</p>
<hr />
<p>你可能會問，我怎麼知道要改這些行？ 因為我一直在try error 和看作者的 source code, trace 再 trace, 看了好幾個小時了, 還是看不懂作者在寫什麼東西，還好加 debug code 來 print 很簡單，初學者都會。</p>
<p>遇把作者 github 上的 issue, commit history, google group 上的討論看了一輪，結論：沒什麼幫助。</p>
<hr />
<p>結合 line id 的 database，並連結上 line server 進行 userid 的檢查：</p>
<p><a href="http://max-everyday.com/wp-content/uploads/2016/07/Screenshot-2016-07-30-18.38.19.jpg"><img loading="lazy" decoding="async" class="alignnone wp-image-1051 size-medium" src="http://max-everyday.com/wp-content/uploads/2016/07/Screenshot-2016-07-30-18.38.19-474x500.jpg" alt="Screenshot 2016-07-30 18.38.19" width="474" height="500" /></a></p>
<p>LINE BOT 就完成了，真感動，真的是 May the LINE be with you&#8230;</p>
<hr />
<p>上面的方法，已經不能用了，python 程式是對的可以用，但中間的 library 聽說需要調整才行。</p>
<p>接著出現的解法是透過 QR code 登入：<br />
LineVodka<br />
<a href="https://github.com/merkremont/LineVodka">https://github.com/merkremont/LineVodka</a></p>
<p>上面解法只適用到 2017年11月，LINE官方的伺服器修改了相關的程式碼，目前會顯示這個錯誤：</p>
<pre>File "/LineVodka/LineAlpha/LineThrift/TalkService.py", line 3490, in recv_getLastOpRevision
raise result.e
LineAlpha.LineThrift.ttypes.TalkException: TalkException(parameterMap=None, reason='LOG_OUT', code=8)</pre>
<hr />
<p>另一個解法，使用LINE 官方的 BOT API：</p>
<p>這個限制是，BOT最多只能服務50個人，超過的話要付費。</p>
<p><a href="https://pypi.org/project/line-bot-sdk/">https://pypi.org/project/line-bot-sdk/</a></p>
<p>這個要先 create a channel：<br />
<a href="https://developers.line.me/en/docs/line-login/getting-started/">https://developers.line.me/en/docs/line-login/getting-started/</a></p>
<p>Integrating LINE Login with your web app<br />
<a href="https://developers.line.me/en/docs/line-login/web/integrate-line-login/">https://developers.line.me/en/docs/line-login/web/integrate-line-login/</a></p>
<p>相關教學：</p>
<ul>
<li>邦妮教學：連結 LINE@ 帳號<br />
<a href="https://medium.com/botbonnie/%E9%82%A6%E5%A6%AE%E6%95%99%E5%AD%B8-%E9%80%A3%E7%B5%90-line-%E5%B8%B3%E8%99%9F-75ec33791f4e">https://medium.com/botbonnie/%E9%82%A6%E5%A6%AE%E6%95%99%E5%AD%B8-%E9%80%A3%E7%B5%90-line-%E5%B8%B3%E8%99%9F-75ec33791f4e</a></li>
<li>LINE BOT 實戰 ( 原理篇 )<br />
<a href="http://www.oxxostudio.tw/articles/201701/line-bot.html">http://www.oxxostudio.tw/articles/201701/line-bot.html</a><br />
<a href="http://www.oxxostudio.tw/articles/201701/line-bot-2.html">http://www.oxxostudio.tw/articles/201701/line-bot-2.html</a></li>
</ul>
<hr />
<p>看看新的 line-py:</p>
<p><a href="https://github.com/fadhiilrachman/line-py">https://github.com/fadhiilrachman/line-py</a></p>
<p>目前 bot，會造成帳號的部份功能被ban:</p>
<p>Sometimes administrators regulate your account. The best workaround is don&#8217;t use api or don&#8217;t be bad user like kicker. If you want to avoid it but want to use api too, please see below list.</p>
<h2><a id="user-content-rules" class="anchor" href="https://github.com/Dosugamea/l-api-tips/wiki/Account-Regulatory#rules" aria-hidden="true"></a>Rules</h2>
<ul>
<li>Talk Regulatory
<ul>
<li>Happen when you send too many messages.</li>
</ul>
</li>
<li>AddContact Regulatory
<ul>
<li>Happen when you add too many contacts in a day.</li>
</ul>
</li>
<li>Group Change Regulatory
<ul>
<li>Happen when you Invite,Kickout,Change Name,Change Invite Link too many times.</li>
</ul>
</li>
<li>Timeline Post Regulatory
<ul>
<li>Happen when you made a too many posts in a time.</li>
</ul>
</li>
<li>Timeline Comment Regulatory
<ul>
<li>Happen when you made a too many comments in a time.</li>
</ul>
</li>
</ul>
<h2><a id="user-content-if-got-regulatory" class="anchor" href="https://github.com/Dosugamea/l-api-tips/wiki/Account-Regulatory#if-got-regulatory" aria-hidden="true"></a>If got Regulatory</h2>
<p>It can login, but some features can&#8217;t use. For example, Talk Regulatory, Messages are undelivered.<br />
Usually take a from 3 days to 1 week to get unban.(maybe)<br />
If banned for more than 1 week, you will have to recreate an account.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2016/07/python-line-bot-find-userid/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
