外卖菜单转换

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

目前为 2016-12-16 提交的版本,查看 最新版本

// ==UserScript==
// @namespace    undefined
// @version      1.1.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);
                info = info.replace('起', '');
            }
        }
        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 : item[j].querySelector('.m-price strong').textContent;
                info += assembleItem(foodName, foodPrice.substring(1).trim());
            }
        }
        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 : item[j].querySelector('.price').textContent;
                info += assembleItem(foodName, foodPrice.substring(1).trim());
            }
        }
        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 btn = document.createElement('button');
        btn.style.cssText = "position:fixed;z-index:9999;left:0;bottom:400px;background:#fff;width:120px;height:40px;";
        btn.classList.add('wm-btn');
        body.appendChild(btn);

        const textarea = document.createElement('textarea');
        textarea.style.cssText = "position:fixed;z-index:9999;left:0;bottom:0px;height:380px;";
        body.appendChild(textarea);
        return {
            btn,
            textarea
        };
    }

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

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

    /**
     *
     *
     */
    function judgeHostAndSetComponent(host, btn, textarea) {
        if (host === 'i.waimai.meituan.com') {
            btn.innerHTML = '美团外卖菜单手机版';
            btn.addEventListener('click', getMeituanMobileMenu.bind(this, btn, textarea), false)
        } else if (host === 'waimai.meituan.com') {
            btn.innerHTML = '美团外卖菜单PC版';
            btn.addEventListener('click', getMeituanMenu.bind(this, btn, textarea), false)
        } else if (host === 'client.waimai.baidu.com') {
            btn.innerHTML = '百度外卖菜单手机版';
            btn.addEventListener('click', getBaiduMobileMenu.bind(this, btn, textarea), false)
        } else if (host === 'waimai.baidu.com') {
            btn.innerHTML = '百度外卖菜单PC版';
            btn.addEventListener('click', getBaiduMenu.bind(this, btn, textarea), false)
        } else if (host === 'h5.ele.me') {
            btn.innerHTML = '饿了么菜单手机版';
            btn.addEventListener('click', getElemeMobileMenu.bind(this, btn, textarea), false)
        } else if (host === 'www.ele.me') {
            btn.innerHTML = '饿了么菜单PC版';
            btn.addEventListener('click', getElemeMenu.bind(this, btn, textarea), false)
        }
    }

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

        judgeHostAndSetComponent(location.host, btn, textarea);

    }

    init();
})()