iT邦幫忙

14

超簡單一鍵推播 591 租屋資訊完全免 Coding-透過 Google Sheet 與 LINE Notify

  • 分享至 

  • xImage
  •  

在 iT 邦幫忙 PO 一篇完全不需要 coding 的技術文章,是否搞錯了什麼?


2022/01/23 更新:

新年快樂~修復之前寫死 Cookie 導致的問題。
Github:
https://github.com/dang113108/591_rent
Commit: https://github.com/dang113108/591_rent/commit/4d6de2f7ee527cf450f17894fcc17935062fe895


2021/11/08 更新:

修復因 591 改版導致整組壞掉的問題!
Github: https://github.com/dang113108/591_rent/tree/dev


2021/09/08 更新:

感謝邦友 flier268, travis668 幫忙修復因 591 改版導致抓不到 cover image 的問題!
Github: https://github.com/dang113108/591_rent/tree/dev


2021/02/22 更新:

感謝邦友 Chil 幫忙抓到一個 Bug,如果有在之前嘗試使用失敗的朋友再麻煩覆蓋最新版本的 Code 或直接重來一次,謝謝!
Github: https://github.com/dang113108/591_rent/tree/dev


現在房子合約是到六月底,有鑑於租的地方離公司及市區有大概半小時的車程,因此在過完年後的二月中我認為差不多可以開始找下一間房子了。

剛好我的朋友 Robin 在我們的群組分享了他寫的 rentHouse 這個工具,透過 node.js 自己去架設一個 server 來爬 591 的資訊並且推播到 LINE Notify,讓我們可以即時追蹤新發布的物件,效果其實已經相當不錯。但是我沒用,對不起,我沒用

但這次要分享的算是基於他的想法以及我之前使用過 Google Sheet 的經驗來開發的,透過 Google Apps Script 內建的「觸發條件」我們可以設定每分鐘爬一次 591 的資訊,並且一樣推播到 LINE Notify 外,我們還可以將這些資料統整至 Google Sheet 上,去篩選哪些是我可以考慮的,而哪些是我不想要的;而最重要的-不需要任何指令、npm、或安裝額外的東西,只要根據這篇文章的教學,任何人都可以自己架設一個!

標題有點詐騙,因為設定完成後不需要任何按鍵就會自動推播你想看到的資訊 (?)

功能介紹

  • 每分鐘透過你設定的篩選條件到 591 網站上爬蟲並將資訊上傳至 Google Sheet 及推播到 LINE Notify
  • 如果該物件已曾經推播過且價格沒有變動,不會再次推播
  • 如果該物件已曾經推播過且價格有變動,會再次推播
  • 透過 Google Sheet 特性,可多人同時編輯 (但請注意你的 LINE Notify Token 可能會外洩)
  • 透過 LINE 特性,可多人加入同一群組一起討論

實際使用多週後的展示

  • Google Sheet
    Google Sheet 實際案例
  • LINE Notify
    LINE Notify 實際案例

開始設定!

第一步,複製 Google Sheet

Google Sheet link: 591 Rent Template

  1. 點進去連結後,記得要先登入你的 Google 帳號
  2. 點選「檔案 > 建立副本」
    檔案 > 建立副本
  3. 輸入你想要的名稱後,按下確定來建立副本
    複製文件
  4. 複製完成!
    複製完成

第二步,取得 591 的資料

591 link: https://rent.591.com.tw/

  1. 進入 591 網站後,第一步請先打開瀏覽器的「開發人員工具」

開發人員工具開啟方式:Google Chrome
開啟開發人員工具

  1. 進入「Network」的分頁
    Network分頁
  2. 搜尋「/home/search/rsList」,此時還不會看到任何東西
    搜尋 URI
  3. 回到 591 的頁面,搜尋你想要的條件
    591篩選條件
  4. 按下「刊登時間」以刊登時間作為排序(最新到最舊)
    以刊登時間做排序
  5. 這時回到「開發人員工具」的畫面,可以看到像是這樣的畫面,已經有資訊了
    已取得 591 資料
  6. 點選最下面的一筆,待會會需要複製圖片中紅線部分(包括問號)
    取得 591 資料

第三步,取得 LINE Notify Token

LINE Notify 首頁:https://notify-bot.line.me/zh_TW/

  1. 請先將 LINE Notify 加入成為你 LINE 的好友
    將 LINE Notify 加入好友
  2. 建議先在 LINE 中創建一個群組,並邀請 LINE Notify 進入你的群組裡
    將 LINE Notify 加入群組
  3. 進入 LINE Notify 首頁,並請登入你的 LINE 帳號
    登入 LINE Notify
  4. 進入你的「個人頁面」
    進入個人頁面
  5. 點選「發行權杖」
    點選發行權杖
  6. 尋找你剛剛創建的群組,並輸入這個權杖的名稱(該名稱除了管理用之外也會是推播內容的標題)
    設定發行權杖
  7. 點選發行後,會出現該權杖的 Token,請不要將此 Token 外洩以免有人瘋狂傳訊息給你 XD
    複製 Token
  8. 待會會需要複製這個 Token,而且此頁面關閉後將沒辦法再次查看這個 Token,所以請先將他複製到一個安全的地方或先不要關閉這個頁面

最後一步,將以上取得的資訊放入 Google Sheet 中

  1. 請回到你剛剛所建立的 Google Sheet 副本,並且點選「工具 > 指令碼編輯器」
    指令碼編輯器
  2. 此時會開啟一個新頁面並可以看到原始碼,在這邊我們只需要將剛剛取得的資訊貼到相對應的地方就好

請注意必須保留雙引號的部分
修改 Google Apps Script

  1. 按下儲存按鈕
    儲存專案
  2. 接著將上方的功能選取為「main」後點選「執行」
    執行測試
  3. 可能會跳出需要你授權的視窗,請依照他所跳出的視窗登入你的帳號並允許授權
    需要授權
    未經驗證
    我很安全
    允許授權
  4. 確認下方的執行紀錄沒有錯誤即可到下個步驟
    確認執行紀錄
  5. 點選左側的鬧鐘圖示(觸發條件)
    進入觸發條件
  6. 點選右下角的「新增觸發條件」
    新增觸發條件
  7. 請依序將「選擇您要執行的功能」選擇為「main」、「選取活動來源」選擇為「時間驅動」、選取時間型觸發條件類型選擇為「分鐘計時器」,並確定「選取分鐘間隔」為「每分鐘」後,按下儲存按鈕
    調整觸發條件
  8. 成功!
    新增觸發條件成功

成果展示

在以上步驟都完成後,Google Apps Script 便會根據你所設定的條件每分鐘去爬一次 591 的資料,並儲存到你所建立的 Google Sheet 以及推播到你的 LINE Notify。

如果過了一分鐘後都沒有任何通知或更新,有可能是剛好過去一兩分鐘都沒有新的物件,所以請不用擔心、繼續等待

  • Google Sheet (如果 LINE 有通知但 Google Sheet 上沒有的話,請重新整理 Google Sheet 頁面)
    Google Sheet 成果展示
  • LINE Notify
    LINE Notify 成果展示

以上分享,有任何問題歡迎留言提問 : )
Github: https://github.com/dang113108/591_rent


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Robin
iT邦新手 2 級 ‧ 2021-02-21 23:34:45

推爆

太色了吧連這個都追蹤

4
Ryan Lee
iT邦新手 4 級 ‧ 2021-02-22 15:38:16

推好文

如果有人看完要自用的話應該沒什麼問題,但如果有其他用途要注意一下爬蟲資料的使用目的與法律問題

前陣子滿多人傳的判決案例QQ
https://www.netadmin.com.tw/netadmin/zh-tw/viewpoint/BC05E753C27943AB93187936A8F25B7E

非常感謝你的補充。

老實說從之前學習爬蟲開始都沒有想過會有這種問題,
還好沒有做傻事不然可能已經賠到跟現在一樣窮了 (?)

3
Chil
iT邦新手 4 級 ‧ 2021-02-22 20:38:33

好文~謝謝分享
最近剛好有租屋需求~
然後城市的部分是不是還需要更改${cookie}; urlJumpIp=8 才能搜尋對應城市?
(打算搜尋北部租屋結果沒任何資料,最後亂改了這部分才正常爬到資料XD)

非常感謝你的實測,
我忘記那個變數了…超抱歉,
馬上更新一下!

已經更新 :)
如果有需要可以直接覆蓋 Code 的部分就好 XD
Github: https://github.com/dang113108/591_rent/blob/dev/index.js

非常感謝你!

1
YUYU
iT邦新手 5 級 ‧ 2021-03-17 12:01:15

好強XD

Thanks :)
希望對你有幫助

1
leeyeeee
iT邦新手 5 級 ‧ 2021-03-31 18:24:55

推好文!!
最近剛好有租屋需求,這對我這個新手也很友善

但我實作的時候有遇到一個問題,在check_rent_item_no_duplicated那裡
let list_sheet = SpreadsheetApp.getActive().getSheetByName(search_sheet);
let type_array = list_sheet.getRange("M2:M").getValues();
會報錯,報錯內容:
TypeError: Cannot read property 'getRange' of null

但我把search_sheet那裡直接改成裡直接改成工作表名稱就可以了,如下:
let list_sheet = SpreadsheetApp.getActive().getSheetByName("list");

想請問為何會這樣?謝謝!

看更多先前的回應...收起先前的回應...

Hi! 首先,很高興這篇文章對你有幫助
而對於你提出的問題在我測試後沒有出現同樣的錯誤,
想請問是否有動到程式的其他部分呢?

leeyeeee iT邦新手 5 級 ‧ 2021-04-02 10:34:54 檢舉

都沒有改到其他程式的地方耶
我也不知道怎麼會有這個超不合邏輯的問題XD
不過我就先暫且這樣用好了~~謝謝:D

leeyeeee iT邦新手 5 級 ‧ 2021-04-02 10:48:01 檢舉

阿阿阿!!剛剛覺得越想越不符合邏輯
突然發現我沒有把要執行的函式改成main
抱歉擾民了QQ
還是謝謝你!!

哈哈哈沒關係,我沒想到有這樣的可能性 XD
/images/emoticon/emoticon12.gif

1
leo1221
iT邦新手 5 級 ‧ 2021-06-21 00:20:44

設定完
Linenotify的推播 租屋物件圖片好像都抓不到
全部都是大大的“沒“?

Sorry, 已有其他大大協助修好這個問題, 我已經 merge 進去了

1
chunwen
iT邦新手 3 級 ‧ 2021-06-29 20:43:34

我目前也遇到圖片讀取不到問題,我看一下應該是這段程式碼問題

const response = UrlFetchApp.fetch(rent_detail_url);
  let html = response.getContentText();

  let cover_img_regex = new RegExp("    <meta property=\"og:image\" content=\"(https:\/\/hp[0-9]\.591\.com\.tw\/house\/active\/[1-9][0-9]{3}\/[0-1][0-9]\/[0-3][0-9]\/[0-9]*_765x517\.water3\.jpg)\" \/>", "gi");
flier268 iT邦新手 5 級 ‧ 2021-07-28 09:59:28 檢舉

flier268 iT邦新手 5 級 ‧ 2021-07-28 09:59:28
修好囉
https://github.com/flier268/591_rent/commit/a88560f757a6c5dd1ec2bdd330bbd8fb053abd47

Hi, 非常感謝你的協助!! 但我已 merge 另一位大大修改的版本, 抱歉前陣子比較沒有空回復/images/emoticon/emoticon02.gif

1
raywu0301
iT邦新手 5 級 ‧ 2021-08-31 13:18:05

您好,我想請問一下

我照著您提供的教學實作後,LINE Notify 沒有收到訊息,請問我有什麼方法可以 debug?

另外,我想要base on你的分享,修改成 for 購買中古屋,請問可以我會需要修改哪部份的內容呢?

希望能幫忙解答,非常感謝!!

Hi, 可以先嘗試在裡面 log 看看到底有沒有抓到訊息?
另外也可以手動 call LINE Notify 看看有沒有設定成功

中古屋的部分有大大已經 Fork 出去做了一份, 你可以參考看看
https://github.com/vance0725/591_sale

goddbird iT邦新手 5 級 ‧ 2022-01-22 01:55:10 檢舉

中古屋的部分,目前main compile會碰到問題
SyntaxError: Unexpected token < in JSON at position 0
get_sale_data @ index.gs:130
main @ index.gs:200
感覺像是Json.parse這邊出現問題

1
rinldo
iT邦新手 5 級 ‧ 2021-11-02 22:32:52

我這邊執行 main 有遇到錯誤

SyntaxError: Unexpected token < in JSON at position 0
get_rent_data @ index.gs:87
main @ index.gs:122

不知道是因為591改版了嗎

看更多先前的回應...收起先前的回應...

Hi, 目前確認的確因 591 API Change 導致暫時失效,
待有空時會進行修復, 也歡迎有能力的大大幫推 PR !!

rinldo iT邦新手 5 級 ‧ 2021-11-03 23:09:50 檢舉

再麻煩了,能力不足,幫不上忙

Hi, 我已經修好囉, 如果還有需要的話可以從頭開始再做一次試試看
有問題再麻煩回報一下, 感謝

goddbird iT邦新手 5 級 ‧ 2022-01-22 01:54:04 檢舉

1/19後,我也發現main會有問題
SyntaxError: Unexpected token < in JSON at position 0
get_sale_data @ index.gs:130
main @ index.gs:200
還請大大幫忙了

goddbird
Check 後發現是 cookie 的問題,之前都是寫死的,這次改用關鍵字去抓,你可以參考這個 commit 去改你的
https://github.com/dang113108/591_rent/commit/4d6de2f7ee527cf450f17894fcc17935062fe895

goddbird iT邦新手 5 級 ‧ 2022-01-24 08:41:23 檢舉

復活了,真的非常感謝大大
真的要來讀一下node.js了,不然都還要麻煩樓主QQ

哈哈不會,不過這應該只需要原生 js 就足夠了,當然能夠多學是好事~
期待你之後可以開 PR 幫忙修 哈哈哈

1
rinldo
iT邦新手 5 級 ‧ 2021-12-18 19:02:24

非常感謝老大改好了,目前可以正常使用。我看了一下作者的SCRIPT,rent_item 存著某個物件的資料。

我現在想要多放一些資訊在line裡面,初步是可以做到另設變數來存放。這部分是沒問題的。但是現在卡在 rent_item 這一串
rent_tag=[{id=1, name=屋主直租}, {id=16, name=新上架}, {id=3, name=拎包入住}, {id=10, name=有電梯}, {name=隨時可遷入, id=5}, {id=6, name=可開伙}]

這串裡面的資料,像有無電梯、能否開伙,也想放在line訊息裡。不知道這該用什麼方式擷取呢

主要是透過 get_rent_result() 先去撈他的 API 回來,然後在 get_formated_rent_info() 格式化 API response,所以你可以在這邊看他的 API 回了哪些東西回來,然後把你要的東西塞進 tmp_array (要放在 Google sheet 上的資訊) 跟 line_message (會傳到 line 的訊息) 這兩個 Array 裡面

0
cho010012
iT邦新手 5 級 ‧ 2022-02-21 13:20:16

推好文
但目前遇到篩選條件為桃園市/有車位/租金10000-20000時
執行main時出現以下錯誤
TypeError: Cannot read property '1' of null
get_region_from_query @ index.gs:87
get_rent_result @ index.gs:141
get_rent_data @ index.gs:126
main @ index.gs:163
不知道是我哪些function要做修改呢?

看更多先前的回應...收起先前的回應...
cho010012 iT邦新手 5 級 ‧ 2022-02-23 07:52:32 檢舉

發現可能是network貼的url複製錯誤 已改過就可以跑了

好的~抱歉沒能即時回覆

cho010012 iT邦新手 5 級 ‧ 2022-02-25 10:20:33 檢舉

感謝!! 最近在延伸 利用下班的時候 修改您的code爬中古車網站 目前還在嘗試中

/images/emoticon/emoticon31.gif

0
msn174
iT邦新手 5 級 ‧ 2022-04-07 14:13:13

謝了 超有用 但因為line現在網址會有跳圖片 所以我就把payload的圖片刪了 感覺可以找到房ㄌ 讚

剛看了一下,手機有縮圖但電腦版沒有,所以如果會有需要用電腦版看的話可能還是留著比較好XD

msn174 iT邦新手 5 級 ‧ 2022-04-09 20:26:52 檢舉

確實 好像是 但是說為啥要設置notificationDisabled 一直沒跳通知還以為是我line的問題 原來還有這種操作

msn174 iT邦新手 5 級 ‧ 2022-04-09 20:30:49 檢舉

台大附近的房特難搶 非天龍人想一跳通知就電話過去搶第一個看房ㄌ 坐過去要快兩小時阿... 被搶好幾次ㄌQQ

0
s24966904
iT邦新手 5 級 ‧ 2022-04-19 20:34:15

太贊了!! ~~ 我居然也會
希望大大能夠多一些gas實例教學,多跟您學習/images/emoticon/emoticon08.gif

看更多先前的回應...收起先前的回應...
s24966904 iT邦新手 5 級 ‧ 2022-04-19 20:42:40 檢舉

/images/emoticon/emoticon08.gif

Hi! 剛好看到信件,不曉得方不方便把 search_city & search_query 這兩行貼出來給我看一下?感謝
因為我目前在跑都正常 QQ

s24966904 iT邦新手 5 級 ‧ 2022-04-19 20:54:19 檢舉

你回復太快了吧~這個回覆好像不能收回, 我剛查一下,已經用好了,感謝你

哈哈哈真的剛好收信看到通知,沒問題!

0
c366
iT邦新手 5 級 ‧ 2023-03-03 14:17:15

請問這也適用追蹤591廠房出租嗎?或者需要修改哪些部分?

0
慌張君
iT邦新手 5 級 ‧ 2023-04-01 15:44:30

我在今天解析了 cookie 裡面有看到另外一組 key

urlJumpIpByTxt=%E5%8F%B0%E5%8C%97%E5%B8%82

是 urlencode 解碼後可以拿到 台北市
ref: https://www.urldecoder.org/


噢, 我看到程式碼裡面有了 XD

0
arsehole
iT邦新手 2 級 ‧ 2023-04-02 09:48:42

謝謝您!我的租屋超人
這個優點就真的是不用搞個vpc或者是主機上

現在591屋量算多,但另外一家租租通也逐漸變多了
不知道租租通能不能爬

不過我都是用mixrent條件可以下到路段
不知道mixrent能不能這樣做
照片對我來說沒有太重要,都要點進去看

0
dsa5540317
iT邦新手 5 級 ‧ 2023-09-11 13:38:10

請問最近使用會出現
Exception: Request failed for https://rent.591.com.tw returned code 403. Truncated server response:

0
alanno1
iT邦新手 5 級 ‧ 2023-09-15 08:42:37

從9/10號開始會出現此錯誤, 看起來是get_csrf_token抓不到東西,請問有大大知道怎麼修改嗎?
Exception: Request failed for https://sale.591.com.tw returned code 404. Truncated server response:

看更多先前的回應...收起先前的回應...
alanno1 iT邦新手 5 級 ‧ 2023-09-15 08:43:18 檢舉

Exception: Request failed for https://sale.591.com.tw returned code 404. Truncated server response:

也遇到一樣問題

rex0220 iT邦新手 4 級 ‧ 2023-09-25 10:07:44 檢舉

有解嗎...

alanno1 iT邦新手 5 級 ‧ 2023-10-20 16:38:14 檢舉

今天好像忽然正常了

我要留言

立即登入留言