由于使用網頁版微信,機器人往往不能夠永遠地在線。如果無法一直在線,也就失去了自動回復程序的意義。在此,我們使用兩種方式來監控機器人程序:
- 自動定時發送消息
- 使用supervisor進行監控
自動發送消息
準備
如果需要定時發送消息,使用sleep
方式來等待計時會阻塞線程,因此我們會使用threading
來進行多線程的操作。把一個線程分配給自動給特定人發送微信消息。
定義自動發送消息的方法
在進行多線程操作之前,我們先定義一個自動發送消息的方法以備調用:
def send_online_notification(name):
my_friend = ensure_one(bot.search(name))
while True:
my_friend.send('Hello!') # 你想發送的消息
time.sleep(3600) # 一小時后在進行發送
wxpy的ensure_one()
方法會確認返回的內容僅有一個值,如果返回的列表超過一個值(或是沒有返回),它會進行報錯。我們在這里尋找name
相關的好友,并且保證只有一個這樣的好友。如果你需要給多個好友發送消息,我建議再使用一個循環來遍歷好友列表。
我們寫一個阻塞線程的死循環,在死循環中給需要尋找發送特定消息,并讓線程停止一小時,由此來打成定時發送消息的方法。
增加線程
另一邊,我們需要利用多線程調用這個方法。
positiveSendingThread = threading.Thread(target=send_online_notification, args=(u'乙醚。',)) # 請在這里輸入你想要尋找的好友昵稱或備注
positiveSendingThread.setDaemon(True)
positiveSendingThread.start()
這樣就成功啟用了一個線程來進行自動發送消息了。
利用Supervisor監控
安裝
supervisor是一個python寫成的程序,因此可以簡單地通過pip
來進行安裝:
pip install supervisor
調整 wxpy設置
如果想使用supervisor的重啟功能,我們必須開啟wxpy的緩存功能以儲存登錄狀態,具體操作在登錄時增加cache_path
參數:
bot = Bot(cache_path=True)
你也可以自由選擇將緩存存在什么文件中,以免多個機器人沖突
同時,你需要阻塞進程而非進入python控制臺,否則機器人退出時程序不退出,將不會進入重啟:
# embed()
bot.join()
配置
官方提供了一個默認的配置文件,你可以使用這條命令輸出到你放置機器人的文件夾中:
echo_supervisord_conf > supervisord.conf
在這個supervisord.conf
后面,我們再追加對微信機器人程序的控制
[program:bot]
command=python ./wxbot.py ;執行機器人文件,請修改文件名
process_name=%(program_name)s
autostart=true ; 程序是否隨supervisor啟動而啟動
autorestart=true ;程序停止時,是否自動重啟
startsecs=10
啟動和控制
從命令啟動supervisor只需要一句:
supervisord -c supervisord.conf
-c
用以指定配置文件,也就是我們剛剛編寫的文件。
使用supervisor還可以方便的開始、重啟和停止程序:
supervisorctl start bot # 開始程序,bot 是剛剛填寫的程序名
supervisorctl restart bot # 重啟程序
supervisorctl stop bot # 停止程序
使用supervisor查看自己的程序運行狀態
supervisorctl status # 查看狀態
因此,只要將wxpy的緩存打開,并且使用supervisor進行自動重啟,我們就可以獲得一個長時間保持登錄的自動回復機器人啦!
機器人代碼
我的微信機器人的代碼在GitHub托管,歡迎查看(づ ̄3 ̄)づ╭?~