Node.js 发送微信消息(原创)
Node.js 发送微信消息(原创)
发布完不能编辑?这… 如果大家想获取微信的头像的话,其实有点复杂,因为是远程图片,而且要附带cookie上去,为了怕新手碰壁,以下贴出代码:下面的__basename其实是我定义的全局变量,放在index.js或者app.js都可以
global.__basename = __dirname
getAvatar: (options, fn) ->
@login (err, cookie) ->
request
.get('mp.weixin.qq.com/cgi-bin/getheadimg?fakeid=' + options.takeid)
.set('Cookie', cookie)
.end (res) ->
f = fs.createWriteStream(__basename + '/public/avatar/'+options.takeid+'.jpg',
flags: "w"
encoding: "binary"
)
res.on "data", (data) ->
f.write data
options.res.write data
res.on "end", (data) ->
f.end()
options.res.end()
当然可以!下面是关于如何使用 Node.js 发送微信消息的详细内容。我们将通过一个简单的例子来展示如何发送消息到微信,并附带一些必要的代码片段。
Node.js 发送微信消息
首先,我们需要安装一些必要的库。这里我们使用 request
和 request-promise
库来处理 HTTP 请求。你可以使用 npm 安装这些库:
npm install request request-promise
接下来,我们创建一个简单的函数来发送消息到微信。
示例代码
const rp = require('request-promise');
const qs = require('querystring');
// 全局变量定义
global.__basename = __dirname;
// 微信公众号的 AppID 和 AppSecret
const APP_ID = 'your_app_id';
const APP_SECRET = 'your_app_secret';
// 获取访问令牌
async function getAccessToken() {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APP_ID}&secret=${APP_SECRET}`;
const response = await rp({ uri: url, json: true });
return response.access_token;
}
// 发送文本消息
async function sendMessage(openId, accessToken, content) {
const url = `https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`;
const message = {
touser: openId,
msgtype: 'text',
text: {
content: content
}
};
const options = {
method: 'POST',
uri: url,
body: message,
json: true
};
const response = await rp(options);
console.log(response);
}
// 主函数
(async () => {
try {
const accessToken = await getAccessToken();
await sendMessage('OPEN_ID', accessToken, 'Hello from Node.js!');
} catch (error) {
console.error(error);
}
})();
解释
-
全局变量定义:
global.__basename = __dirname;
这里我们定义了一个全局变量
__basename
,用于存储项目的根目录路径。 -
获取访问令牌:
async function getAccessToken() { const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APP_ID}&secret=${APP_SECRET}`; const response = await rp({ uri: url, json: true }); return response.access_token; }
这个函数从微信服务器获取访问令牌。我们需要提供
AppID
和AppSecret
来换取访问令牌。 -
发送文本消息:
async function sendMessage(openId, accessToken, content) { const url = `https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`; const message = { touser: openId, msgtype: 'text', text: { content: content } }; const options = { method: 'POST', uri: url, body: message, json: true }; const response = await rp(options); console.log(response); }
这个函数用于向指定的微信用户发送文本消息。我们传递用户的 OpenID、访问令牌和消息内容。
-
主函数:
(async () => { try { const accessToken = await getAccessToken(); await sendMessage('OPEN_ID', accessToken, 'Hello from Node.js!'); } catch (error) { console.error(error); } })();
这是一个异步的主函数,它首先获取访问令牌,然后调用
sendMessage
函数发送消息。
希望这个示例能帮助你理解如何使用 Node.js 发送微信消息。如果你有任何问题或需要进一步的帮助,请随时提问!
取好友fakeId.
var pattern = /\"fakeId\" : \"(\d+)\"/gi;
var fakes = typeof res.text === 'undefined' ? [] : pattern.exec(res.text);
for (var i = 1; i < fakes.length; i++) {
console.log(fakes[i]);
}`
取自己fakeid
var pattern = /FakeID : \"(\d+)\"/gi;
var FakeID = typeof res.text === 'undefined' ? undefined : pattern.exec(res.text)[1];
嗯,很好,遗憾的就是知道微信号或者qq号不能search到fakeid,现在也只能局限于自己的微信好友或者朋友圈了
其实可以直接用拿到它的好友列表的json数据的,qq微信公众平台的用户管理的html代码中有这样一段:
所以…getFriendPage方法改成如下就可以顺利拿到这个数据了:
getFriendPage: (req, fn) ->
page = req.query.page or 0
@login (err, cookie)->
request
.get('http://mp.weixin.qq.com/cgi-bin/contactmanagepage?t=wxm-friend&lang=zh_CN&pagesize=&pageidx='+page+'&type=0&groupid=0')
.set('Cookie', cookie)
.end (res) ->
rs = res.text.replace(/document.location.hostname.match.*\[0\]/g, '"'+req.host+'"')
pattern = /<script id="json-friendList" .*>([\s\S]*?)<\/script>/
results = rs.match(/<script id="json-friendList" .*>([\s\S]*?)<\/script>/)[1]
fn null, results
嗯这是昨晚写的一段方法, cookieAgent(request, response).toString()
存储了代理的cookies, 获得的数据填充在request.wechat
里.
获取朋友列表:
var getFriendsList = function (request, response, next) {
var url = 'http://mp.weixin.qq.com/cgi-bin/contactmanagepage?t=wxm-friend&pagesize=&groupid=100';
var cb = function (res) {
var pattern = /<script id="json-friendList" type="json\/text">([\s\S]*)<\/script><script type="text\/javascript">/;
var fakes = [];
try {
fakes = JSON.parse(pattern.exec(res.text)[1]);
} catch (e) {
console.error(e);
}
request.wechat.fakes = fakes;
next();
};
superagent.get(url).set('Cookie', cookieAgent(request, response).toString()).end(cb);
};
补全好友信息:
var entry = function (request, response, next) {
var ep = new EventProxy();
var getInfo = function (index, fake) {
var url = 'http://mp.weixin.qq.com/cgi-bin/getcontactinfo?t=ajax-getcontactinfo&fakeid=' + fake.fakeId;
var cb = function (res) {
request.wechat.fakes[index] = JSON.parse(res.text);
ep.emit('getInfo');
};
superagent.get(url).set('Cookie', cookieAgent(request, response).toString()).end(cb);
};
ep.after('getInfo', request.wechat.fakes.length, function () {
// console.log(request.wechat.fakes);
next();
});
for (var i in request.wechat.fakes) {
getInfo(i, request.wechat.fakes[i]);
}
};
另外今天微信登录的post表单改了.
var postData = {
username: loginData.user,
pwd: md5(loginData.password.substr(0, 16)),
imgcode: loginData.verify,
register: 0,
f: 'json'
};
不错!
可以编辑的吧
谢谢提醒,总算找到了,但是位置和图标我感觉不明显,要是能调调那是最好不过的了.
大侠上面的代码使用的什么语言?我试了js和php都不像,只好自己用js重写一把了
完整的可运行的code能否给我发一份,我的邮箱如下: zrhhust@gmail.com
我用php模仿上传封面图片也碰到了document.domain问题,但是不知道怎么解决: 抓取正确的返回如下:
<script>
document.domain = location.hostname.match(/[^.]?.[^.]?$/); var url = window.location.href, type = url.match(/[?&]type=([^&])/), formId = url.match(/[?&]formId=([^&])/);
type = type[1] || 0; formId = formId[1]; top.W.upload.suc(“上传成功”, type, formId, ‘10000017’); </script>
但是我用PHP模拟上传了之后返回:
<script>
document.domain = location.hostname.match(/[^.]?.[^.]?$/); var url = window.location.href, type = url.match(/[?&]type=([^&])/), formId = url.match(/[?&]formId=([^&])/);
type = type[1] || 0;
formId = formId[1];
top.W.upload.err(“上传文件失败”, type, formId);
</script>
请问如何解决domain这个问题呢?
已发送
其实你要正则匹配拿回来的数据,
#node.js:
res.text.replace(/document.location.hostname.match.*[0]/g, ‘"’+req.host+’"’)
#php
preg_replace(’/document.location.hostname.match.*[0]/g/’,’"’.$_SERVER[‘HTTP_HOST’].’"’, results)
其实你主要是为了拿下面的10000017也就是封面图片的id,正则拿就好了. top.W.upload.suc(“上传成功”, type, formId, ‘10000017’);
完整的代码能否也给我分享下,我用php试了半天没搞出来就放弃了。看了你这个, 我有来劲了, 想参考你这个改成php的。 呵呵·~ 邮箱:273097817@qq.com 先谢谢了~~~~
这么好的项目,上到github上维护吧。
这种获取fakeid的方法只能是唯一一个用户的情况下,多人关注的时候,怎么获取呢?
已发送…记得查收
最近学习node.js,真心渴望一个demo,楼主分享一个吧,谢谢! oujianlin1990@126.com
楼主分享一下吧,谢谢!
magicbrighter@gmail.com
其实可以和公众平台的机器人结合起来实现更多交互
现在每次发送都需模拟登录,我已经改成了一次登录后就可以了,然后掉用发送接口即可,避免重复登录,增加了接口的稳定性,可靠性.现在需要此功能的人越来越多,这段时间我会将它放在我的github中.
nodejs发送微信代码我已经放入到我的github中,需要的到该地址下载 https://github.com/ym1623/node_wx
lz 用的什么编辑器,这个配色方案 怎么弄?
#node.js:
res.text.replace(/document.location.hostname.match.*[0]/g, ‘"’+req.host+’"’)
#php
preg_replace(’/document.location.hostname.match.*[0]/g/’,’"’.$_SERVER[‘HTTP_HOST’].’"’, results)
#node.js:
res.text.replace(/document.location.hostname.match.*[0]/g, ‘"’+req.host+’"’)
#php
preg_replace(’/document.location.hostname.match.*[0]/g/’,’"’.$_SERVER[‘HTTP_HOST’].’"’, results)`
楼主的开源精神值得学习,能不能发一份我呢?aven86@163.com
赞! 不过觉得这只是一个技术性的临时解决方案,最后微信团队肯定是要将发送微信的标准接口制定出来。 不过作为geek怎么能够忍耐等待官方的接口!!!再赞
php版的图片上传是否可以, 我在模拟上传的时候也遇到了这问题. 我的提示如下: <script> document.domain = location.hostname.match(/[^.]?.[^.]?$/); var url = window.location.href, type = url.match(/[?&]type=([^&])/), formId = url.match(/[?&]formId=([^&])/);
type = type[1] || 0;
formId = formId[1];
top.W.upload.err(“上传的素材格式不正确”, type, formId);
</script>
--------------------------- 如果已解决能否分享一下. 邮箱:1060314286@qq.com
楼主你好,我刚接触这一块,能发一份给我这个初学者研究研究吗? 664075573@qq.com
高手,你写的很漂亮,能否把源码发我一份,研究研究
邮箱105333972@qq.com
楼主辛苦了,请发给我一份完整代码吧,我的邮箱是:168177867@qq.com,谢谢!
copy上传的javascript代码,修改上传路径,在nodejs中引用
感谢楼主,正为获取fakeid着急呢,我用的php,模拟登陆获取用户信息页面但是返回的字符串到 <script type=“text/javascript”>
WXM.Conf = {};
WXM.Conf.protocol = (function(){
if(location.host.indexOf(“dev”)<0 && location.host.indexOf(“991”) < 0){
return 'https';
}
return ‘http’;
})();
下面的代码就输出不了,所以也就不用preg_replace了,请问楼主是为什么呢?参数都带上了
我用php想获取用户的头像,代码是这样写的。但是微信用户的图片一点就是下载的,显示不出来,跟一般的好像不一样。那我这样获取URL的方法是不是不对啊。我刚开始学代码,能不能麻烦楼主也写下php怎么保存头像啊。非常感谢啊。我正在做一个东西,但是卡在保存图像这很长时间了。您写的东西给了我很大的帮助,谢谢。 $headimg=“https://mp.weixin.qq.com/cgi-bin/getheadimg?token=".$this->_token."&fakeid=”.$match[1]; echo $headimg; //创建新图片的名称 $filename=date(“YmdHis”).".jpg"; //建立抓取图片类 $f = new SaeFetchurl(); //抓取图片 $res = $f->fetch($headimg); //如果抓取到图片 if($f->errno() == 0) { //新建存储类 $s = new SaeStorage(); //写入图片 $s->write( ‘sth’ , $filename , $res ); }
兄弟们拿到demo,也传一份给我,非常感谢: mail:j60017268@gmail.com
demo 请去我的github中下载,地址:https://github.com/ym1623/node_wx
现在这段时间不知道微信平台是否有变,因为有很多人都对这个功能很感兴趣,这段时间我会找个时间把这个功能推到github中,
真心没怎么关注coffee,你这样写看得好辛苦。
我是node初学,你用coffee写的,看的好困难,请问怎么运行你的代码呢?node index.js能运行,怎么用呢?
已经更新了github修复了登录bug
先运行运行npm install 命令,然后运行http://服务地址:端口/wx/login 或者 修改routers/test/test.coffee的第九行和第十行,把第八行的post修改为get,即能通过get的方式在浏览器中直接运行你的脚本
我现在模拟登录也获取不到用户信息了,是什么原因呢?
现在获取 fakeid 和获取用户信息的链接地址是不是,我自己找了很长时间也不试不出来哪个是,请问换成什么了呀???????????????、
初学node,完全一头雾水,求教怎么运行啊
你好 ,完全看不懂啊 我是弄php的 请问在么部署到php上怎么弄?
能否整个PHP 可以运行的(win环境的),小弟不懂node.js 或是你教我怎么整 QQ:742345550@qq.com
你可以用snoopy或者curl就可以了,,你可以多看看我的第一篇文章:http://cnodejs.org/topic/510889e9df9e9fcc58b69afe 还有我的github源码:https://github.com/ym1623/node_wx
又是coffescript ,很头痛
针对“Node.js 发送微信消息(原创)”这一主题,我将提供一个简单的示例来展示如何使用Node.js发送微信消息。这里将使用axios
库来进行HTTP请求,并使用dotenv
库来管理环境变量。
首先,你需要在微信开发者平台注册一个公众号或小程序,并获取相应的Access Token。之后可以使用以下步骤发送文本消息:
- 安装所需的依赖包:
npm install axios dotenv
- 创建
.env
文件并添加以下内容(确保替换成你自己的AppID和AppSecret):
APP_ID=your_app_id
APP_SECRET=your_app_secret
ACCESS_TOKEN_URL=https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APP_ID}&secret={APP_SECRET}
SEND_MSG_URL=https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={ACCESS_TOKEN}
- 创建一个名为
sendWechatMsg.js
的文件,并添加以下代码:
require('dotenv').config();
const axios = require('axios');
async function getAccessToken() {
const response = await axios.get(process.env.ACCESS_TOKEN_URL.replace('{APP_ID}', process.env.APP_ID).replace('{APP_SECRET}', process.env.APP_SECRET));
return response.data.access_token;
}
async function sendMsg(toUser, content) {
const accessToken = await getAccessToken();
const url = process.env.SEND_MSG_URL.replace('{ACCESS_TOKEN}', accessToken);
const msgData = {
touser: toUser,
msgtype: 'text',
text: {
content: content
}
};
try {
const resp = await axios.post(url, msgData);
console.log(`Message sent successfully!`, resp.data);
} catch (error) {
console.error('Error sending message:', error.response.data);
}
}
// 使用方法
sendMsg('openid', 'Hello from Node.js!');
这段代码实现了获取Access Token和发送文本消息的功能。你可以根据实际需求调整消息类型和内容。注意将openid
替换为接收方的OpenID。
希望这段代码对你有所帮助!