時間:2022-08-07 07:54:01 | 來源:網(wǎng)站運營
時間:2022-08-07 07:54:01 來源:網(wǎng)站運營
微信機(jī)器人有很多,比如之前的 itchat 是基于網(wǎng)頁版實現(xiàn)的,然而現(xiàn)在微信網(wǎng)頁版被封的厲害,許多賬號都用不了了。找來找去發(fā)現(xiàn) Wechaty 有基于 ipad 協(xié)議的實現(xiàn),下面對其進(jìn)行簡單介紹。node --version
如果是 v10.16. 以下,需要先更新 Node。mkdir wechatbotcd wechatbotnpm init -ynpm install ts-node typescript -gtsc --init --target ES6touch bot.ts
上面我們新建了文件 bot.ts,這個文件就是主程序了,我們把官方示例代碼放到這個文件里,不要忘了把 token 和 name 改成你自己的:// bot.tsimport { Contact, Message, Wechaty } from 'wechaty'import { ScanStatus } from 'wechaty-puppet'import { PuppetPadplus } from 'wechaty-puppet-padplus'import QrcodeTerminal from 'qrcode-terminal'import { FileBox } from 'wechaty'const token = your_tokenconst puppet = new PuppetPadplus({ token,})const name = your_nameconst bot = new Wechaty({ name, puppet, // generate xxxx.memory-card.json and save login data for the next login})var baoshi: RegExp = new RegExp('報時.*') // 正則表達(dá)式,群名以“報時”開頭//報時器,整點觸發(fā)async function hourReport() { //當(dāng)前時間 var time = new Date(); //小時 var hours = time.getHours(); //分鐘 var mins = time.getMinutes(); //秒鐘 var secs = time.getSeconds(); //下一次報時間隔 var next = ((60 - mins) * 60 - secs) * 1000; //設(shè)置下次啟動時間 setTimeout(hourReport, next); //整點報時,因為第一次進(jìn)來mins可能不為0所以要判斷 const room = await bot.Room.find({topic:baoshi}) var request = require('request') request.get({url:'http://127.0.0.1:5000/clock'}, function (error, response, body) { if (error) { console.log('Error :', error) return } console.log(' Body :', body) if(body.length > 0){ room?.say(body) } })}bot.on('scan', (qrcode, status) => { if (status === ScanStatus.Waiting) { QrcodeTerminal.generate(qrcode, { small: true }) } })bot.on('login', async (user: Contact) => { console.log(`login success, user: ${user}`) //啟動報時器 hourReport(); })bot.on('message', async (msg: Message) => { console.log(`msg : ${msg}`) var room = msg.room() var topic = '' if(room){ topic = await room.topic() } var contact = msg.from() //直接推給python處理,我們獲得回復(fù)內(nèi)容 var request = require('request') var formData = { text: msg.text(), roomtopic: topic, date: JSON.stringify(msg.date()), contactid: contact?.id, } try{ // 所有的東西都推到后端用python處理request.post({url:'http://127.0.0.1:5000/message', formData: formData}, function (error, response, body) { if (error) { console.log('Error :', error) return } console.log(' Body :', body) var response = JSON.parse(body) if(body.length > 0){ const type: string = response['type'] if(type=='image'){ const path: string = response['content'] const filebox: FileBox = FileBox.fromFile(path) if(room){ console.log('準(zhǔn)備發(fā)啦!') room.say(filebox) }else{ contact?.say(filebox) } }else if(type=='text'){ const text: string = response['content'] if(room){ room.say(text) }else{ contact?.say(text) } }else{ //什么也不做 } } }) }catch(e){ console.log(e) } })
安裝 wechaty 和 qrcode-terminalnpm install wechaty@latestnpm install wechaty-puppet-padplus@latestnpm install qrcode-terminal
這一步我遇到了點問題,裝著裝著就卡住不動了,因為某些不可描述的原因國外的網(wǎng)站連接質(zhì)量不好,我們需要使用代理:npm config set registry https://registry.npm.taobao.org
然后安裝就好了。# backend.pyfrom flask import Flaskfrom flask import requestimport jsonimport datetimeapp = Flask(__name__)# 全局變量name = '報時'model = r'淦!已經(jīng)/h點/m分了!你今天學(xué)習(xí)了嗎?'# 獲取報時內(nèi)容def gettext(): response_text = '' status = False for c in model: if not status: if c == chr(92): status = True else: response_text += c else: status = False if c == chr(92): response_text += c elif c == 'h': response_text += str(datetime.datetime.now().hour) elif c == 'm': response_text += str(datetime.datetime.now().minute) elif c == 's': response_text += str(datetime.datetime.now().second) else: pass return response_textdef handle(data): global model text = data['text'] if len(text) >= 6 and text[:4] == '修改模板': model = text[5:] return json.dumps({'type': 'text', 'content': '修改大成功!現(xiàn)在的模板是:/n'+model}) elif text == '報時': return json.dumps({'type': 'text', 'content': gettext()}) else: return json.dumps({'type': 'null'})@app.route('/message', methods=['GET', 'POST'])def message(): if request.method == 'POST': data = request.form print(data) roomtopic = data['roomtopic'] if roomtopic: # 是群 if len(roomtopic) >= 2 and roomtopic[0:2] == name: return handle(data) return json.dumps({'type':'null'})# 返回當(dāng)前報時內(nèi)容@app.route('/clock', methods=['GET'])def clock(): return gettext()if __name__ == '__main__':app.run()
啟動服務(wù)(可以使用 screen 同時運行兩個程序):ts-node bot.tspython3 backend.py
大功告成!關(guān)鍵詞:機(jī)器
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。