Giter Site home page Giter Site logo

guidone / node-red-contrib-chatbot Goto Github PK

View Code? Open in Web Editor NEW
914.0 46.0 185.0 89.44 MB

Visually build a full featured chat bot for Telegram, Facebook Messenger, Whatsapp and Slack with Node-RED. Almost no coding skills required.

Home Page: http://red-bot.io

HTML 31.95% JavaScript 66.00% Dockerfile 0.01% SCSS 2.03% CSS 0.01%
chatbot messenger slack telegram

node-red-contrib-chatbot's Introduction


New! RedBot 1.0 is out, read here

Release npm RedBot Forum


With RedBot you can visually build a full featured chat bot for Telegram, Facebook Messenger, Viber, Twilio and Slack with Node-RED. Almost no coding skills required.

Node-RED is a tool for wiring together hardware devices, APIs and online services in new and interesting ways.

Maintaining RedBot is very time-consuming, if you like it, please consider:

RedBot

Documentation

  1. RedBot nodes
  2. Examples
  3. Advanced examples
  4. Chat context
  5. Changelog

Getting started

First of all install Node-RED

$ sudo npm install -g node-red

Then open the user data directory ~/.node-red and install the package

$ cd ~/.node-red
$ npm install node-red-contrib-chatbot

Then run

node-red

The next step is to create a chat bot, I recommend to use Telegram since the setup is easier ( Telegram allows polling to receive messages, so it's not necessary to create a https certificate). Use @BotFather to create a chat bot, follow instructions here then copy you access token.

Then open your Node-RED and add a Telegram Receiver, in the configuration panel, add a new bot and paste the token

Telegram Receiver

Now add a Message node and connect to the Telegram Receiver

Simple Message

Finally add a Telegram Sender node, don't forget to select in the configuration panel the same bot of the Telegram Receiver, this should be the final layout

Example Simple

Now you have a useful bot that answers "Hi there!" to any received message. We can do a lot better.

Credits

The MIT License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Coded with ❤️ in 🇮🇹

node-red-contrib-chatbot's People

Contributors

adamgoose avatar alex0520 avatar aniston avatar dependabot[bot] avatar dkkv avatar estalldecker avatar fuzzie360 avatar guidone avatar jacksbox avatar jflaflamme avatar jonathan-meyer avatar kyen99 avatar m2calabr avatar oidatiftla avatar rotzbua avatar syshen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

node-red-contrib-chatbot's Issues

Facebook Receive/Facebook Send crashes my node-Red

I have this installed on node-Red on Heroku. Is there an example to using the Facebook receive and Facebook send? I tried to set it up like the telegram example

Facebook Receiver --> /hi --> Hello World --> Facebook Send

I've also tried

Facebook Receiver --> Hello World --> Facebook Send

But when I deploy it crashes my server. I tried it several times after reinstalling everything on Heroku and it just crashes every time and I have to do a fresh install.

I have Facebook webhook setup and I receive my messages in the debug node.

msg.payload : Object
{ "object": "page", "entry": [ { "id": "1612769548xxxxx", "time": 14741334xxxxx, "messaging": [ { "sender": { "id": "1067505073xxxxx" }, "recipient": { "id": "1612769548xxxx" }, "timestamp": 14741334xxx, "message": { "mid": "mid.1474133483418:e8664ba87xxxxxxxx", "seq": 156, "text": "tester" } } ] } ] }


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

"Topic" TAG is not processed into block.

in the following sample the script process successfully {topic=sorry} on replying .
unfortunately it does process {topic=random} on "It's OK, I'll forgive you!" replying.
Is somebody can help ?
Regards.

! version = 2.0

  • i hate you
  • You're really mean! I'm not talking again until you apologize.{topic=sorry}

topic sorry

// This will match if the word "sorry" exists ANYWHERE in their message

  • [] sorry []
  • It's OK, I'll forgive you!{topic=random}
  • Nope, not until you apologize.
  • Say you're sorry!
  • Apologize!

< topic

how to send a message to the event?

how to send a message to the event?
my node:
[{"id":"419bc18b.1d416","type":"function","z":"859404ac.f5b828","name":"","func":"console.log(msg);\nmsg.payload.transport = 'telegram';\nmsg.payload.type = 'message';\nmsg.payload.chatId = '********';\nmsg.payload.content = 'test';\nreturn msg;","outputs":1,"noerr":0,"x":410,"y":300,"wires":[["fcd65ca4.ea444"]]},{"id":"3b2db523.3c6dea","type":"inject","z":"859404ac.f5b828","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":240,"y":300,"wires":[["419bc18b.1d416"]]},{"id":"fcd65ca4.ea444","type":"chatbot-message","z":"859404ac.f5b828","name":"","message":"","answer":false,"track":false,"parse_mode":"","x":570,"y":300,"wires":[["bbaa6e12.459b2","7555aa74.d25754"]]},{"id":"bbaa6e12.459b2","type":"chatbot-debug","z":"859404ac.f5b828","x":620,"y":200,"wires":[]},{"id":"7555aa74.d25754","type":"chatbot-telegram-send","z":"859404ac.f5b828","bot":"","track":false,"outputs":0,"x":770,"y":300,"wires":[]}]

function:
console.log(msg); msg.payload.transport = 'telegram'; msg.payload.type = 'message'; msg.payload.chatId = '********'; msg.payload.content = 'test'; return msg;

Facebook Send/ Receive node not available in RPi

Facebook Send/ Receive node is not loading on my Raspberry Pi 2. However, it works well on my Windows PC running an instance of Node-RED.

NodeRED version on my RPI2 is v0.14.6, NodeJS v0.10.29

/home/pi/.node-red/node_modules/messenger-bot/index.js:2
const url = require('url')
^^^^^
21 Sep 14:29:05 - [warn] [chart request] Deprecated call to RED.runtime.nodes.re gisterType - node-set name must be provided as first argument

Command not being recognised in group

Hi, when using redbot with Telegram and using the command node. When my bot is added to a group, the incoming command is /command@botname instead of just /command.

This is expected behaviour as I understand it but the command node does not recognise the input so you have to add a second node which seems excessive and also isn't covered by the documentation.

It would be best if all the nodes were able to deal with @botnetname on the end of the command.

Unhandled exceptions with telegrambot

For a while telegram receiver/sender works without issues in a node-red chat flow. However after node-red has been running for some time ( ~few days? (to-be-measured)) quite a few of these begin to occur.

Unhandled rejection TimeoutError: operation timed out
    at afterTimeout (/usr/local/lib/node_modules/node-red-contrib-chatbot/node_modules/request-promise/node_modules/bluebird/js/main/timers.js:16:15)
    at timeoutTimeout (/usr/local/lib/node_modules/node-red-contrib-chatbot/node_modules/request-promise/node_modules/bluebird/js/main/timers.js:59:9)
    at Timer.listOnTimeout (timers.js:92:15)

Any ideas what might be causing them?


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Cannot access chat object in subflow

I attempting to access the chat object that should be available in the flow context from within a subflow. Being a node-red newbie, I'm not even sure a subflow can access the flow context. My function node starts with the following:

var chatId = msg.originalMessage.chat.id // chatId exists
var chat = flow.get('chat:'+chatId) // chat is undefined

A chatbot listen node is the first node in the subflow and seems to access the flow context just fine. The listen properly responds to the configured tokens.

What am I missing?

Trigger message from "external"

Maybe I'm an idiot, but I can't figure out how to trigger a message from the bot to the user without starting with an "In" object.

To take a very simple example;, I want to create a flow that sends a telegram-message when I get a HTTP-request on http://nodered.example.com/sendmessage

It would be excellent with an example like that in the documentation

Doesn't working with v0.13.4-git

I can't get it woring with my node-red
after installing i'm getting endless animation on left panel of node red UI and

red.min.js:16 Uncaught TypeError: Cannot set property 'added' of undefinedregisterNodeType @ red.min.js:16(anonymous function) @ VM1213:2(anonymous function) @ vendor.js:2globalEval @ vendor.js:2domManip @ vendor.js:4append @ vendor.js:4(anonymous function) @ red.min.js:16j @ vendor.js:2fireWith @ vendor.js:2x @ vendor.js:5b @ vendor.js:5

in chrome developer console.

Alexa support

Would it be possible to support Alexa/Amazon Echo?

msg.chat is not a function

Hi,

I got strange error sending message via telegram sender node after various elaboration of message (like mqtt or other flows).

Comparing input of telegram node with a normal message I see no difference.
Input message is following:

msg : Object
object
_msgid: "2ce13225.d31ece"
->originalMessage: object
	message_id: 2706
	->from: object
		id: <NUMBEROFCHATID>
		first_name: "MYFN"
		last_name: "MYLN"
		username: "user1234"
	->chat: object
		id: <NUMBEROFCHATID>
		first_name: "MYFN"
		last_name: "MYLN"
		username: "user1234"
		type: "private"
	date: 1488789456
	text: "/smart"
	->entities: array[1]
		->0: object
			type: "bot_command"
			offset: 0
			length: 6
	transport: "telegram"
->payload: object
	type: "message"
	chatId: <NUMBEROFCHATID>
	inbound: false
	content: "OK !"

Error on debug node is the following:
msg : error "TypeError: msg.chat is not a function"

Modifying chat ID of Conversation node

Thinking about this use case:

  • I create a group and invite the bot
  • a Telegram user sends a message with command "/listen" to the group
  • a listening chatbot flow gets chatId and saves it
  • from now on, specific events will trigger a message sent with the Conversation node to that chatId

But I don't see any way for specifiying the chatId to Conversation out of manually configuring it, correct? It would be great to be able to add chatIds to nodes.

didn't receive any incoming message for Facebook

Hi,

I set up a Facebook in node, a Facebook out node, a function node, and a debug node to print out the payload from "Facebook in".

Facebook webhook verification is working fine. It passes the verification.

But I cannot get any message from "Facebook in" (try to debug by connecting it to a debug node.)

Then I insert a "HTTP input" node to debug, it shows Facebook actually sends messages to the webhook URL. But why the "Facebook in" node didn't handle it?

Telegram receiver does not work

I'm using an instance on openshift.

Node 0.10
node-red-contrib-chatbot 0.5.13

Unhandled rejection ReferenceError: Promise is not defined
    at TelegramBotNode.getMessageDetails (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/chatbot-telegram-receive.js:39:18)
    at TelegramBotNode.handleMessage (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/chatbot-telegram-receive.js:177:12)
    at TelegramBot.emit (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/eventemitter3/index.js:116:35)
    at TelegramBot.processUpdate (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/lib/telegram.js:104:14)
    at /var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/lib/telegramPolling.js:52:17
    at Array.forEach (native)
    at /var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/lib/telegramPolling.js:49:17
    at tryCatcher (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/util.js:26:23)
    at Promise._settlePromiseFromHandler (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:510:31)
    at Promise._settlePromiseAt (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:584:18)
    at Promise._settlePromises (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:700:14)
    at Async._drainQueue (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/async.js:123:16)
    at Async._drainQueues (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/async.js:133:10)
    at Async.drainQueues (/var/lib/openshift/57e00ddb2d527132ed0000ed/app-root/runtime/repo/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/async.js:15:14)
    at process._tickCallback (node.js:442:13)

Fancy keyboard

Hi guidone,
In python I can create this nice keyboards:

HIGH_BRIGHTNESS_SYMBOL = "\U0001F506" # b'\xF0\x9F\x94\x86'
LOW_BRIGHTNESS_SYMBOL = "\U0001F505" # b'\xF0\x9F\x94\x85'
UPWARDS_BLACK_ARROW = "\U00002B06" # b'\xE2\xAC\x86'
DOWNWARDS_BLACK_ARROW = "\U00002B07" # b'\xE2\xAC\x87'
DOOR = "\U0001f6aa" # b'\xF0\x9F\x9A\xAA'
VERTICAL_TRAFFIC_LIGHT = "\U0001F6A6" # b'\xF0\x9F\x9A\xA6'
CAMERA = "\U0001F4F7" # b'\xF0\x9F\x93\xB7'

def setNormalKeyboard(cid):
markup = types.ReplyKeyboardMarkup()
itembtn11 = types.KeyboardButton(UPWARDS_BLACK_ARROW+"\nBlind #1")
itembtn12 = types.KeyboardButton(UPWARDS_BLACK_ARROW+"\nBlind #2")
itembtn13 = types.KeyboardButton(UPWARDS_BLACK_ARROW+"\nBlind #3")
itembtn14 = types.KeyboardButton(UPWARDS_BLACK_ARROW+"\nBlind #4")
itembtn15 = types.KeyboardButton(HIGH_BRIGHTNESS_SYMBOL+"\nON")
markup.row(itembtn11, itembtn12, itembtn13, itembtn14, itembtn15)
itembtn21 = types.KeyboardButton(DOWNWARDS_BLACK_ARROW+"\nBlind #1")
itembtn22 = types.KeyboardButton(DOWNWARDS_BLACK_ARROW+"\nBlind #2")
itembtn23 = types.KeyboardButton(DOWNWARDS_BLACK_ARROW+"\nBlind #3")
itembtn24 = types.KeyboardButton(DOWNWARDS_BLACK_ARROW+"\nBlind #4")
itembtn25 = types.KeyboardButton(LOW_BRIGHTNESS_SYMBOL+"\nOFF")
markup.row(itembtn21, itembtn22, itembtn23, itembtn24, itembtn25)
itembtn31 = types.KeyboardButton(CAMERA+"#1")
itembtn32 = types.KeyboardButton(CAMERA+"#2")
itembtn33 = types.KeyboardButton(DOOR+"\nSmall Door1")
itembtn34 = types.KeyboardButton(VERTICAL_TRAFFIC_LIGHT+"\nMORE")
markup.row(itembtn31, itembtn32, itembtn33, itembtn34)

strMessage = "Choose one action:"
try:
    bot.send_message(chat_id=cid, text=strMessage, reply_markup=markup)
except:
    pass

Can I do the same with your Chatbot?
screenshot_20170326-165747

Parse Location

Hi,
This could be a lame but how do I change the parsed payload location from

{latitude: xxxx, longitude: yyyy}

to

{lat:xxx, lon:yyy}

Unhandled rejection Error continuously showing up

I was testing all the chatbot nodes in this chatbot contrib, when deploying these chatbot nodes in node-red, whenever I start the flow, an error message would keep showing on the console.

10 Aug 22:55:51 - [info] Stopping flows
10 Aug 22:55:51 - [info] Stopped flows
10 Aug 22:55:51 - [info] Starting flows
10 Aug 22:55:51 - [info] Started flows
Unhandled rejection Error: Closing node.
at Object.ensureErrorObject (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/util.js:261:20)
at Promise._rejectCallback (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:469:22)
at Promise._settlePromiseFromHandler (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:513:17)
at Promise._settlePromiseAt (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:581:18)
at Promise._settlePromises (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/promise.js:697:14)
at Async._drainQueue (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/async.js:123:16)
at Async._drainQueues (/home/vagrant/.node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/node_modules/bluebird/js/main/async.js:133:10)
at Immediate.Async.drainQueues as _onImmediate
at processImmediate as _immediateCallback

Although the error messages mention about the telegram-bot-api, but I found that, whether or not I have telegram nodes set up in the flow, the same messages would come up.

Something is breaking my docker

This is what shows to me.

at Async._drainQueue (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/async.js:123:16)
at Async._drainQueues (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/async.js:133:10)
at Immediate.Async.drainQueues as _onImmediate
at processImmediate as _immediateCallback
Unhandled rejection Error: 409 {"ok":false,"error_code":409,"description":"Conflict: terminated by other long poll or webhook"}
at /usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/src/telegramPolling.js:72:15
at tryCatcher (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/util.js:26:23)
at Promise._settlePromiseFromHandler (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/promise.js:507:31)
at Promise._settlePromiseAt (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/promise.js:581:18)
at Promise._settlePromises (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/promise.js:697:14)
at Async._drainQueue (/usr/src/node-red/node_modules/node-red-contrib-telegrambot/node_modules/node-telegram-bot-api/node_modules/bluebird/js/main/async.js:123:16)

Here is my flow:
[{"id":"a57e8fe2.23234","type":"chatbot-telegram-send","z":"81d92955.9666a8","bot":"9fabba67.1d0838","track":false,"outputs":0,"x":948,"y":380,"wires":[]},{"id":"4cf317bf.b5b5d8","type":"chatbot-command","z":"81d92955.9666a8","name":"","command":"/gate","x":438,"y":321,"wires":[["a9be57fd.fc5088","ebd394e3.da9cf8"]]},{"id":"a9be57fd.fc5088","type":"chatbot-waiting","z":"81d92955.9666a8","waitingType":"upload_photo","x":598,"y":379,"wires":[["a57e8fe2.23234"]]},{"id":"ebd394e3.da9cf8","type":"http request","z":"81d92955.9666a8","name":"","method":"GET","ret":"bin","url":"http://mortunha.servegame.com:8000/picture/1/current","tls":"","x":609,"y":322,"wires":[["71950575.6d43ec","23970dd5.8c89c2"]]},{"id":"375c37b9.916168","type":"chatbot-image","z":"81d92955.9666a8","name":"","filename":"","track":false,"x":800,"y":315,"wires":[["a57e8fe2.23234"]]},{"id":"94bb6b.13ddf498","type":"chatbot-command","z":"81d92955.9666a8","name":"","command":"/temp","x":400,"y":462,"wires":[["66bd0b68.b9d5a4","d64f65a7.fe31a8"]]},{"id":"66bd0b68.b9d5a4","type":"chatbot-waiting","z":"81d92955.9666a8","waitingType":"typing","x":560,"y":524,"wires":[["c0deb443.0ccd98"]]},{"id":"268bc97c.9cbff6","type":"influxdb in","z":"81d92955.9666a8","influxdb":"34cd6bd7.28f7b4","name":"influxdb query","query":"","x":817,"y":459,"wires":[["c8237e0.859138"]]},{"id":"c8237e0.859138","type":"function","z":"81d92955.9666a8","name":"generate msg","func":"lastTemp = msg.payload[0][0].last;\nmsg.payload.content = \"A temperatura atual é de \" + lastTemp + \"ºC\";\nmsg.payload.chatId = msg.originalMessage.chat.id;\nmsg.payload.type = \"message\";\nreturn msg;","outputs":1,"noerr":0,"x":1025,"y":458,"wires":[["c0deb443.0ccd98"]]},{"id":"d64f65a7.fe31a8","type":"function","z":"81d92955.9666a8","name":"get last temperature","func":"msg.query=\"SELECT last(value) FROM temperature WHERE device='18fe34f36113'\";\nreturn msg;","outputs":1,"noerr":0,"x":605,"y":460,"wires":[["268bc97c.9cbff6"]]},{"id":"c0deb443.0ccd98","type":"chatbot-telegram-send","z":"81d92955.9666a8","bot":"9fabba67.1d0838","track":false,"outputs":0,"x":1255,"y":519,"wires":[]},{"id":"f3f83cf4.19a69","type":"chatbot-command","z":"81d92955.9666a8","name":"","command":"/humi","x":402,"y":593,"wires":[["59d1a7fe.d32258","1d1b302.cbc59d"]]},{"id":"59d1a7fe.d32258","type":"chatbot-waiting","z":"81d92955.9666a8","waitingType":"typing","x":562,"y":655,"wires":[["9150bd4e.e0954"]]},{"id":"2ff26296.d150fe","type":"influxdb in","z":"81d92955.9666a8","influxdb":"34cd6bd7.28f7b4","name":"influxdb query","query":"","x":819,"y":590,"wires":[["c4eb0bd7.d81008"]]},{"id":"c4eb0bd7.d81008","type":"function","z":"81d92955.9666a8","name":"generate msg","func":"lastHumi = msg.payload[0][0].last;\nmsg.payload.content = \"A humidade relativa do ar atual é de \" + lastHumi + \"%\";\nmsg.payload.chatId = msg.originalMessage.chat.id;\nmsg.payload.type = \"message\";\nreturn msg;","outputs":1,"noerr":0,"x":1027,"y":589,"wires":[["9150bd4e.e0954"]]},{"id":"1d1b302.cbc59d","type":"function","z":"81d92955.9666a8","name":"get last humidity","func":"msg.query=\"SELECT last(value) FROM humidity WHERE device='18fe34f36113'\";\nreturn msg;","outputs":1,"noerr":0,"x":587,"y":591,"wires":[["2ff26296.d150fe"]]},{"id":"9150bd4e.e0954","type":"chatbot-telegram-send","z":"81d92955.9666a8","bot":"9fabba67.1d0838","track":false,"outputs":0,"x":1257,"y":650,"wires":[]},{"id":"71950575.6d43ec","type":"debug","z":"81d92955.9666a8","name":"","active":true,"console":"false","complete":"payload","x":869,"y":248,"wires":[]},{"id":"23970dd5.8c89c2","type":"switch","z":"81d92955.9666a8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"0","vt":"num"},{"t":"eq","v":"0","vt":"num"}],"checkall":"true","outputs":2,"x":598,"y":208,"wires":[["375c37b9.916168"],["ebd394e3.da9cf8"]]},{"id":"3ce15339.ce359c","type":"chatbot-telegram-receive","z":"81d92955.9666a8","bot":"9fabba67.1d0838","x":113,"y":420,"wires":[["f3f83cf4.19a69","94bb6b.13ddf498"]]},{"id":"2bb715e1.74ce3a","type":"chatbot-telegram-receive","z":"81d92955.9666a8","bot":"9fabba67.1d0838","x":197,"y":313,"wires":[["4cf317bf.b5b5d8"]]},{"id":"9fabba67.1d0838","type":"chatbot-telegram-node","z":"81d92955.9666a8","botname":"Lemmy","usernames":""},{"id":"34cd6bd7.28f7b4","type":"influxdb","z":"81d92955.9666a8","hostname":"doc.jeanbrito.com","port":"8086","database":"greenhouse","name":""}]


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Response changes identity

Hi, I have a simple bot which replies with a message like: "Hi {{firstName}}" and is ok, I got my name when I start it.

Some step ahead I issue a /back command (from a button) which points me to the start message but this time I got "Hi <>" and not my name, why?

Cant install getting 404 on slack/client ?

When running npm install node-red-contrib-chatbot I get this..

pi@raspberrypi:~/.node-red $ npm install node-red-contrib-chatbot
npm ERR! 404 Not Found
npm ERR! 404 
npm ERR! 404 'slack/client' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it
npm ERR! 404 It was specified as a dependency of 'node-red-contrib-chatbot'
npm ERR! 404 
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, or http url, or git url.

npm ERR! System Linux 4.4.34-v7+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "node-red-contrib-chatbot"
npm ERR! cwd /home/pi/.node-red
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.21
npm ERR! code E404
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/pi/.node-red/npm-debug.log
npm ERR! not ok code 0

relying on the existence of `msg.payload.chatId` in "Telegram Sender" prevents from using some other nodes

Hi.

First off, fantastic project! Thanks so much for your work.

I'm building a Telegram bot specifically, but appreciate that you make everything generic to use other platforms as well (I might want to start using Slack in the future).

The issue I encountered happens when I include some other "transformation node" (e.g. the built-in csv, html, json nodes) inside a flow that begins with the "Telegram Receiver" node and ends with the "Telegram Sender" node.
The problem is that those transformation nodes rely on their input being the msg.payload property, and they save their transformed output to the msg.payload property as well.
This means that any prior data saved on msg.payload is lost.
Specifically in the case of the "Telegram Sender" node this will mean it will no longer work because it expects msg.payload.chatId to exist (relevant source-code).

From the convention I see in the built-in node-red nodes and some of the comunnity nodes as well, this is by-design and not a bug. Meaning msg.payload exists for direct "node-to-next-immediate-node" communication, not for data that should be persisted along with the message for the entire flow. For that type of longer-living persistence, I think the convention is to create another property on the msg object (like you do with msg.originalMessage). By using a custom property and not payload, it's a lot safer that another node won't overwrite it. This is, for example, how the built-in HTTP request&response nodes communicate which is similar to what you're trying to accomplish.

Please let me know if you need more info or assitance from me.
Thank you!

API.AI node

Hi,
I am trying to use the API.AI node in my chatflow. I've defined my entities and intents on api.ai and am not sure how to use the api.ai chatbot flow.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Canned Replies

How can I create a canned connected conversation with anyone who initiates a chat via FB messenger? What I'm trying to do is to mimic API.AI with Redbot. I would like to get the response from a user for a multiple choice question and make the output as a single JSON formatted output.

For instance, you can think of a scenario like
Q1. What is your Age?
Q2. Male or Female?
Q3. Occupation
Q4. Phone Number

While asking these questions, I would like the chatbot to follow a set of pre-defined question that will guide the user to mandatorily give the expected output (like how API.AI and Rivescript does).

Can such a scenario be built using Redbot? I would like to mimic how the API.AI works with redbot.

Telegram Unhandled rejection TypeError

What might be the problem with this error?

Unhandled rejection TypeError: Cannot read property 'get' of undefined
at TelegramBotNode.handleMessage (/home/chris/.node-red/node_modules/node-red-contrib-chatbot/chatbot-telegram-receive.js:160:39)

no nodes on node-red after installation

root@v9069:~/.node-red# npm install node-red-contrib-chatbot
/root/.node-red
-- [email protected] +-- @slack/[email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | | -- [email protected]
| | -- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | -- [email protected]
| -- [email protected] | +-- [email protected] | -- [email protected]
+-- [email protected]
+-- [email protected]
| +-- [email protected]
| +-- [email protected]
| +-- [email protected]
| | -- [email protected] | +-- [email protected] | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | -- [email protected]
| -- [email protected] +-- [email protected] +-- [email protected] | +-- [email protected] | -- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
+-- [email protected]
| -- [email protected] +-- [email protected] | +-- [email protected] | | -- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | -- [email protected] | +-- [email protected] | | -- [email protected]
| +-- [email protected]
| +-- [email protected]
| +-- [email protected]
| | +-- [email protected]
| | -- [email protected] | | -- [email protected]
| -- [email protected] | -- [email protected]
+-- [email protected]
| +-- [email protected]
| -- [email protected] +-- [email protected] +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | | -- [email protected]
| +-- [email protected]
| +-- [email protected]
| +-- [email protected]
| | -- [email protected] | +-- [email protected] | | +-- [email protected] | | | +-- [email protected] | | | -- [email protected]
| | | -- [email protected] | | -- [email protected]
| +-- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | -- [email protected] | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | | +-- [email protected] | | | +-- [email protected] | | | +-- [email protected] | | | -- [email protected]
| | -- [email protected] | | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | +-- [email protected] | | | -- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | | -- [email protected] | | +-- [email protected] | | +-- [email protected] | | -- [email protected]
| +-- [email protected]
| +-- [email protected]
| +-- [email protected]
| +-- [email protected]
| | -- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | +-- [email protected] | | -- [email protected]
| +-- [email protected]
| -- [email protected] +-- [email protected] | +-- [email protected] | -- [email protected]
+-- [email protected]
| -- [email protected] | -- [email protected]
+-- [email protected]
| +-- [email protected]
| | +-- [email protected]
| | +-- [email protected]
| | | -- [email protected] | | -- [email protected]
| | -- [email protected] | +-- [email protected] | | +-- [email protected] | | | +-- [email protected] | | | | -- [email protected]
| | | -- [email protected] | | -- [email protected]
| -- [email protected] | -- [email protected]
| +-- [email protected]
| -- [email protected] | +-- [email protected] | -- [email protected]
+-- [email protected]
| -- [email protected] +-- [email protected] -- [email protected]
+-- [email protected]
`-- [email protected]

npm WARN enoent ENOENT: no such file or directory, open '/root/.node-red/package.json'
npm WARN .node-red No description
npm WARN .node-red No repository field.
npm WARN .node-red No README data
npm WARN .node-red No license field.

this is the outpot of installation

Unable to find context().global in Node-RED

Hi

I tried the simple Telegram example.
It shows its connected, but when sending a message I get 'Unable to find context().global in Node-RED' in the debug screen.
I'm using node-red 0.15.2 on IBM Bluemix.

What can this be ?

Thanks
Henk

Facebook Messenger send Buttons

Code for sending buttons to messenger is broken:
case 'buttons':
// prepare buttons
var quickReplies = _(msg.payload.buttons).map(function(button) {
return {
content_type: 'text',
title: button,
payload: button
};
});
// send
bot.sendMessage(
msg.payload.chatId,
{
text: msg.payload.content,
quick_replies: quickReplies
},
reportError
);
break;

it should be:

var quickReplies = _(msg.payload.buttons).map(function(button) {
return {
content_type: 'text',
title: button.label,
payload: button.value
};
});

And also html for buttons does not permit to insert value/label

Message template error

If I have a message like this:

xxxx {{payload}} xxxx

and payload is a string everything is ok, but if payload is a number it does not get inserted.

How do I use the Voice node?

I can type in a message manually but I need the voice node to pass on a message created in an upstream node. Can this be done?

keep getting an error with slack

Hi I am trying to send a message to slack but I keep getting this error message

TypeError: Cannot read property 'transport' of undefined

I use a an inject node to trgger the message. the payload is set to boolean true.
the message node only contains 'hi'.
the slack node says it is connected.

not sure what I am missing...

Seb


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

timeout issue and socket issue

Unhandled rejection RequestError: Error: connect ETIMEDOUT 149.154.167.200:443 at new RequestError (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/lib/errors.js:11:15) at Request.RP$callback [as _callback] (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/lib/rp.js:60:32) at self.callback (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/request/request.js:187:22) at emitOne (events.js:77:13) at Request.emit (events.js:169:7) at Request.onRequestError (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/request/request.js:813:8) at emitOne (events.js:77:13) at ClientRequest.emit (events.js:169:7) at TLSSocket.socketErrorListener (_http_client.js:267:9) at emitOne (events.js:77:13) at TLSSocket.emit (events.js:169:7) at emitErrorNT (net.js:1269:8) at nextTickCallbackWith2Args (node.js:442:9) at process._tickCallback (node.js:356:17)

Unhandled rejection RequestError: Error: socket hang up at new RequestError (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/lib/errors.js:11:15) at Request.RP$callback [as _callback] (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/node-telegram-bot-api/node_modules/request-promise/lib/rp.js:60:32) at self.callback (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/request/request.js:187:22) at emitOne (events.js:77:13) at Request.emit (events.js:169:7) at Request.onRequestError (/vagrant/stand-alone-node-red/node_modules/node-red/node_modules/node-red-contrib-chatbot/node_modules/request/request.js:813:8) at emitOne (events.js:77:13) at ClientRequest.emit (events.js:169:7) at TLSSocket.socketErrorListener (_http_client.js:267:9) at emitOne (events.js:77:13) at TLSSocket.emit (events.js:169:7) at emitErrorNT (net.js:1269:8) at nextTickCallbackWith2Args (node.js:442:9) at process._tickCallback (node.js:356:17)

When I leave the nodes for a while(not doing anything), I keep receiving these unhandled error msgs. They are not crashing node-red, but it is kind of annoying.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Facebook Menu

Hi, I'm trying to setup a Messenger menu but when I send back to Facebook the output of the block I got this error:

(#105) Number of call to actions exceeds the maximum allowed number

This is the debug output after the node:

11/4/2017, 16:50:28node: 2ea50287.0cd00e
msg : Object
object
payload: object
type: "persistent-menu"
chatId: "1702515586442155"
messageId: "mid.$cAAXuokGHoY1hjsPbAVbXX8SqR5aN"
items: array[6]
0: object
type: "postback"
title: "News"
payload: "News"
1: object
2: object
3: object
4: object
5: object
originalMessage: object
transport: "facebook"
chat: object
id: "1702515586442155"
_msgid: "587da288.c756ec"

no output from Facebook Receiver

Hi,
I'm using an instance of the Facebook Receiver on IBM Bluemix,
I configured the messenger webhook to call it and it registered the configuration with no problem.
The issue is that when I send a message through messanger nothing is coming out from the node, I can see it replying to the http post request on the console but there is no output.
Do you have any idea on what could cause the problem?
Thanks!

Catch telegram error 403

When sending a message to a user (chatId) which has deleted and blocked the bot, I receive the following error on the debug tab:

7/2/2017, 14:52:46
msg : error
Error: 403 {"ok":false,"error_code":403,"description":"Forbidden: Bot was blocked by the user"}

But I cannot catch it using catch node. What could I do? I need to delete the corresponding chatId from my db.

Most everything for slack seems to not work

When piping from slack receiver to just about anything I get "ReferenceError: self is not defined". If I just do receiver to output, it works just fine (it just echos my input). I see some comments that say that the slack module needs some love which is super ok, It'd still be nice to have that disclaimer up front vs trying it and being like why the heck does this not work (if it does indeed not work).

Is it possible to response multiple messages at once?

Hi Guidone

I am wondering is it possible to response with multiple messages at once when the bot gets a message from the user?
I checked it might be not possible since the later message will replace the previous one since the message is stored in the same msg.payload.content. But is there any other workaround way to do the same behavior? Or you have any plan to add such feature in the future (allow the bot creator to add multiple messages in the text)?

RiveScript parser

I have followed the RiveScript parser example but I keep receiving error on the 'Telegram Sender' node when the second output flow is triggered.

TypeError: msg.chat is not a function

Error, wrong validation token

I've this message on site https://*****/redbot/facebook

Error, wrong validation token

but token, access token and app secret in Facebook Receiver is correct.
Redbot runs on a bluemix host.

node-red v0.16.2
node-red-contrib-chatbot v0.6.17

How to send unsolicited messages to the Chat Bot

Hi,
As platform, I'm using Telegram.

As part of a HomeAutomation concept system, I was thinking to add also a ChatBot as interface. With NodeRED and your module it has been easy to create a prototype.
What I'm not been able to do is to send a message to the Bot without a TelegramReceiver.
The problem is that i need to set up the context. Simple with "transport", but then I get an error of the kind: "msg.char() is not a function". It is something in the context set by the Receiver that I need to add.

In short, to be able to use if for notification (for example: an event on the Home site happen, I want to notify an alert using Telegram). Would be nice to document how to manage this UseCase.

Uncaught Exception

Hi,
When I send a command from Slack, node-red abruptly terminates with the following error:

15 Dec 13:20:18 - [red] Uncaught Exception: 15 Dec 13:20:18 - ReferenceError: self is not defined at RTMClient.<anonymous> (/home/pi/.node-red/node_modules/node-red-contrib-c hatbot/chatbot-slack-receive.js:142:69) at RTMClient.emit (/home/pi/.node-red/node_modules/eventemitter3/index.js:11 6:35) at RTMClient.emit (/home/pi/.node-red/node_modules/@slack/client/lib/clients /client.js:83:39) at RTMClient._handleWsMessageViaEventHandler (/home/pi/.node-red/node_module s/@slack/client/lib/clients/rtm/client.js:466:10) at RTMClient.handleWsMessage (/home/pi/.node-red/node_modules/@slack/client/ lib/clients/rtm/client.js:420:10) at WebSocket.wrapper (/home/pi/.node-red/node_modules/@slack/client/node_mod ules/lodash/lodash.js:4921:19) at emitTwo (events.js:87:13) at WebSocket.emit (events.js:172:7) at Receiver.ontext (/home/pi/.node-red/node_modules/@slack/client/node_modul es/ws/lib/WebSocket.js:841:10) at /home/pi/.node-red/node_modules/@slack/client/node_modules/ws/lib/Receive r.js:536:18 at Receiver.applyExtensions (/home/pi/.node-red/node_modules/@slack/client/n ode_modules/ws/lib/Receiver.js:371:5) at /home/pi/.node-red/node_modules/@slack/client/node_modules/ws/lib/Receive r.js:508:14 at Receiver.flush (/home/pi/.node-red/node_modules/@slack/client/node_module s/ws/lib/Receiver.js:347:3) at Receiver.opcodes.1.finish (/home/pi/.node-red/node_modules/@slack/client/ node_modules/ws/lib/Receiver.js:541:12) at Receiver.expectHandler (/home/pi/.node-red/node_modules/@slack/client/nod e_modules/ws/lib/Receiver.js:499:31) at Receiver.add (/home/pi/.node-red/node_modules/@slack/client/node_modules/ ws/lib/Receiver.js:103:24) at TLSSocket.realHandler (/home/pi/.node-red/node_modules/@slack/client/node _modules/ws/lib/WebSocket.js:825:20) at emitOne (events.js:77:13) at TLSSocket.emit (events.js:169:7) at readableAddChunk (_stream_readable.js:153:18) at TLSSocket.Readable.push (_stream_readable.js:111:10) at TLSWrap.onread (net.js:537:20)

Can't initiate a chat using the conversation node

[{"id":"ae336b2e.356da8","type":"inject","z":"432b859c.aafd0c","name":"","topic":"Pi BOT","payload":"Is it me you're looking for?","payloadType":"str","repeat":"","crontab":"","once":false,"x":235.50003051757812,"y":439.8000183105469,"wires":[["e7c78221.26164"]]},{"id":"9b79f7df.2e0538","type":"chatbot-telegram-send","z":"432b859c.aafd0c","bot":"edbd32e.1e115d","track":false,"outputs":0,"x":806.0000152587891,"y":438.00001525878906,"wires":[]},{"id":"e7c78221.26164","type":"chatbot-conversation","z":"432b859c.aafd0c","name":"","chatId":"202430638","transport":"telegram","x":433.49998474121094,"y":439.40000915527344,"wires":[["9b79f7df.2e0538"]]},{"id":"edbd32e.1e115d","type":"chatbot-telegram-node","z":"","botname":"KnightTestBot","usernames":"","polling":"1000","log":""}]

Fails with "msg.payload.chatId is empty"

This also fails:

[{"id":"ae336b2e.356da8","type":"inject","z":"432b859c.aafd0c","name":"","topic":"Pi BOT","payload":"Is it me you're looking for?","payloadType":"str","repeat":"","crontab":"","once":false,"x":230,"y":460,"wires":[["e7c78221.26164"]]},{"id":"9b79f7df.2e0538","type":"chatbot-telegram-send","z":"432b859c.aafd0c","bot":"edbd32e.1e115d","track":false,"outputs":0,"x":910,"y":460,"wires":[]},{"id":"e7c78221.26164","type":"chatbot-conversation","z":"432b859c.aafd0c","name":"","chatId":"202430638","transport":"telegram","x":390,"y":460,"wires":[["f0dd3631.132388"]]},{"id":"f0dd3631.132388","type":"change","z":"432b859c.aafd0c","name":"","rules":[{"t":"set","p":"payload.chatID","pt":"msg","to":"202430638","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":460,"wires":[["9b79f7df.2e0538"]]},{"id":"edbd32e.1e115d","type":"chatbot-telegram-node","z":"","botname":"KnightTestBot","usernames":"","polling":"1000","log":""}]

So how do you initiate a message to a group?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.