【网】利用http调用node-red-contrib-bizwechat节点

方糖大大的Pushbear因遭到恶意滥用,已经关停服务,使得各位规规矩矩使用该服务的网友很难受,但没办法,方糖大大不可能因为某些滥用者的做法承担过多的责任。

但还好,经过flashsoft 大佬,F 大佬和smarthomefans 组织的共同努力,发布了基于企业微信的node-red-contrib-bizwechat,基本已经可以完美替代 pushbear 。原文链接(https://bbs.hassbian.com/thread-7205-1-1.html)。该文章详细介绍了如何申请企业微信及如何在Node-Red中安装及配置node-red-contrib-bizwechat,基本上懂一些VPS搭建及编程功底的人都能看懂并配置完成。本人也按照此教程完成了节点的安装配置工作,并能手动触发消息发送。但距离完美替代PushBear还差一步,就是使其具有利用http的Post方式完成消息发送的功能。原文并没有说明如何配置http的接口,在作者的github中issue中也有人提交此问题,但作者的答复很简单,要自行设置http接口,同时存在安全认证问题。

本人对Node-Red并不是很熟悉,通过网络检索发现这是一个适用于物联网智能家居等IOT设备的轮子,但还好有官方手册,官方手册中就介绍了利用http endpoint来接收post来的数据,这就使得利用http来触发消息发送成为了可能。(官方手册地址为https://cookbook.nodered.org/http/post-form-data-to-a-flow )利用手册里的示例,我们成功的接收到了post来的数据,相关node节点布置如下。

只需要在流程中加入一个http in的节点,并将它与function节点连接起来,同时,在http in节点配置中定义好接收post传入数据的地址,即可通过http post方式,实现触发消息发送功能。此外,应在最后加入一个http response节点,使其可以response一个http 200,防止调用失去响应。Post端PHP版示例代码如下:

<?php

function send_post($url, $post_data) {
$postdata = http_build_query($post_data);
  $options = array(
    'http' => array(
      'method' => 'POST',
      'header' => 'Content-Type: application/x-www-form-urlencoded;charset=utf-8',
      'content' => $postdata,
      'timeout' => 15 * 60 // 超时时间(单位:s)
    )
  );
  $context = stream_context_create($options);
  $result = file_get_contents($url, false, $context);
 return $result;
}

//使用方法

$post_data = array(
  'key' => 'abcdefghijklmnopqrstuvwxyz',
  'title' =>'今日违章信息',
  'description' => $cc_str
);
send_post('http://msg.xxx.com:1880/msgsend',$post_data);

?>

此方法因为需要方位Node-Red的1880端口,如果没有权限控制,就意味着将Node-Red暴露在公网之中,所以我们要对Node-Red的端口进行一些安全处理措施。根据官方文档,Node-Red本身具有安全控制功能,但我们选用的是指定IP才能访问服务器的1880端口,实现安全控制功能。有兴趣的老铁可以根据官方手册,自行修改Node-Red的安全控制功能。


12月12日更新,之前漏掉了function功能如何获得数据,现在补充一下,funciton节点接收代码如下。

sendtitle=encodeURI('我是标题');
msg.title =decodeURI(sendtitle);
var m_title = msg.payload.title;
var m_des = msg.payload.description;
msg.title = m_title;
msg.description = m_des;
return msg;

 

标签: node-red-contrib-bizwechat pushbear wechat http

精彩评论
  1. Evan Evan

    你好,Function节点是不是也需要修改啊?怎么把post的变量传递给msg.payload或msg.title

    1. Evan Evan

      已调试完毕,解决了

发表评论: