Sistema de gerenciamento WeChat
...
Instale MySQL, Redis e crie uma biblioteca (o padrão é teste):
❯ 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
Baixe o código fonte e instale as dependências:
❯ 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/`这样的前缀可不加,下同
Instruções de configuração: a configuração personalizada deve ser armazenada em local_settings.py (precisa ser criada) e as configurações em config.py podem ser substituídas.
Instale o plugin (opcional):
❯ git clone --recursive https://github.com/dongweiming/wechat-plugins
# 如果有额外插件配置,需要修改PLUGIN_PATHS和PLUGINS
Para desenvolvimento de plug-ins, acesse: Página de plug-ins
Inicialize o banco de dados:
❯ export FLASK_APP = manager . py
❯ venv / bin / flask initdb
Inicie o serviço:
❯ venv/bin/gunicorn app:app --bind 0.0.0.0:8100 -w 6 -t 0
PS: Se você estiver executando-o localmente, poderá usar o modo de depuração multithread do Flask diretamente, sem usar o gunicorn:
❯ python app.py
Visite a página WEB http://localhost:8100 e use o WeChat para escanear o código QR para fazer login.
Após o login bem-sucedido, inicie o Celery Beat and Worker:
❯ venv/bin/celery -A wechat worker -l info -B
Observação: pela primeira vez, todos os contatos e listas de membros do chat em grupo serão extraídos, o que levará algum tempo. Observe a saída do terminal para compreender a conclusão da tarefa de inicialização.
Supondo que o Docker esteja instalado, basta executar o seguinte 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 o cnpm para aumentar a velocidade de download do pacote:
❯ npm install -g cnpm --registry=https://registry.npm.taobao.org
Instale os pacotes necessários:
❯ cnpm i
Inicie o ambiente de depuração:
❯ npm run dev
Se a inicialização for bem-sucedida, http://localhost:8080 será aberto por padrão e a API de back-end ainda usará http://localhost:8100/j
Após o desenvolvimento local, é construído da seguinte forma:
❯ npm run build
Atualize http://localhost:8100 para ver o efeito mais recente.
Preste atenção ao modificar a estrutura da tabela sempre:
❯ venv/bin/flask db migrate
❯ venv/bin/flask db upgrade
puid not found
aparecem ocasionalmente após usá-lo por um período de tempo?Devido ao design do WeChat, ele não fornece dados únicos e estáveis, como uid, então o wxpy projetou um conjunto de relacionamentos de mapeamento entre usuários logados e seus contatos relacionados, bate-papos em grupo e contas oficiais. com a implementação do wxpy, você pode obter mais conteúdo relacionado à legenda (apelido, gênero, província, cidade), tornando o puid no objeto mais estável.
Devido a alterações nas configurações de algumas pessoas/grupos, seu puid pode mudar. Após cada leitura do código QR para fazer login, uma tarefa para atualizar o relacionamento de mapeamento será acionada para atualizar o relacionamento de mapeamento para o mais recente. Se você encontrar esse erro, significa que você precisa fazer login novamente ou acionar manualmente esta tarefa:
from wechat . tasks import retrieve_data
retrieve_data . delay ()
Edição: #9
Obrigado a @zgjhust pelo comentário
Este é um projeto pequeno, não adicionei suporte Nginx e usei Gunicorn diretamente. Ao usar o Gunicorn, use -t 0
o que significa que não há tempo limite.
A razão para isso é que o SSE no projeto requer uma conexão longa, e o tempo desde a abertura da página de login do usuário até a conclusão da verificação é difícil de controlar, então simplesmente não atinge o tempo limite, mas também faz com que as solicitações não respondam. para ser liberado a tempo. Na verdade, /stream deve ser retirado para processamento especial, e outras rotas precisam ter tempos limite definidos (reconstruirei isso quando surgir a oportunidade).
A solução atual é especificar mais trabalhadores e reiniciar o gunicorn com frequência (usar o gerenciamento de supervisor será mais conveniente):
gunicorn app:app --bind 0.0.0.0:8100 -w 10 -t 0
Ou em vez de gunicorn, comece diretamente usando o parâmetro threaded do Flask:
❯ cat app.py
...
if __name__ == ' __main__ ' :
app.run(host= ' 0.0.0.0 ' , port=8100, debug=app.debug, threaded=True)
❯ python app.py
Geralmente há 2 motivos para não funcionar:
Embora eu tenha projetado a função de reiniciar tarefas no aipo, porque escaneei o código QR para fazer login novamente após ficar offline, essa etapa não pôde ser automatizada, fazendo com que o sistema parasse de funcionar.
Se você deseja que este sistema funcione o maior tempo possível, minha sugestão é:
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 )
Observe que a operação de assinatura deve ocorrer antes da importação do wxpy/itchat.
Sim, este é um projeto que encapsula wxpy/itchat. Em última análise, ele ainda usa o web WeChat (wx.qq.com), portanto a função de sua API determina as capacidades deste sistema.
Descriptografar a API móvel do WeChat e integrar essas APIs não abertas não é muito bom e também pode causar problemas legais.
Você pode consultar este problema para saber o problema. Muitas pessoas o encontraram e não há como resolvê-lo depois de serem bloqueados. Mas você pode garantir que não esteja bloqueado tanto quanto possível. Após vários dias de pesquisa, encontrei três lições: