使用Node.js实现Yahoo奇摩拍卖的拍卖提醒功能

为了什么

我想要自動化Yahoo奇摩拍賣的搜尋,所以我利用這個腳本和GoogleAppsScript來完成每天的研究自動化。

请在中文中进行重述:

“フロー”

将下面的JSON内容发送到服务器上

{
    "data": {
        "keyword": "ヤフオクで検索するキーワード",
        "limit_purchase_price": "価格上限を指定(任意)",
        "already_checked_auction_ids": "すでにチェック済のオークションIDをカンマ区切りで指定(任意)"
    }
}

在服务器上访问和爬取Yahoo拍卖网站,并以逗号分隔的字符串形式返回新拍卖的ID。

执行环境 (shí

・Node.js 8.9.4
・npm 5.6.0
・在Heroku上进行部署

结构

因为只有两个文件,所以它们在同一个目录下。

– 服务器.js
– 新拍卖通知.js

事前准备
– Chinese paraphrase option 1: 预先准备

・模块安装

npm install --save express
npm install -save body-parser
npm install --save cheerio-httpcli

符合

服务器.js

"use strict";
const express = require('express');
const body_parser = require('body-parser');
const newAuctionAlert = require('./newAuctionAlert');
const app = express();

//***サーバー作成***
const server = app.listen(process.env.PORT || 3000, function() {
    console.log("server listening..");
});

//***express設定***
app.use(body_parser.urlencoded({
    extended: true,
    limit: '5KB'
}));
app.use(body_parser.json({
    limit: '5KB'
}));

//***expressルーティング***
app.post('/newAuctionAlert', async(req, res, next) => {
    const data = req.body.data;
    if (data.keyword) {
        const itemData = JSON.parse(req.body.data);
        const new_auction_ids = await newAuctionAlert.main(data);
        res.status(200).send(new_auction_ids); //カンマ区切り
    } else {
        res.status(404).send('キーワードの指定は必須です');
    }
});

新的拍卖警报.js

"use strict";
const cheerio = require('cheerio-httpcli');

async function main(data) {
    return new Promise(async(resolve, reject) => {

        //***1. オークションページのHTMLを取得***
        cheerio.fetch(
            'https://auctions.yahoo.co.jp/search/search', {
                p: data.keyword.replace(/\+/g, ' '), //検索キーワード
                s1: 'end', //残り時間が長い順
                o1: 'd',
                ngram: 1, //あいまい検索
                istatus: 2, //中古のみで検索
                fixed: 0,
                ei: 'UTF-8',
                auccat: 0,
                slider: 0,
                tab_ex: 'commerce',
            }).then((res) => {
            //*** 2. 検索結果が存在すれば、価格が条件にマッチしているものをnew_auction_idsに追加する***
            const enddate_elms = res.$('.ti'); //オークション終了まで○日の部分
            const new_auction_ids = [];
            const already_checked_auction_ids_array = data.already_checked_auction_ids.split(/\,/g);

            if (enddate_elms.first().text() !== "") { //検索結果最上位の終了日を取得 検索結果が無ければ""
                enddate_elms.each(function() {
                    const $parent_dom = res.$(this).parent();
                    const auction_id = $parent_dom.find('.a1wrp').first().find('a').first().attr('href').match(/\/\w+?$/)[0].replace(/^\//, '');

                    //上限価格が設定されている場合は価格チェック
                    var price_flag = true;
                    if (data.limit_purchase_price) {
                        const auction_now_price = Number($parent_dom.find('.pr1').first().text().replace(/\D/g, ''));
                        if (data.limit_purchase_price < auction_now_price) price_flag = false;
                    }
                    //価格がOKですでにチェック済のオークションで無ければ新しいオークション情報として登録
                    if (price_flag && already_checked_auction_ids_array.indexOf(auction_id) === -1) new_auction_ids.push(auction_id);
                });
            }
            resolve(new_auction_ids.join());
        }).catch((e) => {
            reject(e);
        });

    });
}

exports.main = main;

广告
将在 10 秒后关闭
bannerAds