跳到主要內容

[Python+LINE Bot教學]6步驟快速上手LINE Bot機器人

python_line_bot
Photo by Yura Fresh on Unsplash
每當朋友或家人要聚餐時,是不是總要花很長的時間尋找評價不錯的餐廳?不但要確認營業時間、消費價格及地點,還要觀看許多的美食文章才有辦法決定,這時候如果有人能夠明確提供幾間符合條件且有人氣的餐廳作為選擇,想必會省事許多。

所以筆者開發了一個美食的LINE Bot小作品,透過對談的方式瞭解使用者所要尋找的餐廳條件後,利用Python網頁爬蟲取得目前正在營業的五間最高人氣餐廳資料,回覆給使用者作為參考。

為了要讓想學習的您能夠由淺入深,瞭解其中的實作過程,所以將會分成三篇文章來進行教學。

2020/06/30補充說明
而在進行實作前,先來看一下LINE Bot主要的執行架構,如下圖:
python_line_bot
使用者透過LINE發送訊息時,LINE Platform將會進行接收,並且傳遞至我們所開發的LINE Bot執行邏輯運算後,透過LINE所提供的Messaging API回應訊息給LINE Platform,最後再將訊息傳遞給使用者。

其中Messaging API(Application Programming Interface),就是LINE官方定義的回應訊息標準介面,包含Text(文字)、Sticker(貼圖)、Video(影片)、Audio(聲音)及Template(樣板)訊息等,完整的說明可以參考LINE官方文件

所以在我們的LINE Bot回應訊息時,就要依據Messaging API定義的規範,傳入相應的參數後,Messaging API就會回應使用者相對的訊息類型。簡單來說,就是LINE PlatformLINE Bot的溝通橋樑。

而本文就先以最基本的使用者發送什麼訊息,LINE Bot就回應什麼訊息為例,讓讀者體會其中的運作方式,整體架構如下圖:
python_line_bot
LINE Bot的部分,使用Django框架來進行建置,並且透過Messaging API回應Text(文字)訊息。在下一篇文章中,將會加入Python網頁爬蟲,取得美食網站的資訊回應給使用者。

本文的實作步驟包含:
  • 建立Provider
  • 建立Messaging API channel
  • 設定LINE Bot憑證
  • 開發LINE Bot應用程式
  • 安裝Ngrok
  • 設定LINE Webhook URL

一、建立Provider

要開發LINE Bot前,首先需建立一個Provider,也就是服務提供者,主要用來讓LINE官方能夠識別這個LINE Bot是誰提供的,可以是個人、公司或服務名稱等

前往LINE Developers,「使用LINE帳號登入」後,會看到如下圖的畫面,輸入姓名及電子郵件即可,目的在於讓開發人員同意使用規範與聯絡使用:
python_line_bot
完成帳戶的建立,就會看到開發者控制台,如下圖:
python_line_bot
其中的三個圖示說明了開發流程,分別為「建立服務提供者(Provider)「建立頻道(Channel)「連結應用程式(APP)

第一步驟就是建立服務提供者(Provider),所以點擊「Create a new provider」,在按鈕下方就會出現輸入框,如下圖:
python_line_bot
這邊可以輸入姓名、公司或服務名稱等,LINE並沒有限定,點擊「Create」按鈕後,就會來到第二步驟,建立頻道(Channel)的畫面,如下圖:
python_line_bot

二、建立Messaging API channel

各位可以把頻道(Channel)想像是服務提供者(Provider)所建立的LINE帳號,藉此和使用者互動與傳遞訊息。

由於本文所建立的LINE Bot主要以傳訊息為主,所以選擇「Create a Messaging API channel。接著,會看到基本資料的輸入畫面,截取部分如下圖:
python_line_bot
python_line_bot
其中的Channel iconLINE帳號的大頭貼,之後的「Privacy policy URL」「Terms of use URL」可選擇性填寫,沒有的話保持空白即可。建立成功後,就可以看到如下畫面:
python_line_bot
最後的步驟就是要將這個頻道(Channel)與自己開發的應用程式連結,所以其中有兩個憑證會使用到,如下:
  • Channel secret(頻道密碼):位於Basic settings頁籤中,如下圖:
python_line_bot
  • Channel access token(頻道憑證):位於Messaging API頁籤中,要按下右方的「Issue」按鈕才會出現,如下圖:
python_line_bot

三、設定LINE Bot憑證

本文將以Django框架為例,利用Python來建置LINE Bot應用程式(APP)。首先,透過以下指令安裝會使用到的Python套件
$ pip install django

$ pip install line-bot-sdk

$ pip install beautifulsoup4

$ pip install requests
接著,建立Django專案應用程式資料庫遷移(Migration),其中詳細的觀念可以點擊連結參考之前所寫的部落格文章。如下指令
$ django-admin startproject mylinebot .  #建立Django專案

$ python manage.py startapp foodlinebot  #建立Django應用程式

$ python manage.py migrate  #執行資料遷移(Migration)
這時候的專案架構如下圖:
python_line_bot
開啟專案主程式下的settings.py檔案,增加LINE Developers上所取得的兩個憑證設定,來LINE頻道(Channel)進行連結如下範例
LINE_CHANNEL_ACCESS_TOKEN = 'Messaging API的Channel access token'

LINE_CHANNEL_SECRET = 'Basic settings的Channel Secret'
並且,在INSTALL_APPS的地方,加上剛剛所建立的Django應用程式(APP)如下範例
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'foodlinebot.apps.FoodlinebotConfig',
]

四、開發LINE Bot應用程式

設定完成後,開啟Django應用程式(APP)views.py檔案,這邊就是撰寫LINE Bot接收訊息後,所要執行的運算邏輯,這邊先以使用者發送什麼訊息,就回覆什麼訊息為例,來測試Django應用程式(APP)能夠成功的和LINE頻道(Channel)進行連結,如下範例
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings

from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextSendMessage

line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)


@csrf_exempt
def callback(request):

    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)  # 傳入的事件
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            if isinstance(event, MessageEvent):  # 如果有訊息事件
                line_bot_api.reply_message(  # 回復傳入的訊息文字
                    event.reply_token,
                    TextSendMessage(text=event.message.text)
                )
        return HttpResponse()
    else:
        return HttpResponseBadRequest()
這邊幾個地方說明一下,第10、11行為取得settings.py中的LINE Bot憑證來進行Messaging API的驗證。

而在callback檢視函式中,當偵測到使用者有傳入的事件,就會透過Python迴圈進行讀取(第28行),如果其中有訊息事件(第29行),則回覆使用者所傳入的文字(第30~33行)。

接下來就要設定這個LINE Bot應用程式(APP)的連結網址,所以在Django應用程式(APP)下建立一個urls.py檔案,加入以下的網址設定
from django.urls import path
from . import views

urlpatterns = [
    path('callback', views.callback)
]
而為了要將這個Django應用程式(APP)的網址也加入到專案主程式中,所以,在Django專案主程式下的urls.py檔案中,加入以下的網址設定
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('foodlinebot/', include('foodlinebot.urls')) #包含應用程式的網址
]

五、安裝Ngrok

LINE Bot應用程式(APP)都完備後,接下來就要讓網址能夠公開(Public)且具有HTTPSLINE頻道(Channel)才有辦法連結。

這時候除了可以將LINE Bot應用程式(APP)部署到像Heroku雲端平台,擁有對外公開的HTTPS網址外,還可以使用一個非常強大的工具-Ngrok

Ngrok簡單來說,就是能夠將你本機的IP埠號(http://127.0.0.1:8000),對應到一個隨機產生的HTTPS網址,並且這個HTTPS網址是對外公開的(Public)的,這時候外部使用者只要透過這個HTTPS網址,就能夠存取本機所運行的服務,是不是非常的強大阿。

首先,前往Ngrok官網,如下圖:
python_line_bot
點擊「Get started for free」後,會需要註冊一個帳戶,接著就會看到如下圖的畫面:
python_line_bot
依據作業系統進行下載即可,而這邊要特別注意的是,在下方會有專屬於你的憑證(Token),如下圖:
python_line_bot
將下載的檔案解壓縮,並且執行後,需要輸入以下的指令進行驗證
$ ngrok authtoken <YOUR TOKEN>
接著,就可以透過Ngrok,將本機的埠號對外公開,以本文為例,Django在本機運行的埠號為8000,所以輸入以下的指令
$ ngrok http 8000
執行結果
python_line_bot
Ngrok就會隨機產生一個HTTPS的網址,只要把這個網址填入LINE Webhook URL,以及LINE Bot應用程式(APP) settings.py檔案中的ALLOWED_HOSTS,如下範例,LINE頻道(Channel)就能夠與LINE Bot應用程式(APP)互相連結:
ALLOWED_HOSTS = [
    'cf3fb14f6910.ngrok.io'  #允許的網域名稱
]
接著,利用以下的指令執行LINE Bot應用程式(APP)
$ python manage.py runserver

六、設定LINE Webhook URL

2020/06/30補充說明
在一般的網路世界中,用戶端(Client)會發送請求(Request)給伺服器端(Server),處理完商業邏輯後,就會回傳結果(Response)給用戶端(Client),如下圖:
python_line_bot

而Webhook機制就是除了擁有上面一般請求(Request)的流程外,還能夠主動推播訊息給用戶端(Client),即便用戶端(Client)沒有向伺服器端(Server)發送請求(Request),所以Webhook機制讓用戶端(Client)與伺服器端(Server)成了雙向的溝通,如下圖:
python_line_bot
LINE Webhook URL位於LINE Developers開發者控制台的Messaging API頁籤中,如下圖:
python_line_bot
點擊「Edit」,輸入剛剛Ngrok所產生的HTTPS網址,如下圖:
python_line_bot
範例中,在Ngrok的網址後面,記得要加上LINE Bot應用程式(APP)的網址,這樣LINE頻道(Channel)才有辦法請求(Request)。除此之外,下方的「Use webhook」要啟用。

這邊點擊「Verify」進行驗證,如果發生錯誤,而LINE Bot應用程式(APP)的終端機(Terminal)中卻沒有出現問題的話,則無需擔心,還是可以繼續往下實作。

由於本文所開發的LINE Bot應用程式(APP)會自動回覆訊息,而無需LINE官方回覆,所以在下方的「Auto-reply messages」,點擊「Edit」,如下圖:

python_line_bot

設定自動回應訊息為「停用」,如下圖:

python_line_bot

最後,掃描Messaging API頁籤中的QR code,加入好友後就可以對LINE Bot傳送訊息,執行結果如下圖:
python_line_bot

七、小結

本文為基本的LINE Bot實作過程,在下一篇文章中,將會加入Python網頁爬蟲,依據使用者所傳入的需求,爬取知名美食網站的資料,回覆給使用者。希望本文的教學有幫助到您,歡迎分享給身邊在學習LINE Bot的朋友。

如果您喜歡我的文章,請幫我按五下Like(使用GoogleFacebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。

留言

  1. python manage.py startapp foodlinebot

    File "manage.py", line 16
    ) from exc
    ^
    SyntaxError: invalid syntax

    請問要如何解決?

    回覆刪除
    回覆
    1. 試試看使用以下指令:
      python3 manage.py startapp foodlinebot

      刪除
  2. 大大您好
    我現在想要runserver的情況下 會出現下面的錯誤


    C:\Users\AlphaLin\bot>python manage.py runserver
    Watching for file changes with StatReloader
    Performing system checks...
    .
    .
    .
    .(一堆錯誤代碼)
    path('dblinebot/', include('dblinebot.urls')),
    NameError: name 'include' is not defined

    我以為是我的電腦沒有裝include害的 所以我就

    C:\Users\AlphaLin\bot>pip install include
    Requirement already satisfied: include in c:\python38\lib\site-packages (0.2.2)

    然後還是出現一樣的錯誤

    請問是可能哪邊有錯?
    謝謝

    回覆刪除
    回覆
    1. 另外 我試著把webhook更新上去 Verify之後 結果會出現 The webhook returned an HTTP status code other than 200

      然後再ngrok下面會出現 POST /dblinebot/callback 502 Bad Gateway 的錯誤

      是因為我上面的問題導致 下面這個問題嗎?

      刪除
    2. ALPHAGXX您好:
      include()是Django內建的方法,不是套件,用來讓Django結合專案中各個應用程式的網址設定(urls.py)。檢查一下您的Django專案主程式下的urls.py檔案中,是否有引用include()方法,如下:

      from django.urls import path, include

      引用後,就不會出現NameError: name 'include' is not defined的錯誤,也就不會導致ngrok的502 Bad Gateway(找不到網址)錯誤。

      希望以上有解決您的問題,如果沒有,歡迎至Learn Code With Mike粉絲專頁私訊我,將會協助您解決,謝謝 :)

      刪除
    3. 這個錯誤解決了 可是又有錯誤發生了XD

      server跑起來了

      然後我按了Line Developer 的Verify之後
      他出現這個問題
      The webhook returned an HTTP status code other than 200

      ngrok
      POST /dblinebot/callback 500 Internal Server Error

      LINEBOT server

      Internal Server Error: /dblinebot/callback
      linebot.exceptions.LineBotApiError: LineBotApiError: status_code=400, request_id=5ead826d-cb29-43d1-908f-05366221be0a, error_response={"details": [{"message": "May not be empty", "property": "messages[0].text"}], "message": "The request body has 1 error(s)"}, headers={'Server': 'openresty', 'Content-Type': 'application/json', 'x-line-request-id': '5ead826d-cb29-43d1-908f-05366221be0a', 'x-content-type-options': 'nosniff', 'x-xss-protection': '1; mode=block', 'x-frame-options': 'DENY', 'Content-Length': '118', 'Expires': 'Thu, 01 Oct 2020 11:33:20 GMT', 'Cache-Control': 'max-age=0, no-cache, no-store', 'Pragma': 'no-cache', 'Date': 'Thu, 01 Oct 2020 11:33:20 GMT', 'Connection': 'close'}
      [01/Oct/2020 19:33:19] "POST /dblinebot/callback HTTP/1.1" 500 84333

      是還有哪邊有問題呢= =?

      刪除
    4. ALPHAGXX您好:
      應該是訊息不能為空值的關係所導致,請您將ngrok及LINEBOT server跑起來,直接使用LINE傳送訊息試試看 :)

      刪除
    5. 大大你好
      我傳送訊息後出現
      Bad Request: /foodlinebot/callback
      [12/Oct/2020 16:00:45] "POST /foodlinebot/callback HTTP/1.1" 400 66635
      ngrok也出現400 Bad Request
      請問是哪裡可能出錯?
      謝謝

      刪除
    6. 可以檢查一下LINE Develops的Webhook URL是否有正確配對Django專案主程式及應用程式的urls.py檔案設定,也確認一下settings.py檔案中的LINE_CHANNEL_ACCESS_TOKEN及LINE_CHANNEL_SECRET設定,另外,line-bot-sdk記得安裝。

      希望以上有解決您的問題,如果還有其它疑問,歡迎至Learn Code With Mike粉絲專頁私訊我,將會協助您解決,謝謝 :)

      刪除
    7. 您好,請問上面的問題解決了嗎?我是用flask架的,access_token和secret都對,但line還是一直回我400...

      刪除
    8. 您好,可以檢查一下專案的LINE Bot應用程式網址與LINE Webhook URL是否有正確設定,以及專案ALLOW_HOSTS的部分要設定ngrok的https網址,並且有安裝line-bot-sdk套件,最後試著用手機發送訊息,如果以上皆正確還是無法接收訊息,可以參考以下的文章,部署到Heroku雲端平台,來進行測試會較為準確:

      https://www.learncodewithmike.com/2020/07/python-line-bot-deploy-to-heroku.html

      希望以上對您有所幫助 :)

      刪除
  3. 你好,請問我在
    下載的檔案解壓縮,並且執行後,需要輸入以下的指令進行驗證:
    $ ngrok authtoken
    這個步驟發生錯誤
    命令語法不正確.
    請問 如何解決?

    回覆刪除
    回覆
    1. 您好,$ ngrok authtoken指令之後是否有貼上您的Token(憑證)呢?

      刪除
  4. 我的Line Bot不會自動回覆我打的訊息,請問是哪部分出問題呢?

    回覆刪除
    回覆
    1. 歡迎將問題或程式碼截圖,到Learn Code With Mike粉絲專頁發訊息給我,將會協助您解決,謝謝 :)

      刪除
    2. 我也經解決這個問題,謝謝您的回覆!

      刪除
    3. 我的Django應用程式(APP)的views.py檔案中,"from linebot import LineBotApi, WebhookParser"以及下面兩行會出現錯誤訊息,"Unable to import 'linebot'"。請問可能哪裡有問題嗎

      刪除
    4. 您好,請問是否有利用以下指令安裝LINE Bot SDK呢?
      $ pip install line-bot-sdk

      刪除
    5. 還是會出現"Unable to import 'linebot'"��

      刪除
  5. 你好 我在Webhook URL 驗證時 發生錯誤訊息An error occurred when sending the webhook, 而在我的ngrok.exe命令列中收到 POST /footlinebot/callback 在Line機器人收不到它的回覆 想知道有什麼問題 謝謝.

    回覆刪除
    回覆
    1. 您好,請問ngrok中POST /footlinebot/callback之後所顯示的HTTP狀態碼是多少呢? Django專案這邊的Terminal視窗中是否有顯示什麼錯誤訊息?

      刪除

張貼留言

這個網誌中的熱門文章

[Python爬蟲教學]7個Python使用BeautifulSoup開發網頁爬蟲的實用技巧

Photo by Stanley Dai on Unsplash 在實務上開發專案時,很多時候會利用其他網站的資料來進行分析或運用,而取得的方式除了透過網站所提供的 API(Application Programming Interface) 外,也可以利用 Python 來開發爬蟲程式,將網頁的 HTML 內容下載下來,接著利用 BeautifulSoup 套件 (Package) ,擷取所需的資訊。 本文將開發一個簡單的爬蟲程式,爬取「 ETtoday 旅遊雲 」網頁,擷取桃園旅遊景點的標題資訊,如下圖: 取自ETtoday 的旅遊雲 而在開發的過程中,常會需要搜尋 HTML 的節點,本文將分享幾個常用的方法,包含: BeautifulSoup 安裝 以 HTML 標籤及屬性搜尋節點 以 CSS 屬性搜尋節點 搜尋父節點 搜尋前、後節點 取得屬性值 取得連結文字 一、 BeautifulSoup 安裝 BeautifulSoup 是一個用來解析 HTML 結構的 Python 套件 (Package) , 將取回的網頁 HTML 結構, 透過其提供的方法 (Method) ,能夠輕鬆的搜尋及擷取網頁上所需的資料,因此廣泛的 應用在網頁爬蟲的開發上 。 Beautifulsoup 套件 (Package) 可以透過 pip 指令來進行安裝,如下範例: pip install beautifulsoup4 而要解析網頁的 HTML 程式碼前,還需要安裝 Python 的 requests 套件 (Package) ,將要爬取的網頁 HTML 程式碼取回來,安裝方式如下: pip install requests 安裝完成後,首先引用 requests 套件 (Package) ,並且 透過 get() 方法 (Method) 存取 ETtoday 旅遊雲的桃園景點網址,如下範例: import requests response = requests.get( "https://travel.ettoday.net/category/%E6%A1%83%E5%9C%92/") 將網頁的 HTML 程式碼取回來後,接著引用 BeautifulSoup

[Python物件導向]淺談Python類別(Class)

Photo by Bram Naus on Unsplash 在學習程式語言時,或多或少都有聽過物件導向程式設計 (Object-oriented programming ,簡稱 OOP) ,它是一個具有物件 (Object) 概念的開發方式,能夠提高軟體的重用性、擴充性及維護性,在開發大型的應用程式時更是被廣為使用,所以在現今多數的程式語言都有此種開發方式, Python 當然也不例外。而要使用物件導向程式設計就必須對類別 (Class) 及物件 (Object) 等有一些基本的了解,包含了: 類別 (Class) 物件 (Object) 屬性 (Attribute) 建構式 (Constructor) 方法 (Method) 我們先來看一下今天要來建立的類別: # 汽車類別 class Cars: # 建構式 def __init__(self, color, seat): self.color = color # 顏色屬性 self.seat = seat # 座位屬性 # 方法(Method) def drive(self): print(f"My car is {self.color} and {self.seat} seats.") 接下來就針對類別 (Class) 各個部分來進行介紹。 一、類別 (Class) 簡單來說,就是物件 (Object) 的藍圖 (blueprint) 。就像要生產一部汽車時,都會有設計圖,藉此可以知道此類汽車會有哪些特性及功能,類別 (Class) 就類似設計圖,會定義未來產生物件 (Object) 時所擁有的屬性 (Attribute) 及方法 (Method) 。而定義類別的語法如下: class classname:   statement 首先會有 class 關鍵字,接著自定類別名稱,最後加上冒號。類別名稱的命名原則習慣上使用 Pascal 命名法,也就是每個單字字首大寫,不得使用空白或底線分隔單字,如下範例: #範例一 class Cars: #範例二 class MyCars: 二、物件 (Object) 就是透過

[Python爬蟲教學]整合Python Selenium及BeautifulSoup實現動態網頁爬蟲

Photo by LAUREN GRAY on Unsplash 相信大家都知道,取得資料後能夠進行許多的應用,像是未來的趨勢預測、機器學習或資料分析等,而有效率的取得資料則是這些應用的首要議題,網頁爬蟲則是其中的一個方法。 網頁爬蟲就是能夠取得網頁原始碼中的元素資料技術,但是,有一些網頁較為特別,像是社群平台,需先登入後才能進行資料的爬取,或是電商網站,無需登入,但是要透過滾動捲軸,才會動態載入更多的資料,而要爬取這樣類型的網頁爬蟲,就稱為動態網頁爬蟲。 該如何實作呢? 本文將使用 Python Selenium 及 BeautifulSoup套件 來示範動態網頁爬蟲的開發過程,重點包含: BeautifualSoup vs Selenium 安裝 Selenium 及 Webdriver 安裝 BeautifulSoup Selenium get() 方法 Selenium 元素定位 Selenium send_keys() 方法 Selenium execute_script 方法 BeautifulSoup find_all() 方法 BeautifulSoup getText() 方法 一、 BeautifualSoup vs Selenium BeautifulSoup套件 相信對於 開發 網頁爬蟲的人員來說,應該都有聽過,能夠解析及取得 HTML 原始碼各個標籤的元素資料,擁有非常容易上手的方法 (Method) ,但是,對於想要爬取 動態 網頁資料來說,則無法達成,因為 BeautifulSoup套件 並沒有模擬使用者操作網頁的方法 (Method) ,像是輸入帳號密碼進行登入或滾動捲軸等,來讓網頁動態載入資料,進行爬取的動作。 所以,這時候,就可以使用被設計於自動化測試的 Selenium 套件,來模擬使用者的動作,進行登入後爬取資料或滾動卷軸,並且能夠執行 JavaScript 程式碼,這些就是 Selenium 與 BeautifulSoup套件 最大不同的地方。對於開發 Python 動態爬蟲來說,就可以結合 Selenium套件 以上的特點,讓網頁動態載入資料後,再利用 BeautifulSoup套件簡潔的 方法 (Method) ,將所需的資料爬取下來。 本文就是利用這樣的概念,利用 Selenium 套件登入 Facebook 後,前往

Python學習資源整理

Photo by Pablo Heimplatz on Unsplash 本文將分享在學習 Python的 過程中,所參考的學習資源,由於喜歡做中學,所以分享的教學資源大部分都會有應用實作,除了能夠瞭解基本的 Python 語法外,透過實際的專案開發,可以增加熟悉度,並且從中培養解決問題的能力。而今天分享的 Python 學習資源,分別有: 網站 書籍 YouTube頻道 線上課程 一、網站 以下是除了 Python 官方之外,推薦的教學網站,除了附有範例程式碼說明之外,觀念講解清楚且易於理解,包含: 1. Real Python: Python Tutorials 2. Python Programming Language - GeeksforGeeks 3. ccClub(Coding&Co-working Club) 二、書籍 1. Python 初學特訓班(第四版):從快速入門到主流應用全面實戰(附250分鐘影音教學/範例程式) 這本書從 Python 的基本語法教學 開始 ,最後進行幾個應用程式的開發,包含了 YouTube 、 LINE Bot 聊天機器人、 網頁爬蟲 及資訊圖表繪製等 Python 專案的開發,這也是我非常喜歡的原因,學習任何的程式語言,在學習完基礎語法後,就是要透過實際的專案開發來練習及增加熟悉度,其中的實戰專案也是我目前正在學習的,並且還有附影音教學,非常適合初學者入門或是想要增加自己實戰經驗的開發人員。 2. Python 自動化的樂趣:搞定重複瑣碎&單調無聊的工作(第二版) 這本書同樣是先介紹 Python 的基本重要語法,簡潔易懂,不過這裡的專案實作比較是針對 Python 自動化的處理,包含Web擷取資訊、工作排程、影像圖片處理及 Email 發送等,是我在開發自動化專案時的參考書籍,實作範例都很實用,適合初學者及對 Python 自動化處理有興趣的開發人員。 3. Python 設計模式 實務上在開發專案時,大家都知道需求會隨著業務一直改變,這時候就會有機會修改程式碼,而有好的架構會讓程式碼好維護,相信這是開發人員所追求的,這本書就是介紹 Python 常用的設計模式 (Design Pattern) 及設計原則

[Python爬蟲教學]Python網頁爬蟲結合LINE Notify打造自動化訊息通知服務

Photo by William Hook on Unsplash 日常生活中,每個人都有關注的事情,像是演唱會門票的開賣、喜歡的商品降價或新電影上檔等,而為了要及時自動取得這些資訊, Python 網頁爬蟲就被廣泛的使用,除了將爬取的資訊透過 [Python 實戰應用 ]Python 寄送 Gmail 電子郵件實作教學 文章介紹的電子郵件進行通知外,另一個備受歡迎的接收通知管道就是 LINE 。 而 LINE 官方提供了 LINE Notify 的服務,只要完成和 LINE 網站的連動設定,就可以透過 LINE Notify 推播或傳送訊息至目標使用者的 LINE 中。 本文即以 Udemy 線上課程網站為例,利用 Python 網頁爬蟲關注想購買的線上課程,只要低於指定的價格,就透過 LINE Notify 服務傳送訊息給使用者。本文的重點包含: 登錄 LINE Notify 服務 發行 LINE Notify 權杖(Token) 整合 Python 網頁爬蟲及 LINE Notify 服務 一、登錄 LINE Notify 服務 首先,前往 LINE Notify 官網 ,來進行Python網頁爬蟲與LINE Notify的連動設定,如下圖: 點選右上角的登入,輸入 LINE 帳號及密碼,如下圖: 成功登入後,就可以看到「管理登錄服務」頁面,如下圖: 接著,點擊「登錄服務」,輸入 LINE Notify 服務的基本資料,由於本文的 Python 爬蟲是跑在本機上,所以「服務網址」及「 Callback URL 」皆為 http://127.0.0.1 ,如下範例: 填寫完成後,點擊「同意並前往下一步」,就可以看到剛剛所輸入的基本資料,確認沒問題點選「登錄」按鈕即可,如下範例: 這時後 LINE Notify 會發送認證郵件到登錄服務時,所填寫的電子郵件帳號中,如下圖: 完成電子郵件認證後,點擊「前往服務一覽」,可以看到 LINE Notify 配發了一個 Client ID(帳號) 給我們,如下圖: 而密碼則需點擊服務,才可以看到,如下圖: 以上就完成了 LINE Notify 服務的基本資料登錄了。 二、發行 LINE Notify 權杖 (Token) 有了的服務帳號及密碼後,接下來,就可以向 LINE Notify 取得權杖 (token) ,各位可以把

[Python教學]搞懂5個Python迴圈常見用法

Photo by Scott Webb on Unsplash 在撰寫程式的過程中,都有機會要重複執行一些相同的運算,但是重複撰寫好幾次同樣的運算看起來非常的沒有效率,所以在這個情況下我們通常會使用迴圈來幫我們完成,本篇就來介紹 Python 迴圈的使用方式,包含 For-Loops 、 Nested Loops 及 while-Loops ,並且說明用來控制迴圈流程的 break 及 continue 指令。 一、 range() 方法 在開始介紹 Python 迴圈之前,先來說明一個在執行迴圈時常用的 range() 方法,主要用來幫我們產生數列,語法如下: range( 起始值 , 結束值 , 遞增 ( 減 ) 值 ) 使用說明: range(20) :起始值預設從 0 開始,所以會產生 0 到 19 的整數序列。 range(10,20) :起始值從 10 開始,所以會產生 10 到 19 的整數序列。 range(10,20,3) :起始值從 10 開始,遞增值為 3 ,所以會產生 10,13,16,19的整數序列 。 二、 Python For-Loops 敘述 可以針對 Iterable( 可疊代的 ) 物件來進行讀取, Python 內建幾個常用的 Iterable 物件,像是 String( 字串 ) 、 List( 串列 ) 、 Tuples( 元組 ) 、 Dictionary( 字典 ) 等,往後會出文章詳細的介紹。 Python for-loop 的語法如下: 在語法中, in 的後方就是 for-loop 要讀取的目標物,這個目標物的為 Iterable ( 可疊代的 ) 物件,一次讀取一個元素,然後用 item( 自訂變數名稱 ) 來接收每次讀取到的元素,執行區塊中的運算。注意 for-loop 的結尾需加上冒號 ( : ) 及區塊中的運算式要有相同的縮排,範例如下: 在範例中, for-loop 的讀取目標物為一個字串,每一次讀取一個字母,並且用 letter 變數來接收,執行 print() 方法。 三、 Python Nested Loops ( 巢狀迴圈 ) 簡單來說,就是迴圈中又有一層迴圈,我們來看一個範例:   這個巢狀迴

解析Python模組(Module)和套件(Package)的概念

Photo by Helloquence on Unsplash 當我們在開發大型應用程式時,如果沒有適當的組織程式碼,除了會降低開發的效率外,也不易於維護,所以模組 (Module) 化就顯得相當的重要,讓程式碼能夠透過引用的方式來重複使用,提升重用性 (Reusable) 。 但是隨著專案模組 (Module) 的增加,將難以管理及問題的追蹤,這時候就能將模組 (Module) 打包成套件 (Package) ,利用其階層式的結構來彈性規劃模組 (Module) 。 本篇文章就帶大家瞭解 Python 模組 (Module) 及套件 (Package) 的重要觀念,包含: 什麼是模組 (Module) 模組引用方式 (Import) 什麼是套件 (Package) dir() 函式 (dir function) 將模組當作腳本來執行 (Executing a Module as a Script) 一、什麼是模組 (Module) 模組 (Module) 就是一個檔案,包含了相關性較高的程式碼。隨著應用程式的開發規模越來越大,我們不可能把所有的程式碼都寫在同一份 Python 檔案中,一定會將關聯性較高的程式碼抽出來放在不同的檔案中來形成模組 (Module) ,主程式再透過引用的方式來使用。所以模組 (Module) 可以提高程式碼的重用性 (Reusable) 且易於維護。 假設我們現在要開發一個部落格,主程式為 app.py ,在還沒有模組化時,程式碼可能長得像這樣: #取得作者 def get_author(): return "Mike" #取得電子郵件 def get_email(): return "learncodewithmike@gmail.com" #新增文章 def add_post(title): pass #刪除文章 def delete_post(title): pass add_post() author = get_author() email = get_email() 各位應該可以想像,隨著部落格功能的增加,將所有程式碼都寫在  app.py 主程式中會變得怎麼樣。所以這

Visual Studio Code Python環境建置

在 完成 Python安裝 後,接下來就需要選擇一個開發工具來撰寫程式碼,目前市面上的開發工具有很多,像是 Sublime 、 Visual Studio Code 、 Atom 、 PyCharm 等,各自都有其優點,沒有哪一個工具一定最好,只要依照個人喜好進行選擇就可以了。本篇就以 Windows 平台為例,介紹如何在 Visual Studio Code( 簡稱 VSCode) 中建置 Python 的開發環境。為什麼會推薦使用 VSCode 呢 ? 除了它是一個較輕量的開發工具以外,它還具有以下的特點。 一、 VSCode 特色 1.   Intellisense( 智慧語法提示 ) 於撰寫程式碼時, VSCode 會提示此物件能使用的各種屬性 (Property) 及方法 (Method) ,並且會顯示該方法的簡要說明及回傳的型別。點選需要的方法後,自動完成,無須逐字 Key 完所有的字母,大幅提高撰寫程式碼的效率。 2.   Debugging( 偵錯功能 ) VSCode 擁有出色的偵錯功能,能將中斷點下在可能出問題的程式碼列,並於偵錯模式中,逐步的執行程式碼,左欄視窗會依據執行的過程顯示各個變數目前的數值,減少開發人員除錯的時間。 3.   Bult-in Git( 內建 Git) VSCode 內建 Git 原生的功能,包含常用的如 Pull 、 Push 、 Commit 及不同版本程式碼的異動比較等,讓我們在程式撰寫的過程中,易於進行版本控管。 4.   Code Formatting( 程式碼排版 ) 在稍後教大家安裝 Python 套件後, VSCode 會在儲存的時候,依據 Python 官方的程式碼撰寫風格原則 ( PEP8 - Style Gide for Python Code ) 自動幫我們排版程式碼,提高程式碼的可讀性。 5.   Linting( 程式碼檢查 ) 同樣的安裝完 Python 套件後, VSCode 的 Linting 功能在我們撰寫程式的過程中,分析我們的程式碼,只要有語法上的錯誤,即會顯示紅色的線條,並在下方的 PROBLEMS 頁籤中,提示錯誤的原因。 6.   Extensions( 擴充套件 )

[Python實戰應用]掌握Python連結MySQL資料庫的重要操作

Photo by Glenn Carstens-Peters on Unsplash 在現今很多的 Python 應用當中,像是開發爬蟲獲取網頁資料,或透過 API 取得所需的資訊等,都有機會將這些有效的資料存進資料庫中,透過其強大的查詢語法篩選、分析及過濾資料,甚至可以直接匯出 Excel 報表等,資料庫扮演了非常重要的角色。 所以本文將延續 瞭解 Python 存取 API 的重要觀念-以 KKBOX Open API 為例 文章,模擬實務上呼叫 KKBOX Open  API 取得資料後,如何透過 Python 存進 MySQL 資料庫中,並且執行資料的新增、查詢、修改及刪除操作, 利用實作來瞭解 Python 存取資料庫的重要概念 ,重點包含: Python 專案前置作業 安裝 MySQL 資料庫 建立 MySQL 資料庫 建立 MySQL 資料表 新增資料表資料 查詢資料表資料 修改資料表資料 刪除資料表資料 一、 Python 專案前置作業 在開始今天的實作前,將 Python 專案中的 charts.py 簡化為以下範例: import requests # 取得Token def get_access_token(): #API網址 url = "https://account.kkbox.com/oauth2/token" #標頭 headers = { "Content-Type": "application/x-www-form-urlencoded", "Host": "account.kkbox.com" } #參數 data = { "grant_type": "client_credentials", "client_id": "貼上ID內容", "client_secret": "貼上Secret內容"