因为住的地方离公司太远,每天上下班都要坐很久的班车,所以最近想搬到公司旁边的皖水公寓住。去问了一下公寓的客服,客服说房源现在没有了,只能等到别人退房,才能在网站上申请到。

如果纯靠手动F5刷新浏览器,来捡漏可入住房源,那简直是太难了。要知道很多人都在电脑前面按着F5,感觉和春运抢票一样。

所以就准备写一个脚本来监测房源,解放双手。

平时对node.js用的比较多,所以就用node.js来写,怎么方便咱怎么搞。

一.房源信息抓取

通过对公寓申请网站的数据分析,找到了房源列表的接口地址。

二.数据获取

1.首先我们先要在电脑上安装node,node安装我就不写了,网上一大堆教程。

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++
// }, 30000)

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

在命令行 输入

node app.js

这样就可以自动刷房源了。

测试了一下,效果很好

使用node自动刷房源并发送可入住房源到邮箱的更多相关文章

  1. HDU 自动刷题机 Auto AC (轻轻松松进入HDU首页)

    前言: 在写这篇文章之前,首先感谢给我思路以及帮助过我的学长们 以下4篇博客都是学长原创,其中有很多有用的,值得学习的东西,希望能够帮到大家! 1.手把手教你用C++ 写ACM自动刷题神器(冲入HDU ...

  2. 手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页)

    转载注明原地址:http://blog.csdn.net/nk_test/article/details/49497017 少年,作为苦练ACM,通宵刷题的你 是不是想着有一天能够荣登各大OJ榜首,俯 ...

  3. 三极管的妙用之C118自动刷机

    首先咱们要搞清楚咱们自动刷机的原理,不谈修改固件那么高深的东西,简单的就是控制开机键. 使用继电器来控制基本上算是上个世纪的想法吧,之前博主也做过,做出来的感觉其实也很不错,就像是一个收藏品.因为继电 ...

  4. 狗扑论坛 自动刷取VIP狗粮

    狗扑论坛 自动刷取VIP狗粮 开始闲狗粮回复太慢就自己想了想去写一个,成功总是给我的哈哈. 自己花了一小时 时间慢慢学就慢慢写的  虽然代码简单 但是已经够自己用了 using System; usi ...

  5. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  6. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

  7. BZOJ_4590_[Shoi2015]自动刷题机_二分答案

    BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...

  8. Python-王者荣耀自动刷金币+爬取英雄信息+图片

    前提:本文主要功能是 1.用python代刷王者荣耀金币 2.爬取英雄信息 3.爬取王者荣耀图片之类的. (全部免费附加源代码) 思路:第一个功能是在基于去年自动刷跳一跳python代码上面弄的,思路 ...

  9. Node.js 0.12: 正确发送HTTP POST请求

    Node.js 0.12: 正确发送HTTP POST请求 本文针对版本:Node.js 0.12.4 之前写过一篇Node.js发送和接收HTTP的GET请求的文章,今天再写一篇,讲发送POST的请 ...

随机推荐

  1. Scratch2的离线下载与安装

    scratch是一种程序设计语言,可以用来设计 故事.动画.游戏.音乐和美术作品. Scratch主页:https://scratch.mit.edu/ Scratch的下载与安装: 首先下载并安装A ...

  2. docker~从Dockerfile到Container的过程(终于算是OK了)

    上一文章,主要介绍Dockerfile里各参数的含义,以及在项目文件里这些内容的含义,因为大叔认为官方和网上其它文章说的有些模棱两可,不太好让大家理解,所有我又从新写了一个大白话的文章,希望可以给大家 ...

  3. YAML文件解析

    YAML是“另一种标记语言”的外语缩写,YAML 是一种比JSON(json多层次{ 与 [ 会被搞晕的)更直观的表现形式,展示上更易查错和关系描述.因为不需要一个专业工具就可以排查正确性.YAML目 ...

  4. Linux工具之bc计算器进制的转换

    bc是Linux下的命令行式的计算器. 题目虽然叫任意进制,但是因为bc的限制,输入进制是2~16范围:输出进制是2~999范围.这与常见计算器的进制范围是一致的,比如windows计算器最高也只能处 ...

  5. Memcached的安装与使用

    这一段折腾了下Memcached,有所收获吧,记录一下. 1.什么是Memcached memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memca ...

  6. Es6 新增解构赋值

    1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 要想实现解构,就必须是容器,或者具有可遍历的接口. 以前,为 ...

  7. shell统计文本中单词的出现次数

    Ubuntu14.04 给定一个文本,统计其中单词出现的次数 方法1 # solution 1 grep与awk配合使用,写成一个sh脚本 fre.sh sh fre.sh wordfretest.t ...

  8. 51nod_1490: 多重游戏(树上博弈)

    题目链接 该题实质上是一个树上博弈的问题.要定义四种状态--2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必胜态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的 ...

  9. (转)log4j(四)——如何控制不同风格的日志信息的输出?

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 import org.apache.log4j.*; //by godtrue p ...

  10. (转)Oracle中的rownum,ROWID的 用法

    场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录 ...