初次嘗試 Line Bot sdk — 爬蟲與推送訊息

在開始正題之前一定要先提一下研究動機!最近恰巧發現了一款 PS4 遊戲 《地平線:期待黎明》(Horizon : Zero Dawn) ,看了故事預告以及放出來的 Gameplay 以後,就深深地被吸引到了。

戰鬥方式
有點類似魔物獵人,翻滾、打弱點、部位破壞等等,而且主武器是使用弓!對於中二病患來說這點真是加分! 
背景設定
從預告片看來是在文明毀滅後的未來世界,一種蠻荒部落與機械生物共存的衝突感,那些生物的設定很吸引我。
遊戲模式
開放世界對於不愛跑主線、專門不務正業跑支線任務的人來說真的不錯XD

回到正題,因為我還沒有 PS4 ,且比較想入手的 PS4 Pro 又嚴重缺貨,除了 PTT Gamesale 板偶爾有一些人賣之外,其他地方都沒有看到,但由於 GS 板的都會在極短的時間內被掃掉,因此想做個 LineBot 提醒自己。


申請帳號

要使用 Line Bot 需要先至 LINE Business Center 申請一個 Line@ 帳號,並且開啟 Message API 的 Develop trial 權限,就可以免費使用。

Message API 申請處

申請並且認證通過後,就可以進入 Message API 的管理頁面,這時候就可以找到 Channel Access Token 這東西,在使用 Line Bot SDK 時會用到。

拿到了這串就能使用你的帳號發送訊息,因此請妥善保存。

申請帳號部分因為很簡單,我就不再贅述了。


這次使用的環境與工具:
- 語言:Python 3.5 (有人可以告訴我為何部份的人很排斥 Python3 嗎?)
- 爬蟲:Selenium, Beautifulsoup4
- Bot:line-bot-sdk-python

爬蟲

印象中看過有人在 PTT 用程式進行一些站內行為而被封鎖的,因此這次抓取的目標放在 網頁版 最新一頁的內容。
首先使用 Selenium 抓取頁面的 HTML 後,再用 Beautifulsoup 找到標題的地方。

from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.PhantomJS()
driver.get("https://www.ptt.cc/bbs/Gamesale/index.html")
soup = BeautifulSoup(driver.page_source, “lxml”)
for article in soup.select(‘.r-list-container .r-ent .title a’):
title = str(article.string)

如上所示就可以取得所有文章標題,再使用正規表達式尋找符合
[PS4 ] 售 * Pro *」的文章標題就好了。
如果不想用 Selenium 也可以使用更簡單的 Request 來抓資料,但因為我有打算要爬拍賣網站,只用 Request 可能會有些資料抓不到。

Line 發送訊息

Line Message API 有分兩種權限:Push message 及 Reply message,後者不是這次目標因此暫且不提。而要使用 sdk 發送訊息一樣是很簡單的一件事情

from linebot import LineBotApi
from linebot.models import TextSendMessage
line_bot_api = LineBotApi('Your Channel Access Token')
#push message to one user
line_bot_api.push_message('user_id',
TextSendMessage(text='Hello World!'))
#push message to multiple users
line_bot_api.multicast(['user_id1', 'user_id2'],
TextSendMessage(text='Hello World!'))

值得注意的地方是,user id 並不是使用者的 Line id因此我是建立了一個簡單的 echo bot 來取得我自己的 user id,至於常規要怎麼取得可能還要再找找。

現在已經可以如下面補充的一樣查到自己的 userid 囉。


總結

測試的訊息通知

依照著上面兩個部分的簡單程式,就可以拼湊出一個看到新文章時會發送訊息通知你的 Line Bot 了,再搭配上 crontab 定期執行大概…就有機會買到 PS4 Pro 了。

附上 GitHub 連結

下一篇《再戰 Line Bot SDK -接收訊息與回應》將會提到怎麼接收使用者傳過來的訊息,並且回覆給使用者。


補充

現在 LINE Developers Message API 的管理介面可以看到你自己的 userid 囉。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.