Sistema de gestión WeChat
...
Instale MySQL, Redis y luego cree una biblioteca (el valor predeterminado es prueba):
❯ mysql -u root -p
mysql > drop database test ;
Query OK, 9 rows affected (0.32 sec)
mysql > create database test ;
Query OK, 1 row affected (0.01 sec)
mysql > ^DBye
Descargue el código fuente e instale las dependencias:
❯ git clone https://github.com/dongweiming/wechat-admin
❯ cd wechat-admin
❯ virtualenv venv # 只支持Python 3
❯ source venv/bin/activate # 推荐使用autoenv
❯ venv/bin/pip install -r requirements.txt # 如果已经激活虚拟环境,`venv/bin/`这样的前缀可不加,下同
Instrucciones de configuración: la configuración personalizada debe almacenarse en local_settings.py (debe crearse) y la configuración en config.py se puede anular.
Instalar complemento (opcional):
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
# 如果有额外插件配置,需要修改PLUGIN_PATHS和PLUGINS
Para el desarrollo de complementos, vaya a: Página de complementos
Inicialice la base de datos:
❯ export FLASK_APP = manager . py
❯ venv / bin / flask initdb
Iniciar el servicio:
❯ venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0
PD: si lo está ejecutando localmente, puede usar el modo de depuración multiproceso de Flask directamente sin usar gunicorn:
❯ python app.py
Visite la página WEB http://localhost:8100 y use WeChat para escanear el código QR e iniciar sesión.
Después de iniciar sesión correctamente, inicie Celery Beat and Worker:
❯ venv/bin/celery -A wechat worker -l info -B
Nota: Por primera vez, se extraerán todos los contactos y las listas de miembros del chat grupal, lo que llevará algún tiempo. Observe la salida del terminal para comprender la finalización de la tarea de inicialización.
Suponiendo que Docker esté instalado, simplemente ejecute el siguiente comando.
❯ pip install docker-compose
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
❯ venv/bin/docker-compose build
❯ venv/bin/docker-compose run init # 只有在第一次才需要执行这步
❯ venv/bin/docker-compose run --service-ports -d web # 启动Web,地址也是 http://localhost:8100
❯ venv/bin/docker-compose run -d celery # 同样是在扫码登录之后再启动
Instale cnpm para aumentar la velocidad de descarga del paquete:
❯ npm install -g cnpm --registry=https://registry.npm.taobao.org
Instale los paquetes necesarios:
❯ cnpm i
Inicie el entorno de depuración:
❯ npm run dev
Si el inicio es exitoso, http://localhost:8080 se abrirá de forma predeterminada y la API de back-end seguirá usando http://localhost:8100/j.
Luego del desarrollo local, se construye de la siguiente manera:
❯ npm run build
Actualice http://localhost:8100 para ver el efecto más reciente.
Preste atención a modificar la estructura de la tabla cada vez:
❯ venv/bin/flask db migrate
❯ venv/bin/flask db upgrade
puid not found
después de usarlo durante un período de tiempo?Debido al diseño de WeChat, no proporciona datos únicos y estables como uid, por lo que wxpy diseñó un conjunto de relaciones de mapeo entre los usuarios que iniciaron sesión y sus contactos relacionados, chats grupales y cuentas oficiales. Con la implementación de wxpy, puede obtener más contenido relacionado con subtítulos (apodo, género, provincia, ciudad), lo que hace que el puid en el objeto sea más estable.
Debido a cambios en la configuración de algunas personas/grupos, su puid puede cambiar. Después de cada escaneo del código QR para iniciar sesión, se activará una tarea para actualizar la relación de mapeo a la última. Si encuentra este error, significa que necesita iniciar sesión nuevamente o activar esta tarea manualmente:
from wechat . tasks import retrieve_data
retrieve_data . delay ()
Asunto: #9
Gracias a @zgjhust por el comentario.
Este es un proyecto pequeño, no agregué soporte para Nginx y usé Gunicorn directamente. Cuando uses Gunicorn, usa -t 0
lo que significa que no hay tiempo de espera.
La razón de esto es que el SSE en el proyecto requiere una conexión larga, y el tiempo desde que el usuario abre la página de inicio de sesión hasta que completa el escaneo es difícil de controlar, por lo que simplemente no se agota el tiempo de espera, pero también provoca que las solicitudes no respondan. para ser liberado a tiempo. De hecho, /stream debe sacarse para un procesamiento especial y otras rutas deben tener tiempos de espera establecidos (lo reconstruiré cuando surja la oportunidad).
La solución actual es especificar más trabajadores y reiniciar gunicorn con frecuencia (será más conveniente usar la gestión de supervisor):
gunicorn app:app --bind 0.0.0.0:8100 -w 10 -t 0
O en lugar de gunicorn, comience a usar directamente el parámetro threaded de Flask:
❯ cat app.py
...
if __name__ == ' __main__ ' :
app.run(host= ' 0.0.0.0 ' , port=8100, debug=app.debug, threaded=True)
❯ python app.py
Generalmente hay 2 razones para no trabajar:
Aunque diseñé la función de reiniciar tareas en el apio, debido a que escaneé el código QR para iniciar sesión nuevamente después de desconectarme, este paso no se pudo automatizar, lo que provocó que el sistema dejara de funcionar.
Si quieres que este sistema funcione el mayor tiempo posible, mi sugerencia es:
from celery . task import periodic_task
from celery . task . control import revoke
def restart_listener ( sender , ** kw ):
task_id = r . get ( LISTENER_TASK_KEY )
if task_id :
revoke ( str ( task_id , 'utf-8' ))
task_id = app . send_task ( 'wechat.tasks.listener' )
r . set ( LISTENER_TASK_KEY , task_id )
stopped . connect ( restart_listener )
Tenga en cuenta que la operación de suscripción debe realizarse antes de importar wxpy/itchat.
Sí, este es un proyecto que encapsula wxpy/itchat. En última instancia, todavía usa la web WeChat (wx.qq.com), por lo que la función de su API determina las capacidades de este sistema.
Descifrar la API de WeChat móvil e integrar estas API no abiertas no es muy bueno y también puede causar problemas legales.
Puede consultar este problema para conocer el problema. Muchas personas lo han encontrado y no hay forma de resolverlo después de ser bloqueado. Pero puedes asegurarte de que no esté bloqueado tanto como sea posible. Después de varios días de investigación, encontré tres lecciones: