python实现定时发送qq消息


Posted in Python onJanuary 18, 2019

因为生活中老是忘记各种事情,刚好又在学python,便突发奇想通过python实现提醒任务的功能(尽管TIM有定时功能),也可定时给好友、群、讨论组发送qq消息。其工作流程是:访问数据库提取最近计划——>根据数据内容(提醒时间、提醒对象、提醒内容)设置定时任务——>给特定qq好友发送消息。

1. 软件版本:

python实现定时发送qq消息

2.安装依赖环境

  • pymysql安装:pip install pymysql
  • qqbot安装:pip install qqbot

3.数据库操作

数据库操作非常简单,跟Java类似,自己去菜鸟教程看一下基础语法就好了。

#coding: utf-8
import pymysql #导入pymysql模块

db = pymysql.connect("localhost","root","root","info_db" ) #数据库链接信息
cursor = db.cursor()

#插入任务
def insertSchedule(schedule):
 insertsql = "insert into dutyschedule_tb(worktime,name) values(%s,%s)"
 try:
 #这种查询语句可以防止sql注入
 cursor.execute(insertsql,(schedule['worktime'],schedule['name']))
 db.commit()
 except Exception:
 db.rollback()
 raise Exception

#删除任务
def deleteSchedule():
 deletesql = ""
 try:
 cursor.execute(deletesql)
 db.commit()
 except Exception:
 db.rollback()

def updateSchedule(user):
 updatesql = ""
 try:
 cursor.execute(updatesql)
 db.commit()
 except Exception:
 db.rollback()

#获取下一个任务
def findScheduleByNewTime():
 selectsql = "SELECT * FROM dutyschedule_tb where NOW() <= date_format(worktime,'%Y-%m-%d %H:%i:%S') ORDER BY worktime ASC;"
 try:
 cursor.execute(selectsql)
 results = cursor.fetchone()
 schedule = {}
 schedule['worktime'] = results[1]
 schedule['name'] = results[2]
 schedule['content'] = results[3]
 return schedule
 except Exception:
 return None

4.配置qqbot登陆信息

也可以不配置,不配置的话就是每次扫码登陆,但这在Linux系统下不好用,我按说明将配置改成了每次将登陆二维码发到固定qq邮箱。qqbot模块在GitHub上,大家可以去看一下模块说明:qqbot
配置文件默认在用户目录下的.qqbot-tmp/v2.3.conf,linux下类似

{

 # QQBot 的配置文件
 # 使用 qqbot -u somebody 启动程序时,依次加载:
 # 根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
 # 使用 qqbot 启动程序时,依次加载:
 # 根配置 -> 默认配置 -> 命令行参数配置
 
 "fantasy" : {
  # 这是自己创建的用户自定义配置,可以在启动qqbot启动时选择加载哪个配置文件 
 # QQBot-term (HTTP-API) 服务器端口号(该服务器监听 IP 为 127.0.0.1 )
 # 设置为 0 则不会开启本服务器(此时 qq 命令和 HTTP-API 接口都无法使用)。
 "termServerPort" : 8188,
 
 # 二维码 http 服务器 ip,请设置为公网 ip 或空字符串
 "httpServerIP" : "",
 
 # 二维码 http 服务器端口号
 "httpServerPort" : 8189,
 
 # 自动登录的 QQ 号
 "qq" : "你的qq",
 
 # 接收二维码图片的邮箱账号
 "mailAccount" : "你的邮箱",
 
 # 该邮箱的 IMAP/SMTP 服务授权码,一般在邮箱设置中有
 "mailAuthCode" : "你的授权码",
 
 # 是否以文本模式显示二维码
 "cmdQrcode" : False,
 
 # 显示/关闭调试信息
 "debug" : False,

 # QQBot 掉线后自动重启
 "restartOnOffline" : True,
 
 # 在后台运行 qqbot ( daemon 模式)
 "daemon": False,
 
 # 完成全部联系人列表获取之后才启动 QQBot 
 "startAfterFetch" : False,
 
 # 插件目录
 "pluginPath" : ".",
 
 # 启动时需加载的插件
 "plugins" : [],
 
 # 插件的配置(由用户自定义)
 "pluginsConf" : {},
 
 },
 
 # 用户 somebody 的配置,这是默认配置
 "somebody" : {
 #这里的基本内容跟上面一样,就不贴出来了,太长了占地方
 
 
 },
 
 # 可以在 默认配置 中配置所有用户都通用的设置
 "默认配置" : {
 "qq" : "",
 "pluginPath" : "",
 "plugins" : [
  'qqbot.plugins.sampleslots',
  'qqbot.plugins.schedrestart',
 ],
 "pluginsConf" : {
  'qqbot.plugins.schedrestart': '8:00',
 }
 },
 
 # # 注意:根配置是固定的,用户无法修改(在本文件中修改根配置不会生效)
 # "根配置" : {
 # "termServerPort" : 8188,
 # "httpServerIP" : "",
 # "httpServerPort" : 8189,
 # "qq" : "",
 # "mailAccount" : "",
 # "mailAuthCode" : "",
 # "cmdQrcode" : False,
 # "debug" : False,
 # "restartOnOffline" : False,
 # "daemon" : False,
 # "startAfterFetch" : False,
 # "pluginPath" : "",
 # "plugins" : [],
 # "pluginsConf" : {}
 # },

}

5. 自定义功能

from qqbot import _bot as bot

#登陆qq,使用配置文件为fantasy
bot.Login(['-u','fantasy'])

#自定义函数,用来进一步封装qqbot接口
#获取所有好友列表
def getBuddyByName(nickname):
 return bot.List('buddy',nickname)

#获取所有群列表
def getGroupByName(groupname):
 return bot.List('group',groupname)

#给备注(没用备注就是昵称)为nickname的好友发送content消息
def sendToNickname(nickname,content):
 user = getBuddyByName(nickname)
 if user:
 bot.SendTo(user[0],content)
 else:
 print("未找到联系人:"+nickname)

6.入口主程序

#coding: utf-8
import time
import sched
import datetime
from Dao.DutyscheduleDao import *
from Utils.QQInterface import *
#sched是python的定时任务模块


schedule = sched.scheduler(time.time, time.sleep)
#从数据库获取第一个任务
newschedule = findScheduleByNewTime()

#返回距下次任务还有多少秒
def getSeconds():
 #申明全局变量
 global newschedule
 newschedule = findScheduleByNewTime()
 if newschedule:
 return (newschedule['worktime'] - datetime.datetime.now()).total_seconds()
 else:
 print("所有任务执行完毕,退出程序……")
 exit()

#发消息函数
def SendTo():
 global newschedule
 sendToNickname(newschedule['name'],newschedule['content'])

#中间函数,用于循环运行所有数据库未执行事件
def perform():
 SendTo()
 #睡眠5秒,不然可能会重复发送消息
 time.sleep(5)
 sleepSecond = getSeconds()
 print("下次任务执行时间:"+str(newschedule['worktime']))
 #这次任务执行完后添加新任务
 schedule.enter(sleepSecond,1,perform,())


def run():
 #1.获取数据库最近将执行任务的时间及姓名
 #2.计算执行任务的时间与现在时间的差值(单位:秒)
 sleepSecond = getSeconds()
 print("下次通知:"+str(newschedule['worktime']))
 #3.加入定时处理函数
 schedule.enter(sleepSecond,1,perform,())
 #4.执行定时任务
 schedule.run()

if __name__ == '__main__':
 run()

7.其它

数据库结构:

drop database if exists info_db;
create database info_db default character set utf8;

use info_db;
create table dutyschedule_tb(
 id int(11) auto_increment primary key,
 worktime timestamp not null,
 name varchar(10) not null,
 content varchar(100) not null
)engine=InnoDB auto_increment=1 default charset=utf8;

以上就是循环发送qq消息的代码,以下是项目目录结构,其中一些没有出现的文件是自己测试所用,可以不用关心:

python实现定时发送qq消息

效果图:

python实现定时发送qq消息

python实现定时发送qq消息

总结:基本功能完成了,但是操作不够友好,需要手动往数据库录入数据,之后准备做一个数据管理的前端配合使用,可以简化很多操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过post提交数据的方法
May 06 Python
python自定义类并使用的方法
May 07 Python
Python使用django获取用户IP地址的方法
May 11 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python导入模块交叉引用的方法
Jan 19 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
BeautifulSoup获取指定class样式的div的实现
Dec 07 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
如何在Django中设置定时任务的方法示例
Jan 18 #Python
Python设计模式之工厂方法模式实例详解
Jan 18 #Python
Python设计模式之原型模式实例详解
Jan 18 #Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 #Python
Python中logging实例讲解
Jan 17 #Python
python矩阵/字典实现最短路径算法
Jan 17 #Python
python实现Dijkstra静态寻路算法
Jan 17 #Python
You might like
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
Javascript玩转继承(二)
2014/05/08 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
python学习数据结构实例代码
2015/05/11 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
基于python的Paxos算法实现
2019/07/03 Python
python openpyxl使用方法详解
2019/07/18 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
Python截图并保存的具体实例
2021/01/14 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
什么是Smart Navigation?
2016/07/03 面试题
日语专业毕业生求职信
2013/12/04 职场文书
吨的认识教学反思
2014/04/27 职场文书
设计师求职信模板
2014/05/06 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
党员承诺书范文2015
2015/04/27 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书