700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件

Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件

时间:2021-09-12 23:18:36

相关推荐

Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件

Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件。

想法的来源:每天需要在部门群中发送工作日报,有时候想早点休息但是又不想太早发送日报到群里(原因你懂得。。。),想着如果能够定时发送信息到群里汇报工作就好了,有个Python编写的微信自动控制包itchat很好用,可以使用很简单便捷的接口实现网页登录微信,向好友和微信群发送消息与文件,比较喜欢利用Django框架做Web端,同时有同事也希望使用这个功能,就做成了一个Web服务,定时任务使用apscheduler,这只是一个雏形,不过可以实现预期功能,代码写的不太好请见谅。

下面介绍一下具体做法:

后端使用Python3+Django2,编写了WeChatSendServer.py的文件并创建了一个自定义的WechatScheduler类,代码如下:

# 启动异步定时任务import itchatfrom apscheduler.schedulers.background import BackgroundScheduler, BlockingSchedulerfrom django_apscheduler.jobstores import DjangoJobStore, register_events, register_jobfrom apscheduler.triggers.date import DateTriggerimport logging# Get an instance of a loggerlogger = logging.getLogger('collect')class WechatScheduler(object):def __init__(self, date_time, file_name, group_name, send_message):self.mychat = itchat.Core()self.date_time = date_timeself.file_name = file_nameself.group_name = group_nameself.send_message = send_messagedef wechat_login_server(self):# 主要实现获取登录二维码供用户登录mychat = self.mychatuuid = mychat.get_QRuuid()print("uuid is ============", uuid)qr_io = mychat.get_QR(enableCmdQR=2)qr_io.seek(0)return qr_iodef wechat_sendfile_server(self):mychat = self.mychatstatus = mychat.check_login()if status == '200':print("登录成功==============")mychat.web_init()mychat.show_mobile_login()mychat.get_contact(True)mychat.start_receiving()scheduler = BackgroundScheduler()# 调度器使用DjangoJobStore()# scheduler.add_jobstore(DjangoJobStore(), "default")trigger = DateTrigger(run_date=self.date_time)# job = scheduler.add_job(send_file_by_time, trigger='date', next_run_time='-05-13 14:52:30')job = scheduler.add_job(self.send_file_by_time, trigger)print(job)scheduler.start()# job.remove()returndef send_file_by_time(self):# 根据设置的定时时间和指定的微信群或者好友,定时发送消息和文件mychat = self.mychatprint("开始发送文件-----------------------》start")group = mychat.get_chatrooms(update=True)to_group = ' 'to_flag = ' 'for g in group:if g['NickName'] == self.group_name: # 从群中找到指定的群聊to_group = g['UserName']to_flag = g['NickName']breakprint("群名称是===============》", to_group)if to_flag == self.group_name and self.send_message != '':mychat.send_msg(self.send_message, toUserName=to_group)logger.info('有文字信息发送')mychat.send_file(self.file_name, toUserName=to_group)print("完成发送文件《-----------------------end")returnelif to_flag == self.group_name:mychat.send_msg(self.send_message, toUserName=to_group)logger.info('无文字信息发送')mychat.send_file(self.file_name, toUserName=to_group)print("完成发送文件《-----------------------end")returnelse:#发送个人users = mychat.search_friends(self.group_name)userName = users[0]['UserName']print(userName)mychat.send_msg(self.send_message, toUserName=userName)logger.info('有文字信息发送')res = mychat.send_file(self.file_name, toUserName=userName)print("完成发送文件《-----------------------end")return

同时编写了对应的Controller文件,WeChatSendController.py文件,代码如下:

from django.contrib.auth.decorators import login_requiredfrom django.http import JsonResponse, HttpResponsefrom django.shortcuts import HttpResponse, render, redirectfrom .WechatSendServer import WechatSchedulerimport os, base64# import the logging libraryimport logging# Get an instance of a loggerlogger = logging.getLogger('collect')wechatsend = WechatScheduler('-05-13 14:52:30', 'file_name', 'wechat_receive', '')def wechat_set_controller(request):response = {}response['code'] = 0response['message'] = 'success'# POSTif request.method == 'POST':logger.info('设置定时时间和任务')file_name = request.FILES.get('file_name')file_path = os.path.abspath(os.path.join("upload_dir", file_name.name))print(file_path)destination = open(file_path, 'wb+') # 打开特定的文件进行二进制的写操作for chunk in file_name.chunks(): # 分块写入文件destination.write(chunk)destination.close()date_time = request.POST.get('date_time')wechat_receive = request.POST.get('group_name')send_message = request.POST.get('send_message')print("date_time is {0} and wechat_receive is {1} and send_message is {2}".format(date_time, wechat_receive,send_message))wechatsend1 = WechatScheduler(date_time, file_path, wechat_receive, send_message)global wechatsendwechatsend = wechatsend1return JsonResponse(response)def wechat_send_controller(request):response = {}response['code'] = 0response['message'] = 'success'# POSTif request.method == 'GET':logger.info('获取登录二维码')response['data'] = wechatsend.wechat_login_server()res = HttpResponse(response['data'])return resdef wechat_login_controller(request):# wechatsend = WechatScheduler()# mychat = wechatsend.mychatresponse = {}response['code'] = 0response['message'] = 'success'# POSTif request.method == 'GET':logger.info('执行登录操作')response['data'] = wechatsend.wechat_sendfile_server()return JsonResponse(response)

对应urls.py文件代码如下:

from django.contrib import adminfrom django.urls import pathfrom wechatsend.views import sendfilefrom django.views.generic.base import TemplateView, RedirectViewurlpatterns = [path('', TemplateView.as_view(template_name='index.html')),path('admin/', admin.site.urls),path('setdate/', sendfile.WechatSendController.wechat_set_controller),path('send/', sendfile.WechatSendController.wechat_send_controller),path('login/', sendfile.WechatSendController.wechat_login_controller),# path('index/', sendfile.WechatSendController.wechat_set_controller),]

实现页面如下:

首先,指定微信群或者个人好友(微信群需要保存到通讯录)

然后,设置定时时间,推送内容,推送文件

然后,点击提交日报

再点击获取二维码,用手机微信扫描登录

最后再点击登录,这个时候会发现手机微信提示微信在网页登录了,到时间后相关内容将推送到微信群活好友。

具体代码可以私信找我要,仅供学习交流。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。