用node寫一個皖水公寓自動刷房源腳本


因為有需求,所以就寫了一個簡單的腳本來實時監測房源。

平時對node.js用的比較多,所以就用node.js來寫,怎么方便咱怎么搞。


 

2017.12.19號更新

熱心的小伙伴告訴我,房源查詢現在加了一層驗證碼,所以代碼暫時不能使用了。請大家先手動查詢吧,有時間我會看一下驗證碼的事情。

大家新年快樂!

 


 

直接提供打包好的代碼,下載下來簡單配置一些就可以運行了。前提是你的電腦要先安裝好node.js

下載地址 :鏈接: https://pan.baidu.com/s/1boEHuQN   密碼: vhic

下載完成后,修改app.js里的郵箱地址。代碼里都注釋都寫好了,修改完保存,在house目錄里雙擊 start.bat文件。

 

 

一.房源信息抓取

通過對公寓申請網站的數據分析,找到了房源列表的接口地址。(吐槽一下,這個網站做的太爛了😆)

http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816806945psc
http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816830250MuI
http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816949458BXk
http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816949458BXk

找到房源列表接口,下面就好辦了。

二.數據獲取

1.首先我們先要在電腦上安裝node,node安裝我就不寫了,網上一大堆教程。(http://jingyan.baidu.com/article/fd8044faf2e8af5030137a64.html

2.在你電腦桌面上鼠標右擊,新建文件夾,進入文件夾 然后用命令行 輸入 

npm init

然后一路enter

2.按照必要的模塊

axios(接口請求)

nodemailer(用來發送郵件到自己郵箱)
 
在命令行輸入
npm install axios -save
npm install nodemailer --save

3.開始寫代碼

const nodemailer = require('nodemailer');
const axios = require('axios') let i = 1; setInterval(()=> {  console.log(`可入住房源第${i}次查詢中...`) axios.get('http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816806945psc') .then(res=> { formatData(res.data.list, '1棟') }); axios.get('http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816830250MuI') .then(res=> { formatData(res.data.list, '2棟') }); axios.get('http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816876736sfx') .then(res=> { formatData(res.data.list, '綜合樓東') }); axios.get('http://117.71.57.99:9080/online/roomResource.xp?action=formList1&code=01&buildingCode=0011449816949458BXk') .then(res=> { formatData(res.data.list, '綜合樓西') }) i++ }, 10000) function formatData(list, info) { for (var key in list) { for (var j = 0; j < list[key].length; j++) { const roomInfo = list[key][j] let {id,status,roomFloor,roomName,roomType} = roomInfo if (status == 02 || status == 01) { axios.get(`http://117.71.57.99:9080/online/roomConfig.xp?action=getRoomConfig&roomID=${id}`).then(res => { let {itemName,roomTypeName,price,roomArea} = res.data.info; let roomDirection = res.data.roomDirection; sendEmail(info, roomFloor, roomName,roomDirection,roomTypeName,price,roomArea,itemName) }) } } } } function sendEmail(info, roomFloor, roomName,roomDirection,roomTypeName,price,roomArea,itemName) { // 開啟一個 SMTP 連接池 let transporter = nodemailer.createTransport({ host: 'smtp.163.com', secureConnection: true, // use SSL port: 465, secure: true, // secure:true for port 465, secure:false for port 587  auth: { user: '', // 你的郵箱賬號 pass: '' // QQ郵箱需要使用授權碼 //郵箱密碼  } }); // 設置郵件內容(誰發送什么給誰) let mailOptions = { from: '"xxx" <marven@163.com>', // 發件人 to: 'xxx@qq.com', // 收件人 subject: `Hello ✔有可入住的房源啦`, // 主題 text: 'search house', // plain text body html: `<b style="font-size:18px;">已為你搜到可入住的房源啦</b> <br> <p style="font-size:22px">房間信息:${info}--${roomFloor}樓--${roomName}</p> <p style="font-size:22px;color'#db384c'">房間類型:${roomTypeName}</p> <p style="font-size:22px">房間價格:${price}元/月</p> <p style="font-size:22px">房間大小:${roomArea}m²米</p> <p style="font-size:22px">房間朝向:${roomDirection}</p> <p style="font-size:22px">房間配置:${itemName}</p> <a style="font-size:18px;color:blue" href="http://117.71.57.99:9080/online/gzflogin.jtml?action=login&accountCode=xxx&accountPass=xxx">立即登錄</a>`,  }; // 使用先前創建的傳輸器的 sendMail 方法傳遞消息對象 transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log(`Message: ${info.messageId}`); console.log(`sent: ${info.response}`); }); }

然后保存為 app.js

 

踩坑細節

實踐的時候遇到許多問題,現在列舉如下,若未詳盡,敬請留言交流。

POP3/SMTP服務、獲取授權碼(以QQ為例)

首先需要開啟郵箱的 POP3/SMTP 服務。

QQ郵箱需要使用授權碼,而不是QQ密碼;163 郵箱直接使用163郵箱密碼就行。

進入QQ郵箱,設置-賬戶-開啟服務 POP3/SMTP 服務,並生成授權碼,現在獲取授權碼需要驗證手機短信。

 
 

支持郵箱

理論上支持所有主流郵箱,但我只測試了 QQ 和 163,都成功了。若其他郵箱出問題請留言交流。

535 錯誤

Error: Invalid login: 535 Error: authentication failed

認證失敗:

  • 可能是賬號密碼錯誤
  • 鏈接資源池時加 ssl:secureConnection: true,
  • QQ 的 host 是 smtp.qq.com;163 的 host 是 smtp.163.com

553 錯誤

Error: Mail command failed: 553 Mail from must equal authorized user

發件人和認證的郵箱地址不一致

  • auth.user 需要與 from 中的郵箱一致

在命令行 輸入  

node app.js

 

這樣就可以自動刷房源了。

測試了一下,效果很好

代碼已上傳到github,歡迎各位給個star      https://github.com/zhouyangit/searchHouse


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM