{"id":20881712,"url":"https://github.com/huanz/wechat-mp-hack","last_synced_at":"2026-05-19T10:39:38.128Z","repository":{"id":77085996,"uuid":"79707488","full_name":"huanz/wechat-mp-hack","owner":"huanz","description":"微信公众平台模拟登录自动群发图文消息","archived":false,"fork":false,"pushed_at":"2020-02-27T04:58:12.000Z","size":72,"stargazers_count":122,"open_issues_count":2,"forks_count":31,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-06-18T07:51:44.529Z","etag":null,"topics":["nodejs","wechat","weixin"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/huanz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-01-22T09:23:23.000Z","updated_at":"2024-10-24T02:52:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"66bd941a-ee45-4260-956a-4f43d63cea22","html_url":"https://github.com/huanz/wechat-mp-hack","commit_stats":{"total_commits":42,"total_committers":3,"mean_commits":14.0,"dds":0.4285714285714286,"last_synced_commit":"926f670604811391f4d0b0da510c41b155163b56"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/huanz/wechat-mp-hack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huanz%2Fwechat-mp-hack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huanz%2Fwechat-mp-hack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huanz%2Fwechat-mp-hack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huanz%2Fwechat-mp-hack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/huanz","download_url":"https://codeload.github.com/huanz/wechat-mp-hack/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huanz%2Fwechat-mp-hack/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265311871,"owners_count":23745161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nodejs","wechat","weixin"],"created_at":"2024-11-18T07:26:04.104Z","updated_at":"2026-05-19T10:39:38.060Z","avatar_url":"https://github.com/huanz.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wechat-mp-hack\n\n无需微信认证即可实现微信公众号自动群发图文消息。\n\n## 使用\n\n```shell\nnpm i wechat-mp-hack --save\n```\n\n```javascript\nconst Wechat = require('wechat-mp-hack');\nconst API = new Wechat('公众号账号', '公众号密码');\n```\n\n\u003e `1.1.0`版本后不再需要把调用方法包裹在 `login`回调后执行，调用下列核心方式时会自动处理登录。\n\n### events\n\n#### scan.login\n\n登录认证二维码\n\n```javascript\nAPI.once('scan.login', (filepath) =\u003e {\n  // 登录二维码图片地址\n  console.log(filepath);\n});\n```\n\n#### scan.send\n\n开启群发认证保护后调用群发接口需要微信扫描二维码\n\n```javascript\nAPI.on('scan.send', (filepath) =\u003e {\n  // 群发认证二维码地址\n  console.log(filepath);\n});\n```\n\n#### vcode \n\n登录验证码\n\n```javascript\nAPI.once('vcode', (filepath) =\u003e {\n  // 验证码图片地址\n  console.log(filepath);\n});\n```\n\n### methods\n\n#### login\n\n登录接口\n\n```javascript\n/**\n * @desc 登录公众号\n * @param {string} [imgcode] - [可选]验证码\n * @return {Promise\u003cobject\u003e} data\n */\nAPI.login().then(data =\u003e {\n  console.log(data);\n}).catch(console.error);\n```\n\n#### loginchk\n\n检测是否已经登录\n\n```javascript\ntry {\n  let islogin = await API.loginchk();\n  console.log('已登录');\n} catch(e) {\n  console.log('未登录');\n}\n```\n\n#### appmsg\n\n获取图文/视频素材列表\n\n```javascript\n/**\n * 获取图文/视频素材列表\n * @param {number} [type] - 消息类型：图文消息-10 视频消息-15 默认-10\n * @param {number} [begin] - 从第几条开始 默认-0\n * @param {number} [count] - 返回条数 默认-10\n * @return {Promise\u003carray\u003e} - 素材列表\n * @return {number} [].app_id - 素材id appMsgId\n * @return {string} [].author - 作者\n * @return {string} [].create_time - 创建时间，单位秒\n * @return {number} [].data_seq\n * @return {string} [].digest - 素材描述信息\n * @return {number} [].file_id\n * @return {string} [].img_url - 图片地址\n * @return {number} [].is_illegal\n * @return {number} [].is_sync_top_stories\n * @return {array} [].multi_item - 素材资源列表（一个素材下面有多个文章）\n * @return {string} [].multi_item[].author - 文章作者\n * @return {string} [].multi_item[].author_appid\n * @return {number} [].multi_item[].can_reward - 文章是否可打赏，0否\n * @return {string} [].multi_item[].cdn_url - 图片/视频地址\n * @return {string} [].multi_item[].cdn_url_back\n * @return {number} [].multi_item[].cover - 封面图片地址\n * @return {string} [].multi_item[].digest - 文章描述\n * @return {number} [].multi_item[].file_id\n * @return {string} [].multi_item[].free_content\n * @return {number} [].multi_item[].is_new_video\n * @return {number} [].multi_item[].need_open_comment\n * @return {boolean} [].multi_item[].only_fans_can_comment\n * @return {string} [].multi_item[].ori_white_list\n * @return {number} [].multi_item[].review_status\n * @return {number} [].multi_item[].reward_money\n * @return {string} [].multi_item[].reward_wording\n * @return {number} [].multi_item[].seq\n * @return {number} [].multi_item[].show_cover_pic\n * @return {number} [].multi_item[].smart_product\n * @return {string} [].multi_item[].source_url - 原文地址\n * @return {string} [].multi_item[].title - 文章标题\n * @return {array\u003cstring\u003e} [].multi_item[].tags - 文章标签\n*/\nAPI.appmsg().then((items) =\u003e {\n  console.log(items);\n}).catch(console.error);\n```\n\n#### filepage\n\n获取图片/语音素材列表\n\n```javascript\n/**\n * 获取图片/语音素材列表\n * @param {number} [type] - 素材类型：图片素材-2 语音素材-3 默认-2\n * @param {number} [begin] - 从第几条开始 默认-0\n * @param {number} [count] - 返回条数 默认-10\n * @param {number} [group_id] - 图片素材专用，分组id 全部图片-0 未分组-1 文章配图-3 或者其它你自己新建的分组id\n * @return {Promise\u003carray\u003e} - 素材列表\n * @return {string} [].cdn_url - 资源地址\n * @return {number} [].file_id\n * @return {number} [].group_id - 分组id\n * @return {string} [].img_format - 图片类型：png...\n * @return {string} [].name - 资源名称，如：1488631877698.png\n * @return {number} [].seq\n * @return {string} [].size - 资源大小，如：749.4\tK\n * @return {number} [].type\n * @return {number} [].update_time - 单位：秒\n * @return {string} [].video_cdn_id\n * @return {string} [].video_thumb_cdn_url\n*/\nAPI.filepage().then((files) =\u003e {\n  console.log(files);\n}).catch(console.error); \n```\n\n#### operate_appmsg\n\n创建/更新图文素材\n\n```javascript\n/**\n * 创建图文素材\n * @param {array} news - 消息列表\n * @param {string} news[].title - 文章标题\n * @param {string} news[].thumb - 文章缩略图\n * @param {string} news[].description - 描述信息\n * @param {string} news[].html - 文章内容\n * @param {string} news[].url - 原文地址\n * @param {number} [appMsgId] - 图文素材id，传此字段表示更新图文素材\n * @return {Promise} appMsgId\n */\nAPI.operate_appmsg(news).then((appMsgId) =\u003e {\n  console.log(appMsgId);\n}).catch(console.error);\n```\n\n#### del_appmsg\n\n删除图文素材\n\n```javascript\n/**\n * 删除图文素材\n * @param {number} [appMsgId] - 图文素材id\n */\nAPI.del_appmsg(appMsgId).then(res =\u003e {\n  console.log(res);\n  console.log('删除成功');\n});\n```\n\n#### batchUpload\n\n批量上传远程图片至公众号\n\n```javascript\n/**\n * 批量上传远程图片至公众号\n * @param {array\u003cstring\u003e} imgurls - 远程图片地址\n */\nAPI.batchUpload(['http://wesbos.com/wp-content/uploads/2016/09/dead-zone.png']).then(results =\u003e {\n  // results[0].fileid;\n  // results[0].cdn_url;\n});\n```\n\n#### filetransfer\n\n上传单个远程图片至公众号\n\n```javascript\n/**\n * 上传单个远程图片至公众号\n * @param {string} imgurl - 远程图片地址\n */\nAPI.filetransfer('http://wesbos.com/wp-content/uploads/2016/09/dead-zone.png').then(console.log);\n```\n\n#### localUpload\n\n上传本地图片至公众号\n\n```javascript\n/**\n * 上传本地图片至公众号\n * @param {string} filepath - 本地图片地址\n * @return {Promise\u003cobject\u003e} res\n * @return {number} res.fileid - 资源id\n * @return {string} res.cdn_url - 资源链接地址\n */\nAPI.localUpload('qrcode-safe.png').then(result =\u003e {\n  console.log(result);\n});\n```\n\n####  uploadimg2cdn\n\n上传远程图片上传至cdn\n\n```javascript\n/**\n * 上传远程图片上传至cdn\n * @param {string} imgurl - 远程图片地址\n * @return {Promise\u003cstring\u003e} - 微信cdn资源地址\n */\nAPI.uploadimg2cdn('https://www.baidu.com/img/baidu_resultlogo@2.png')\n```\n\n#### preview_post\n\n获取图文素材文章临时预览链接\n\n```javascript\n/**\n * 获取图文素材文章临时预览链接\n * @param {number} appmsgid - 图文素材id\n * @param {number} [itemidx] - 文章在图文素材中的索引，从1开始 默认: 1\n * @return {Promise\u003cstring\u003e} - 文章临时预览链接\n */\nAPI.preview_post(100000126, 2).then(post_url =\u003e {\n  console.log(post_url);\n}).catch(console.error);\n```\n\n#### preview_appmsg\n\n预览群发消息\n\n```javascript\n/**\n * 预览群发消息\n * @param {string} username - 预览人微信号/QQ号/手机号\n * @param {number|string} content - 预览内容，图文消息-appmsgid 文字-content 图片/语音/视频-fileid\n * @param {number} [type] - 消息类型：图文消息-10 文字-1 图片-2 语音-3 视频-15 默认-10\n */\nAPI.preview_appmsg('Zaker-yhz', 100000126).then(res =\u003e {\n  console.log('预览发送成功');\n}).catch(console.error);\n```\n\n#### masssend\n\n群发消息\n\n```javascript\n/**\n * 群发消息\n * @param {number|string} appmsgid - 消息内容，图文消息-appmsgid 文字-文字内容 图片/语音/视频-fileid\n * @param {number} [groupid] - 分组id，默认-1 所有用户\n * @param {number} [send_time] - 定时群发，默认-0 不定时群发  定时群发设置定时时间戳（单位秒）\n * @param {number} [type] - 消息类型：图文消息-10 文字-1 图片-2 语音-3 视频-15 默认-10\n */\nAPI.masssend(appMsgId).then(() =\u003e {\n  console.log('success');\n}).catch(console.error);\n```\n\n#### cancel_time_send\n\n取消定时群发\n\n```javascript\n/**\n * 取消定时群发\n * @param {number} msgid 群发消息id\n */\nAPI.cancel_time_send(1000000041).then(() =\u003e {\n  console.log('success');\n}).catch(console.error);\n```\n\n#### timesend_list\n\n定时群发消息列表\n\n```javascript\n/**\n * 定时群发消息列表\n * @return {Promise\u003carray\u003e} msgs - 定时群发消息列表\n * @return {number} msgs[].type - 消息类型\n * @return {number} msgs[].msgid - 消息id\n * @return {object} msgs[].sent_info\n * @return {number} msgs[].sent_info.time - 群发时间\n * @return {boolean} msgs[].sent_info.is_send_all - 是否群发给所有人\n * @return {array} msgs[].appmsg_info - 图文消息内容\n * @return {object} msgs[].text_info - 文字消息\n * @return {string} msgs[].text_info.content - 文字消息内容\n */\nAPI.timesend_list().then(msgs =\u003e {\n  console.log(msgs);\n});\n```\n\n#### singlesend\n\n发文本消息给某个用户\n\n```javascript\n/**\n * 发文本消息给某个用户\n * @param {string} tofakeid - 用户fakeid，可以在公众号后台singlesendpage页面url看到或者消息列表\n * @param {string} msg - 消息内容\n * @param {string} [replyId] - 回复消息id，可以消息列表看到，可选\n */\nAPI.singlesend('osl8HwPBTCsVbquNsnYbUfOQH8sM', '哈哈哈哈', 425131038).then(res =\u003e {\n  console.log(res);\n}).catch(console.error);\n```\n\n#### message\n\n获取公众号消息列表\n\n```javascript\n/**\n * 获取公众号消息列表\n * @param {number} count - 消息条数\n * @param {number|string} [day] - 今天：0 昨天：1 前天：2 更早：3 最近5天：7 已收藏消息：star，默认：0\n * @return {array\u003cobject\u003e} msgs\n * @return {string} msgs[].content - 消息内容\n * @return {string} msgs[].date_time - 消息时间\n * @return {string} msgs[].fakeid - 用户fakeid\n * @return {number} msgs[].func_flag\n * @return {number} msgs[].has_reply\n * @return {number} msgs[].id - replyId\n * @return {number} msgs[].is_vip_msg\n * @return {number} msgs[].msg_status\n * @return {array} msgs[].multi_item\n * @return {string} msgs[].nick_name\n * @return {string} msgs[].refuse_reason\n * @return {string} msgs[].source\n * @return {string} msgs[].to_uin\n * @return {number} msgs[].type\n * @return {string} msgs[].wx_headimg_url - 用户头像地址\n */\nAPI.message(1).then(msgs =\u003e {\n  console.log(msgs);\n}).catch(console.error); \n```\n\n#### user_list\n\n获取公众号关注用户列表\n\n```javascript\n/**\n * @desc 获取关注用户列表\n * @return {array\u003cobject\u003e} userlist\n * @return {string} userlist[].user_openid\n * @return {string} userlist[].user_name - 用户昵称\n * @return {string} userlist[].user_remark - 用户备注名称\n * @return {array} userlist[].user_group_id - 分组\n * @return {number} userlist[].user_create_time - 关注时间，单位：秒\n * @return {string} userlist[].user_head_img - 用户头像地址\n */\nAPI.user_list().then(res =\u003e {\n  console.log(res);\n});\n```\n\n#### user_info\n\n获取某用户信息\n\n```javascript\n/**\n * 获取用户信息\n * @param {string} user_openid \n * @return {object} user\n * @return {string} user.user_openid\n * @return {string} user.user_name - 用户昵称\n * @return {string} user.user_remark - 用户备注名称\n * @return {array} user.user_group_id - 分组\n * @return {number} user.user_create_time - 关注时间，单位：秒\n * @return {string} user.user_head_img - 用户头像地址\n */\nAPI.user_info('oslHwqwYnw20jnqMca18KET91pa0').then(res =\u003e {\n  console.log(res);\n});\n```\n\n#### user_info_detail\n\n获取某用户详细信息\n\n```javascript\n/**\n * 获取用户详细信息\n * @param {string} user_openid \n * @return {object} user\n * @return {string} user.user_openid\n * @return {string} user.user_city - 用户城市\n * @return {string} user.user_country - 用户国家\n * @return {string} user.user_province - 省份\n * @return {string} user.user_signature - 签名\n * @return {number} user.user_comment_cnt - 留言量\n * @return {number} user.user_selected_comment_cnt - 精选留言量\n * @return {number} user.user_msg_cnt - 消息量\n * @return {number} user.user_gender - 性别 0：未知 1：男 2：女\n * @return {string} user.user_name - 用户昵称\n * @return {string} user.user_remark - 用户备注名称\n * @return {array} user.user_group_id - 分组\n * @return {number} user.user_create_time - 关注时间，单位：秒\n * @return {string} user.user_head_img - 用户头像地址\n * @return {number} user.user_in_blacklist - 是否在黑名单\n */\nAPI.user_info_detail('oslHwqwYnw20jnqMca18KET91pa0').then(res =\u003e {\n  console.log(res);\n});\n```\n\n#### qrdecode\n\n二维码解析\n\n```javascript\n/**\n * 二维码解析\n * @param {string} url - 远程图片地址/本地图片路径\n * @return {Promise\u003cobject\u003e}\n */\nAPI.qrdecode('qrcode-login.png').then((result) =\u003e {\n  console.log(result.text);\n}).catch(console.error); \n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuanz%2Fwechat-mp-hack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhuanz%2Fwechat-mp-hack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuanz%2Fwechat-mp-hack/lists"}