CPS chat bot

tips: 使用微信群,推广电商商品及优惠券,机器人使用 wechaty-puppet-padplus.

简介

推广营销机器人是一个微信助手,可以帮助推广者在自己的微信群,查询优惠商品及优惠券并转发到自己所在的微信群

需求描述

1.推广者启动机器人,查询商品

  • 当推广者,发送指令查询商品类目后, 微信助手通过接口查询到商品列表。

2.查询到的商品信息,发送到微信群

  • 例如, 发送
【京东】君乐宝 涨芝士啦酸奶芝芝多莓口味 180g*12袋
京东价:¥ 59.9

-------------------
商品入口 https://union-click.jd.com/jdc?e=&p=AyIGZRhYFQARAlYeWxMyFQVcGF8dAxoCUx9rUV1KWQorAlBHU0VeBUVNR0ZbSkAOClBMW0scWRwBFg9UE14TBg1eEEcGJQdmAg9dP2tScQdSHjJIR1lmM3s9cUQeC2UeWhQDEgFdHVMXMhIGVBhSFgMSBlUraxUHIkY7HVIXBBIAZRlaFAEXD1MbXhUyEgNdG1IUAhMFUx1dFDISD1ErAEBsZ3UOTRpXVkdCPkgPJTIiBGUraxUyETcLdVpGAUFTABwLe1hBDwwSBkwEfAVWGF0cBSIFVBpZFw%3D%3D

Quick Start

新建项目

mkdir bot & cd ./bot
npm init -y

安装项目依赖

npminstall --save wechaty
npm install --save wechaty-puppet-padplus
npm install --save qrcode-terminal

开始编码

项目目录如下

- src
  - my-chat-bot.js
- config
  - config.ts
config.js

配置信息

module.exports = {
  // puppet_padplus Token
  token: "puppet_padplus_..."
}
my-chat-bot.js
/**
 * wechaty-puppet-padplus index
 */

import { Wechaty }  from 'wechaty'
import { PuppetPadplus }  from 'wechaty-puppet-padplus'
import config  from '../config/config'

// init
const bot = new Wechaty({
  puppet: new PuppetPadplus({
    token: config.token
  }),
  name: config.name
})

bot.on('scan',    onScan)
bot.on('login',   onLogin)
bot.on('logout',  onLogout)
bot.on('message', onMessage)

bot.start()
  .then(() => log.info('StarterBot', 'Starter Bot Started.'))
  .catch(e => log.error('StarterBot', e))

收商品指令

收到查询商品指令

/**
 * onMessage
 */
async function onMessage (msg: Message) {
  // log.info('StarterBot', msg.toString())

  if (msg.type() === bot.Message.Type.Text) {
    if (msg.text().includes('#查询商品:')) {
        queryJingFenGoodsAndSendMsg(msg);
    } else if (msg.text().includes('ready stop')) {
      console.log('ready stop');
    }
  }
}

查询商品
const eliteIds: Array<Number> =
[
  1, //好券商品,
  22, //热销爆品,
  2, //超级大卖场,
  10, //9.9专区,
  23, //为你推荐
];
var eliteIdIndex = 0;
/**
 * QueryJFGoodsAndSendMsg
 */
function queryJingFenGoodsAndSendMsg(msg: Message) {
  var eliteId: Number = 1;
  // 查询商品
  queryJingFenGoods(eliteId).then(res => {
    var index = 0
    if (eliteIdsIndex < eliteIds.length) {
      eliteId = eliteIds[eliteIdsIndex];
      eliteIdsIndex ++;
    } else {
        eliteIdsIndex = 0;
    }

    if (index < res.length) {
    var goods: JFGoodsInfo = res[index];
    index ++;
    // 领链
    getCpsUrl(goods).then(res => {
        var cpsInfo: CpsInfo = res;
        // 发消息
        sendPromotionMsg(msg, goods, cpsInfo)
    });
    }

  }, rej => {
    console.log('rej = ', rej);
  });

/**
 * 根据类目查询商品
 */
async function queryJingFenGoods(eliteId: Number) {
  return new Promise((resolve: (value: Array<JFGoodsInfo>) => void, reject) => {
    var uParam = {
      goodsReq: {
        pageIndex: 1,
        pageSize: pageSize,
        eliteId: eliteId
      },
    };

    requestAPI('https://router.jd.com/api', JSON.stringify(uParam))
    .then(res => {
      if (res.code === '0') {
          var dataArr = res.data;
          var list = [];
          for (let d of dataArr) {
            var goods = new JFGoodsInfo(d)
            list.push(goods);
          }

          resolve(list)
      }
    }, rej => {
        reject('Server error');
    });
  });
}

/**
 * 领链
 */
async function getCpsUrl(goodsInfo: JFGoodsInfo) {
  return new Promise((resolve: (value: CpsInfo) => void) => {
    var materialId: string = goodsInfo.materialUrl;
    // console.log('indexof http = ', materialId.indexOf('http'))
    if (materialId.indexOf('http') !== 0) {
      materialId = 'https://' + materialId;
    }
    const appId = 000000; // your app id

    var promotionCodeReq = {
      materialId: materialId,
      siteId: appId,
      positionId: 000000, // your positionId
      couponUrl: ''
    }

    var coupon = goodsInfo.coupon;
    if (coupon && coupon.link) {
      promotionCodeReq.couponUrl = encodeURIComponent(coupon.link);
    }
    var uParam = {
      promotionCodeReq
    }

    requestAPI('https://router.jd.com/api', JSON.stringify(uParam))
    .then(res => {
      if (res.code === '0') {
        var cpsInfo: CpsInfo = res.data;
        // 发品
        resolve(cpsInfo);
      }
    });
  });
}

/**
 *
 */
function sendPromotionMsg(msg: Message, goods:JFGoodsInfo, cpsInfo: CpsInfo) {
  (async () => {
    // 发商品图
    var urlInfo: UrlInfo = goods.imageInfo.imageList[0];
    if (urlInfo.url) {
      const fileBox = FileBox.fromUrl(urlInfo.url)
      await msg.say(fileBox);
    }

    // 发送商品信息
    var jd;
    if (goods.owner === 'g') {
      jd = '京东自营';
    } else {
      jd = '京东';
    }

    var text = ''+ jd +'' + goods.skuName + '\n\r'
    + '----------------' + '\n'
    + '京东价:¥ ' + goods.priceInfo.price + '\n'
    + '券后价:¥ ' + goods.priceInfo.lowestCouponPrice + '\n\r'
    + '商品入口:' + cpsInfo.clickURL

    await msg.say(text);
  })();
}

试运行

启动脚本 ‘package.json’

{
  ...

  "scripts": {
    "start": "cross-env WECHATY_LOG=verbose nodemon  my-chat-bot.ts"
  },

  ...
}

运行

npm run start

效果图

效果图

致谢

项目链接

https://github.com/wss793062366/my-padplus-bot

Author: @wss793062366 your one-line bio at here Code: @my-padplus-bot

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值