이 프로젝트는 WeChat 채팅 로봇에 대한 빠른 시작 및 모범 사례를 개발하기 위한 오픈 소스 채팅 로봇 커뮤니티 Wechaty의 puppet-xp 프로젝트를 기반으로 하며 Windows WeChat 클라이언트 버전 3.3.0.115, 3.6.0.18 및 3.9.2.23을 지원합니다.
이점:
본 창고에 게시된 콘텐츠는 학습 및 연구 목적으로만 사용되며 불법적이거나 상업적인 목적으로 사용하지 마십시오! 이로 인해 법적 분쟁이 발생하더라도 작성자는 아무런 관련이 없습니다!
WeChat 로봇을 실행하면 계정 금지 및 기타 결과가 발생할 수 있습니다. 자기 책임하에 사용해 주십시오. 학습 및 연구용으로만 사용하시고, 불법적인 목적으로 사용하지 마시기 바랍니다.
이는 전적으로 puppet-xp 프로젝트의 지원 수준에 따라 다릅니다. 현재 지원되는 최신 WeChat 버전은 3.9.2.23이고 가장 안정적인 버전은 3.6.0.18입니다.
버전 | 3.3.0.115 | 3.6.0.18 | 3.9.2.23 |
---|---|---|---|
<메시지> | |||
문자를 받다 | ✅ | ✅ | ✅ |
사진을 받다 | ✅ | ✅ | ✅ |
파일 수신 | ✅ | ✅ | ✅ |
애니메이션 사진 수신 | ✅ | ✅ | ✅ |
이모티콘을 받다 | ✅ | ✅ | ✅ |
미니 프로그램 카드 받기 | ✅ | ✅ | ✅ |
연락처 카드 받기 | ✅ | ✅ | ✅ |
위치 카드 받기 | ✅ | ✅ | ✅ |
문자 보내기 | ✅ | ✅ | ✅ |
사진 보내기 | ✅ | ✅ | ✅ |
파일 보내기 | ✅ | ✅ | ✅ |
GIF 보내기 | ✅ | ✅ | ✅ |
<그룹> | |||
@그룹 회원 | ✅ | ✅ | ✅ |
그룹 목록 | ✅ | ✅ | ✅ |
그룹 회원 목록 | ✅ | ✅ | ✅ |
그룹 세부정보 | ✅ | ✅ | ✅ |
그룹 가입을 위한 팁 | ✅ | ✅ | ✅ |
<연락처> | |||
친구 목록 | ✅ | ✅ | ✅ |
친구 세부정보 | ✅ | ✅ | ✅ |
<기타> | |||
로그인 이벤트 | ✅ | ✅ | ✅ |
로그인하려면 코드를 스캔하세요 | ✅ |
wechaty-puppet-xp는 Windows 운영 체제에서만 사용을 지원하며, WeChat 버전은 npm 패키지 버전과 일치해야 합니다. Quick Start는 기본적으로 WeChat 버전 3.9.2.23을 사용합니다.
컴퓨터의 WeChat 버전이 지원되는 버전인지 확인하고(지정된 버전을 다운로드할 필요가 없으면 다시 설치할 필요가 없습니다), 현재 WeChat 버전이 지원되는 경우 정상적으로 WeChat에 로그인합니다 . 컴퓨터가 일치하지 않으면 WeChatSetup-v3.9.2.23.exe를 다운로드해야 합니다.
16LTS 버전 nodejs를 다운로드하여 설치하고 노드 버전 >= v16.0.0을 확인하세요.
node -v
PS C:UsersAdministratorDocumentsGitHubwechaty-puppet-xp-demo> node -v
v16.15.0
git clone https://github.com/atorber/puppet-xp-getting-started
cd puppet-xp-getting-started
npm i wechaty-puppet-xp@next
npm install
설치에 실패하면 puppet-xp를 수동으로 설치하고
npm i wechaty-puppet-xp@next
실행할 수 있습니다.
PC의 WeChat이 로그인되어 있는지 확인하고 버전이 v3.9.2.23인지 확인하세요.
npm run start
디스플레이는 다음과 유사하며 시작이 성공했음을 나타냅니다.
PS C:UsersAdministratorDocumentsGitHubwechaty-puppet-xp-demo> npm run start
> [email protected] start
> cross-env NODE_OPTIONS="--no-warnings --loader=ts-node/esm" node ./src/index.ts
01:42:54 INFO options... {"version":"3.9.2.23"}
01:42:57 INFO StarterBot Starter Bot Started.
01:43:12 INFO onLogin Contact<大师> login
01:43:13 INFO 当前登录账号信息: Contact<大师>
01:43:13 INFO 微信号查找联系人: Contact<文件传输助手>
01:43:13 INFO 昵称查找联系人: Contact<文件传输助手>
01:43:13 INFO 备注名称查找联系人: 没有找到联系人
01:43:13 INFO 群ID查找群: Room<大师是群主>
01:43:13 INFO 群名称查找群: Room<大师是群主>
01:43:13 INFO 联系人数量: 6271
01:43:13 INFO 群数量: 53
달리다 | 해당 프로그램 | 설명하다 |
---|---|---|
npm start | src/indext.ts | TS 코드 예 |
npm run start:js | src/ding-dong-bot.js | JS 코드 예제 |
#!/usr/bin/env -S node --no-warnings --loader ts-node/esm
/**
* wechaty-puppet-xp示例代码,可以作为模版编写自己的业务逻辑.
*
**/
import 'dotenv/config.js'
import {
Contact,
Message,
ScanStatus,
WechatyBuilder,
log,
types,
} from 'wechaty'
import qrcodeTerminal from 'qrcode-terminal'
import { FileBox } from 'file-box'
const onScan = (qrcode: string, status: ScanStatus) => {
if (status === ScanStatus.Waiting || status === ScanStatus.Timeout) {
const qrcodeImageUrl = [
'https://wechaty.js.org/qrcode/',
encodeURIComponent(qrcode),
].join('')
log.info('onScan: %s(%s) - %s', ScanStatus[status], status, qrcodeImageUrl)
qrcodeTerminal.generate(qrcode, { small: true }) // show qrcode on console
} else {
log.info('onScan: %s(%s)', ScanStatus[status], status)
}
}
const onLogin = async (user: Contact) => {
log.info('onLogin', '%s login', user)
// 登录成功后调用bot
main()
}
const onLogout = (user: Contact) => {
log.info('onLogout', '%s logout', user)
}
const onMessage = async (msg: Message) => {
log.info('onMessage', JSON.stringify(msg))
// Message doc : https://wechaty.js.org/docs/api/message#messageage--number
const talker = msg.talker() // 发消息人
const listener = msg.listener() // 接收消息人
const room = msg.room() // 是否是群消息
const text = msg.text() // 消息内容
const type = msg.type() // 消息类型
const self = msg.self() // 是否自己发给自己的消息
log.info('talker', JSON.stringify(talker))
log.info('listener', listener||'undefined')
log.info('room', room || 'undefined')
log.info('text', text)
log.info('type', type)
log.info('self', self?'true':'false')
try {
switch (text) {
case 'ding': // 接收到的消息是ding,回复dong
await msg.say('dong')
break
case 'send text': // 接收到的消息是send text,发送文本消息
await msg.say('this is a test text')
break
case 'send image': // 接收到的消息是send image,发送图片
const image = FileBox.fromFile('file/ledongmao.jpg')
await msg.say(image)
break
case 'send file': // 接收到的消息是send file,发送文件
const fileBox = FileBox.fromUrl('https://wechaty.js.org/assets/logo.png')
await msg.say(fileBox)
break
case 'send video': // 接收到的消息是send video,发送视频
const video = FileBox.fromUrl('http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4')
await msg.say(video)
break
case 'send audio': // 接收到的消息是send audio,发送音频
const audio = FileBox.fromUrl('http://www.zhongguoyinhang.com/upload/2018-11/201811161154314128.mp3')
await msg.say(audio)
break
case 'send emotion': // 接收到的消息是send emotion,发送表情
const emotion = FileBox.fromUrl('https://res.wx.qq.com/mpres/htmledition/images/icon/emotion/0.gif')
await msg.say(emotion)
break
default:
break
}
} catch (e) {
console.log('回复消息失败...', e)
}
try{
switch (type) {
case types.Message.Text: // 接收到的消息是文本
log.info('接收到的消息是文本')
log.info('消息内容:', text)
break
case types.Message.Image: // 接收到的消息是图片
log.info('接收到的消息是图片')
const image = await msg.toImage().thumbnail() // Save the media message as a FileBox
const filePath = 'file/' + image.name
try {
image.toFile(filePath, true)
log.info(`Saved file: ${filePath}`)
} catch (e) {
log.error('保存文件错误:', e)
}
break
case types.Message.Attachment: // 接收到的消息是附件
log.info('接收到的消息是附件')
const attachment = await msg.toFileBox() // Save the media message as a FileBox
const attachmentPath = 'file/' + attachment.name
try {
attachment.toFile(attachmentPath, true)
log.info(`Saved file: ${attachmentPath}`)
} catch (e) {
log.error('保存文件错误:', e)
}
break
case types.Message.Video: // 接收到的消息是视频
log.info('接收到的消息是视频')
const video = await msg.toFileBox() // Save the media message as a FileBox
const videoPath = 'file/' + video.name
try {
video.toFile(videoPath, true)
log.info(`Saved file: ${videoPath}`)
} catch (e) {
log.error('保存文件错误:', e)
}
break
case types.Message.Audio: // 接收到的消息是音频
log.info('接收到的消息是音频')
break
case types.Message.Emoticon: // 接收到的消息是表情
log.info('接收到的消息是表情')
const emoticon = await msg.toFileBox() // Save the media message as a FileBox
const emoticonPath = 'file/' + emoticon.name
try {
emoticon.toFile(emoticonPath, true)
log.info(`Saved file: ${emoticonPath}`)
} catch (e) {
log.error('保存文件错误:', e)
}
break
case types.Message.Url: // 接收到的消息是链接
log.info('接收到的消息是链接')
try {
const urlLink = await msg.toUrlLink()
log.info('链接标题:', urlLink.title)
log.info('链接地址:', urlLink.url)
} catch (e) {
log.error('获取链接错误:', e)
}
break
case types.Message.MiniProgram: // 接收到的消息是小程序
log.info('接收到的消息是小程序')
try {
const miniProgram = await msg.toMiniProgram()
log.info('小程序标题:', miniProgram.title)
log.info('小程序描述:', miniProgram.description)
log.info('小程序页面地址:', miniProgram.pagePath)
log.info('小程序缩略图:', miniProgram.thumbUrl)
} catch (e) {
log.error('获取小程序错误:', e)
}
break
case types.Message.Transfer: // 接收到的消息是转账
log.info('接收到的消息是转账')
break
case types.Message.RedEnvelope: // 接收到的消息是红包
log.info('接收到的消息是红包')
break
case types.Message.Recalled: // 接收到的消息是撤回的消息
log.info('接收到的消息是撤回的消息')
break
case types.Message.Location: // 接收到的消息是位置
log.info('接收到的消息是位置')
break
case types.Message.GroupNote: // 接收到的消息是群公告
log.info('接收到的消息是群公告')
break
case types.Message.Contact: // 接收到的消息是联系人名片
log.info('接收到的消息是联系人名片')
break
case types.Message.ChatHistory: // 接收到的消息是聊天记录
log.info('接收到的消息是聊天记录')
break
case types.Message.Post: // 接收到的消息是公众号文章
log.info('接收到的消息是公众号文章')
break
case types.Message.Unknown: // 接收到的消息是未知类型
log.info('接收到的消息是未知类型')
break
default:
break
}
}catch(e){
console.log('处理消息失败...', e)
}
// 关键词回复,同时也是发送消息的方法
}
const bot = WechatyBuilder.build({
name: 'ding-dong-bot',
puppet: 'wechaty-puppet-xp',
puppetOptions: {
version: '3.9.2.23',
}
})
bot.on('scan', onScan)
bot.on('login', onLogin)
bot.on('logout', onLogout)
bot.on('message', onMessage)
bot.start()
.then(async () => {
log.info('StarterBot', 'Starter Bot Started.')
})
.catch(e => log.error('StarterBot', e))
const main = async () => {
// 获取当前登录微信信息
try {
const self = bot.currentUser
log.info('当前登录账号信息:', self)
} catch (e) {
log.error('get user failed', e)
}
// 通过微信号搜索联系人
try {
const contactById = await bot.Contact.find({
id: 'filehelper'
})
log.info('微信号查找联系人:', contactById)
// 向联系人发送消息
contactById?.say('向指定好友微信号发送消息')
} catch (e) {
log.error('contactByWeixin', e)
}
// 通过昵称搜索联系人
try {
const contactByName = await bot.Contact.find({
name: '文件传输助手'
})
log.info('昵称查找联系人:', contactByName)
// 向联系人发送消息
contactByName?.say('向指定好友昵称发送消息')
} catch (e) {
log.error('contactByName', e)
}
// 通过备注搜索联系人
try {
const contactByAlias = await bot.Contact.find({
alias: '超哥'
})
log.info('备注名称查找联系人:', contactByAlias || '没有找到联系人')
// 向联系人发送消息
contactByAlias?.say('向指定好友备注好友发送消息')
} catch (e) {
log.error('contactByAlias', e)
}
try {
// 通过群ID搜索群
const roomById = await bot.Room.find({
id: '21341182572@chatroom'
})
log.info('群ID查找群:', roomById)
// 向群里发送消息
roomById?.say('向指定群ID发送消息')
} catch (e) {
log.error('roomById', e)
}
try {
// 通过群名称搜索群
const roomByName = await bot.Room.find({
topic: '大师是群主'
})
log.info('群名称查找群:', roomByName || '没有找到群')
// 向群里发送消息
roomByName?.say('向指定群名称发送消息')
} catch (e) {
console.log('roomByName', e)
}
try {
// 获取所有联系人
const contactList = await bot.Contact.findAll()
// log.info('获取联系人列表:', contactList)
log.info('联系人数量:', contactList.length)
} catch (e) {
log.error('contactList', e)
}
try {
// 获取所有群
const roomList = await bot.Room.findAll()
// log.info('获取群列表:', roomList)
log.info('群数量:', roomList.length)
} catch (e) {
log.error('roomList', e)
}
}
이 프로젝트는 wechaty-puppet-xp로 업데이트되었으며 여러 WeChat 버전을 지원합니다. WeChat 버전과 해당 npm 버전을 직접 전환할 수 있습니다.
꼭두각시-XP | 위챗 클라이언트 다운로드 | npm 패키지 설치 |
---|---|---|
1.3.x | 위챗-v3.9.2.23 | npm 나 wechaty-puppet-xp@next |
1.12.7 | 위챗-v3.6.0.18 | npm 나 [email protected] |
1.11.14 | 위챗-v3.3.0.115 | npm 나 [email protected] |
wechaty-puppet-xp 프로젝트 소스 코드
ChatFlow ChatFlow 채팅로봇 관리 시스템
좋은 소식: Windows WeChat 데스크톱 버전 프로토콜을 사용하여 로그인하면 wechaty 무료 버전 프로토콜이 곧 제공될 예정입니다. @atorber, 2021년 7월 5일
새로운 Windows 꼭두각시 프로젝트 wechaty-puppet-xp가 출시되었습니다(@atorber, 2021년 7월 13일).
코드는 시와 같고, 봇은 노래와 같습니다. Wechaty가 촉발한 초보자의 모험, @老张school技术, 2021년 7월 5일
위챗티 공식 홈페이지