外卖菜单转换

获取美团/饿了么/百度外卖菜单页并指定格式输出

目前為 2016-12-16 提交的版本,檢視 最新版本

// ==UserScript==
// @namespace    undefined
// @version      1.2.0

// @name         外卖菜单转换
// @description  获取美团/饿了么/百度外卖菜单页并指定格式输出

// @run-at       document-end
// @include      *://waimai.meituan.com/restaurant/*
// @include      *://i.waimai.meituan.com/restaurant/*
// @include      *://waimai.baidu.com/waimai/shop/*
// @include      *://client.waimai.baidu.com/mobile/waimai*
// @include      *://h5.ele.me/shop/*
// @include      *://www.ele.me/shop/*


// @author       freeshine<[email protected]>

// @copyright  2016
// ==/UserScript==
(function () {
    'use strict';
    /**
     * 美团外卖PC版
     */
    function getMeituanMenu(btn, textarea) {
        let info = '';
        const category = document.querySelectorAll('.food-nav .category');
        for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
            const foodTypeName = category[i].querySelector('.title > span').textContent.trim();
            info += '#' + foodTypeName + '\n';

            const item = category[i].querySelectorAll('.pic-food');
            for (let j = 0, itemLength = item.length; j < itemLength; j++) {
                const foodName = item[j].querySelector('.np .name').getAttribute('title').trim();
                const foodPrice = item[j].querySelector('.labels .price .only').textContent.split('/')[0].substring(1).trim();
                info += assembleItem(foodName, foodPrice);
            }
        }
        setInfo(textarea, info);
    }

    /**
     * 美团外卖手机版
     */
    function getMeituanMobileMenu(btn, textarea) {
        let info = '';
        const category = document.querySelectorAll('.foodlistwrap .foodlist');
        for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
            const foodTypeName = category[i].querySelector('.foodlist-label').textContent.trim();
            info += '#' + foodTypeName + '\n';

            const item = category[i].querySelectorAll('.fooditem');
            for (let j = 0, itemLength = item.length; j < itemLength; j++) {
                const foodName = item[j].getAttribute('data-foodname').trim();
                const foodPrice = item[j].getAttribute('data-price').trim();
                info += assembleItem(foodName, foodPrice);
            }
        }
        info = info.replace('APP下单优惠菜品', '折扣');
        setInfo(textarea, info)
    }

    /**
     * 百度外卖PC版
     */
    function getBaiduMenu(btn, textarea) {
        let info = '';
        const category = document.querySelectorAll('.menu-list .list-wrap');
        for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
            const foodTypeName = category[i].querySelector('.list-status .title').textContent.trim();
            info += '#' + foodTypeName + '\n';

            const item = category[i].querySelectorAll('.list-item');
            for (let j = 0, itemLength = item.length; j < itemLength; j++) {
                const foodName = item[j].querySelector('h3').getAttribute('data-title').trim();
                const foodPrice = item[j].querySelector('.m-price del') ? item[j].querySelector('.m-price del strong').textContent.substring(1).trim() : item[j].querySelector('.m-price strong').textContent.substring(1).trim();
                info += assembleItem(foodName, foodPrice);
            }
        }
        setInfo(textarea, info);
    }

    /**
     * 百度外卖手机版
     */
    function getBaiduMobileMenu(btn, textarea) {
        let info = '';
        const category = document.querySelectorAll('#shopmenu-category .list-item a');
        const categoryGroup = document.querySelectorAll('#shopmenu-list .listgroup')

        for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
            const foodTypeName = category[i].textContent.trim();
            info += '#' + foodTypeName + '\n';

            const item = categoryGroup[i].querySelectorAll('.list-item');

            for (let j = 0, itemLength = item.length; j < itemLength; j++) {
                const foodName = item[j].querySelector('.title').textContent.trim();
                const foodPrice = item[j].querySelector('s') ? item[j].querySelector('s').textContent.substring(1).trim() : item[j].querySelector('.price').textContent.substring(1).trim();
                info += assembleItem(foodName, foodPrice);
            }
        }
        setInfo(textarea, info)
    }

    /**
     * 饿了么PC版
     */
    function getElemeMenu(btn, textarea) {
        let info = '';
        const category = document.querySelectorAll('.shopmenu-main .shopmenu-list');
        for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
            const foodTypeName = category[i].querySelector('.shopmenu-title').textContent.split(' ')[0].trim();
            info += '#' + foodTypeName + '\n';

            const item = category[i].querySelectorAll('.shopmenu-food');
            for (let j = 0, itemLength = item.length; j < itemLength; j++) {
                const foodName = item[j].querySelector('.shopmenu-food-name').textContent.trim();
                const foodPrice = item[j].querySelector('.shopmenu-food-price').textContent.trim();
                info += assembleItem(foodName, foodPrice);
            }
        }
        setInfo(textarea, info)
    }

    /**
     * 饿了么手机版
     */
    function getElemeMobileMenu(btn, textarea) {
        let info = '';
        const category = document.querySelectorAll('.menu-list dl');
        for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
            const foodTypeName = category[i].querySelector('dt strong').textContent.trim();
            info += '#' + foodTypeName + '\n';

            const item = category[i].querySelectorAll('dd');
            for (let j = 0, itemLength = item.length; j < itemLength; j++) {
                const foodName = item[j].querySelector('.foodtitle span').textContent.trim();
                const foodPrice = item[j].querySelector('.foodprice .foodprice-origin') ? item[j].querySelector('.foodprice .foodprice-origin').textContent.trim() : item[j].querySelector('.foodprice span').textContent.trim();
                info += assembleItem(foodName, foodPrice);
            }
        }
        setInfo(textarea, info)
    }

    /**
     * 创建页面组件
     */
    function createComponent() {
        const body = document.body;
        const wmWrap = document.createElement('div');
        wmWrap.style.cssText = 'position:fixed;z-index:9999;left:0;bottom:0px;background:#fff;width:180px;height:340px;font-size:14px;';

        const btn = document.createElement('button');
        btn.style.cssText = 'background:#fff;width:100%;height:40px;';
        wmWrap.appendChild(btn);

        const textarea = document.createElement('textarea');
        textarea.style.cssText = 'width:100%;height:300px;box-sizing: border-box;';
        wmWrap.appendChild(textarea);

        body.appendChild(wmWrap);

        return {
            btn,
            textarea
        };
    }

    /**
     * 按格式 组装name price
     */
    function assembleItem(name, price) {
        return name + ' ' + formatPrice(price) + '\n';
    }

    function setInfo(area, info) {
        area.value = info;
        GM_setClipboard(info);
    }

    function formatPrice(price) {
        return price.replace(/起/g, '');

    }

    /**
     *
     *
     */
    function judgeHostAndSetComponent(host, btn, textarea) {
        switch (host) {
            case 'i.waimai.meituan.com':
                btn.innerHTML = '美团外卖菜单手机版';
                btn.addEventListener('click', getMeituanMobileMenu.bind(this, btn, textarea), false);
                break;
            case 'waimai.meituan.com':
                btn.innerHTML = '美团外卖菜单PC版';
                btn.addEventListener('click', getMeituanMenu.bind(this, btn, textarea), false);
                break;
            case 'client.waimai.baidu.com':
                btn.innerHTML = '百度外卖菜单手机版';
                btn.addEventListener('click', getBaiduMobileMenu.bind(this, btn, textarea), false);
                break;
            case 'waimai.baidu.com':
                btn.innerHTML = '百度外卖菜单PC版';
                btn.addEventListener('click', getBaiduMenu.bind(this, btn, textarea), false);
                break;
            case 'h5.ele.me':
                btn.innerHTML = '饿了么菜单手机版';
                btn.addEventListener('click', getElemeMobileMenu.bind(this, btn, textarea), false);
                break;
            case 'www.ele.me':
                btn.innerHTML = '饿了么菜单PC版';
                btn.addEventListener('click', getElemeMenu.bind(this, btn, textarea), false);
                break;
            default:
                textarea.value = '你在一个无法识别的网站';
        }
    }

    function init() {
        const {
            btn,
            textarea
        } = createComponent();

        judgeHostAndSetComponent(location.host, btn, textarea);

    }

    init();
})()