平常我们用微信都是使用安卓客户端或者,IOS客户端,或者网页版,但是作为一个Programmer,必须得有点Programmer的亚子。
下载链接

本文只作为学习交流,不可用于其他用途,若有冒犯之处,请立即联系我删除。

在阅读之前请确保你有Javascript的基础,和Http相关的基础。

本文只分析微信发送消息(文本),不涉及其他微信其他接口的分析。

Step:1 找到微信发送消息的请求

  1. 打开chromeDevTool
  2. 找到network选项(专门用于查看网络请求的选项)
  3. 点击XHR(过滤其他请求)
  4. 就是他了(webwxsendmsg听名字就像)

Step:2 查看请求详细信息

Step:3 分析其请求参数

其参数有两部分,第一部分是QueryStringParameter里面的pass_ticket,登陆之后就是固定值。

第二部分是请求体中的部分:

  • DeviceId:是按照当前时间随机生成的生成规则如下:

    "e" + ("" + Math.random().toFixed(15)).substring(2, 17)
    
  • Sid是在Cookie中的:

    getSid: function() {return n || (n = a.getCookie("wxsid"))},
    
  • Skey:固定值(服务端传回来的,同一账号每次登陆都是如此)

  • Uin:固定值(服务端传回来的,同一账号每次登陆都是如此)

  • ClentMsgId和LocalId:通过当前时间戳生成:

    //utilFactory.now()等同于Date.now()
    e.ClientMsgId = e.LocalID = e.MsgId = (utilFactory.now() + Math.random().toFixed(3)).replace(".", "")
    
  • Content:消息内容

  • FromUserName:自身账号的标识(每次登陆都会不同)

  • ToUserName:消息接收用户的标识(每次登陆都会不同)

  • Type:消息类型

    • 1——文本消息
    • 3——图片消息
    • 34——语音消息
    • 43——视频消息
    • 62——小视频
    • 47——表情符号
    • 49——app
    • 50——网络电话
    • 52——网络电话通知
    • 53——网络电话邀请
    • 48——定位
    • 51——状态唤醒
    • 9999——系统通知
    • 40——单向好友消息
    • 37——验证消息
    • 42——SHARECARD
    • 1e4——SYS

Step:4 分析其相应结果

成功的示例包含:

  • Ret=0
  • ErrMsg=""
  • 会将我们发送的LocalId返回来
  • MsgID:也会有值

Ok,如果我们能获取到如上的返回结果就基本确认可以发出去了。

Step:5 发送消息

此次使用Java进行测试,并在下面贴出了代码。其他语言想测试的话,可参考思路。

测试类

import org.jsoup.Connection;
import org.jsoup.Jsoup;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.NumberFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class Ts {public static void main(String[] args) throws IOException {WX wx = new WX();HashMap<String, String> map = new HashMap<>();map.put("passTicket", "xc5t%252FDlS9Rwo47Fn9etDMuF7RwmY3g9eFQmRVuioZAudH3T8EuAYXQB8MhdywQRd");map.put("cookie", "wxuin=1581772621; webwxuvid=41eb93e6ef2e38a577ea2ea6b903594c88846cca31e6dda901afa2f0f2681cd59a0c8dacb47291f8e654bdc71f66e5bd; last_wxuin=1581772621; pgv_pvi=540184576; pgv_pvid=5488108125; ptui_loginuin=228846384; RK=RZKt0BQJZO; ptcz=b1c17e858051a1a4b4ae7af9bbda73303db615c3aa263dc5d0d37e2788187d0f; mm_lang=zh_CN; MM_WX_NOTIFY_STATE=1; MM_WX_SOUND_STATE=1; wxsid=F4EYzJ9vuXu0ruhm; webwx_data_ticket=gSc4Xg3VXZl/lJGgCqpviUOv; webwx_auth_ticket=CIsBEMjWxBEagAF3bcXg4+deLUBcXm7QCmJlYQa4NzMYR+J8Mo1vx06AorpEG4CqhlYzsKxfJTWUIxcX0uNifVtbz/5MTQGkhu/ZG3oAQfEqqMN8aj/RPMWUFSDk0YwcnniAVH1joTTq3m/Znp2WGmL8zpZQoOkbhWx8mRsYH07Ln7EKExxiNaLwfw==; login_frequency=2; wxloadtime=1562203882_expired; wxpluginkey=1562197398");String fromUser = "@38a4bd3020c368f82d7cf6183f545bb2b8aa0096995c06c9ebfedaac8729cdc5";String toUser = "@52e7190ff0ab4006f5199fda9a47def0cd5815d437ded69bd75d3d44551b938e";wx.sendMsg("你好", map, fromUser, toUser);}
}

我们看到了确实成功了。

发送消息类

import org.jsoup.Connection;
import org.jsoup.Jsoup;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.NumberFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class WX {public static String sendMsg(String msg, Map<String, String> map, String fromUser, String toUser) throws IOException {BigDecimal b = new BigDecimal(Math.random());double v = b.setScale(15, BigDecimal.ROUND_HALF_UP).doubleValue();String dId = "e" + ("" + v).substring(2, 17);String timeStamp = getTimeStamp();String param = "{\n" +"    \"BaseRequest\": {\n" +"        \"Uin\": 1581772621,\n" +"        \"Sid\": \"F4EYzJ9vuXu0ruhm\",\n" +"        \"Skey\": \"@crypt_94354c03_6bff423a698bb93e83549fd90906c2d6\",\n" +"        \"DeviceID\": \"" + dId + "\"\n" +"    },\n" +"    \"Msg\": {\n" +"        \"Type\": 1,\n" +"        \"Content\": \"" + msg + "\",\n" +"        \"FromUserName\": \"" + fromUser + "\",\n" +"        \"ToUserName\": \"" + toUser + "\",\n" +"        \"LocalID\": \"" + timeStamp + "\",\n" +"        \"ClientMsgId\": \"" + timeStamp + "\"\n" +"    },\n" +"    \"Scene\": 0\n" +"}";System.out.println(param);System.out.println(dId);URL url = new URL("https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=" + map.get("passTicket"));HttpURLConnection urlconn = (HttpURLConnection) url.openConnection();urlconn.setRequestMethod("POST");urlconn.setDoInput(true);urlconn.setDoOutput(true);urlconn.setRequestProperty("userAgent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36");urlconn.setRequestProperty("referrer", "https://wx2.qq.com/?&lang=zh_CN");urlconn.setRequestProperty("Accept", "application/json, text/plain, */*");urlconn.setRequestProperty("Accept-Encoding", "gzip, deflate, br");urlconn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");urlconn.setRequestProperty("Connection", "keep-alive");urlconn.setRequestProperty("Cookie", map.get("cookie"));urlconn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");urlconn.setRequestProperty("Host", "wx.qq.com");OutputStream outputStream = urlconn.getOutputStream();outputStream.write(param.getBytes());outputStream.flush();int responseCode = urlconn.getResponseCode();if (responseCode != 200) {throw new RuntimeException("Failed : HTTP error code : "+ urlconn.getResponseCode());}BufferedReader responseBuffer = new BufferedReader(new InputStreamReader((urlconn.getInputStream()), "UTF-8"));String output = "";StringBuffer stringBuffer = new StringBuffer();System.out.println("Output from Server:\n");while ((output = responseBuffer.readLine()) != null) {stringBuffer.append(output);System.out.println(output);}urlconn.disconnect();return stringBuffer.toString();}private static String getTimeStamp() {NumberFormat nf = NumberFormat.getNumberInstance();// 保留两位小数nf.setMaximumFractionDigits(3);// 如果不需要四舍五入,可以使用RoundingMode.DOWNnf.setRoundingMode(RoundingMode.UP);return (new Date().getTime() + "" + nf.format(Math.random())).replace(".", "");}
}

关于chrome调试的问题,下次文章会发出来,敬请期待。

下载类文件之后,请注意修改包名。

分析微信发送消息接口(基于网页版分析)相关推荐

  1. 企业自建应用对接企业微信发送消息接口

    1.第一步我们在企业微信开发平台找到这个接口说明文档 发送应用消息 - 文档 - 企业微信开发者中心 (qq.com) 2.我们可以先简单看一下在他们的调试工具走通了大概代码也会写了我下面一步一步带这 ...

  2. php微信 发送信息,PHP微信企业号主动给用户发送消息接口代码

    php微信企业号主动给用户发送消息接口代码 $corpid = "wx690e2a9380e2440dyt"; $secrect = "3g9l6dHy8qjYqYMWX ...

  3. 企业微信发送消息--Python

    企业微信内部消息推送--Python 我有一些自动化任务,这些自动化任务的执行结果,是成功和失败都是通过邮件发送的.但是邮件这个工具,有点正式,毕竟我只想一个通知.那有没有方法可以用微信接受通知呢? ...

  4. linux 脚本调用企业微信_shell或python调用企业微信发送消息(实现报警功能)

    shell或python调用企业微信发送消息(实现报警功能) 官方文档 注册登陆企业微信 登录企业微信管理端 -> 应用与小程序 -> 应用 -> 自建,点击"创建应用&q ...

  5. java 给微信发消息_(新版)通过java程序,给微信发送消息

    之前写过一篇使用飞鸽快信给自己的微信发送消息的示例.https://blog.csdn.net/xcxzzx01/article/details/80461086 两年多过去了,飞鸽快信已改名捷易快信 ...

  6. 串口to微信IOT模块,串口直接向微信发送消息与微信通讯,开发板物联网

    微信IOT模块 简介 微信IOT模块 以下简称[模块] 由 广州互联智控科技有限公司 出品. 功能 设备通过串口/网口UDP连接[模块],直接向手机微信发送消息.点击微信消息进入设备控制界面,通过控制 ...

  7. electron打包在linux环境运行,通过Electron基于网页版打包Linux端飞书(Electron-Lark)...

    在Linux系统下使用飞书,可使用下面提供的通过Electron基于网页版打包的Linux端飞书(Electron-Lark),提供deb和tar.xz包下载,支持Deepin.Ubuntu等版本. ...

  8. xposed框架微信发送消息功能实现

    网上公开的xposed微信源码只有如何处理接收到的微信消息和抢红包. 分析接收到的信息,只需要hook com.tencent.wcdb.database.SQLiteDatabase中的insert ...

  9. java代码控制qq、微信发送消息

    对于程序QQ.微信的程序控制,本人并不是直操纵他官方提供的接口,而且直接借用github大佬开发的第三方辅助程序,开放出来接口供java代码调用,实现java代码控制qq.微信发消息的功能. 一.代码 ...

  10. java编程实现给微信发送消息

    平时我们老是在网上看到使用python操作微信发送消息,这种功能java能不能实现呢,答案是可以的,这里我借助飞鸽快信实现一下.想了解飞鸽快信更多请访问官网. 1.访问飞鸽快信:https://u.i ...

最新文章

  1. iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
  2. 一些当前 Node.js 中最流行 ES6 特性的 benchmark (V8 / Chakra)
  3. C++数组的左右旋转的实现算法(附完整源码)
  4. python方差特征选择_使用scikitlearn进行方差分析的特征选择和交叉验证
  5. 分享一个点赞超过100的漂亮ASP.NET MVC蓝色界面框架
  6. 无刷新分页 jquery.pagination.js
  7. python中常见的几种错误
  8. 2022十大科技趋势
  9. @白帽子,你有一封来自2020“补天杯”破解大赛的邀请函
  10. iOS开发-获取rootViewController的正确方式
  11. unity物体移动的几种常用方式
  12. 微型计算机启天m425显卡驱动,联想启天M425安装win7系统详细教程包括BIOS设置方法USB驱动...
  13. regester正则用法_Regester下载|Regester(正则表达式测试器) 官方版v2.0.1 下载_当游网...
  14. 打印机脱机了怎么恢复打印
  15. 开心网刷分程序详解以及web游戏破解思路分析(一)
  16. 【听课笔记】复旦大学遗传学_04连锁与交换
  17. 作为一名APP开发者,你更Care什么?
  18. 【转】钓鱼邮件攻击检测
  19. 暑假学习 Python爬虫基础(4)
  20. c#获取公网的ip,本机ip 以及当前城市以及运营商

热门文章

  1. tongweb7启动参数配置配置个人理解
  2. 脑机接口专栏 | 如何分析静息状态的fMRI数据?(二)
  3. Spring boot出现java.awt.HeadlessException【已解决】
  4. IK分词器结合ES使用
  5. php实例精通txt下载,PHP实例精通(1碟)
  6. 计算机中开方的符号,开方符号-平方根符号怎么打?平方根符号在word和Excel中怎么打?上面 爱问知识人...
  7. centos6.6_vsftpd 虚拟账户FTP服务搭建
  8. bmp怎样转成jpg,bmp格式换jpg
  9. 可以删除电脑文件的c语言程序,win7c盘哪些文件可以删除?其删除方法介绍
  10. 什么是跳跃表。跳跃表的原理及其实现。