Envío de mensajes programados basado en WeChat (puede convencer a tu novia), chat inteligente y asistente personal
título: "Envío de mensajes programados (puede convencer a las novias), chat inteligente y asistente personal basado en WeChat"
Autor: Jasonlovesharon
Correo electrónico:
54027901@163.com
Etiquetas:
?- nodejs
?- wechaty
?- wechaty-puppet -padplus
---
## Prólogo
- Desde las restricciones de la API web de WeChat en 2017, una gran cantidad de robots como itchat han dejado de funcionar. para alternativas adecuadas
: hasta ahora, la mayoría de ellas son para clientes de Windows WeChat. La inyección DLL basada en HOOK realiza el control de WeChat y existe un cierto riesgo de prohibición de cuenta. Solo se pueden usar versiones fijas. La implementación en el servidor Linux es difícil, lo que significa que solo se puede encender todo el tiempo: Wechaty admite IPAD, MAC y otros protocolos. No es necesario llamar a la API web y se puede implementar. el servidor para satisfacer todas mis necesidades. Puedo tener todas mis necesidades cubiertas. [Dirección del proyecto](/wechaty/wechaty)
- Después de leer el documento oficial ([Introducción oficial del token](/juzibot/welcome/wiki/everything-about-wechaty)), descubrí que necesito Para solicitar un Token, hay una tarifa por la versión Python de Token, pero nunca he aprendido mecanografiado, así que quiero rendirme. Busqué el ejemplo del robot Dingdong y parece que todavía puedo entenderlo. aprendamos y exploremos. (PD: Más tarde descubrí accidentalmente otra versión de Python que puede usar tokens para transformar Wechaty, pero en este momento está básicamente escrito en TS. Si desea usar Python y otros lenguajes, puede consultar el [Documento oficial] (/ wechaty /wechaty/ issues/1985)).
## Función
### 1. Activador de palabra clave
1.1 Palabra clave "autopresentación", "preséntate", "quién eres" Activador autopresentación
1.2 Ubicación + consulta meteorológica desencadenante del tiempo
### 2.
2.2 Todos los miembros del grupo tienen permiso para chatear con "@bot"
2.3 No responderá a los mensajes de @otros miembros del grupo
### Proceso de implementación
Hablar es barato, muestra tu código
# ## 1. Programa principal
```typecript
import { Wechaty, Message, UrlLink,log,} from 'wechaty'
import { PuppetPadplus } de 'wechaty-puppet- padplus'
importar { EventLogger, QRCodeTerminal } de 'wechaty-plugin-contrib'
importar { WechatyWeixinOpenAI, } de 'wechaty-weixin-openai'
importar { setSchedule, } desde '. /schedule/index'
importar { getDay, formatDate, } from '.
/utils/index'
import { getOne, getTXweather, getSweetWord,} from '.
// Crear tarea programada diaria de WeChat
función asíncrona initDay() {
? console.log(`Se ha configurado la tarea diaria de decir`);
?setSchedule('0 40 0 * * *', async () = > {
console.log('¡Tu pequeño y dulce asistente ha comenzado a funcionar!)
let logMsg
let contact =
(? await bot.Contact.find({ name: 'Jason' }))|
?(await bot.Contact.find({ alias: 'boss' }))// Obtener el contenido que se enviará a tus contactos
let one = await getOne() // Obtener la frase de hoy
let weather = await getTXweather() // Obtener información del clima
let hoy = await formatDate(new Date()) // Obtener la fecha de hoy
let memorialDay = getDay('2009/08/07') // Obtener el número de días del aniversario
let sweetWord = await Weather.todayWeather
}nFrase del día:
${one}
Palabras diarias de amor terrenal:
${sweetWord}
< br > -------- te amo más. `
intento {
?logMsg = str
await delay(2000)< / p>
? await contact.say(str) // enviar mensaje
} catch (e) {
? logMsg = e.message
}
console.log(logMsg)
?))
}
const padplusToken = 'Tu propio TOKEN' p>
const puppet = nuevo PuppetPadplus({
?token: padplusToken,
})
const bot = nuevo Wechaty({
? nombre: 'jason-assistant',
? títere,
})
bot.use(EventLogger())
bot.use(QRCodeTerminal({ small: true }))
//Referencia y configuración del complemento dentro de Wechaty
const openAIToken = 'Tu propio robot TOKEN' //Debe aplicarse en la plataforma abierta de diálogo WeChat
, haga clic en configuración del robot, vincule la aplicación, puede verla en la parte inferior de la página
const openAIEncodingAESKey = 'Su propia EncodingAESKey' //Aplicación de plataforma abierta de diálogo WeChat.
Haga clic en "Vincular aplicación" en "Configuración del robot" para verla en la parte inferior de la página
const preAnswerHook = async (message: Message) => {
? procesoCommonMaterial(mensaje)
? si (isCommonMaterial) {
devuelve falso
?}
}
/**
* Obtenga la tarjeta de contacto del jefe y presione la tarjeta de presentación del jefe cuando el robot no pueda encontrar la respuesta a la pregunta.
*/
const getBoss = async () => {
const contact = bot.Contact.load('boss microsoft ID')
await contact.sync()
return contacto
?} const noAnswerHook = async (mensaje: Mensaje) => {
const room = message.room()
const from = mensaje de. ()
if (!room) {
? const boss = await getBoss()
? await message.say('No puedo responder a tu pregunta, puedes comunicarte con mi jefe')
? aguardar mensaje.say('No puedo responder a tu pregunta, puedes comunicarte con mi jefe')
esperar mensaje. (jefe)
?decir(jefe)
? regresar;
}
miembros constantes = esperar habitación.miembroTodos()
const bossInRoom = member.find(m => m.id === 'id de jefe de Microsoft')
if ( bossInRoom) {
¿esperar habitación? .say `${bossInRoom}, ${from} hizo una pregunta que no sé, así que respóndela por mí.
} else {
* const boss = await getBoss ()
* await room.say `${from}, no responderé a tu pregunta, puedes contactar a mi jefe`
* await room.say(boss)
}
?}
/**
* Utilice wechaty-weixin-openai para acceder rápidamente a la plataforma de conversación WeChat
*/
bot.use(WechatyWeixinOpenAI({
token: openAIToken,
codificaciónAESKey: openAIEncodingAESKe
y,
noAnswerHook, //enviar una respuesta establecida si el bot no puede responder
preAnswerHook, //determina si es una palabra clave, si es una palabra clave, activa la respuesta de la palabra clave sin acceder a la plataforma abierta WechatyWeixin
?}))
const processCommonMaterial = async (message: Message) => {
const room = message.room( )
// const de = mensaje.de()<
const mencionarSelf = esperar mensaje.mencionarSelf()
const texto = mensaje.text()
let intro = 'Jason, una amplia gama de pasatiempos de los héroes del mundo, hasta el cielo recogiendo la luna, hasta los cinco océanos capturando tortugas, como dice el refrán, no podrá decir, no podré decir, no podré hacer, como dice el dicho, no podré decir, no podré hacer.
let intro = 'Jason, hay una amplia gama de pasatiempos, y es un gran amante de la naturaleza, un piloto que no sabe hornear, un aficionado que no sabe tocar música, un chef que no sabe dibujar, un entusiasta extremo que no puede ser un buen programador, y ese es mi jefe, Jason =. = null && mencionarSelf) {
?
await room.say(new UrlLink({
descripción: 'Bastardos al aire libre y pelear, pelear, pelear y pelear, leer un millón de libros, caminar un millón de millas, aprender Y comer, beber, jugar , diviértete',
thumbnailUrl: '',
título: 'Jason',
url: '/s?__biz= MzkxODE3MjAyNQ==&mid= 100000001&idx=1&sn=d05de320c6fbe6c9f9149a09a4da81ec&chksm= 41b4
391776c3b001c143ac2c284c58ac8b08de41d95cab682aa5a07022e32096567f5780d5be#rd',
?}))
devuelve verdadero
?} else if (/outdoorbitch/.test(text)) {
await room.say(new UrlLink({
descripción: 'Perra al aire libre y pelea, pelea, pelea y pelea. Lee miles de libros, viaja miles de millas, aprende a comer, beber y que te diviertas', p>
thumbnailUrl: '',
título: 'Jason',
url: '/s?__biz=MzkxODE3MjAyNQ==&mid=100000001& idx=1&sn=d05de320c6fbe6c9f9149a09a4da81ec&chksm = 41b4391776c3b001c143ac2c284c58ac8b08de41d95cab682aa5a07022e32096567f5780d5be#rd',
?}))
Devuelve verdadero
?}
}
Devuelve falso
}
// Iniciar sesión
función asíncrona onLogin(usuario) {
consola. log(`El pequeño y dulce asistente ${user} ha iniciado sesión`)
?// Crear una tarea programada después de iniciar sesión
? await initDay()
}
bot.on('iniciar sesión', onLogin)
bot.start()
.entonces(() => log.info ('StarterBot', 'Starter Bot iniciado.'))
.catch(e => log.error('StarterBot', e))
``` p>
## # 2. Cree una función de temporizador de programación
```typescript
importe {programación} desde 'nodo-programación'
// Parámetro de fecha
// Otras reglas en /package/node-schedule
// Explicación del parámetro de regla * representa un carácter comodín
//
// * ?*?*?*?*? |
// │ │ │ │ │ └Día de la semana (0 - 7) (0 o 7 es domingo) p>
// │ │ │ │ └───── Mes (1 - 12)
// │ │ │ │ └────────── Mes y día (1 - 31)
// │ │ │ └──────── ─────── horas (0 - 23)
// │ │ │ │ └─────── ─ ────────23)
// │ └────────────── ──── ── Minutos (0 - 59)
// └──────────────────────── Segundos (0 - 59, opcional)
// Los primeros 30 segundos de cada minuto de toque
cabello. Se activa a los 30 segundos de cada minuto: '30 * * * '
//
// Se activa a los 1 minuto y 30 segundos de cada hora: '30 1 * * * '
//
// // Se activa a la 1:00 a. m.
1:30 1:30 1:30 1:30 1:30 1:30 1:30 1:30 1:30 1:30 30 1:30 1:30 Cada mes: ' 30 1 1 1 *'
//
// Se activa a las 1:01:30 el día 1 de cada semana: '30 1 1 *' p>
función setSchedule(fecha, devolución de llamada) {
? agenda.scheduleJob(fecha, devolución de llamada)
}
función de exportación setSchedule()
```
### 3. Crear varias funciones para rastrear las frases diarias del sitio web de ONE para extraer los mensajes obtenidos a través de la API
## # 3.
``mecanografiado
importar * como cheerio de 'cheerio'
importar * como superagente de 'superagente'
const ONE = '/' // La versión web del sitio web ONE
const TXHOST = '/txapi/' // skyhost
función req( url, método, parámetros, datos , cookies) {
?return new Promise(función (resolver,rechazar) {
superagent(método, url)
? .query(params)
?.send(datos)
.set('Tipo de contenido','aplicación/x-www-form-urlencoded') p>
. end(función (err, respuesta) {
if (err) {
rechazar(err)
}
resolver(respuesta )
?})
})
}
función asíncrona getOne() { p>
?/ / Obtener la frase del día
? Pruebe {
let res = await req(ONE, 'GET')
let $ = cheerio.load( res.text)
let todayOneList = $('#carousel-one .carousel-inner .item ')
let todayOne = $(todayOneList[ 0])
?find('.fp-one-cita')
?text()
.replace(/(^\ s*)|(\s *$)/g, '')
return hoyUno
?} catch (err) {
console.log( 'Error', err)
devolver error
?}
}
función asíncrona getTXweather() {
?// getTXweather
? let url = TXHOST + 'tianqi/'
? >
let res = await req(url, 'GET', {
? key: 'Tu propia CLAVE',//debes solicitarla tú mismo en skype en /signup.html?source =474284281
? ciudad: 'Arlington'
})
let content = JSON.parse(res.text)
if (content.code === 200) {
?let todayInfo = content.newslist[0]
?let obj = {
WeatherTips: TodayInfo. consejos,
todayWeather:`Arlington hoy ${todayInfo.weather}\n temperatura:${todayInfo.lowest}/${todayInfo.highest}
\n${todayInfo. viento}Viento: ${todayInfo.windspeed}\nÍndice ultravioleta:${todayInfo.uv_index}\nHumedad
${todayInfo.humidity}`
?};
? console.log('Obteniendo el clima de Skywalk correctamente', obj)
? return obj
} else {
console.log(' No se pudo obtener la interfaz', content.code)
}
?} catch (err) {
console.log('No se pudo obtener la interfaz', err)
?}
}
función asíncrona getSweetWord() {
?// Let url = TXHOST + 'saylove/ '
? Intenta {
let res = await req(url, 'GET', { key: '' })
let content = JSON.parse (res.text)
if (content.code === 200) {
?let sweet = content.newslist[0].content
? let str = sweet.replace('\r\n', '
')
? return str
} else {
consola. log('No se pudo obtener la interfaz', content.msg)
}
?} catch (err) {
console.log('No se pudo obtener interfaz', err)
?}
}
export { getOne, getTXweather, getSweetWord, }
```
### Calcula el tiempo restante hasta una fecha determinada (cumpleaños, aniversario, etc. .) ¿Cuántos días
```typescript
function getDay(date) {
?var date2 = new Date()
? var fecha1 = nueva fecha(fecha)
? var iDays = parseInt(
Math.abs(fecha2.getTime() - fecha1.getTime()) / 1000/60 / 60 / 24
?)
? Devolver iDays
}
función formatDate(fecha) {
? var tempDate = nueva fecha(fecha)
? var año = tempDate.getFullYear()
var mes = tempDate.getMonth() + 1
? var día = tempDate.getDate()
?var hora = tempDate.getHours()
var min = tempDate.getMinutes()
var segundo = tempDate.getSeconds()
var semana = tempDate.getDay()
var str = ''
si (semana === 0) {
str = 'Domingo'
?} else if (semana === 1) {
str = 'Lunes'
?} else if (semana === 2) {
str = 'Martes'
?} else if (semana === 3) {
str = 'miércoles'
?} else if (semana === 4) {
str = 'jueves'
?} else if (semana = == 5 ) {
str = 'Viernes'
?} else if (semana === 6) {
str = 'Sábado' p>
?}
? si (hora < 10) {
hora = '0' + hora
?}
? si (min < 10) {
min = '0' + min
?}
si (segundo < 10) { p>
segundo = '0' + segundo
?}
? año de retorno + '-' + mes + '-' + día + 'día ' + hora + ':' + min + ' ' + str
}
export { getDay, formatDate }
``
! [Mensaje desencadenante de palabra clave](/jasonlov
esharon/my_bot)), debido a que no estoy familiarizado con Typecript, muchas funciones se implementan tomando prestadas las ruedas de muchos maestros. Es mejor estar familiarizado con Python. El siguiente paso es usar Python para implementar las funciones anteriores y expandirlas aún más. Funciones más interesantes.