本篇文章就是为大家介绍一下我是如何用node去实现扫码群发功能,源代码地址在最后面

获取登录二维码 -> 扫码登录服务端

         

首先介绍一下主要流程,并附上关键代码

1.获取UUID并请求二维码图片

  调用接口:https://login.wx.qq.com/jslogin

  返回数据:code为200表示成功,并返回uuid

function getUUID(){
         var hreq = https.get('https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1508239448402',function(ress){
        ress.setEncoding('utf-8');
        var str = '';
        ress.on('end',function(){

            var regxp = new RegExp(/^""$/)
            var uuid = str.split('"')[1];
            console.log('uuid=='+uuid)
            var img = '<img src="https://login.weixin.qq.com/qrcode/'+uuid + '"/>'
            res.send(img)
            getTicket(uuid)

        });
        ress.on('data',function(chunk){
            str+=chunk;
        });
         });
    }

2,通过uuid轮训获取ticket

  调用接口:https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login

  如果返回code是200,表示用户扫码,返回的信息redirect_uri中有登录微信用的ticket等信息

function getTicket(uuid){
        var hreq = https.get('https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid='+uuid+'&tip=0&r=-880061546&_='+Date.now(),function(ress){
        ress.setEncoding('utf-8');
        var str = '';
        ress.on('end',function(){
            console.log('请求ticket。。。。。。');
            console.log(str);
            var code = str.split(';')[0].split('=')[1];
            console.log('code='+code);
            if(code == 200){
                if(str.match(/wx2.qq.com/) != null) {
                    wx2 = "2";
                    headers.Host = "wx2.qq.com";
                    headers.Referer = "https://wx2.qq.com/"
                }
                var ticket = str.split('ticket=')[1].split('&uuid')[0];
                console.log('ticket=' + ticket);
                getPassTicket(ticket,uuid);
            }else if(code == 408 || code==201){
                getTicket(uuid);
            }else{
                console.log(str);
                console.log('超时');
            }

        });
        ress.on('data',function(chunk){
            str+=chunk;
        });
         });
    }

3. 获取微信登录唯一标志信息wxsid、skey、pass_ticket

  调用接口:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage

  返回信息wxsid、skey、pass_ticket,并且会把cookie种植上

  到这一步获取到的信息,在后面所有的请求将畅行无阻

function getPassTicket(ticket,uuid){
        request.get({
          url:'https://wx'+wx2+'.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket='+ticket+'&uuid='+uuid+'&lang=zh_CN&scan='+parseInt(Date.now())+'&fun=new&version=v2&lang=zh_CN',
        }, function(error, response, body){
            console.log('请求PassTicket------->>>>>>>>');
            console.log(body);
            var str = body.toString();
        pass_ticket = str.split('<pass_ticket>')[1].split('</pass_ticket>')[0];
        skey = str.split('<skey>')[1].split('</skey>')[0];
        sid = str.split('<wxsid>')[1].split('</wxsid>')[0];
        uin = str.split('<wxuin>')[1].split('</wxuin>')[0];
        setCookie(response.headers['set-cookie'])
        wxInit()
        });
    }

4.获取联系人列表,并群发消息

  联系人列表调用接口:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact

  返回所有用户联系人信息,每个用户都有此次登录中唯一的ID

 

  发送消息调用接口:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg

  如果BaseResponse.ErrorMsg为空,表示消息发送成功

function getAllUsers(){
        request.get({
            headers: headers,
          url:'https://wx'+wx2+'.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket='+pass_ticket+'&r='+Date.now()+'&seq=0&skey='+skey
        }, function(error, response, body){
            console.log('getAllUsers..........')
            console.log(body)
          var list = JSON.parse(body).MemberList;
          console.log(list.length)
          for (var i = 0; i < list.length; i++) {
              var member = list[i];
                console.log(member.NickName,member.UserName);
                // 群发消息要慎重
              // if(member.NickName == '北风吹雪') {
                   // postMsg(myUserName,member.UserName,'消息内容');
                   // break;
              //  }
          }
        });
    }

源代码GitHub地址https://github.com/ColdDay/wxPro(如果对你有帮助请给个star✨,星星到位了后面才会有更有趣的功能,)

node实现微信扫码群发消息《附上github代码》的更多相关文章

  1. C#开发微信门户及应用(45)--微信扫码登录

    在前面随笔<C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理>介绍了基于微信开放平台接口实现的微信扫码直接登录的过程.本篇介绍对扫码登录的一些改进和处理,以便更方便应用在实 ...

  2. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  3. 第三方登录:微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  4. PC 端微信扫码注册和登录

    一.前言 先声明一下,本文所注重点为实现思路,代码及数据库设计主要为了展现思路,如果对代码效率有着苛刻要求的项目切勿照搬. 相信做过微信开发的人授权这块都没少做过,但是一般来说我们更多的是为移动端的网 ...

  5. Net MVC微信扫码支付

    微信扫码支付+Asp.Net MVC 这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下. 一.准备工作 使用的微信API中的统一下单方法,关键的 ...

  6. asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1

    2018-08-13更新生成二维码的方法 在做微信支付前,首先要了解你需要什么方式的微信支付,目前本人做过的支付包含扫码支付.H5支付.公众号支付.App支付等,本人使用的是asp.net mvc c ...

  7. 微信扫码支付springboot版本

    发布时间:2018-11-06   技术:springboot+freemarker   概述 该项目是一个采用springboot构建的web项目,主要实现了微信扫码支付功能.包含最基本的创建订单, ...

  8. ThinkPHP微信扫码支付接口

    最近折腾微信扫码支付,看了微信官方文档,找了很多网页,发现和文档/demo不匹配,现在自己算是弄出来了(文件名称有所更改),贴出来分享一下 一.将有用的官方lib文件和使用的相关文件放置到vendor ...

  9. Web应用多账号系统设计及微信扫码登录实现

    Web应用多账号系统设计及微信扫码登录实现 1   前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...

随机推荐

  1. C#线程等待句柄

    相互排斥对象 Mutex private Mutex m = new Mutex(); public void Method(){ m.WaitOne(); //运行操作 m.ReleaseMutex ...

  2. Creational模式之Builder模式

    1.意图 将一个复杂对象的构建与它表示分离,使得相同的构建过程能够创建不同的表示. 查看很多其它请点击 2.别名 无 3.动机 一个RTF(Rich Text Format)文档交换格式的阅读器应能将 ...

  3. Hibernate常见问题 No row with the given identifier exists问题的解决办法及解决

    (1)在学习Hibernate的时候遇到了这个问题"No row with the given identifier exists"在网上一搜看到非常多人也遇到过这个问题! 问题的 ...

  4. 使用javaMail和velocity来发送模板邮件

    之前在ssh项目中有用过javaMail和velocity来发送邮件,实现的效果如下所示. 这类邮件主要用于公司的推广宣传,比如商城的促销等场景. 今天打算将邮件模块也集成到ssm项目,也算是对之前做 ...

  5. android studio 使用adb命令传递文件到android设备

    一:文件传输 在android开发中,有时候需要将文件从pc端传递至android,或者将软件运行的日志,从android设备传递到pc进行分析,我们可以使用windows的cmd窗口,或者andro ...

  6. 微信小程序——轮播图实现

    小程序的轮播图,也就是他其中的一个控件可以算是直接上代码: 这是WXML 页面 代码: <view class='carousel_div'> <swiper class=" ...

  7. 查看windows、linux的SN

     gwmi win32_bios    [root@live-al-ops-pxe-2 ~]# dmidecode | grep Number | sed -n '1p' Serial Number: ...

  8. k-近邻算法实例

    1. 简单例子 步骤 1.1 计算已知点和被求点的距离 1.2 按距离递增排序 1.3 求出距离最近的前k个点的类别最大值作为目标分类 from numpy import * import opera ...

  9. DeepLearning.ai学习笔记(一)神经网络和深度学习--Week4深层神经网络

    一.深层神经网络 深层神经网络的符号与浅层的不同,记录如下: 用\(L\)表示层数,该神经网络\(L=4\) \(n^{[l]}\)表示第\(l\)层的神经元的数量,例如\(n^{[1]}=n^{[2 ...

  10. 阿里云ECS升级OpenSSL记录

    1.下载OpenSSL wget https://www.openssl.org/source/openssl-1.1.0e.tar.gz 2.解压编译安装 tar xf openssl-1.1.0e ...