WeChat public accounts can automatically send text and graphic messages to groups without WeChat authentication.
npm i wechat-mp-hack --save
const Wechat = require ( 'wechat-mp-hack' ) ;
const API = new Wechat ( '公众号账号' , '公众号密码' ) ;
After version
1.1.0
it is no longer necessary to wrap the calling method inlogin
callback and execute it. The login will be automatically processed when the following core methods are called.
Login authentication QR code
API . once ( 'scan.login' , ( filepath ) => {
// 登录二维码图片地址
console . log ( filepath ) ;
} ) ;
After turning on mass authentication protection, calling the mass interface requires WeChat to scan the QR code.
API . on ( 'scan.send' , ( filepath ) => {
// 群发认证二维码地址
console . log ( filepath ) ;
} ) ;
Login verification code
API . once ( 'vcode' , ( filepath ) => {
// 验证码图片地址
console . log ( filepath ) ;
} ) ;
Login interface
/**
* @desc 登录公众号
* @param {string} [imgcode] - [可选]验证码
* @return {Promise<object>} data
*/
API . login ( ) . then ( data => {
console . log ( data ) ;
} ) . catch ( console . error ) ;
Check if you are logged in
try {
let islogin = await API . loginchk ( ) ;
console . log ( '已登录' ) ;
} catch ( e ) {
console . log ( '未登录' ) ;
}
Get a list of image, text/video materials
/**
* 获取图文/视频素材列表
* @param {number} [type] - 消息类型:图文消息-10 视频消息-15 默认-10
* @param {number} [begin] - 从第几条开始 默认-0
* @param {number} [count] - 返回条数 默认-10
* @return {Promise<array>} - 素材列表
* @return {number} [].app_id - 素材id appMsgId
* @return {string} [].author - 作者
* @return {string} [].create_time - 创建时间,单位秒
* @return {number} [].data_seq
* @return {string} [].digest - 素材描述信息
* @return {number} [].file_id
* @return {string} [].img_url - 图片地址
* @return {number} [].is_illegal
* @return {number} [].is_sync_top_stories
* @return {array} [].multi_item - 素材资源列表(一个素材下面有多个文章)
* @return {string} [].multi_item[].author - 文章作者
* @return {string} [].multi_item[].author_appid
* @return {number} [].multi_item[].can_reward - 文章是否可打赏,0否
* @return {string} [].multi_item[].cdn_url - 图片/视频地址
* @return {string} [].multi_item[].cdn_url_back
* @return {number} [].multi_item[].cover - 封面图片地址
* @return {string} [].multi_item[].digest - 文章描述
* @return {number} [].multi_item[].file_id
* @return {string} [].multi_item[].free_content
* @return {number} [].multi_item[].is_new_video
* @return {number} [].multi_item[].need_open_comment
* @return {boolean} [].multi_item[].only_fans_can_comment
* @return {string} [].multi_item[].ori_white_list
* @return {number} [].multi_item[].review_status
* @return {number} [].multi_item[].reward_money
* @return {string} [].multi_item[].reward_wording
* @return {number} [].multi_item[].seq
* @return {number} [].multi_item[].show_cover_pic
* @return {number} [].multi_item[].smart_product
* @return {string} [].multi_item[].source_url - 原文地址
* @return {string} [].multi_item[].title - 文章标题
* @return {array<string>} [].multi_item[].tags - 文章标签
*/
API . appmsg ( ) . then ( ( items ) => {
console . log ( items ) ;
} ) . catch ( console . error ) ;
Get picture/voice material list
/**
* 获取图片/语音素材列表
* @param {number} [type] - 素材类型:图片素材-2 语音素材-3 默认-2
* @param {number} [begin] - 从第几条开始 默认-0
* @param {number} [count] - 返回条数 默认-10
* @param {number} [group_id] - 图片素材专用,分组id 全部图片-0 未分组-1 文章配图-3 或者其它你自己新建的分组id
* @return {Promise<array>} - 素材列表
* @return {string} [].cdn_url - 资源地址
* @return {number} [].file_id
* @return {number} [].group_id - 分组id
* @return {string} [].img_format - 图片类型:png...
* @return {string} [].name - 资源名称,如:1488631877698.png
* @return {number} [].seq
* @return {string} [].size - 资源大小,如:749.4 K
* @return {number} [].type
* @return {number} [].update_time - 单位:秒
* @return {string} [].video_cdn_id
* @return {string} [].video_thumb_cdn_url
*/
API . filepage ( ) . then ( ( files ) => {
console . log ( files ) ;
} ) . catch ( console . error ) ;
Create/update graphics and text materials
/**
* 创建图文素材
* @param {array} news - 消息列表
* @param {string} news[].title - 文章标题
* @param {string} news[].thumb - 文章缩略图
* @param {string} news[].description - 描述信息
* @param {string} news[].html - 文章内容
* @param {string} news[].url - 原文地址
* @param {number} [appMsgId] - 图文素材id,传此字段表示更新图文素材
* @return {Promise} appMsgId
*/
API . operate_appmsg ( news ) . then ( ( appMsgId ) => {
console . log ( appMsgId ) ;
} ) . catch ( console . error ) ;
Delete graphic material
/**
* 删除图文素材
* @param {number} [appMsgId] - 图文素材id
*/
API . del_appmsg ( appMsgId ) . then ( res => {
console . log ( res ) ;
console . log ( '删除成功' ) ;
} ) ;
Batch upload remote images to public account
/**
* 批量上传远程图片至公众号
* @param {array<string>} imgurls - 远程图片地址
*/
API . batchUpload ( [ 'http://wesbos.com/wp-content/uploads/2016/09/dead-zone.png' ] ) . then ( results => {
// results[0].fileid;
// results[0].cdn_url;
} ) ;
Upload a single remote image to the official account
/**
* 上传单个远程图片至公众号
* @param {string} imgurl - 远程图片地址
*/
API . filetransfer ( 'http://wesbos.com/wp-content/uploads/2016/09/dead-zone.png' ) . then ( console . log ) ;
Upload local pictures to the public account
/**
* 上传本地图片至公众号
* @param {string} filepath - 本地图片地址
* @return {Promise<object>} res
* @return {number} res.fileid - 资源id
* @return {string} res.cdn_url - 资源链接地址
*/
API . localUpload ( 'qrcode-safe.png' ) . then ( result => {
console . log ( result ) ;
} ) ;
Upload remote images to cdn
/**
* 上传远程图片上传至cdn
* @param {string} imgurl - 远程图片地址
* @return {Promise<string>} - 微信cdn资源地址
*/
API . uploadimg2cdn ( 'https://www.baidu.com/img/[email protected]' )
Get the temporary preview link of graphic and text material articles
/**
* 获取图文素材文章临时预览链接
* @param {number} appmsgid - 图文素材id
* @param {number} [itemidx] - 文章在图文素材中的索引,从1开始 默认: 1
* @return {Promise<string>} - 文章临时预览链接
*/
API . preview_post ( 100000126 , 2 ) . then ( post_url => {
console . log ( post_url ) ;
} ) . catch ( console . error ) ;
Preview group message
/**
* 预览群发消息
* @param {string} username - 预览人微信号/QQ号/手机号
* @param {number|string} content - 预览内容,图文消息-appmsgid 文字-content 图片/语音/视频-fileid
* @param {number} [type] - 消息类型:图文消息-10 文字-1 图片-2 语音-3 视频-15 默认-10
*/
API . preview_appmsg ( 'Zaker-yhz' , 100000126 ) . then ( res => {
console . log ( '预览发送成功' ) ;
} ) . catch ( console . error ) ;
group message
/**
* 群发消息
* @param {number|string} appmsgid - 消息内容,图文消息-appmsgid 文字-文字内容 图片/语音/视频-fileid
* @param {number} [groupid] - 分组id,默认-1 所有用户
* @param {number} [send_time] - 定时群发,默认-0 不定时群发 定时群发设置定时时间戳(单位秒)
* @param {number} [type] - 消息类型:图文消息-10 文字-1 图片-2 语音-3 视频-15 默认-10
*/
API . masssend ( appMsgId ) . then ( ( ) => {
console . log ( 'success' ) ;
} ) . catch ( console . error ) ;
Cancel scheduled group sending
/**
* 取消定时群发
* @param {number} msgid 群发消息id
*/
API . cancel_time_send ( 1000000041 ) . then ( ( ) => {
console . log ( 'success' ) ;
} ) . catch ( console . error ) ;
Scheduled group message list
/**
* 定时群发消息列表
* @return {Promise<array>} msgs - 定时群发消息列表
* @return {number} msgs[].type - 消息类型
* @return {number} msgs[].msgid - 消息id
* @return {object} msgs[].sent_info
* @return {number} msgs[].sent_info.time - 群发时间
* @return {boolean} msgs[].sent_info.is_send_all - 是否群发给所有人
* @return {array} msgs[].appmsg_info - 图文消息内容
* @return {object} msgs[].text_info - 文字消息
* @return {string} msgs[].text_info.content - 文字消息内容
*/
API . timesend_list ( ) . then ( msgs => {
console . log ( msgs ) ;
} ) ;
Send a text message to a user
/**
* 发文本消息给某个用户
* @param {string} tofakeid - 用户fakeid,可以在公众号后台singlesendpage页面url看到或者消息列表
* @param {string} msg - 消息内容
* @param {string} [replyId] - 回复消息id,可以消息列表看到,可选
*/
API . singlesend ( 'osl8HwPBTCsVbquNsnYbUfOQH8sM' , '哈哈哈哈' , 425131038 ) . then ( res => {
console . log ( res ) ;
} ) . catch ( console . error ) ;
Get the public account message list
/**
* 获取公众号消息列表
* @param {number} count - 消息条数
* @param {number|string} [day] - 今天:0 昨天:1 前天:2 更早:3 最近5天:7 已收藏消息:star,默认:0
* @return {array<object>} msgs
* @return {string} msgs[].content - 消息内容
* @return {string} msgs[].date_time - 消息时间
* @return {string} msgs[].fakeid - 用户fakeid
* @return {number} msgs[].func_flag
* @return {number} msgs[].has_reply
* @return {number} msgs[].id - replyId
* @return {number} msgs[].is_vip_msg
* @return {number} msgs[].msg_status
* @return {array} msgs[].multi_item
* @return {string} msgs[].nick_name
* @return {string} msgs[].refuse_reason
* @return {string} msgs[].source
* @return {string} msgs[].to_uin
* @return {number} msgs[].type
* @return {string} msgs[].wx_headimg_url - 用户头像地址
*/
API . message ( 1 ) . then ( msgs => {
console . log ( msgs ) ;
} ) . catch ( console . error ) ;
Get the list of users followed by public accounts
/**
* @desc 获取关注用户列表
* @return {array<object>} userlist
* @return {string} userlist[].user_openid
* @return {string} userlist[].user_name - 用户昵称
* @return {string} userlist[].user_remark - 用户备注名称
* @return {array} userlist[].user_group_id - 分组
* @return {number} userlist[].user_create_time - 关注时间,单位:秒
* @return {string} userlist[].user_head_img - 用户头像地址
*/
API . user_list ( ) . then ( res => {
console . log ( res ) ;
} ) ;
Get information about a user
/**
* 获取用户信息
* @param {string} user_openid
* @return {object} user
* @return {string} user.user_openid
* @return {string} user.user_name - 用户昵称
* @return {string} user.user_remark - 用户备注名称
* @return {array} user.user_group_id - 分组
* @return {number} user.user_create_time - 关注时间,单位:秒
* @return {string} user.user_head_img - 用户头像地址
*/
API . user_info ( 'oslHwqwYnw20jnqMca18KET91pa0' ) . then ( res => {
console . log ( res ) ;
} ) ;
Get detailed information of a user
/**
* 获取用户详细信息
* @param {string} user_openid
* @return {object} user
* @return {string} user.user_openid
* @return {string} user.user_city - 用户城市
* @return {string} user.user_country - 用户国家
* @return {string} user.user_province - 省份
* @return {string} user.user_signature - 签名
* @return {number} user.user_comment_cnt - 留言量
* @return {number} user.user_selected_comment_cnt - 精选留言量
* @return {number} user.user_msg_cnt - 消息量
* @return {number} user.user_gender - 性别 0:未知 1:男 2:女
* @return {string} user.user_name - 用户昵称
* @return {string} user.user_remark - 用户备注名称
* @return {array} user.user_group_id - 分组
* @return {number} user.user_create_time - 关注时间,单位:秒
* @return {string} user.user_head_img - 用户头像地址
* @return {number} user.user_in_blacklist - 是否在黑名单
*/
API . user_info_detail ( 'oslHwqwYnw20jnqMca18KET91pa0' ) . then ( res => {
console . log ( res ) ;
} ) ;
QR code analysis
/**
* 二维码解析
* @param {string} url - 远程图片地址/本地图片路径
* @return {Promise<object>}
*/
API . qrdecode ( 'qrcode-login.png' ) . then ( ( result ) => {
console . log ( result . text ) ;
} ) . catch ( console . error ) ;