Greasy Fork

来自缓存

Greasy Fork is available in English.

外卖菜单转换

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @namespace    undefined
// @version      1.2.10

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

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


// @author       freeshine<[email protected]>

// @homepageURL  https://github.com/nnecec/some-demo/blob/master/Function/waimaiTransform.js
// @supportURL   https://github.com/nnecec/some-demo/issues

// @grant    GM_setClipboard

// @copyright  2018
// ==/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++) {
        let foodName = item[j].querySelector('.np .name').getAttribute('title').trim();
        let foodPrice = item[j].querySelector('.labels .price .only').textContent.split('/')[0].substring(1).trim();
        const numberFlag = foodPrice.search(/[^[0-9].?[0-9]]/)
        if(numberFlag> 0){
          foodName = foodName+ foodPrice.slice(numberFlag,foodPrice.length)
          foodPrice = foodPrice.slice(0,numberFlag)
        }
        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++) {
      if (category[i].querySelector('.foodlist-label')) {
        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++) {
        let foodName = item[j].querySelector('.foodname').textContent.trim();
        let foodPrice = item[j].querySelector('.food-price').textContent.trim().slice(1);
        const numberFlag = foodPrice.search(/[^[0-9].?[0-9]]/)
        if(numberFlag> 0){
            foodName = foodName+ foodPrice.slice(numberFlag,foodPrice.length)
            foodPrice = foodPrice.slice(0,numberFlag)
        }
        info += assembleItem(foodName, foodPrice);
      }
    }
    info = info.replace('APP下单优惠菜品', '折扣');
    setInfo(textarea, info)
  }

  /**
   * 百度外卖PC版
   */
  function getBaiduMenu(btn, textarea) {
    let info = '';
    const category = document.querySelectorAll('.list-wrap');
    for (let i = 0, categoryLength = category.length; i < categoryLength; i++) {
      let foodTypeName = '';
      if (category[i].querySelector('.list-status .title')) {
        foodTypeName = category[i].querySelector('.list-status .title').textContent.trim();
      } else if (document.querySelector('.filter-item.cur')) {
        foodTypeName = document.querySelector('.filter-item.cur .item-name').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();
        let foodPrice = '';
        if (item[j].querySelector('.m-price del')) {
          foodPrice = item[j].querySelector('.m-price del strong').textContent.substring(1).trim()
        } else if (item[j].querySelector('.m-price strong')) {
          foodPrice = item[j].querySelector('.m-price strong').textContent.substring(1).trim()
        } else if (item[j].querySelector('.m-break strong')) {
          foodPrice = item[j].querySelector('.m-break 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;right: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();
})()