Imagem do Docker |
Um pequeno webhook do robô WeChat ajuda a eliminar muitos obstáculos ao seu próprio desenvolvimento. É baseado em solicitações http. É diferente dos ganchos WeChat. Por ser baseado em API da web, a vantagem é que pode ser implantado em dispositivos como o arm. arquitetura.
Cuidado
O projeto atualmente é baseado na web WeChat, que por si só corre o risco de ser restrito. Além disso, fica offline uma vez a cada dois dias. Além dos reparos normais de função, não aceitará solicitações de novos recursos. O protocolo windows está sob WIP e deverá estar disponível para atender você em um futuro próximo!
Função | protocolo web | protocolo do windows |
---|---|---|
Disponibilidade atual | ✅ | |
ramo de código | principal | Windows |
Etiqueta Docker | mais recente | Windows |
<Enviar mensagem> | ✅Único/Múltiplo/Grupo | ✅Único/Múltiplo/Grupo |
Enviar texto | ✅ | ✅ |
Envie fotos | ✅ Análise de imagem local/url | ✅ Análise de imagem local/url |
Enviar vídeo (mp4) | ✅ Análise de vídeo local/url de vídeo | |
Enviar documentos | ✅ Análise de arquivo local/url | ✅ Análise de arquivo local/url |
<Receber mensagem> | ||
receber texto | ✅ | ✅ |
receber voz | ✅ | |
receber fotos | ✅ | |
receber vídeo | ✅ | |
receber arquivos | ✅ | |
Receber link de tweet de conta pública | ✅ | |
Receba notificações do sistema | ✅ Notificação online/notificação offline/notificação anormal | |
Aquisição de avatar | ✅ | |
Resposta rápida | ✅ | ✅ |
<Gerenciamento de grupo> | ||
<Gerenciamento de amigos> | ||
Receber solicitação de amizade | ✅ | |
Solicitar via amigo | ✅ | |
Obter lista de contatos | ||
<Outras funções> | ||
Login automático sem desconexão | ✅ | |
Autenticação de API | ✅ | ✅ |
acesso contínuo n8n | ✅ | |
Suporte à implantação do docker | ✅ arm64/amd64 | ✅amd64 |
Exportação de arquivo de log | ✅ | ✅ |
As funções mencionadas acima ainda não foram implementadas. Elas são limitadas pelas restrições do protocolo WeChat. Diferentes protocolos suportam funções diferentes.
npx wechatbot-webhook
A menos que seja desconectado, o último login será lembrado por padrão. Para alterar sua conta, execute o seguinte comando
npx wechatbot-webhook -r
Se você encontrar um erro de instalação, certifique-se de que a versão do seu nó >= 18.14.1 #227
Copie a API da mensagem push da linha de comando, por exemplo http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]
Abra um novo terminal e tente o seguinte curl. Altere os valores dos campos to e token para os valores desejados.
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' { "to": "测试昵称", data: { "content": "Hello World!" }} '
Importante
O gerenciador de pacotes foi migrado para pnpm. Use-o para instalar dependências para suportar alguns patches de pacotes temporários irregulares e acelerar a instalação de dependências.
docker pull dannicool/docker-wechatbot-webhook
# 启动容器并映射日志目录,日志按天维度生成,e.g: app.2024-01-01.log
docker run -d --name wxBotWebhook -p 3001:3001
-v ~ /wxBot_logs:/app/log
dannicool/docker-wechatbot-webhook
wget -O docker-compose.yml https://cdn.jsdelivr.net/gh/danni-cool/wechatbot-webhook@main/docker-compose.yml && docker-compose down && docker-compose -p wx_bot_webhook up
docker logs -f wxBotWebhook
Encontre o endereço de login do código QR, a parte do URL abaixo da imagem, acesse-o com um navegador, escaneie o código para fazer login no wx
https://localhost:3001/login?token=[SEU_PERSONAL_TOKEN]
Dicas: você precisa adicionar parâmetros usando -e e separar várias linhas com , por exemplo -e RECVD_MSG_API="https://example.com/your/url"
Função | variável | Observação |
---|---|---|
Nível de registro | LOG_LEVEL=informações | Nível de log, o padrão é info, afeta apenas a saída de log atual, considere usar debug para saída detalhada. Não importa como esse valor seja alterado, o arquivo de log sempre registra logs de nível de depuração. |
Receber API de mensagem | RECVD_MSG_API=https://example.com/your/url | Se você quiser lidar com a lógica de recebimento de mensagens, como links com base em mensagens, preencha o URL da lógica de processamento |
API de recebimento de mensagens para aceitar mensagens enviadas por você | ACCEPT_RECVD_MSG_MYSELF=falso | RECVD_MSG_API Se deseja receber mensagens de si mesmo (definido como verdadeiro, ou seja, recebido, padrão falso) |
Token de API de login personalizado | LOGIN_API_TOKEN=abcdefg123 | Você também pode personalizar seu próprio token de login. Se não configurá-lo, um será gerado por padrão. |
Desativar login automático | DISABLE_AUTO_LOGIN=verdadeiro | Para expulsar contas que não sejam do WeChat, você pode contar com a sessão atualmente conectada para evitar o login . Se quiser escanear o código QR para fazer login sempre, adicione esta configuração. |
A interface da versão v2 adiciona uma função de envio de grupo. Para a interface da versão v1, mude para legacy-api.
POST
application/json
payload
Envie texto ou arquivos para links externos e os links externos serão analisados em imagens ou arquivos.
parâmetro | ilustrar | tipo de dados | valor padrão | Pode estar vazio | Parâmetros opcionais |
---|---|---|---|---|---|
para | Para o receptor da mensagem , a String recebida será enviada para o apelido por padrão (o mesmo se aplica ao nome do grupo). A estrutura Object recebido pode ser enviada para a pessoa que fez uma nota, por exemplo: {alias: '备注名'} . O nome do grupo não suporta o nome da nota. | Object String | - | N | - |
éQuarto | Seja para enviar uma mensagem para um grupo , este parâmetro determina se você está procurando um grupo ou uma pessoa ao procurar alguém, pois o apelido na verdade é igual ao nome do grupo em termos de processamento técnico. | Boolean | false | S | true false |
dados | Estrutura do corpo da mensagem, consulte payload.data abaixo | Array Object | false | N | true false |
payload.data
parâmetro | ilustrar | tipo de dados | valor padrão | Pode estar vazio | Parâmetros opcionais |
---|---|---|---|---|---|
tipo | Tipo de mensagem , deixe o campo em branco e analise para texto simples | text String | - | S | fileUrl text |
contente | Conteúdo da mensagem , se você deseja enviar vários URLs e analisá-los, especifique o tipo como fileUrl. Ao mesmo tempo, preencha os URLs no conteúdo e separe-os com vírgulas em inglês. | String | - | N | - |
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": { "content": "你好" }
} '
Em alguns casos, enviar diretamente o nome do arquivo url pode não ser o que desejamos. O parâmetro de consulta
$alias
pode ser usado para unir o url para especificar o nome do arquivo enviado ao destino (nota: aliases não realizam conversão de arquivo).
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": {
"type": "fileUrl" ,
"content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg?$alias=cloud.jpg"
}
} '
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testGroup",
"isRoom": true,
"data": { "type": "fileUrl" , "content": "https://download.samplelib.com/jpeg/sample-clouds-400x300.jpg" },
} '
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": [
{
"type": "text",
"content": "你好"
},
{
"type": "fileUrl",
"content": "https://samplelib.com/lib/preview/mp3/sample-3s.mp3"
}
]
} '
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' [
{
"to": "testUser1",
"data": {
"content": "你好"
}
},
{
"to": "testUser2",
"data": [
{
"content": "你好"
},
{
"content": "近况如何?"
}
]
}
] '
response
de valor de retornosuccess
: se a mensagem foi enviada com sucesso ou não, mesmo que parte da mensagem do grupo seja enviada com sucesso, ela retornará true
message
: a mensagem solicitada quando ocorre um errotask
: envie detalhes da tarefatask.successCount
: Número de mensagens enviadas com sucessotask.totalCount
: número total de mensagenstask.failedCount
: Número de mensagens com falha para enviartask.reject
: Parâmetros e avisos de erro devido a falha na verificação de parâmetrostask.sentFailed
: porque o envio falhou e o prompt de errotask.notFound
: porque o usuário ou grupo não foi encontrado e o erro apareceGaranta a consistência do envio de uma única mensagem. A falha na verificação de um determinado parâmetro encerrará todas as tarefas de envio de mensagens.
{
"success" : true ,
"message" : " " ,
"task" : {
"successCount" : 0 ,
"totalCount" : 0 ,
"failedCount" : 0 ,
"reject" : [],
"sentFailed" : [],
"notFound" : []
}
}
A leitura de arquivos atualmente suporta apenas envio único.
POST
multipart/form-data
payload
parâmetro | ilustrar | tipo de dados | valor padrão | Pode estar vazio | Valor opcional |
---|---|---|---|---|---|
para | Para o receptor da mensagem, a String recebida é enviada para o apelido por padrão (o mesmo se aplica ao nome do grupo). A estrutura Json String recebida suporta o envio para a pessoa que fez uma nota, por exemplo: --form 'to=). "{alias: "小号"}" ', o nome do grupo não suporta nomes de comentários | String | - | N | - |
éQuarto | Seja para enviar mensagens de grupo , o texto simples do formData só pode usar o tipo String , 1 representa sim, 0 representa não, | String | 0 | S | 1 0 |
contente | Arquivo , arquivo local só pode ser enviado um de cada vez, vários arquivos são chamados manualmente várias vezes | Binary | - | N | - |
curl --location --request POST ' http://localhost:3001/webhook/msg?token=[YOUR_PERSONAL_TOKEN] '
--form ' to=testGroup '
--form content=@ " $HOME /demo.jpg "
--form ' isRoom=1 '
response
de valor de retorno {
"success" : true ,
"message" : " Message sent successfully "
}
payload
POST
multipart/form-data
formulárioData | ilustrar | tipo de dados | Valor opcional | Exemplo |
---|---|---|---|---|
tipo | Tipo de função
Outros tipos
Tipo de sistema
| String | file text urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
contente | O conteúdo transferido, texto ou arquivos transferidos compartilham este campo. Consulte o exemplo para mapeamento de estrutura. | String Binary | Exemplo | |
fonte | Dados do remetente relacionados à mensagem, string JSON | String | Exemplo | |
é mencionado | A mensagem é @mymessage #38 | String | 1 0 | - |
isMsgFromSelf | É uma mensagem sua #159 | String | 1 0 | - |
O processamento de formData no lado do servidor geralmente requer manipuladores correspondentes. Supondo que você tenha concluído esta etapa, você receberá a seguinte solicitação.
{
"type" : " text " ,
"content" : "你好" ,
"source" : " { " room " : "" , " to " :{ " _events " :{}, " _eventsCount " :0, " id " : " @f387910fa45 " , " payload " :{ " alias " : "" , " avatar " : " /cgi-bin/mmwebwx-bin/webwxgeticon?seq=1302335654&username=@f38bfd1e0567910fa45&skey=@crypaafc30 " , " friend " :false, " gender " :1, " id " : " @f38bfd1e10fa45 " , " name " : " ch. " , " phone " :[], " star " :false, " type " :1}}, " from " :{ " _events " :{}, " _eventsCount " :0, " id " : " @6b5111dcc269b6901fbb58 " , " payload " :{ " address " : "" , " alias " : "" , " avatar " : " /cgi-bin/mmwebwx-bin/webwxgeticon?seq=123234564&username=@6b5dbb58&skey=@crypt_ec356afc30 " , " city " : " Mars " , " friend " :false, " gender " :1, " id " : " @6b5dbd3facb58 " , " name " : " Daniel " , " phone " :[], " province " : " Earth " , " signature " : "" , " star " :false, " weixin " : "" , " type " :1}}} " ,
"isMentioned" : " 0 " ,
"isMsgFromSelf" : " 0 " ,
"isSystemEvent" : " 0 " // 考虑废弃,请使用type类型判断系统消息
}
Receba exemplo de API curl de mensagem (importado diretamente para o carteiro para depuração)
curl --location 'https://your.recvdapi.com'
--form 'type="file"'
--form 'content=@"/Users/Downloads/13482835.jpeg"'
--form 'source="{\"room\":\"\",\"to\":{\"_events\":{},\"_eventsCount\":0,\"id\":\"@f387910fa45\",\"payload\":{\"alias\":\"\",\"avatar\":\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1302335654&username=@f38bfd1e0567910fa45&skey=@crypaafc30\",\"friend\":false,\"gender\":1,\"id\":\"@f38bfd1e10fa45\",\"name\":\"ch.\",\"phone\":[],\"star\":false,\"type\":1}},\"from\":{\"_events\":{},\"_eventsCount\":0,\"id\":\"@6b5111dcc269b6901fbb58\",\"payload\":{\"address\":\"\",\"alias\":\"\",\"avatar\":\"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=123234564&username=@6b5dbb58&skey=@crypt_ec356afc30\",\"city\":\"Mars\",\"friend\":false,\"gender\":1,\"id\":\"@6b5dbd3facb58\",\"name\":\"Daniel\",\"phone\":[],\"province\":\"Earth\",\"signature\":\"\",\"star\":false,\"weixin\":\"\",\"type\":1}}}"'
--form 'isMentioned="0"'
response
do valor de retorno (opcional)Se você espera responder imediatamente ( resposta rápida ) após receber uma mensagem usando
RECVD_MSG_API
, retorne o valor de retorno de acordo com a seguinte estrutura. Se não houver valor de retorno, a mensagem não será respondida.
json
parâmetro | ilustrar | tipo de dados | valor padrão | Pode estar vazio | Parâmetros opcionais |
---|---|---|---|---|---|
sucesso | Quer a solicitação seja bem-sucedida ou não, retorne falso ou não possua este campo, e a resposta não será processada. Algumas mensagens especiais também são controladas por meio deste campo, como adicionar convites de amizade. Se true for retornado, a solicitação de amizade será. ser processado. | Boolean | - | S | true false |
dados | Se precisar responder a uma mensagem, você precisa definir o campo de dados | Object Object Array | - | S |
response.data
parâmetro | ilustrar | tipo de dados | valor padrão | Pode estar vazio | Parâmetros opcionais |
---|---|---|---|---|---|
tipo | Tipo de mensagem Se este campo não for preenchido, o padrão será a transmissão do tipo texto. | String | text | S | fileUrl text |
contente | Conteúdo da mensagem , se você deseja enviar vários URLs e analisá-los, especifique o tipo como fileUrl. Ao mesmo tempo, preencha os URLs no conteúdo e separe-os com vírgulas em inglês. | String | - | N | - |
Se você responder a uma única mensagem
{
"success" : true ,
"data" : {
"type" : " text " ,
"content" : " hello world! "
}
}
Combine respostas a várias mensagens
{
"success" : true ,
"data" : [
{
"type" : " text " ,
"content" : " hello world! "
},
{
"type" : " fileUrl " ,
"content" : " https://samplelib.com/lib/preview/mp3/sample-3s.mp3 "
}
]
}
Além de configurar o token quando o docker for iniciado, no caso do token padrão, um token padrão será gerado por padrão e gravado no arquivo
.env
.
/login
GET
200
Retornar json contendo o usuário atual
{ "success" : true , "message" : " Contact<TestUser>is already login " }
Exibir página de código de verificação de login do WeChat
Você pode pesquisar ativamente a interface para verificar se o serviço está funcionando normalmente.
/healthz
GET
200
Se o WeChat estiver logado, o texto simples healthy
será retornado, caso contrário, unHealthy
será retornado.
A partir da versão 2.8.0, você pode acessar recursos estáticos, como avatares, por meio desta interface. Para obter detalhes, consulte o campo avatar no exemplo de estrutura de dados recvd_api.
Observe que todos os endereços de recursos estáticos relatados para recvd_api não terão tokens por padrão e precisarão ser unidos por você mesmo, caso contrário, um erro 401 será retornado. Certifique-se de estar logado no WeChat e precisar obter recursos por meio do. estado de login.
Endereço : /resouces
métodos : GET
consulta :
/avatar/1234567890.jpg
codificado como avatar%2F1234567890.jpg
situação : 200
404
401
exemplo : http://localhost:3001/resouces?media=%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxgetheadimg%3Fseq%3D83460%26username%3D%40%4086815a%26skey%3D&token=[YOUR_PERSONAL_TOKEN]
200
Obtenha recursos com sucesso e retorne arquivos de recursos estáticos
404
Falha ao obter recursos
401
não carrega token de login { "success" : false , "message" : " Unauthorized: Access is denied due to invalid credentials. " }
401
O status de login do WeChat expirou {
"success" : false , "message" : " you must login first "
}
Obrigado a todos os nossos colaboradores!
Consulte CHANGELOG para conteúdo atualizado