Python微信机器人实现定时推送与智能回复
本文介绍基于Python wxpy库开发的微信机器人,实现定时推送天气预报与励志语录,以及好友消息的智能回复。通过多线程群发解决发送频率限制,结合图灵机器人接口实现自然语言交互,并包含数据抓取与过滤逻辑。
项目背景与核心功能
近期计划开发一款微信机器人,核心功能包括每日定时推送天气预报或励志语录。励志语录需具备每日自动更新机制,且在用户回复时能随机推送不同内容。实现思路采用多线程群发策略,鉴于微信对高频发送消息有限制,代码中加入了time.sleep(1)进行延时控制,具体时长可根据实际情况调整。原本计划接入写诗机器人,但因本地设备性能不足而放弃,有兴趣的用户可自行尝试。完成该项目有助于提升编程实践能力。
数据源准备
首先,需要寻找提供每日更新天气预报和励志语录的数据源。若需更新其他类型内容,可根据需求自行替换数据源。此处示例选取了两个网站进行数据抓取。
天气预报数据抓取
第一步,从指定网站抓取天气预报数据。由于温度、气候和生活指数分布在两个不同页面,需分别抓取这两个页面的数据并进行整合。
首先抓取第一个页面,提取温度、风向及日期信息,同时一并抓取第二天的天气数据。
def get_content(self, html_str):
html = etree.HTML(html_str)
weather_ts = html.xpath("//div[@id='7d']/ul")
today_w = ''
tomorrow_w = ''
for weather_t in weather_ts:
today_w += weather_t.xpath("./li[1]/h1/text()")[0] + ' '
today_w += weather_t.xpath("./li[1]/p[1]/text()")[0] + ' '
today_w += weather_t.xpath("./li[1]/p[2]/i/text()")[0] + ' '
today_w += '风向' + weather_t.xpath("./li[1]/p[3]/i/text()")[0]
tomorrow_w += weather_t.xpath("./li[2]/h1/text()")[0] + ' '
tomorrow_w += weather_t.xpath("./li[2]/p[1]/text()")[0] + ' '
tomorrow_w += '风向' + weather_t.xpath("./li[2]/p[3]/i/text()")[0]
all_w = today_w + '--' + tomorrow_w
return all_w
接着抓取第二个页面,获取穿衣指数、紫外线指数等生活指数信息。
def get_content1(self, html_str):
html = etree.HTML(html_str)
living_ins =html.xpath("//div[@class='livezs']/ul")
today_living = ''
for living_in in living_ins:
today_living += living_in.xpath("./li[1]/span/text()")[0]
today_living += living_in.xpath("./li[1]/em/text()")[0] + ':'
today_living += living_in.xpath("./li[1]/p/text()")[0] + ' '
today_living += living_in.xpath("./li[2]/a/em/text()")[0] + ' '
today_living += living_in.xpath("./li[2]/a/p/text()")[0] + ' '
today_living += living_in.xpath("./li[3]/em/text()")[0] + ':'
today_living += living_in.xpath("./li[3]/p/text()")[0] + ' '
today_living += living_in.xpath("./li[4]/a/em/text()")[0] + ' '
today_living += living_in.xpath("./li[4]/a/p/text()")[0] + ' '
today_living += living_in.xpath("./li[6]/em/text()")[0] + ':'
today_living += living_in.xpath("./li[6]/p/text()")[0]
return today_living
第二步,从指定网站抓取经典唯美励志语录。为确保每次发送或回复时内容具有新鲜感,程序抓取了10条数据,并实现随机返回其中一条。
def Soul():
url = 'http://www.59xihuan.cn/'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)"}
res = requests.get(url, headers=headers).content
html = etree.HTML(res)
soul_sen = html.xpath("//div[@class='mLeft']")
soul_dict = {}
for soul_s in soul_sen:
soul_dict[1] = soul_s.xpath('./div[1]/div[2]/div[2]/text()')[0].strip()
soul_dict[2] = soul_s.xpath('./div[2]/div[2]/div[2]/text()')[0].strip()
soul_dict[3] = soul_s.xpath('./div[3]/div[2]/div[2]/text()')[0].strip()
soul_dict[4] = soul_s.xpath('./div[4]/div[2]/div[2]/text()')[0].strip()
soul_dict[5] = soul_s.xpath('./div[5]/div[2]/div[2]/text()')[0].strip()
soul_dict[6] = soul_s.xpath('./div[6]/div[2]/div[2]/text()')[0].strip()
soul_dict[7] = soul_s.xpath('./div[7]/div[2]/div[2]/text()')[0].strip()
soul_dict[8] = soul_s.xpath('./div[8]/div[2]/div[2]/text()')[0].strip()
soul_dict[9] = soul_s.xpath('./div[9]/div[2]/div[2]/text()')[0].strip()
soul_dict[10] = soul_s.xpath('./div[10]/div[2]/div[2]/text()')[0].strip()
i = random.randint(1,10)
return soul_dict[i]
微信机器人核心实现
进入核心开发阶段,选用wxpy库作为微信接口,需导入以下依赖库。
import time
import json
import requests
import datetime
import threading
from queue import Queue
import schedule
import wxpy
from weather import WeatherSpider
from soul import Soul
bot = wxpy.Bot(cache_path=True)
设置定时器,支持配置多个定时任务,此处示例仅设置了早间推送任务。
def main():
print("程序开始运行...")
schedule.every().day.at("10:01").do(send)
while True:
schedule.run_pending()
time.sleep(1)
获取抓取的数据内容、微信好友列表,并引入多线程机制以优化发送效率。
def send():
wea_ls = '早上好,今天又是元气满满的一天\n' + WeatherSpider('101271610').run() +'您可以:'+ '\n回复"成都"获取成都天气\n回复"唯美"随机获取励志唯美语录'
send_queue = Queue()
fris = bot.friends().search('') # 这里填空会向所有好友的发送,或者填你想要单独发送的人
for fri in fris:
send_queue.put(fri)
t_list = []
for i in range(3):
t_msend = threading.Thread(target=more_thread, args=(send_queue, wea_ls))
t_list.append(t_msend)
for t in t_list:
t.setDaemon(True) #把子线程设置为守护线程,该线程不重要主线程结束,子线程结束
t.start()
for q in [send_queue]:
q.join() #让主线程等待阻塞,等待队列的任务完成之后再完成
print("主线程结束")
开始执行向好友发送数据的功能逻辑。
def more_thread(send_queue, wea_ls):
while True:
try:
friend = send_queue.get()
friend.send(wea_ls)
print("发送成功,a:",friend)
except Exception as ret:
time.sleep(1) # 如果你发送的好友很多,时间可以设置大一点,防止微信发送频繁,导致发送失败
continue # 这里不建议加continue,依个人微信情况而定吧
send_queue.task_done()
消息监听与智能回复
实现消息监听功能,并向好友回复。必须过滤群消息和公众号消息,具体原因将在后续代码中说明。
@bot.register()
def rcv_message(msg):
sender = str(msg.sender)
if '<MP:'in str(sender) or '<Group:' in str(sender): # 这里过滤掉群消息和公众号消息
return
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# print(now)
recv_save = ''
rev_save = '发送人:'+ sender +" 内容:"+ msg.text + ' ' + now
print(rev_save)
with open('wechat.md','a') as f: # 这里我们要把朋友发送的消息进行保存,方便查看以免遗漏重要消息
f.write(rev_save)
f.write('\n')
if msg.text == '成都':
wea_cd = '成都' + WeatherSpider('101270101').run()
return wea_cd
elif msg.text == '唯美':
return Soul()
else:
try:
return robot_tuling(msg.text)
except Exception as ret:
fri_me = bot.friends().search('virtual')[0]
fri_me.send("发送错误,信息:%s" % ret)
return ("主人不在所以我智商为0了,请尝试下回复(唯美)随机获取励志唯美语句")
接入图灵机器人接口,实现智能聊天回复功能。
def robot_tuling(text):
url = "http://www.tuling123.com/openapi/api"
api_key = "a3c47b29c497e87ab0b6e566f32" # 这里我已经修改,需要自己申请一个咯
payload = {
"key": api_key,
"info": text,
}
rec = requests.post(url, data=json.dumps(payload))
result = json.loads(rec.content)
# print(result["text"])
if result["text"] == "亲爱的,当天请求次数已用完。":
return "主人不在所以我智商为0了,尝试下回复(唯美)随机获取励志唯美语句"
return result["text"]
所有功能开发完毕,查看运行效果。注意需屏蔽公众号消息,否则可能出现异常显示。



总结
以上介绍了基于Python的微信聊天机器人改进版,支持定时或触发式抓取天气预报、励志语录并向好友推送。如有疑问请留言,小编会及时回复。感谢对本站的支持。若本文对您有帮助,欢迎转载,请注明出处。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













