mirror of
https://github.com/cheveguerra/bot-whatsapp.git
synced 2026-04-21 04:59:15 +00:00
Merge branch 'codigoencasa:main' into main
This commit is contained in:
45
.github/workflows/check-providers.yml
vendored
45
.github/workflows/check-providers.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: Rev Providers
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- dev
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-npm:
|
|
||||||
name: Install Dependencies
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16.x
|
|
||||||
cache: 'yarn'
|
|
||||||
registry-url: https://registry.npmjs.org/
|
|
||||||
|
|
||||||
- run: corepack enable
|
|
||||||
|
|
||||||
- name: Install NPM Dependencies
|
|
||||||
run: yarn install --immutable --network-timeout 300000
|
|
||||||
|
|
||||||
- name: Check Baileys
|
|
||||||
run: yarn node ./scripts/checker.js --name=baileys --stable=true
|
|
||||||
|
|
||||||
- name: Check Venom
|
|
||||||
run: yarn node ./scripts/checker.js --name=venom --stable=true
|
|
||||||
|
|
||||||
- name: Check web-whatsapp
|
|
||||||
run: yarn node ./scripts/checker.js --name=web-whatsapp --stable=true
|
|
||||||
|
|
||||||
- name: Check Meta
|
|
||||||
run: yarn node ./scripts/checker.js --name=meta --stable=true
|
|
||||||
|
|
||||||
- name: Check Twilio
|
|
||||||
run: yarn node ./scripts/checker.js --name=twilio --stable=true
|
|
||||||
|
|
||||||
- uses: stefanzweifel/git-auto-commit-action@v4
|
|
||||||
with:
|
|
||||||
commit_message: 'ci(providers): 👍 updated versions stable providers'
|
|
||||||
3
.github/workflows/codeql.yml
vendored
3
.github/workflows/codeql.yml
vendored
@@ -13,7 +13,7 @@ name: 'CodeQL'
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ['main', dev, next-release]
|
branches: [release/next]
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
# The branches below must be a subset of the branches above
|
||||||
branches: ['main']
|
branches: ['main']
|
||||||
@@ -22,6 +22,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
|
if: ${{ !github.event.act }}
|
||||||
name: Analyze
|
name: Analyze
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
|
|||||||
6
.github/workflows/contributors.yml
vendored
6
.github/workflows/contributors.yml
vendored
@@ -1,8 +1,8 @@
|
|||||||
name: Revisando Colaboradores
|
name: Revisando Colaboradores
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
schedule:
|
||||||
branches:
|
- cron: '0 9 * * *'
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
contrib-readme-job:
|
contrib-readme-job:
|
||||||
|
|||||||
1
.github/workflows/netlify-dev.yml
vendored
1
.github/workflows/netlify-dev.yml
vendored
@@ -13,6 +13,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
############ DOCUMENTATION BUILD ############
|
############ DOCUMENTATION BUILD ############
|
||||||
build-documentation:
|
build-documentation:
|
||||||
|
if: ${{ !github.event.act }}
|
||||||
name: Build Package
|
name: Build Package
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/netlify.yml
vendored
5
.github/workflows/netlify.yml
vendored
@@ -3,12 +3,11 @@ name: 📄 (PROD) Desplegando documentacion
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- release/next
|
||||||
- next-release
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
############ DOCUMENTATION BUILD ############
|
############ DOCUMENTATION BUILD ############
|
||||||
build-documentation:
|
build-documentation-prod:
|
||||||
name: Build Package
|
name: Build Package
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/releases-dev.yml
vendored
5
.github/workflows/releases-dev.yml
vendored
@@ -3,7 +3,7 @@ name: 🚀 (DEV) Liberando versiones
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- next-release
|
- release/next
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
############ RELEASE ############
|
############ RELEASE ############
|
||||||
@@ -44,6 +44,9 @@ jobs:
|
|||||||
- name: Release @bot-whatsapp/provider
|
- name: Release @bot-whatsapp/provider
|
||||||
run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}"
|
run: yarn node ./scripts/release.js --name=provider --version= --token="${{ secrets.NPM_TOKEN }}"
|
||||||
|
|
||||||
|
- name: Release @bot-whatsapp/contexts
|
||||||
|
run: yarn node ./scripts/release.js --name=contexts --version= --token="${{ secrets.NPM_TOKEN }}"
|
||||||
|
|
||||||
- name: Release @bot-whatsapp/portal
|
- name: Release @bot-whatsapp/portal
|
||||||
run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}"
|
run: yarn node ./scripts/release.js --name=portal --version= --token="${{ secrets.NPM_TOKEN }}"
|
||||||
|
|
||||||
|
|||||||
27
.github/workflows/releases.yml
vendored
27
.github/workflows/releases.yml
vendored
@@ -1,11 +1,13 @@
|
|||||||
name: 🚀⚡ Liberando versiones
|
name: 🚀⚡ Liberando versiones
|
||||||
|
|
||||||
on:
|
on:
|
||||||
release:
|
push:
|
||||||
types: [created]
|
branches:
|
||||||
|
- release/production
|
||||||
jobs:
|
jobs:
|
||||||
############ RELEASE ############
|
############ RELEASE ############
|
||||||
release:
|
release-prod:
|
||||||
|
if: ${{ !github.event.act }}
|
||||||
name: Release
|
name: Release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -56,11 +58,22 @@ jobs:
|
|||||||
- name: Release @bot-whatsapp/provider
|
- name: Release @bot-whatsapp/provider
|
||||||
run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
|
run: yarn node ./scripts/release.js --name=provider --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
|
||||||
|
|
||||||
|
- name: Release @bot-whatsapp/contexts
|
||||||
|
run: yarn node ./scripts/release.js --name=contexts --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
|
||||||
|
|
||||||
- name: Release @bot-whatsapp/portal
|
- name: Release @bot-whatsapp/portal
|
||||||
run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
|
run: yarn node ./scripts/release.js --name=portal --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.NPM_TOKEN }}"
|
||||||
|
|
||||||
- name: Commit and push changes
|
- name: Release Github
|
||||||
uses: devops-infra/action-commit-push@master
|
run: yarn node ./scripts/github.js --version="${{ steps.package-version.outputs.current-version}}" --token="${{ secrets.OCTO_TOKEN }}"
|
||||||
|
|
||||||
|
- name: 'Run if changes have been detected'
|
||||||
|
run: |
|
||||||
|
git add .
|
||||||
|
git commit -m "chore(version): pre release"
|
||||||
|
|
||||||
|
- name: Commit Versioning & Push changes
|
||||||
|
if: github.event_name == 'push'
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@v4
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
commit_message: 'chore(version): launch release 🚀 "${{ steps.package-version.outputs.current-version}}"'
|
||||||
commit_message: 'release(version): 🚀 - "${{ steps.package-version.outputs.current-version}}" release'
|
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -42,3 +42,4 @@ yarn-error.log
|
|||||||
.npmrc
|
.npmrc
|
||||||
# Local Netlify folder
|
# Local Netlify folder
|
||||||
.netlify
|
.netlify
|
||||||
|
.secrets
|
||||||
31
CHANGELOG.md
31
CHANGELOG.md
@@ -2,6 +2,37 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
### [0.1.16](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.15...v0.1.16) (2023-01-11)
|
||||||
|
|
||||||
|
### [0.1.15](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.14...v0.1.15) (2023-01-11)
|
||||||
|
|
||||||
|
### [0.1.14](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.13...v0.1.14) (2023-01-11)
|
||||||
|
|
||||||
|
### [0.1.13](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.12...v0.1.13) (2023-01-11)
|
||||||
|
|
||||||
|
### [0.1.12](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.12) (2023-01-11)
|
||||||
|
|
||||||
|
### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10)
|
||||||
|
|
||||||
|
### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10)
|
||||||
|
|
||||||
|
### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10)
|
||||||
|
|
||||||
|
### [0.1.11](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.10...v0.1.11) (2023-01-11)
|
||||||
|
|
||||||
|
### [0.1.9-pre](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.9...v0.1.9-pre) (2023-01-10)
|
||||||
|
|
||||||
|
### [0.1.7-pre-1](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-alpha...v0.1.7-pre-1) (2023-01-10)
|
||||||
|
|
||||||
|
### [0.1.7-alpha](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7-alpha) (2023-01-10)
|
||||||
|
|
||||||
|
### [0.1.10](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.8...v0.1.10) (2023-01-11)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* :fire: update qr package ([ecde23f](https://github.com/leifermendez/bot-whatsapp/commit/ecde23fdea65def209aa874af35a3f293e6b1a91))
|
||||||
|
|
||||||
### [0.1.8](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.8) (2023-01-10)
|
### [0.1.8](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.8) (2023-01-10)
|
||||||
|
|
||||||
### [0.1.7](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7) (2023-01-10)
|
### [0.1.7](https://github.com/leifermendez/bot-whatsapp/compare/v0.1.7-pre...v0.1.7) (2023-01-10)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/root",
|
"name": "@bot-whatsapp/root",
|
||||||
"version": "0.1.8",
|
"version": "0.1.16",
|
||||||
"description": "Bot de wahtsapp open source para MVP o pequeños negocios",
|
"description": "Bot de wahtsapp open source para MVP o pequeños negocios",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -67,6 +67,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^17.3.0",
|
"@commitlint/cli": "^17.3.0",
|
||||||
"@commitlint/config-conventional": "^17.3.0",
|
"@commitlint/config-conventional": "^17.3.0",
|
||||||
|
"@octokit/core": "^4.1.0",
|
||||||
"@rollup/plugin-commonjs": "^23.0.2",
|
"@rollup/plugin-commonjs": "^23.0.2",
|
||||||
"@rollup/plugin-json": "^5.0.1",
|
"@rollup/plugin-json": "^5.0.1",
|
||||||
"@rollup/plugin-node-resolve": "^15.0.1",
|
"@rollup/plugin-node-resolve": "^15.0.1",
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ const { createWriteStream } = require('fs')
|
|||||||
const logger = new Console({
|
const logger = new Console({
|
||||||
stdout: createWriteStream(`${process.cwd()}/core.class.log`),
|
stdout: createWriteStream(`${process.cwd()}/core.class.log`),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const QueuePrincipal = new Queue()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos
|
* [ ] Escuchar eventos del provider asegurarte que los provider emitan eventos
|
||||||
* [ ] Guardar historial en db
|
* [ ] Guardar historial en db
|
||||||
@@ -84,20 +87,40 @@ class CoreClass {
|
|||||||
this.databaseClass.save(ctxByNumber)
|
this.databaseClass.save(ctxByNumber)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 📄 Esta funcion se encarga de enviar un array de mensajes dentro de este ctx
|
||||||
|
const sendFlow = async (messageToSend, numberOrId) => {
|
||||||
|
const queue = []
|
||||||
|
for (const ctxMessage of messageToSend) {
|
||||||
|
const delayMs = ctxMessage?.options?.delay || 0
|
||||||
|
if (delayMs) await delay(delayMs)
|
||||||
|
QueuePrincipal.enqueue(() =>
|
||||||
|
Promise.all([
|
||||||
|
this.sendProviderAndSave(numberOrId, ctxMessage),
|
||||||
|
resolveCbEveryCtx(ctxMessage),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return Promise.all(queue)
|
||||||
|
}
|
||||||
|
|
||||||
// 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje
|
// 📄 [options: fallBack]: esta funcion se encarga de repetir el ultimo mensaje
|
||||||
const fallBack = () => {
|
const fallBack = async () => {
|
||||||
fallBackFlag = true
|
fallBackFlag = true
|
||||||
msgToSend = this.flowClass.find(refToContinue?.keyword, true) || []
|
await this.sendProviderAndSave(from, refToContinue)
|
||||||
this.sendFlow(msgToSend, from)
|
QueuePrincipal.queue = []
|
||||||
return refToContinue
|
return refToContinue
|
||||||
}
|
}
|
||||||
|
|
||||||
// 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes
|
// 📄 [options: flowDynamic]: esta funcion se encarga de responder un array de respuesta esta limitado a 5 mensajes
|
||||||
// para evitar bloque de whatsapp
|
// para evitar bloque de whatsapp
|
||||||
const flowDynamic = (listMsg = [], optListMsg = { limit: 3 }) => {
|
const flowDynamic = async (
|
||||||
|
listMsg = [],
|
||||||
|
optListMsg = { limit: 5, fallback: false }
|
||||||
|
) => {
|
||||||
if (!Array.isArray(listMsg))
|
if (!Array.isArray(listMsg))
|
||||||
throw new Error('Esto debe ser un ARRAY')
|
throw new Error('Esto debe ser un ARRAY')
|
||||||
|
|
||||||
|
fallBackFlag = optListMsg.fallback
|
||||||
const parseListMsg = listMsg
|
const parseListMsg = listMsg
|
||||||
.map(({ body }, index) =>
|
.map(({ body }, index) =>
|
||||||
toCtx({
|
toCtx({
|
||||||
@@ -108,26 +131,38 @@ class CoreClass {
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
.slice(0, optListMsg.limit)
|
.slice(0, optListMsg.limit)
|
||||||
msgToSend = parseListMsg
|
for (const msg of parseListMsg) {
|
||||||
this.sendFlow(msgToSend, from)
|
await this.sendProviderAndSave(from, msg)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback o fallback
|
||||||
|
const resolveCbEveryCtx = async (ctxMessage) => {
|
||||||
|
if (prevMsg?.options?.capture) return cbEveryCtx(prevMsg?.ref)
|
||||||
|
if (!ctxMessage?.options?.capture)
|
||||||
|
return await cbEveryCtx(ctxMessage?.ref)
|
||||||
|
}
|
||||||
|
|
||||||
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo
|
// 📄 Se encarga de revisar si el contexto del mensaje tiene callback y ejecutarlo
|
||||||
const cbEveryCtx = (inRef) => {
|
const cbEveryCtx = async (inRef) => {
|
||||||
this.flowClass.allCallbacks[inRef](messageCtxInComming, {
|
if (!this.flowClass.allCallbacks[inRef]) return Promise.resolve()
|
||||||
|
return this.flowClass.allCallbacks[inRef](messageCtxInComming, {
|
||||||
fallBack,
|
fallBack,
|
||||||
flowDynamic,
|
flowDynamic,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prevMsg?.ref) resolveCbEveryCtx(prevMsg)
|
||||||
|
|
||||||
// 📄 [options: callback]: Si se tiene un callback se ejecuta
|
// 📄 [options: callback]: Si se tiene un callback se ejecuta
|
||||||
if (!fallBackFlag) {
|
//TODO AQUI
|
||||||
if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref)
|
// if (!fallBackFlag) {
|
||||||
for (const ite of this.flowClass.find(body)) {
|
// if (prevMsg?.options?.capture) cbEveryCtx(prevMsg?.ref)
|
||||||
if (!ite?.options?.capture) cbEveryCtx(ite?.ref)
|
// for (const ite of this.flowClass.find(body)) {
|
||||||
}
|
// if (!ite?.options?.capture) cbEveryCtx(ite?.ref)
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa
|
// 📄🤘(tiene return) [options: nested(array)]: Si se tiene flujos hijos los implementa
|
||||||
if (!fallBackFlag && prevMsg?.options?.nested?.length) {
|
if (!fallBackFlag && prevMsg?.options?.nested?.length) {
|
||||||
@@ -138,11 +173,12 @@ class CoreClass {
|
|||||||
|
|
||||||
msgToSend = this.flowClass.find(body, false, flowStandalone) || []
|
msgToSend = this.flowClass.find(body, false, flowStandalone) || []
|
||||||
|
|
||||||
for (const ite of msgToSend) {
|
// //TODO AQUI
|
||||||
cbEveryCtx(ite?.ref)
|
// for (const ite of msgToSend) {
|
||||||
}
|
// cbEveryCtx(ite?.ref)
|
||||||
|
// }
|
||||||
|
|
||||||
this.sendFlow(msgToSend, from)
|
sendFlow(msgToSend, from)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,13 +189,13 @@ class CoreClass {
|
|||||||
|
|
||||||
if (['string', 'boolean'].includes(typeCapture) && valueCapture) {
|
if (['string', 'boolean'].includes(typeCapture) && valueCapture) {
|
||||||
msgToSend = this.flowClass.find(refToContinue?.ref, true) || []
|
msgToSend = this.flowClass.find(refToContinue?.ref, true) || []
|
||||||
this.sendFlow(msgToSend, from)
|
sendFlow(msgToSend, from)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msgToSend = this.flowClass.find(body) || []
|
msgToSend = this.flowClass.find(body) || []
|
||||||
this.sendFlow(msgToSend, from)
|
sendFlow(msgToSend, from)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -176,18 +212,6 @@ class CoreClass {
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
sendFlow = async (messageToSend, numberOrId) => {
|
|
||||||
const queue = []
|
|
||||||
for (const ctxMessage of messageToSend) {
|
|
||||||
const delayMs = ctxMessage?.options?.delay || 0
|
|
||||||
if (delayMs) await delay(delayMs)
|
|
||||||
Queue.enqueue(() =>
|
|
||||||
this.sendProviderAndSave(numberOrId, ctxMessage)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return Promise.all(queue)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @param {*} message
|
* @param {*} message
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/bot",
|
"name": "@bot-whatsapp/bot",
|
||||||
"version": "0.0.52-alpha.0",
|
"version": "0.0.61-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./lib/bundle.bot.cjs",
|
"main": "./lib/bundle.bot.cjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ module.exports = [
|
|||||||
banner: banner['banner.output'].join(''),
|
banner: banner['banner.output'].join(''),
|
||||||
file: join(__dirname, 'lib', 'bundle.bot.cjs'),
|
file: join(__dirname, 'lib', 'bundle.bot.cjs'),
|
||||||
format: 'cjs',
|
format: 'cjs',
|
||||||
|
sourcemap: true,
|
||||||
},
|
},
|
||||||
plugins: [commonjs(), nodeResolve()],
|
plugins: [commonjs(), nodeResolve()],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
class Queue {
|
class Queue {
|
||||||
static queue = []
|
queue = []
|
||||||
static pendingPromise = false
|
pendingPromise = false
|
||||||
|
|
||||||
static enqueue(promise) {
|
enqueue(promise) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
this.queue.push({
|
this.queue.push({
|
||||||
promise,
|
promise,
|
||||||
@@ -13,7 +13,7 @@ class Queue {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
static dequeue() {
|
dequeue() {
|
||||||
if (this.workingOnPromise) {
|
if (this.workingOnPromise) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/cli",
|
"name": "@bot-whatsapp/cli",
|
||||||
"version": "0.0.59-alpha.0",
|
"version": "0.0.67-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/contexts",
|
"name": "@bot-whatsapp/contexts",
|
||||||
"version": "0.0.1",
|
"version": "0.0.11-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./lib/bundle.contexts.cjs",
|
"main": "./lib/bundle.contexts.cjs",
|
||||||
"files": [
|
"files": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "create-bot-whatsapp",
|
"name": "create-bot-whatsapp",
|
||||||
"version": "0.0.70-alpha.0",
|
"version": "0.0.78-alpha.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "./lib/bundle.create-bot-whatsapp.cjs",
|
"main": "./lib/bundle.create-bot-whatsapp.cjs",
|
||||||
"files": [
|
"files": [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/database",
|
"name": "@bot-whatsapp/database",
|
||||||
"version": "0.0.51-alpha.0",
|
"version": "0.0.59-alpha.0",
|
||||||
"description": "Esto es el conector a mysql, pg, mongo",
|
"description": "Esto es el conector a mysql, pg, mongo",
|
||||||
"main": "./lib/mock/index.cjs",
|
"main": "./lib/mock/index.cjs",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
|||||||
@@ -47,13 +47,20 @@ export default component$(() => {
|
|||||||
npm create bot-whatsapp@latest
|
npm create bot-whatsapp@latest
|
||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex w-full sm:w-auto">
|
<div class="flex w-full sm:w-auto gap-3">
|
||||||
<a
|
<a
|
||||||
href="/docs"
|
href="/docs"
|
||||||
class="btn bg-gray-50 dark:bg-transparent"
|
class="btn bg-gray-50 dark:bg-transparent"
|
||||||
>
|
>
|
||||||
Ver documentación
|
Ver documentación
|
||||||
</a>
|
</a>
|
||||||
|
<a
|
||||||
|
target={'_blank'}
|
||||||
|
href="https://youtu.be/DEIyGyJNGa8"
|
||||||
|
class="btn bg-gray-50 dark:bg-transparent"
|
||||||
|
>
|
||||||
|
Ver video
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Navigation from '../../../components/widgets/Navigation'
|
import Navigation from '../../../components/widgets/Navigation'
|
||||||
|
|
||||||
# Flow (Flujos)
|
# Flow
|
||||||
|
|
||||||
Los flujos hace referencia al hecho de construir un flujo de conversion. Esto es un flow podemos observar que estan presente dos metodos importantes **addKeyword** y el **addAnswer**.
|
Los flujos hace referencia al hecho de construir un flujo de conversion. Esto es un flow podemos observar que estan presente dos metodos importantes **addKeyword** y el **addAnswer**.
|
||||||
|
|
||||||
@@ -23,6 +23,142 @@ const flowPrincipal = addKeyword(['hola', 'alo'])
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## addKeyword()
|
||||||
|
|
||||||
|
Esta funcion se utliza para iniciar un flujo de conversion. <br /> Recibe un `string` o un `array`
|
||||||
|
de string `['hola','buenas']`.
|
||||||
|
|
||||||
|
**Opciones**
|
||||||
|
|
||||||
|
- sensitive: Sensible a mayusculas y minusculas por defecto `false`
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { addKeyword } = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola')
|
||||||
|
|
||||||
|
const flowArray = addKeyword(['hola', 'alo'])
|
||||||
|
|
||||||
|
const flowSensitive = addKeyword(['hola', 'alo'], {
|
||||||
|
sensitive: true,
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## addAnswer()
|
||||||
|
|
||||||
|
Esta funcion se utliza para responder un mensaje despues del `addKeyword()`
|
||||||
|
|
||||||
|
**Opciones**
|
||||||
|
|
||||||
|
- delay: 0 (milisegundos)
|
||||||
|
- media: url de imagen
|
||||||
|
- buttons: array `[{body:'Boton1'}, {body:'Boton2'}, {body:'Boton3'}]`
|
||||||
|
- capture: false (para esperar respuesta)
|
||||||
|
- child: Objecto tipo flujo o arra de flujos hijos
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { addKeyword } = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola').addAnswer(
|
||||||
|
'Este mensaje se enviara 1 segundo despues',
|
||||||
|
{
|
||||||
|
delay: 1000,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola').addAnswer(
|
||||||
|
'Este mensaje envia una imagen',
|
||||||
|
{
|
||||||
|
media: 'https://i.imgur.com/0HpzsEm.png',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola').addAnswer(
|
||||||
|
'Este mensaje envia tres botones',
|
||||||
|
{
|
||||||
|
buttons: [
|
||||||
|
{ body: 'Boton 1' },
|
||||||
|
{ body: 'Boton 2' },
|
||||||
|
{ body: 'Boton 3' },
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola').addAnswer(
|
||||||
|
'Este mensaje espera una respueta del usuario',
|
||||||
|
{
|
||||||
|
capture: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ctx
|
||||||
|
|
||||||
|
Este argumento se utiliza para obtener el contexto de la conversación
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { addKeyword } = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola').addAnswer(
|
||||||
|
'Indica cual es tu email',
|
||||||
|
null,
|
||||||
|
(ctx) => {
|
||||||
|
console.log('👉 Informacion del contexto: ', ctx)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## fallBack()
|
||||||
|
|
||||||
|
Esta funcion se utliza para volver a enviar el ultimo mensaje abajo un ejemplo.
|
||||||
|
En el ejemplo de abajo esperamos que el usuario ingrese un mensaje que contenga `@` sino contiene
|
||||||
|
se repetira el mensaje `Indica cual es tu email`
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { addKeyword } = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola').addAnswer(
|
||||||
|
'Indica cual es tu email',
|
||||||
|
null,
|
||||||
|
(ctx, { fallBack }) => {
|
||||||
|
if (!ctx.body.includes('@')) return fallBack()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## flowDynamic()
|
||||||
|
|
||||||
|
Esta funcion se utliza para devolver mensajes dinamicos que pueden venir de una API o Base de datos.
|
||||||
|
La funcion recibe un array que debe contener la siguiente estrucutura:
|
||||||
|
|
||||||
|
`[{body:'Mensaje}, {body:'Mensaje2}]`
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { addKeyword } = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const flowString = addKeyword('hola')
|
||||||
|
.addAnswer('Indica cual es tu email', null, async (ctx, {flowDynamic}) => {
|
||||||
|
const mensajesDB = () => {
|
||||||
|
const categories = db.find(...)
|
||||||
|
const mapDatos = categories.map((c) => ({body:c.name}))
|
||||||
|
return mapDatos
|
||||||
|
}
|
||||||
|
await flowDynamic(mensajesDB())
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
<Navigation
|
<Navigation
|
||||||
pages={[
|
pages={[
|
||||||
{ name: 'Conceptos', link: '/docs/essential' },
|
{ name: 'Conceptos', link: '/docs/essential' },
|
||||||
|
|||||||
@@ -39,6 +39,12 @@ Estamos trabajando en el apartado de la documentación lo más claro posible. Pu
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
### Meta: Configuración
|
||||||
|
|
||||||
|
Estamos trabajando en el apartado de la documentación lo más claro posible. Puedes encontrar los [detalles aquí](/docs/providers/meta)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
<Navigation
|
<Navigation
|
||||||
pages={[
|
pages={[
|
||||||
{ name: 'Conversaciones', link: '/docs/providers' },
|
{ name: 'Conversaciones', link: '/docs/providers' },
|
||||||
|
|||||||
@@ -1,3 +1,159 @@
|
|||||||
|
import Alert from '../../../../components/widgets/Alert'
|
||||||
|
import Navigation from '../../../../components/widgets/Navigation'
|
||||||
|
|
||||||
# Meta
|
# Meta
|
||||||
|
|
||||||
...
|
La Plataforma de WhatsApp Business permite a medianas y grandes empresas comunicarse con sus clientes a gran escala.
|
||||||
|
Puedes iniciar conversaciones con clientes en apenas unos minutos, enviarles notificaciones de atención al cliente o actualizaciones de compras, ofrecerles un nivel de servicio personalizado y
|
||||||
|
prestarles ayuda a través del canal que ellos prefieran.
|
||||||
|
|
||||||
|
### Requerimientos
|
||||||
|
|
||||||
|
- Registrar una cuenta de [facebook developers](https://developers.facebook.com/apps)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Requerimientos
|
||||||
|
|
||||||
|
Debes crear una aplicación nueva. Para ello haz clic en el botón **Crear aplicación**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
En esta pantalla debes de seleccionar **Empresa o Business**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
En el siguiente paso debes escribir un nombre al tu aplicación también colocar un email de contacto y seleccionar la aplicación de Test Business
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ahora dirígete a la sección de Ajustes de WhatsApp.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Está la parte donde encontraras el token acceso y también puedes ver el número **desde donde** se envía los mensajes de WhatsApp
|
||||||
|
y **a donde** se va a enviar.
|
||||||
|
Como estás en la versión de prueba, deberás dar de alta los números a los que quieres enviar.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
En esta misma página puedes encontrar el apartado de **Webhook** que pronto necesitaremos usar
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
En el **archivo principal** del bot donde estás implementando la función del adaptador de meta vas a colocar los siguientes datos:
|
||||||
|
|
||||||
|
- **numberId:** Lo puedes encontrar en la pagina anterior
|
||||||
|
- **jwtToken:** Lo puedes encontrar en la pagina anterior
|
||||||
|
- **verifyToken:** Puedes escribir lo que quieras es como una palabra clave
|
||||||
|
|
||||||
|
<Alert>
|
||||||
|
En el ejemplo de abajo puedes ver como una sugerencia de como puede ser
|
||||||
|
utilizando variables de entorno
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
```js
|
||||||
|
const main = async () => {
|
||||||
|
const adapterDB = new MockAdapter()
|
||||||
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
|
|
||||||
|
const adapterProvider = createProvider(MetaProvider, {
|
||||||
|
jwtToken: process.env.JWTOKEN, //EAARBW3ZBGU0UBAACDjtQIzI8JuEa.............
|
||||||
|
numberId: process.env.NUMBER_ID, //103975305758520
|
||||||
|
verifyToken: process.env.VERIFY_TOKEN, //LO_QUE_SEA
|
||||||
|
})
|
||||||
|
|
||||||
|
createBot({
|
||||||
|
flow: adapterFlow,
|
||||||
|
provider: adapterProvider,
|
||||||
|
database: adapterDB,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Luego de ejecutar el bot encontraras un mensaje en la consola similar al siguiente.
|
||||||
|
Donde podrás encontrar la URL para tu **webhook**
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ npm start
|
||||||
|
|
||||||
|
> bot-whatsapp-base-meta-memory@1.0.0 start
|
||||||
|
> node app.js
|
||||||
|
|
||||||
|
|
||||||
|
[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"
|
||||||
|
[meta]: POST http://localhost:3000/webhook
|
||||||
|
[meta]: Más información en la documentacion
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ¿Ahora que hago?
|
||||||
|
|
||||||
|
Podrás observar que el bot inicia un servicio HTTP (endpoint) que debe estar en un servidor en linea para que puedas conectarlo con Meta.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Opción 1:
|
||||||
|
|
||||||
|
Puedes hacer pruebas en local atrevés de un servidor proxy tunnel.
|
||||||
|
Descarga **[ngork](https://ngrok.com/download)** es una herramienta gratuita que nos ayudara con esto.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Esto genera una URL en línea que podemos usar en la parte de **WebHook** de Meta
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Opción 2:
|
||||||
|
|
||||||
|
Si ya tienes desplegado tu bot en un servidor tienes que obtener la IP publica o subdominio que te proporcionaron. **Ejemplo** si estas usando
|
||||||
|
[Railway](https://railway.app/) puedes ir a la seccion de ajustes y generar un subdominio. Ya tendriamos el **WebHook**
|
||||||
|
`https://base-twilio-memory-production.up.railway.app/twilio-hook`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<Navigation
|
||||||
|
pages={[
|
||||||
|
{ name: 'Proveedores', link: '/docs/providers' },
|
||||||
|
{ name: 'Meta', link: '/docs/providers/meta' },
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/portal",
|
"name": "@bot-whatsapp/portal",
|
||||||
"version": "0.0.9-alpha.0",
|
"version": "0.0.17-alpha.0",
|
||||||
"description": "Portal WEB para escanear QR",
|
"description": "Portal WEB para escanear QR",
|
||||||
"main": "./lib/portal.http.cjs",
|
"main": "./lib/portal.http.cjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@bot-whatsapp/provider",
|
"name": "@bot-whatsapp/provider",
|
||||||
"version": "0.0.57-alpha.0",
|
"version": "0.0.65-alpha.0",
|
||||||
"description": "Esto es el conector a Twilio, Meta, etc...",
|
"description": "Esto es el conector a Twilio, Meta, etc...",
|
||||||
"main": "./lib/mock/index.cjs",
|
"main": "./lib/mock/index.cjs",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"twilio": "3.84.0"
|
"twilio": "3.84.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
47
scripts/github.js
Normal file
47
scripts/github.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
const process = require('node:process')
|
||||||
|
const { Octokit } = require('@octokit/core')
|
||||||
|
|
||||||
|
const [PKG_ARG, GITHUB_TOKEN] = process.argv.slice(2) || [null]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publicar Release en Github
|
||||||
|
* @param {*} name
|
||||||
|
* @param {*} tag_name
|
||||||
|
* @param {*} auth
|
||||||
|
* @param {*} owner
|
||||||
|
* @param {*} repo
|
||||||
|
*/
|
||||||
|
const githubGithubRelease = async (
|
||||||
|
name = '',
|
||||||
|
tag_name = '',
|
||||||
|
auth = '',
|
||||||
|
owner = 'codigoencasa',
|
||||||
|
repo = 'bot-whatsapp'
|
||||||
|
) => {
|
||||||
|
const octokit = new Octokit({
|
||||||
|
auth,
|
||||||
|
})
|
||||||
|
|
||||||
|
await octokit.request(`POST /repos/${owner}/${repo}/releases`, {
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
tag_name,
|
||||||
|
name,
|
||||||
|
body: 'Description of the release',
|
||||||
|
draft: false,
|
||||||
|
prerelease: false,
|
||||||
|
generate_release_notes: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
if (PKG_ARG) {
|
||||||
|
const githubToken = GITHUB_TOKEN ? GITHUB_TOKEN.split('=').at(1) : null
|
||||||
|
const pkgNumber = PKG_ARG ? PKG_ARG.split('=').at(1) : null
|
||||||
|
|
||||||
|
if (pkgNumber)
|
||||||
|
await githubGithubRelease(`v${pkgNumber}`, pkgNumber, githubToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
FROM node:lts-bullseye as bot
|
FROM node:18-bullseye as bot
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
RUN npm i
|
RUN npm i
|
||||||
COPY . .
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
ARG PORT
|
ARG PORT
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
|
|||||||
@@ -5,26 +5,8 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes. Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)**
|
**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes. Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver documentación](https://bot-whatsapp.netlify.app/)**
|
||||||
|
|
||||||
```js
|
|
||||||
const main = async () => {
|
|
||||||
const adapterDB = new MockAdapter()
|
|
||||||
const adapterFlow = createFlow([flowPrincipal])
|
|
||||||
|
|
||||||
const adapterProvider = createProvider(BaileysProvider, {
|
|
||||||
accountSid: process.env.ACC_SID,
|
|
||||||
authToken: process.env.ACC_TOKEN,
|
|
||||||
vendorNumber: process.env.ACC_VENDOR,
|
|
||||||
})
|
|
||||||
|
|
||||||
createBot({
|
|
||||||
flow: adapterFlow,
|
|
||||||
provider: adapterProvider,
|
|
||||||
database: adapterDB,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install
|
npm install
|
||||||
|
|||||||
@@ -5,86 +5,90 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
||||||
|
|
||||||
/**
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
* Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo:
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
*
|
])
|
||||||
* Menu Principal
|
|
||||||
* - SubMenu 1
|
|
||||||
* - Submenu 1.1
|
|
||||||
* - Submenu 2
|
|
||||||
* - Submenu 2.1
|
|
||||||
*
|
|
||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'doc',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
[
|
||||||
.addAnswer('y algunas otras cosas.')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowZapatos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🤪 Únete al discord',
|
||||||
.addAnswer(
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowBolsos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Declarando flujo principal
|
|
||||||
*/
|
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const adapterDB = new JsonFileAdapter()
|
const adapterDB = new JsonFileAdapter()
|
||||||
const adapterFlow = createFlow([flowPrincipal])
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
const adapterProvider = createProvider(BaileysProvider)
|
const adapterProvider = createProvider(BaileysProvider)
|
||||||
|
|
||||||
createBot({
|
createBot({
|
||||||
flow: adapterFlow,
|
flow: adapterFlow,
|
||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-bailey-json",
|
"name": "base-bailey-json",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
"@bot-whatsapp/provider": "latest",
|
"@bot-whatsapp/provider": "latest",
|
||||||
|
"@bot-whatsapp/portal": "latest",
|
||||||
"@adiwajshing/baileys": "4.4.0",
|
"@adiwajshing/baileys": "4.4.0",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"wa-sticker-formatter": "4.3.2"
|
"wa-sticker-formatter": "4.3.2"
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
FROM node:lts-bullseye as bot
|
FROM node:18-bullseye as bot
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
RUN npm i
|
RUN npm i
|
||||||
COPY . .
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
ARG PORT
|
ARG PORT
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
|
|||||||
@@ -5,26 +5,8 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes. Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver más informacion](https://bot-whatsapp.netlify.app/)**
|
**Con esta librería, puedes construir flujos automatizados de conversación de manera agnóstica al proveedor de WhatsApp,** configurar respuestas automatizadas para preguntas frecuentes, recibir y responder mensajes de manera automatizada, y hacer un seguimiento de las interacciones con los clientes. Además, puedes configurar fácilmente disparadores que te ayudaran a expandir las funcionalidades sin límites. **[Ver documentación](https://bot-whatsapp.netlify.app/)**
|
||||||
|
|
||||||
```js
|
|
||||||
const main = async () => {
|
|
||||||
const adapterDB = new MockAdapter()
|
|
||||||
const adapterFlow = createFlow([flowPrincipal])
|
|
||||||
|
|
||||||
const adapterProvider = createProvider(BaileysProvider, {
|
|
||||||
accountSid: process.env.ACC_SID,
|
|
||||||
authToken: process.env.ACC_TOKEN,
|
|
||||||
vendorNumber: process.env.ACC_VENDOR,
|
|
||||||
})
|
|
||||||
|
|
||||||
createBot({
|
|
||||||
flow: adapterFlow,
|
|
||||||
provider: adapterProvider,
|
|
||||||
database: adapterDB,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
```
|
||||||
npm install
|
npm install
|
||||||
|
|||||||
@@ -5,86 +5,90 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
const MockAdapter = require('@bot-whatsapp/database/mock')
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
/**
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
* Aqui declaramos los flujos hijos, los flujos se declaran de atras para adelante, es decir que si tienes un flujo de este tipo:
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
*
|
])
|
||||||
* Menu Principal
|
|
||||||
* - SubMenu 1
|
|
||||||
* - Submenu 1.1
|
|
||||||
* - Submenu 2
|
|
||||||
* - Submenu 2.1
|
|
||||||
*
|
|
||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'doc',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
[
|
||||||
.addAnswer('y algunas otras cosas.')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowZapatos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🤪 Únete al discord',
|
||||||
.addAnswer(
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowBolsos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Declarando flujo principal
|
|
||||||
*/
|
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const adapterDB = new MockAdapter()
|
const adapterDB = new MockAdapter()
|
||||||
const adapterFlow = createFlow([flowPrincipal])
|
const adapterFlow = createFlow([flowPrincipal])
|
||||||
const adapterProvider = createProvider(BaileysProvider)
|
const adapterProvider = createProvider(BaileysProvider)
|
||||||
|
|
||||||
createBot({
|
createBot({
|
||||||
flow: adapterFlow,
|
flow: adapterFlow,
|
||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-bailey-memory",
|
"name": "base-bailey-memory",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
"@bot-whatsapp/provider": "latest",
|
"@bot-whatsapp/provider": "latest",
|
||||||
|
"@bot-whatsapp/portal": "latest",
|
||||||
"@adiwajshing/baileys": "4.4.0",
|
"@adiwajshing/baileys": "4.4.0",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"wa-sticker-formatter": "4.3.2"
|
"wa-sticker-formatter": "4.3.2"
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
FROM node:lts-bullseye as bot
|
FROM node:18-bullseye as bot
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
RUN npm i
|
RUN npm i
|
||||||
COPY . .
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
ARG PORT
|
ARG PORT
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
||||||
|
|
||||||
@@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -95,6 +108,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-bailey-mongo",
|
"name": "base-bailey-mongo",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
FROM node:lts-bullseye as bot
|
FROM node:18-bullseye as bot
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
RUN npm i
|
RUN npm i
|
||||||
COPY . .
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
ARG PORT
|
ARG PORT
|
||||||
CMD ["npm", "start"]
|
CMD ["npm", "start"]
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
const BaileysProvider = require('@bot-whatsapp/provider/baileys')
|
||||||
const MySQLAdapter = require('@bot-whatsapp/database/mysql')
|
const MySQLAdapter = require('@bot-whatsapp/database/mysql')
|
||||||
|
|
||||||
@@ -30,58 +29,72 @@ const MYSQL_DB_NAME = 'bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -98,6 +111,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-bailey-mysql",
|
"name": "base-bailey-mysql",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
9
starters/apps/base-meta-json/Dockerfile
Normal file
9
starters/apps/base-meta-json/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -20,58 +20,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-meta-json",
|
"name": "base-meta-json",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
9
starters/apps/base-meta-memory/Dockerfile
Normal file
9
starters/apps/base-meta-memory/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -20,58 +20,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-meta-memory",
|
"name": "base-meta-memory",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
9
starters/apps/base-meta-mongo/Dockerfile
Normal file
9
starters/apps/base-meta-mongo/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -27,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-meta-mongo",
|
"name": "base-meta-mongo",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
9
starters/apps/base-meta-mysql/Dockerfile
Normal file
9
starters/apps/base-meta-mysql/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -28,58 +28,72 @@ const MYSQL_DB_NAME = 'bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-meta-mysql",
|
"name": "base-meta-mysql",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
9
starters/apps/base-twilio-json/Dockerfile
Normal file
9
starters/apps/base-twilio-json/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -20,58 +20,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-twilio-json",
|
"name": "base-twilio-json",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.1",
|
"body-parser": "^1.20.1",
|
||||||
"polka": "^0.5.2",
|
"polka": "^0.5.2",
|
||||||
"twilio": "3.84.0",
|
"twilio": "3.84.1",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
9
starters/apps/base-twilio-memory/Dockerfile
Normal file
9
starters/apps/base-twilio-memory/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -20,58 +20,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-twilio-memory",
|
"name": "base-twilio-memory",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.1",
|
"body-parser": "^1.20.1",
|
||||||
"polka": "^0.5.2",
|
"polka": "^0.5.2",
|
||||||
"twilio": "3.84.0",
|
"twilio": "3.84.1",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
9
starters/apps/base-twilio-mongo/Dockerfile
Normal file
9
starters/apps/base-twilio-mongo/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -27,58 +27,72 @@ const MONGO_DB_NAME = 'db_bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-twilio-mongo",
|
"name": "base-twilio-mongo",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.1",
|
"body-parser": "^1.20.1",
|
||||||
"polka": "^0.5.2",
|
"polka": "^0.5.2",
|
||||||
"twilio": "3.84.0",
|
"twilio": "3.84.1",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
9
starters/apps/base-twilio-mysql/Dockerfile
Normal file
9
starters/apps/base-twilio-mysql/Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
FROM node:18-bullseye as bot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm i
|
||||||
|
COPY . .
|
||||||
|
ARG RAILWAY_STATIC_URL
|
||||||
|
ARG PUBLIC_URL
|
||||||
|
ARG PORT
|
||||||
|
CMD ["npm", "start"]
|
||||||
@@ -29,58 +29,72 @@ const MYSQL_DB_NAME = 'bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-twilio-mysql",
|
"name": "base-twilio-mysql",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.1",
|
"body-parser": "^1.20.1",
|
||||||
"polka": "^0.5.2",
|
"polka": "^0.5.2",
|
||||||
"twilio": "3.84.0",
|
"twilio": "3.84.1",
|
||||||
"@bot-whatsapp/bot": "latest",
|
"@bot-whatsapp/bot": "latest",
|
||||||
"@bot-whatsapp/cli": "latest",
|
"@bot-whatsapp/cli": "latest",
|
||||||
"@bot-whatsapp/database": "latest",
|
"@bot-whatsapp/database": "latest",
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
||||||
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
||||||
|
|
||||||
@@ -22,58 +21,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -85,6 +98,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-venom-json",
|
"name": "base-venom-json",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
||||||
const MockAdapter = require('@bot-whatsapp/database/mock')
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
@@ -22,58 +21,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -85,6 +98,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-venom-memory",
|
"name": "base-venom-memory",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
||||||
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
||||||
|
|
||||||
@@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -95,6 +108,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-venom-mongo",
|
"name": "base-venom-mongo",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
const VenomProvider = require('@bot-whatsapp/provider/venom')
|
||||||
const MySQLAdapter = require('@bot-whatsapp/database/mysql')
|
const MySQLAdapter = require('@bot-whatsapp/database/mysql')
|
||||||
|
|
||||||
@@ -31,58 +30,72 @@ const MYSQL_DB_NAME = 'bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -99,6 +112,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-venom-mysql",
|
"name": "base-venom-mysql",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
|
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
|
||||||
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
||||||
|
|
||||||
@@ -22,58 +21,72 @@ const JsonFileAdapter = require('@bot-whatsapp/database/json')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -85,6 +98,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-wweb-json",
|
"name": "base-wweb-json",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -5,8 +5,7 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
require('./server.http')
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
|
|
||||||
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
|
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
|
||||||
const MockAdapter = require('@bot-whatsapp/database/mock')
|
const MockAdapter = require('@bot-whatsapp/database/mock')
|
||||||
|
|
||||||
@@ -22,58 +21,72 @@ const MockAdapter = require('@bot-whatsapp/database/mock')
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -85,6 +98,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-wweb-memory",
|
"name": "base-wweb-memory",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
@@ -5,11 +5,10 @@ const {
|
|||||||
addKeyword,
|
addKeyword,
|
||||||
} = require('@bot-whatsapp/bot')
|
} = require('@bot-whatsapp/bot')
|
||||||
|
|
||||||
|
const QRPortalWeb = require('@bot-whatsapp/portal')
|
||||||
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
|
const WebWhatsappProvider = require('@bot-whatsapp/provider/web-whatsapp')
|
||||||
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
const MongoAdapter = require('@bot-whatsapp/database/mongo')
|
||||||
|
|
||||||
require('./server.http')
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Declaramos las conexiones de Mongo
|
* Declaramos las conexiones de Mongo
|
||||||
*/
|
*/
|
||||||
@@ -29,58 +28,72 @@ const MONGO_DB_NAME = 'db_bot'
|
|||||||
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
* Primero declaras los submenus 1.1 y 2.1, luego el 1 y 2 y al final el principal.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const flowBolsos2 = addKeyword(['bolsos2', '2'])
|
const flowSecundario = addKeyword(['2', 'siguiente']).addAnswer([
|
||||||
.addAnswer('🤯 *MUCHOS* bolsos ...')
|
'📄 Aquí tenemos el flujo secundario',
|
||||||
.addAnswer('y mas bolsos... bla bla')
|
])
|
||||||
|
|
||||||
const flowZapatos2 = addKeyword(['zapatos2', '2'])
|
const flowDocs = addKeyword([
|
||||||
.addAnswer('🤯 repito que tengo *MUCHOS* zapatos.')
|
'doc',
|
||||||
.addAnswer('y algunas otras cosas.')
|
'documentacion',
|
||||||
|
'documentación',
|
||||||
|
]).addAnswer(
|
||||||
|
[
|
||||||
|
'📄 Aquí encontras las documentación recuerda que puedes mejorarla',
|
||||||
|
'https://bot-whatsapp.netlify.app/',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowZapatos = addKeyword(['1', 'zapatos', 'ZAPATOS'])
|
const flowTuto = addKeyword(['tutorial', 'tuto']).addAnswer(
|
||||||
.addAnswer('🤯 Veo que elegiste zapatos')
|
[
|
||||||
.addAnswer('Tengo muchos zapatos...bla bla')
|
'🙌 Aquí encontras un ejemplo rapido',
|
||||||
.addAnswer(
|
'https://bot-whatsapp.netlify.app/docs/example/',
|
||||||
['Manda:', '*(2) Zapatos2*', 'para mas información'],
|
'\n*2* Para siguiente paso.',
|
||||||
{ capture: true },
|
],
|
||||||
(ctx) => {
|
null,
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
null,
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
[flowSecundario]
|
||||||
console.log(ctx)
|
)
|
||||||
},
|
|
||||||
[flowZapatos2]
|
|
||||||
)
|
|
||||||
|
|
||||||
const flowBolsos = addKeyword(['2', 'bolsos', 'BOLSOS'])
|
const flowGracias = addKeyword(['gracias', 'grac']).addAnswer(
|
||||||
.addAnswer('🙌 Veo que elegiste bolsos')
|
[
|
||||||
.addAnswer('Tengo muchos bolsos...bla bla')
|
'🚀 Puedes aportar tu granito de arena a este proyecto',
|
||||||
.addAnswer(
|
'[*opencollective*] https://opencollective.com/bot-whatsapp',
|
||||||
['Manda:', '*(2) Bolsos2*', 'para mas información.'],
|
'[*buymeacoffee*] https://www.buymeacoffee.com/leifermendez',
|
||||||
{ capture: true },
|
'[*patreon*] https://www.patreon.com/leifermendez',
|
||||||
(ctx) => {
|
'\n*2* Para siguiente paso.',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
],
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
null,
|
||||||
console.log(ctx)
|
null,
|
||||||
},
|
[flowSecundario]
|
||||||
[flowBolsos2]
|
)
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
const flowDiscord = addKeyword(['discord']).addAnswer(
|
||||||
* Declarando flujo principal
|
[
|
||||||
*/
|
'🤪 Únete al discord',
|
||||||
|
'https://link.codigoencasa.com/DISCORD',
|
||||||
|
'\n*2* Para siguiente paso.',
|
||||||
|
],
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
[flowSecundario]
|
||||||
|
)
|
||||||
|
|
||||||
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
const flowPrincipal = addKeyword(['hola', 'ole', 'alo'])
|
||||||
.addAnswer(['Hola, bienvenido a mi tienda', '¿Como puedo ayudarte?'])
|
.addAnswer('🙌 Hola bienvenido a este *Chatbot*')
|
||||||
.addAnswer(['Tengo:', 'Zapatos', 'Bolsos', 'etc ...'])
|
|
||||||
.addAnswer(
|
.addAnswer(
|
||||||
['Para continuar escribe:', '*(1) Zapatos*', '*(2) Bolsos*'],
|
[
|
||||||
{ capture: true },
|
'te comparto los siguientes links de interes sobre el proyecto',
|
||||||
(ctx) => {
|
'👉 *doc* para ver la documentación',
|
||||||
console.log('Aqui puedes ver más info del usuario...')
|
'👉 *gracias* para ver la lista de videos',
|
||||||
console.log('Puedes enviar un mail, hook, etc..')
|
'👉 *discord* unirte al discord',
|
||||||
console.log(ctx)
|
],
|
||||||
},
|
null,
|
||||||
[flowBolsos, flowZapatos]
|
null,
|
||||||
|
[flowDocs, flowGracias, flowTuto, flowDiscord]
|
||||||
)
|
)
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
@@ -95,6 +108,7 @@ const main = async () => {
|
|||||||
provider: adapterProvider,
|
provider: adapterProvider,
|
||||||
database: adapterDB,
|
database: adapterDB,
|
||||||
})
|
})
|
||||||
|
QRPortalWeb()
|
||||||
}
|
}
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "bot-whatsapp-base-wweb-mongo",
|
"name": "base-wweb-mongo",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "app.js",
|
"main": "app.js",
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="es">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<link rel="preconnect" href="https://rsms.me/" />
|
|
||||||
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
|
|
||||||
<title>🤖 Crear chatbot WhatsApp en minutos</title>
|
|
||||||
<style>
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
display: flex;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
align-self: center;
|
|
||||||
align-items: center;
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div
|
|
||||||
style="
|
|
||||||
display: flex;
|
|
||||||
gap: 2rem;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
"
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style="
|
|
||||||
box-shadow: rgba(50, 50, 93, 0.25) 0px 50px 100px -20px,
|
|
||||||
rgba(0, 0, 0, 0.3) 0px 30px 60px -30px;
|
|
||||||
border-radius: 15px;
|
|
||||||
object-fit: contain;
|
|
||||||
"
|
|
||||||
width="400"
|
|
||||||
height="400"
|
|
||||||
src="qr.png"
|
|
||||||
alt="Escanear QR"
|
|
||||||
/>
|
|
||||||
<div style="width: 400px; display: grid; gap: 1rem">
|
|
||||||
<h1 style="margin: 0">Whatsapp QR</h1>
|
|
||||||
<p>
|
|
||||||
<strong
|
|
||||||
>F5 para actualizar, el codigo se actualiza cada minuto. </strong
|
|
||||||
><br />
|
|
||||||
Con esta libreria, puedes configurar respuestas
|
|
||||||
automatizadas para preguntas frecuentes , recibir y
|
|
||||||
responder mensajes de manera automatizada, y hacer un
|
|
||||||
seguimiento de las interacciones con los clientes. Además,
|
|
||||||
nuestro Chatbot se integra fácilmente con otros sistemas y
|
|
||||||
herramientas que ya esté utilizando en su negocio.
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
<a
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
background: white;
|
|
||||||
box-shadow: rgb(0 0 0 / 16%) 0px 10px 36px 0px,
|
|
||||||
rgb(0 0 0 / 6%) 0px 0px 0px 1px;
|
|
||||||
padding: 10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #1a1a1a;
|
|
||||||
border: solid 1px #afafaf;
|
|
||||||
"
|
|
||||||
href="https://bot-whatsapp.netlify.app/"
|
|
||||||
>Ver documentación</a
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
const http = require('http')
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
const PORT = process.env.PORT || 3000
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Levantar un HTTP Server
|
|
||||||
*/
|
|
||||||
http.createServer(function (req, res) {
|
|
||||||
var cssPath = undefined
|
|
||||||
var fileStream = undefined
|
|
||||||
var imagePath = undefined
|
|
||||||
|
|
||||||
if (req.url === '/') {
|
|
||||||
fs.readFile('./public/index.html', 'UTF-8', function (err, html) {
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
||||||
res.end(html)
|
|
||||||
})
|
|
||||||
} else if (req.url.match('.css$')) {
|
|
||||||
cssPath = path.join(__dirname, 'public', req.url)
|
|
||||||
fileStream = fs.createReadStream(cssPath, 'UTF-8')
|
|
||||||
res.writeHead(200, { 'Content-Type': 'text/css' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else if (req.url.match('.png$')) {
|
|
||||||
imagePath = path.join(__dirname, req.url)
|
|
||||||
fileStream = fs.createReadStream(imagePath)
|
|
||||||
res.writeHead(200, { 'Content-Type': 'image/png' })
|
|
||||||
fileStream.pipe(res)
|
|
||||||
} else {
|
|
||||||
res.writeHead(404, { 'Content-Type': 'text/html' })
|
|
||||||
res.end('No Page Found')
|
|
||||||
}
|
|
||||||
}).listen(PORT, () => console.log(`Escanear QR Code http://localhost:${PORT}`))
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user