本篇文章就是为大家介绍一下我是如何用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. 经验总结22--抓取HTML数据,HtmlAgilityPack(续)

    假设获取的数据是HTML的话.我们就须要第三方工具有辅助获取我们须要的数据. 我选用了HtmlAgilityPack这么个工具. 首先肯定去网上下载一个,然后引用到项目中.下载地址:http://ht ...

  2. javascript 正則表達式补充

    定义 JavaScript种正則表達式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串 1. 构造函数 var reg=new RegExp('<%[^%>]+%&g ...

  3. 史上最强学生管理系统之IO版

    既上一博发布的ArrayList版本之后,新一版的IO版又来了,其实只是在上一个版本里面添加了IO流的内容,将存入更改的信息更新到了文件中而已,这个版本网上仍然很多,本人只是在某些方面稍加修改,因为自 ...

  4. TableML-GUI篇(Excel编译/解析工具)

    项目情况 本文接上篇TableML Excel编译/解析工具,本文主要介绍GUI工具的使用,及配置项,如果你想了解此工具更加详细的说明,请阅读上篇文章. 项目地址:https://github.com ...

  5. 调用接口http封装

    public static String httpHandler(String URL,String xml){ try { URL url=new URL(URL); URLConnection c ...

  6. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  7. 【python】type()、instance()

    >>> a=520 >>> type(a) <class 'int'> >>> a=' >>> type(a) &l ...

  8. iOS masonry九宫格 单行 多行布局

    Masonry是个好东西,在当前尺寸各异的iOS开发适配中发挥着至关重要的作用,由于项目中Masonry布局用的比较多,对于UI布局也有了一些自己的理解,经常会有人问道Masonry布局九宫格要怎么布 ...

  9. iOS Swift基础知识代码

    推荐:Swift学习使用知识代码软件 //集合类型 数组 字典 func array1(){ var arr = [","dd"] //简单写法 var arr1 = [ ...

  10. HTML5学习知识点

    一.文档问题 1.html5新标签:section.header.footer.nav.aside.blockquote.q.fieldest.figure.address.article.detai ...