老鱼Python数据分析——篇十八:消息推送(一)

需求分析

这两天想把分析处理之后的数据,做一个定时发送,按照自己设想和百度搜索,发现有以下几种办法。(只是我发现比较大众化的办法,不代表只有这几种方法)

  • 发送邮件
  • QQ机器人
  • 微信机器人
  • 极光API

技术测试

最后经过实际测试,微信机器人和极光API都能满足我的需求,但各有优缺点!

QQ机器人
使用的是Web端QQ接口,而WebQQ现在已经停用, 舍弃!
邮件发送
延时太高,最高长达到3分钟,因为我需要的是数据分析出来之后马上发消息,手机5秒之类就能收到。 舍弃!
微信机器人
优点: 不需要下载APP,消息影响速度很快,后期可以推展很多功能,容易实现商业变现。
缺点: 必须使用成年微信号,新微信号不允许使用Web端接口。规则较多,容易被封号。每次登录必须扫二维码。
极光API
优点: 自由度极高,消息影响速度较快,有专门的后台进行消息推送管理。方便统计数据。
缺点: 需要下载对应的APP,界面不够友好,没有好友功能。

测试案例

功能
定时推送天气预报
分解任务
通过webapi得到当天天气信息
通过数据库缓存当天天气(因为调用的接口每天有次数限制)
使用微信机器人和极光API推送消息

任务实现

任务一:通过webapi得到当天天气信息

花了一个小时,通过百度搜索,终于找到一个相对比较好用的天气API。通过接口返回的是JSON格式数据。
该API不带任何参数时,会根据IP得到访问者所在城市,再返回该城市的天气情况。
天气API地址:天气API
参考文档地址:天气API在线帮助手册
代码如下:

import requests, json
from datetime import datetime

def save_tq(cityname=""):
    heads = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
    url = "https://www.tianqiapi.com/api/"
    if (cityname != ""):
        url += "?city=" + cityname
    rep = requests.get(url, headers=heads)
    rep.encoding = "utf-8"
    # 读取数据
    tq_json = json.loads(rep.text)
    cityid = str(tq_json["cityid"])  # 城市ID
    city = str(tq_json["city"])  # 城市
    update_time = str(tq_json["update_time"])  # 更新时间
    week = str(tq_json["data"][0]["week"])  # 星期
    wea = str(tq_json["data"][0]["wea"])  # 天气
    tem = str(tq_json["data"][0]["tem"])  # 当前温度
    tem2 = str(tq_json["data"][0]["tem2"])  # 最低温度
    tem1 = str(tq_json["data"][0]["tem1"])  # 最高温度
    air_level = str(tq_json["data"][0]["air_level"])  # 空气质量
    humidity = str(tq_json["data"][0]["humidity"])  # 湿度
    air_tips = str(tq_json["data"][0]["air_tips"])  # 推荐
    # 结果格式
    result = city + " 今日天气预报\n" \
             + update_time + "\n" \
             + week + "\n" \
             + "天气: " + wea + " \n" \
             + "当前温度: " + tem + " \n" \
             + "温度范围: " + tem2 + "-" + tem1 + " \n" \
             + "空气质量: " + air_level + " \n" \
             + "湿度: " + humidity + "% \n" \
             + air_tips
	return result

if __name__ == "__main__":
    msg = save_tq()
    print(msg)

运行效果如下图:
调用天气API返回的数据

任务二:通过数据库缓存当天天气

最开始思考的办法,是根据保存时间和访问者IP来缓存数据,但发现当访问者超过100W,很容易就突破5W/天的访问数量。
转变思维,先根据访问者IP得到所在城市,再缓存该城市的天气情况,这样每天5W的访问量是绰绰有余。

任务步骤分解
步骤一:在学习阶段使用的是微信机器人方式,所以设计需要保存的数据:城市ID,缓存时间,城市名,消息内容,接收者,关键字(用于微信自动回复)
步骤二:实现根据IP得到城市功能。通过百度搜索发现https://ip.cn可以很方便的通过IP得到城市名。
步骤三:当需要推送消息时,先根据 用户IP 得到 城市名 ,再根据 城市名 从数据查找缓存,如果有 5个小时之内 的数据,则使用该缓存,否则重新通过WebAPI下载数据并缓存。

代码如下:

import requests, json
from service.sqlite_oper import *		# 自己封装的SQLite访问方法
from datetime import datetime

# 根据IP返回城市
def get_city():
    heads = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
    html = requests.get("https://ip.cn", headers=heads).text
    city = html[html.find("省")+1:html.find("市")]
    return city

# 根据城市返回天气信息并缓存到数据库
def save_tq(cityname=""):
    heads = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
    url = "https://www.tianqiapi.com/api/"
    if (cityname != ""):
        url += "?city=" + cityname
    rep = requests.get(url, headers=heads)
    rep.encoding = "utf-8"
    # 读取数据
    tq_json = json.loads(rep.text)
    cityid = str(tq_json["cityid"])  # 城市ID
    city = str(tq_json["city"])  # 城市
    update_time = str(tq_json["update_time"])  # 更新时间
    week = str(tq_json["data"][0]["week"])  # 星期
    wea = str(tq_json["data"][0]["wea"])  # 天气
    tem = str(tq_json["data"][0]["tem"])  # 当前温度
    tem2 = str(tq_json["data"][0]["tem2"])  # 最低温度
    tem1 = str(tq_json["data"][0]["tem1"])  # 最高温度
    air_level = str(tq_json["data"][0]["air_level"])  # 空气质量
    humidity = str(tq_json["data"][0]["humidity"])  # 湿度
    air_tips = str(tq_json["data"][0]["air_tips"])  # 推荐
    # 结果格式
    result = city + " 今日天气预报\n" \
             + update_time + "\n" \
             + week + "\n" \
             + "天气: " + wea + " \n" \
             + "当前温度: " + tem + " \n" \
             + "温度范围: " + tem2 + "-" + tem1 + " \n" \
             + "空气质量: " + air_level + " \n" \
             + "湿度: " + humidity + "% \n" \
             + air_tips

    # 保存到数据库
    sql = "insert into auto_msg values('{0}','{1}','{2}','{3}','{4}','{5}');".format(
        cityid, datetime.now().strftime('%Y-%m-%d %H:%M:%S'), city, result.replace("\n","&"), "十方上下","天气")
    exec(sql)

    return result

# 返回天气,如果距离上次下载天气5小时以上,则重新下载
def get_tq():
    # 得到城市
    cityname = get_city()
    # 当前时间
    now = datetime.now()
    createTime = ""
    result = ""
    # 从数据库查找缓存
    tq_msg = select("select city_id,create_time,city_name,content,to_user, keys from auto_msg where city_name='"+cityname+"' order by create_time desc limit 1")
    for row in tq_msg:
        createTime = str(row[1])
        createTime = datetime.strptime(createTime, "%Y-%m-%d %H:%M:%S")
        result = str(row[3]).replace("&","\n")
    # 判断是否有记录,如果有判断是否是5小时前的记录
    if createTime!="" and (now-createTime).days<=0 and (now-createTime).seconds<18000:
        return result
    else:
        return save_tq(cityname)

因篇幅和时间关系,先写到这儿(未完,待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值