? 도커 이미지 |
작은 WeChat 로봇 웹훅은 자신의 개발에 많은 장애물을 제거하는 데 도움이 됩니다. http 요청을 기반으로 합니다. 웹 API를 기반으로 하기 때문에 arm과 같은 장치에 배포할 수 있다는 장점이 있습니다. 건축학.
주의
해당 프로젝트는 현재 웹 위챗을 기반으로 하고 있어 그 자체가 제한될 위험이 있습니다. 또한, 이틀에 한 번 정도 오프라인 상태이며, 이외에는 새로운 기능 요청을 받지 않습니다. Windows 프로토콜은 WIP하에 있으며 가까운 시일 내에 만나보실 수 있습니다!
기능 | 웹 프로토콜 | 윈도우 프로토콜 |
---|---|---|
현재 가용성 | ✅ | |
코드 브랜치 | 기본 | 창문들 |
도커 태그 | 최신 | 창문들 |
<메시지 보내기> | ✅1인/다인/그룹 | ✅1인/다인/그룹 |
문자 보내기 | ✅ | ✅ |
사진 보내기 | ✅ 로컬 이미지/URL 이미지 분석 | ✅ 로컬 이미지/URL 이미지 분석 |
비디오(mp4) 보내기 | ✅ 로컬 비디오/URL 비디오 분석 | |
문서 보내기 | ✅ 로컬 파일/URL 파일 구문 분석 | ✅ 로컬 파일/URL 파일 구문 분석 |
<메시지 수신> | ||
문자를 받다 | ✅ | ✅ |
음성을 받다 | ✅ | |
사진을 받다 | ✅ | |
비디오 수신 | ✅ | |
파일 수신 | ✅ | |
공개 계정 트윗 링크 받기 | ✅ | |
시스템 알림 수신 | ✅ 온라인 알림 / 오프라인 알림 / 비정상 알림 | |
아바타 획득 | ✅ | |
빠른 답변 | ✅ | ✅ |
<그룹 관리> | ||
<친구 관리> | ||
친구 요청 받기 | ✅ | |
친구를 통해 요청 | ✅ | |
연락처 목록 가져오기 | ||
<기타 기능> | ||
연결 끊김 없이 자동 로그인 | ✅ | |
API 인증 | ✅ | ✅ |
n8n 원활한 액세스 | ✅ | |
도커 배포 지원 | ✅ arm64 / amd64 | ✅ amd64 |
로그 파일 내보내기 | ✅ | ✅ |
위에서 언급한 기능은 아직 구현되지 않았습니다. WeChat 프로토콜 제한으로 인해 제한됩니다. 예를 들어, 다양한 프로토콜이 모든 기능을 연결할 수 있는 것은 아닙니다.
npx wechatbot-webhook
연결을 끊지 않는 이상 기본적으로 마지막 로그인이 기억됩니다. 계정을 변경하려면 다음 명령을 실행하세요.
npx wechatbot-webhook -r
설치 오류가 발생하는 경우 노드 버전 >= 18.14.1 #227인지 확인하세요.
명령줄에서 푸시 메시지 API를 복사합니다(예: http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN]).
새 터미널을 열고 다음 컬을 시도해 보세요. to 및 token 필드 값을 원하는 값으로 변경하세요.
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' { "to": "测试昵称", data: { "content": "Hello World!" }} '
중요한
패키지 관리자가 pnpm으로 마이그레이션되었습니다. 일부 불규칙한 임시 패키지 패치를 지원하고 종속성 설치를 가속화하려면 이를 사용하여 종속성을 설치하세요.
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
QR 코드 로그인 주소, 사진 아래 URL 부분을 찾아 브라우저로 접속한 후 코드를 스캔하여 wx에 로그인하세요.
https://localhost:3001/login?token=[YOUR_PERSONAL_TOKEN]
팁: -e를 사용하여 매개변수를 추가하고 로 여러 줄을 구분해야 합니다(예: -e RECVD_MSG_API="https://example.com/your/url" ).
기능 | 변하기 쉬운 | 주목 |
---|---|---|
로그 수준 | LOG_LEVEL=정보 | 기본값은 info인 로그 수준은 현재 로그 출력에만 영향을 미칩니다. 자세한 출력을 위해서는 디버그 사용을 고려하세요. 이 값이 어떻게 변경되든 로그 파일은 항상 디버그 수준 로그를 기록합니다. |
메시지 수신 API | RECVD_MSG_API=https://example.com/your/url | 메시지 기반 연결 등 메시지 수신 로직을 직접 처리하려면 처리 로직 URL을 입력하세요. |
자신이 보낸 메시지를 수락하는 메시지 수신 API | ACCEPT_RECVD_MSG_MYSELF=거짓 | RECVD_MSG_API 자신으로부터 메시지 수신 여부(true로 설정, 즉 수신됨, 기본값은 false) |
사용자 정의 로그인 API 토큰 | LOGIN_API_TOKEN=abcdefg123 | 자신만의 로그인 토큰을 사용자 정의할 수도 있습니다. 이를 구성하지 않으면 기본적으로 토큰이 생성됩니다. |
자동 로그인 비활성화 | DISABLE_AUTO_LOGIN=참 | WeChat이 아닌 계정을 추방하려면 현재 로그인된 세션을 사용하여 로그인을 피할 수 있습니다 . 매번 QR 코드를 스캔하여 로그인하려면 이 구성을 추가하세요. |
v2 버전 인터페이스는 그룹 전송 기능을 추가합니다. v1 버전 인터페이스는 Legacy-api로 이동하세요.
POST
application/json
payload
구조텍스트나 파일을 외부 링크로 보내면 외부 링크가 그림이나 파일로 구문 분석됩니다.
매개변수 | 설명하다 | 데이터 유형 | 기본값 | 비어있을 수 있나요? | 선택적 매개변수 |
---|---|---|---|---|---|
에게 | 메시지 수신자의 경우 수신 String 기본적으로 닉네임으로 전송됩니다(그룹 이름에도 동일하게 적용됨). 수신 Object 구조는 메모를 작성한 사람에게 전송될 수 있습니다. 예: {alias: '备注名'} . 그룹 이름은 노트 이름을 지원하지 않습니다. | String Object | - | N | - |
isRoom | 그룹에 메시지를 보낼지 여부는 기술적인 처리상 실제로 닉네임과 그룹 이름이 동일하기 때문에 사람을 찾을 때 그룹을 찾는지 사람을 찾는지 여부를 결정하는 매개변수입니다. | Boolean | false | 와이 | true false |
데이터 | 메시지 본문 구조, 아래 payload.data 참조 | Object Array | false | N | true false |
payload.data
구조매개변수 | 설명하다 | 데이터 유형 | 기본값 | 비어있을 수 있나요? | 선택적 매개변수 |
---|---|---|---|---|---|
유형 | 메시지 유형 , 필드를 비워두고 일반 텍스트로 구문 분석 | String text | - | 와이 | text fileUrl |
콘텐츠 | 메시지 내용 , 여러 URL을 전송하고 구문 분석하려면 type을 fileUrl로 지정하는 동시에 내용에 URL을 입력하고 영어 쉼표로 구분하세요. | String | - | N | - |
curl --location ' http://localhost:3001/webhook/msg/v2?token=[YOUR_PERSONAL_TOKEN] '
--header ' Content-Type: application/json '
--data ' {
"to": "testUser",
"data": { "content": "你好" }
} '
어떤 경우에는 URL 파일 이름을 직접 보내는 것이 우리가 원하는 것이 아닐 수도 있습니다. 쿼리 매개변수
$alias
사용하여 URL을 연결하여 대상으로 보내는 파일 이름을 지정할 수 있습니다(참고: 별칭은 파일 변환을 수행하지 않습니다).
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
구조success
: 메시지가 성공적으로 전송되었는지 여부입니다. 그룹 메시지의 일부가 성공적으로 전송되더라도 true
message
: 오류가 발생했을 때 나타나는 메시지task
: 작업 세부정보 보내기task.successCount
: 전송된 성공적인 메시지 수task.totalCount
: 총 메시지 수task.failedCount
: 전송에 실패한 메시지 수task.reject
: 매개변수 확인 실패로 인한 매개변수 및 오류 프롬프트task.sentFailed
: 전송이 실패하고 오류 메시지가 표시되기 때문에task.notFound
: 사용자 또는 그룹을 찾을 수 없고 오류 메시지가 표시되기 때문입니다.단일 메시지 전송의 일관성을 확인하세요. 특정 매개변수를 확인하지 못하면 모든 메시지 전송 작업이 종료됩니다.
{
"success" : true ,
"message" : " " ,
"task" : {
"successCount" : 0 ,
"totalCount" : 0 ,
"failedCount" : 0 ,
"reject" : [],
"sentFailed" : [],
"notFound" : []
}
}
파일 읽기는 현재 단일 전송만 지원합니다.
POST
multipart/form-data
payload
구조매개변수 | 설명하다 | 데이터 유형 | 기본값 | 비어있을 수 있나요? | 선택적 값 |
---|---|---|---|---|---|
에게 | 메시지 수신자의 경우 수신 String 기본적으로 닉네임으로 전송됩니다(그룹 이름에도 동일하게 적용됨). 수신 Json 문자열 구조는 메모를 작성한 사람에게 전송을 지원합니다. 예: --form 'to= "{alias: "小号"}" ', 그룹 이름은 댓글 이름을 지원하지 않습니다. | String | - | N | - |
isRoom | 그룹 메시지 전송 여부 , formData 일반 텍스트는 String 유형만 사용할 수 있으며 1 예, 0 아니오를 나타냅니다. | String | 0 | 와이 | 1 0 |
콘텐츠 | 파일 , 로컬 파일은 한 번에 하나만 보낼 수 있으며 여러 파일은 수동으로 여러 번 호출됩니다. | 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
구조 {
"success" : true ,
"message" : " Message sent successfully "
}
payload
구조POST
multipart/form-data
양식 데이터 | 설명하다 | 데이터 유형 | 선택적 값 | 예 |
---|---|---|---|---|
유형 | 기능 유형
다른 유형
시스템 유형
| String | text file urlLink friendship unknown system_event_login system_event_logout system_event_error system_event_push_notify | - |
콘텐츠 | 전송된 콘텐츠, 텍스트 또는 전송된 파일은 이 필드를 공유합니다. 구조 매핑의 예를 참조하세요. | String Binary | 예 | |
원천 | 메시지 관련 발신자 데이터, JSON 문자열 | String | 예 | |
언급됨 | 메시지는 @mymessage #38입니다. | String | 1 0 | - |
isMsgFromSelf | 너 자신이 보낸 메시지인가 #159 | String | 1 0 | - |
formData의 서버측 처리에는 일반적으로 해당 핸들러가 필요합니다. 이 단계를 완료했다고 가정하면 다음 요청을 받게 됩니다.
{
"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类型判断系统消息
}
메시지 수신 API 컬 예제(디버깅을 위해 Postman으로 직접 가져옴)
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
구조(선택 사항)
RECVD_MSG_API
사용하여 메시지를 수신한 후 즉시 응답( 빠른 응답 )을 원할 경우, 반환 값이 없으면 다음 구조에 따라 반환 값을 반환하십시오.
json
매개변수 | 설명하다 | 데이터 유형 | 기본값 | 비어있을 수 있나요? | 선택적 매개변수 |
---|---|---|---|---|---|
성공 | 요청 성공 여부는 false를 반환하거나 이 필드가 없으며 응답이 처리되지 않습니다. true 초대 추가와 같은 일부 특수 메시지도 이 필드를 통해 제어됩니다. 처리됩니다. | Boolean | - | 와이 | true false |
데이터 | 메시지에 답장해야 하는 경우 데이터 필드를 정의해야 합니다. | Object Object Array | - | 와이 |
response.data
구조매개변수 | 설명하다 | 데이터 유형 | 기본값 | 비어있을 수 있나요? | 선택적 매개변수 |
---|---|---|---|---|---|
유형 | 메시지 유형 이 필드를 채우지 않으면 기본적으로 텍스트 유형 전송이 사용됩니다. | String | text | 와이 | text fileUrl |
콘텐츠 | 메시지 내용 , 여러 URL을 전송하고 구문 분석하려면 type을 fileUrl로 지정하는 동시에 내용에 URL을 입력하고 영어 쉼표로 구분하세요. | String | - | N | - |
하나의 메시지에 답장을 보내면
{
"success" : true ,
"data" : {
"type" : " text " ,
"content" : " hello world! "
}
}
여러 메시지에 대한 답장 결합
{
"success" : true ,
"data" : [
{
"type" : " text " ,
"content" : " hello world! "
},
{
"type" : " fileUrl " ,
"content" : " https://samplelib.com/lib/preview/mp3/sample-3s.mp3 "
}
]
}
docker가 시작될 때 토큰을 구성하는 것 외에도 기본 토큰의 경우 기본 토큰이 기본적으로 생성되어
.env
파일에 기록됩니다.
/login
GET
200
현재 사용자가 포함된 json을 반환합니다.
{ "success" : true , "message" : " Contact<TestUser>is already login " }
WeChat 로그인 스캔 코드 페이지 표시
인터페이스를 적극적으로 폴링하여 서비스가 정상적으로 실행되고 있는지 확인할 수 있습니다.
/healthz
GET
200
WeChat에 로그인되어 있으면 일반 텍스트 healthy
반환되고, 그렇지 않으면 unHealthy
반환됩니다.
버전 2.8.0부터 이 인터페이스를 통해 아바타와 같은 정적 리소스에 액세스할 수 있습니다. 자세한 내용은 recvd_api 데이터 구조 예제의 아바타 필드를 참조하세요.
Recvd_api에 보고된 모든 정적 리소스 주소에는 기본적으로 토큰이 없으므로 직접 연결해야 합니다. 그렇지 않으면 401 오류가 반환됩니다. WeChat으로 로그인했는지 확인하고 다음을 통해 리소스를 얻어야 합니다. 로그인 상태.
주소 : /resouces
메소드 : GET
쿼리 :
/avatar/1234567890.jpg
avatar%2F1234567890.jpg
로 인코딩됨) 상태 : 200
404
401
예 : http://localhost:3001/resouces?media=%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxgetheadimg%3Fseq%3D83460%26username%3D%40%4086815a%26skey%3D&token=[YOUR_PERSONAL_TOKEN]
200
성공적으로 리소스를 얻고 정적 리소스 파일을 반환합니다.
404
리소스를 획득하지 못했습니다.
401
에는 로그인 토큰이 없습니다. { "success" : false , "message" : " Unauthorized: Access is denied due to invalid credentials. " }
401
WeChat 로그인 상태가 만료되었습니다. {
"success" : false , "message" : " you must login first "
}
모든 기여자에게 감사드립니다!
업데이트된 콘텐츠는 변경 로그를 참조하세요.