Donut App 分享到微信记录

donut app 的微信分享

  1. 需要在 wxml文件中设置按钮的 open-type='share'
    和新建两个 canvas 标签

<button class="sharetowechat" open-type="share" bindtap="sharetowechat">
  <view class="sharetext">分享给朋友</view>
</button>Ï

<canvas id="myShareCanvas" canvas-id="myShareCanvas" type="2d" style="width: 100%; height: 200px;position:fixed;top:-1000px"></canvas>
<canvas id="myShareCanvasDefault" canvas-id="myShareCanvasDefault" type="2d" style="width: 100%; height: 200px;position:fixed;top:-1000px"></canvas>

      2.在 js文件中对 sharetowechat 事件进行编辑,分享的事件叫做                                wx.miniapp.shareMiniProgramMessage,其中有一个参数 imagePath,用做于分享后的图片         展示,这个参数还不能使用网络图片,所以最大的问题就在这里。
        
      3.我先尝试了使用 wx.compressImage 压缩接口来处理,可以成功的获取到能使用的图片地              址,虽然经过压缩,但图片还是太大,wx.miniapp.shareMiniProgramMessage这个接受的图          片最大限度为 128k,所以在压缩方法下加了下面两个参数,大小是符合了,但出来的图片太模糊了。所以这个方法不行。

      4.定睛一想,现在要做的是将图片转成符合的格式,并且大小要在 128k之下,所以想到了用 canvas 的方式来处理图片,就有了下面的方法。


async function refCanvas(target, id) {
  return new Promise((resolve) => {
    target
      .createSelectorQuery()
      .select(id)
      .fields({ node: true, size: true })
      .exec((res) => resolve(res?.[0]));
  });
}

async function initCanvas(target, id) {
  const res = await refCanvas(target, id);
  const canvas = res.node;
  const context = canvas.getContext('2d');

  const dpr = wx.getSystemInfoSync().pixelRatio;
  canvas.width = res.width * dpr;
  canvas.height = res.height * dpr;
  context.scale(dpr, dpr);
  return {
    context,
    canvas,
  };
}

  let imageUrl // 这个是你需要进行转化的 URL

  const { context, canvas } = await initCanvas(target, '#myShareCanvas');

  //以上,先生成对应的 canvas 容器


  const imageInfo = await new Promise((resolve, reject) => {
    wx.getImageInfo({
      src: imageUrl,
      success: resolve,
      fail: reject,
    });
  }); //获取一下图片的初始信息
  const width = imageInfo.width;
  const height = Math.floor(width / 1.25);
  const dpr = wx.getSystemInfoSync().pixelRatio;
  const w = width * dpr;
  const h = height * dpr;
  canvas.width = w;
  canvas.height = h;
  context.scale(dpr, dpr);
  const image = canvas.createImage();
  image.onload = () => {
    //画图,截取对应你需要的尺寸
    context.drawImage(image, 0, 0, width, 1000, 0, 0, width, 1000);
    setTimeout(()=>{
      //导出, 这里注意,如果 canvas 那里设置了 display: none,这个导出在真机测试的时候会失 
      //败,但在模拟器上不会,这里是个坑.
      //fileType: 'jpg',这里必须这么设置,否则在一些安卓机型当中,会出现裁剪后图片大于128k的提 
      //示
      wx.canvasToTempFilePath({
        canvas: canvas,
        canvasId: "#myShareCanvas",
        destWidth: 500,
        destHeight: 400,
        fileType: 'jpg',
        complete: (res) => {
          const tempFilePath = res.tempFilePath;
          wx.compressImage({
            src: tempFilePath || imageUrl, // 图片路径
            quality: 80, // 压缩质量
            complete: (res) => {
              console.log(res, 'compressImage res mini');
              const isSuccess = res.errMsg === 'compressImage:ok';
              //defaultShareImgValue这个是弄了个默认的图片,操作方式和这个方法类似,这就是为 
              //什么一开始创建了两个 canvas,第二个就是给默认图片使用的,导出失败时,可以使用默 
              //认图片进行分享
              wx.miniapp.shareMiniProgramMessage({
                // 注: 小程序原始id 不是小程序 appid,通常是 gh_xxx 开头的内容
                userName,
                title:'标题',
                path:'跳转的地址',
                imagePath: isSuccess ? res.tempFilePath : defaultShareImgValue,
                webpageUrl:'',
                withShareTicket: true,
                miniprogramType: 1,
                scene: 0,
                success(res) {
                  showToast('分享成功')
                  console.log(res);
                },
                fail(e) {
                  console.log(e, 'err');
                },
              });
            },
          });
        },
        fail(err) {
          showToast('分享失败,请稍后重试!');
          console.log(err, 'canvasToTempFilePath err');
        },
      });
    },100)
  };
  image.src = imageUrl;

所以,以上就是解决分享的问题,经测试,压缩过后的图片大小只有 10 几 k,清晰度也并没有受影响。

     

### Wechaty与Node.js结合使用 #### 安装环境准备 为了确保开发环境能够顺利运行Wechaty项目,需先安装Node.js并设置好NPM源。对于国内开发者来说,可以采用淘宝镜像来加速下载过程[^4]。 ```bash npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao.org/dist npm config set puppeteer_download_host https://npm.taobao.org/mirrors ``` #### 创建基础HTTP服务器并与WebSocket集成 创建一个简单的HTTP服务器,并通过`socket.io`实现客户端和服务端之间的实时通信。这一步骤有助于构建更复杂的应用程序结构,在实际应用中可能用于处理来自不同前端页面的消息传递需求[^3]。 ```javascript // 引入必要的模块 const express = require('express'); const http = require('http'); // 初始化Express实例 let app = express(); // 创建HTTP服务 let server = http.createServer(app); /** * Create socket.io server. */ var io = require('../socketio'); io.getSocketio(server); ``` #### 集成Wechaty库 接下来就是核心部分——引入Wechaty库来进行微信机器人的开发工作。这里展示了一个基本的例子,展示了如何启动一个基于Donut Puppet的Wechaty实例。 ```javascript /** * Create puppet_donut server. */ var puppet_donut = require('../donut'); puppet_donut.run(); ``` 以上代码片段说明了如何在一个完整的应用程序框架内集成了Wechaty的功能。需要注意的是,具体项目的文件路径可能会有所不同,请根据实际情况调整导入语句中的相对路径。 #### 实际案例:每日定时发送温馨消息 考虑到某些特定应用场景的需求,比如想要编写一段脚本来定期向指定联系人发送问候信息,则可以通过设定定时器的方式配合Wechaty API轻松达成目标。 ```javascript const { Wechaty } = require('wechaty') async function main() { const bot = new Wechaty() await bot.start() console.log('机器人已上线') } main().catch(console.error) bot.on('login', async user => { console.log(`${user} 登录成功`) }) bot.on('friendship', async friendship => { if (friendship.type() === Friendship.Type.Receive) { await friendship.accept() console.log(`好友请求已被接受`) } }) ``` 上述代码实现了登录事件监听以及自动接收好友申请的功能。要实现定时发送消息的任务,可以在适当位置加入时间调度逻辑(例如利用node-schedule包),并通过调用Contact.say方法完成消息推送操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值