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 json模块使用实例
Apr 11 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
CentOS7安装Python3的教程详解
Apr 10 Python
numpy下的flatten()函数用法详解
May 27 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
python requests.get带header
May 05 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Python如何将将模块分割成多个文件
Aug 04 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 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对称加密算法示例
2014/05/07 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
Python文件和目录操作详解
2015/02/08 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
QA工程师岗位职责
2013/11/20 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
培训计划通知
2015/07/15 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB
Apache Pulsar结合Hudi构建Lakehouse方案分析
2022/03/31 Servers