热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20181028chickensoup

layouttitletagslangarticle每天推送鸡汤pythonzh-Hans前几日在掘金上看到一篇文章:100行代码,每天早上喝一碗鸡汤
layouttitletagslang
article
每天推送鸡汤
python
zh-Hans

前几日在掘金上看到一篇文章:100行代码,每天早上喝一碗鸡汤

大意是通过高德api获取一个固定城市的天气,通过金山词霸的api获取每日推送的鸡汤文,看着挺不错的样子,我就打算研究一下,原文中有的地方我就不再重复了,记录下copy的过程。

api准备

首先,作者在文章下面贴上了完整代码,完整代码中的Server酱的推送地址和高德api url中的key是需要我们自己在Server酱和高德开放平台上面自行申请替换,都是免费的配额足够自用了。
高德查询天气api还需要城市编码,可以通过高德开放平台上面发布的城市编码表查询所需要查询天气的城市编码。

定时任务框架APScheduler

定时发送使用的APScheduler,APScheduler支持多种方式存储任务队列,默认使用的是在内存中存放,看起来挺好玩的,我使用的是sqlite方式,运行后可以打开数据库查看任务队列;

APScheduler框架也挺有意思的,比如说它的工作流程:

参考教程:花10分钟让你彻底学会Python定时任务框架apscheduler

中间碰到比较坑的是服务器时间,我是在下午调试的,还以为服务器时间使用的是不是24小时制,部署了很多次都未按照预期运行,直到我灵光一闪,想到了时区问题。。。

纽约和北京的时差相差12个小时

知道真相的我眼泪掉下来。。。
翻翻APScheduler的用户指南,找到一个叫timezone的构造参数,尝试使用下:

tz
=
pytz
timezone
'Asia/Shanghai'
scheduler
=
BlockingScheduler
timezone
=
tz

嗯,完美运行,又涨姿势了

部署

nohup命令,后台运行进程,并输出日志到nohup.out文件中:

>>
2>&1
&

查看当前后台运行进程:

|
|
|
'{print $2}'

根据PID关闭相应进程:

kill


推送

推送使用的是Server酱的微信群组推送,和单独推送使用起来大差不差;
又向里面加入了钉钉群机器人的推送。

效果图

钉钉:

微信:

总结

总的来说,还是挺好玩的一个东西;
美中不足的是因为推送时候使用的是Markdown,获取天气只能把地址位置固定,不能根据用户位置进行调整,有待优化;
微信Server酱推送以后消息只能在服务器端保存3天,3天前的消息都不能查看了,有待优化。

具体代码


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import
requests
json
sys
os
time
pytz
from
apscheduler
schedulers
blocking
import
BlockingScheduler
soup_url
=
"http://open.iciba.com/dsapi/"
weather_url
=
"http://restapi.amap.com/v3/weather/weatherInfo?city=城市编码&key=高德地图key&extensions=all"
dd_urls
=
"https://oapi.dingtalk.com/robot/send?access_token=机器人token"
# Server酱群组推送
group_push_key
=
"key"
group_push_url
=
"https://pushbear.ftqq.com/sub"
tz
=
pytz
timezone
'Asia/Shanghai'
scheduler
=
BlockingScheduler
timezone
=
tz
def
get_time
"""获取当前时间"""
return
time
strftime
"%Y-%m-%d %H:%M:%S"
time
localtime
def
get_soup
"""获取鸡汤"""
response
=
requests
get
soup_url
json_data
=
response
json
date
=
json_data
'dateline'
content
=
json_data
'content'
note
=
json_data
'note'
picture
=
json_data
'picture'
picture2
=
json_data
'picture2'
translation
=
json_data
'translation'
return
date
content
note
picture
translation
picture2
def
get_weather
"""获取天气"""
response
=
requests
get
weather_url
json_data
=
response
json
if
json_data
'status'
==
'1'
return
json_data
'forecasts'
0
'casts'
0
else
print
get_time
+
" 天气获取失败:"
+
json_data
'info'
return
None
def
make_dd_soup
soup
weather
"""制作鸡汤 钉钉"""
if
weather
is
None
weather
=
get_weather
msg
=
"msgtype"
"actionCard"
"actionCard"
"title"
"[每日鸡汤]"
"text"
"![]({picture}) \n#### {date}\n\n#### 天气 {weather},温度{nighttemp}℃ ~ {daytemp}℃。\n\n*{content}*\n\n#### {note}\n\n{translation}\n\n###### \n"
format
date
=
soup
0
weather
=
weather
'dayweather'
if
weather
'dayweather'
==
weather
'nightweather'
else
weather
'dayweather'
+
"转"
+
weather
'nightweather'
nighttemp
=
weather
'nighttemp'
daytemp
=
weather
'daytemp'
content
=
soup
1
note
=
soup
2
picture
=
soup
5
translation
=
soup
4
"hideAvatar"
"0"
"btnOrientation"
"0"
"singleTitle"
""
"singleURL"
""
return
msg
def
make_wx_soup
soup
weather
"""制作鸡汤 微信"""
if
weather
is
None
weather
=
get_weather
title
=
"早上好!"
desp
=
"#### {date}\n\n天气:{weather},温度{nighttemp}℃ ~ {daytemp}℃。\n\n*{content}*\n\n{note}\n\n![]({picture})\n\n{translation}"
format
date
=
soup
0
weather
=
weather
'dayweather'
if
weather
'dayweather'
==
weather
'nightweather'
else
weather
'dayweather'
+
"转"
+
weather
'nightweather'
nighttemp
=
weather
'nighttemp'
daytemp
=
weather
'daytemp'
content
=
soup
1
note
=
soup
2
picture
=
soup
5
translation
=
soup
4
return
title
desp
def
push_wx
text
=
None
desp
=
""
"""推送消息到微信"""
params
=
"text"
text
"desp"
desp
response
=
requests
get
server_url
params
=
params
json_data
=
response
json
if
json_data
'errno'
==
0
print
get_time
+
" 推送成功。"
else
print
"{0} 推送失败:{1} \n {2}"
format
get_time
json_data
'errno'
json_data
'errmsg'
def
push_wx_group
text
desp
"""推送消息到微信群组"""
params
=
'sendkey'
group_push_key
'text'
text
'desp'
desp
response
=
requests
post
group_push_url
params
=
params
json_data
=
response
json
if
json_data
'code'
==
0
print
get_time
+
' 微群 '
+
json_data
'data'
else
print
"{0} 微群 推送失败:{1} \n {2}"
format
get_time
+
json_data
'message'
json_data
'data'
def
push_dd
dd_url
msg
"""推送消息到钉钉"""
headers
=
'Content-Type'
'application/json;charset=utf-8'
response
=
requests
post
dd_url
data
=
json
dumps
msg
headers
=
headers
json_data
=
response
json
if
json_data
'errcode'
==
0
print
get_time
+
" 钉钉 推送成功。"
else
print
"{0} 钉钉 推送失败:{1} \n {2}\n{3}"
format
get_time
json_data
'errcode'
json_data
'errmsg'
dd_url
def
work
# 获取数据
soup
=
get_soup
weather
=
get_weather
# 生成
dd_msg
=
make_dd_soup
soup
weather
wx_msg
=
make_wx_soup
soup
weather
# 推送 钉钉
for
url
in
dd_urls
push_dd
url
dd_msg
# 推送 微信群组
push_wx_group
wx_msg
0
wx_msg
1
if
__name__
==
'__main__'
url
=
sys
argv
1
if
len
sys
argv
>
1
else
'sqlite:///jobs.sqlite'
scheduler
add_jobstore
'sqlalchemy'
url
=
url
# 使用sqlite存储jobs table默认名为apscheduler_jobs
print
get_time
+
" 开始执行任务"
scheduler
add_job
work
'cron'
day_of_week
=
'0-6'
hour
=
8
minute
=
00
second
=
00
id
=
'data_id'
scheduler
start


推荐阅读
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 笔记day2 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
author-avatar
Panzerkampfwagen-VI_238
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有