100行代码,每天早上喝一碗鸡汤

在开始之前,我们先来介绍一下鸡汤的载体。在这里要介绍一个东西,Server酱

关于Server酱,简单来说,就是可以通过服务器以微信公众号的形式给微信发消息的一个工具,发送的内容支持Markdown语法。而且每天醒来第一件事就是打开微信,这是一件必定会做的事情,没有任何东西比Server酱更合适当鸡汤的载体了。

经过我喝了差不多3个月的鸡汤,发现Server酱是很稳定的,没有错过任何一天的鸡汤。日志为证:

nohup: ignoring input
2018-07-09 10:55:25 开始执行任务
2018-07-10 08:00:00 推送成功。
2018-07-11 08:00:00 推送成功。
2018-07-12 08:00:00 推送成功。
2018-07-13 08:00:00 推送成功。
2018-07-14 08:00:00 推送成功。
2018-07-15 08:00:00 推送成功。
2018-07-16 08:00:00 推送成功。
2018-07-17 08:00:00 推送成功。
2018-07-18 08:00:01 推送成功。
2018-07-19 08:00:00 推送成功。
2018-07-20 08:00:00 推送成功。
2018-07-21 08:00:00 推送成功。
2018-07-22 08:00:00 推送成功。
2018-07-23 08:00:00 推送成功。
2018-07-24 08:00:00 推送成功。
2018-07-25 08:00:00 推送成功。
2018-07-26 08:00:00 推送成功。
2018-07-27 08:00:00 推送成功。
2018-07-28 08:00:00 推送成功。
2018-07-29 08:00:00 推送成功。
2018-07-30 08:00:00 推送成功。
2018-07-31 08:00:00 推送成功。
2018-08-01 08:00:00 推送成功。
2018-08-02 08:00:00 推送成功。
2018-08-03 08:00:00 推送成功。
2018-08-04 08:00:00 推送成功。
2018-08-05 08:00:00 推送成功。
2018-08-06 08:00:00 推送成功。
2018-08-07 08:00:00 推送成功。
2018-08-08 08:00:00 推送成功。
2018-08-09 08:00:00 推送成功。
2018-08-10 08:00:00 推送成功。
2018-08-11 08:00:00 推送成功。
2018-08-12 08:00:00 推送成功。
2018-08-13 08:00:00 推送成功。
2018-08-14 08:00:00 推送成功。
2018-08-15 08:00:00 推送成功。
2018-08-16 08:00:00 推送成功。
2018-08-17 08:00:00 推送成功。
2018-08-18 08:00:00 推送成功。
2018-08-19 08:00:00 推送成功。
2018-08-20 08:00:00 推送成功。
2018-08-21 08:00:01 推送成功。
2018-08-22 08:00:00 推送成功。
2018-08-23 08:00:00 推送成功。
2018-08-24 08:00:01 推送成功。
2018-08-25 08:00:00 推送成功。
2018-08-26 08:00:00 推送成功。
2018-08-27 08:00:00 推送成功。
2018-08-28 08:00:00 推送成功。
2018-08-29 08:00:00 推送成功。
2018-08-30 08:00:00 推送成功。
2018-08-31 08:00:00 推送成功。
2018-09-01 08:00:00 推送成功。
2018-09-02 08:00:00 推送成功。
2018-09-03 08:00:00 推送成功。
2018-09-04 08:00:00 推送成功。
2018-09-05 08:00:00 推送成功。
2018-09-06 08:00:00 推送成功。
2018-09-07 08:00:00 推送成功。
2018-09-08 08:00:00 推送成功。
2018-09-09 08:00:00 推送成功。
2018-09-10 08:00:00 推送成功。
2018-09-11 08:00:00 推送成功。
2018-09-12 08:00:00 推送成功。
2018-09-13 08:00:00 推送成功。
2018-09-14 08:00:00 推送成功。
2018-09-15 08:00:00 推送成功。
2018-09-16 08:00:00 推送成功。
2018-09-17 08:00:00 推送成功。
2018-09-18 08:00:00 推送成功。
2018-09-19 08:00:00 推送成功。
2018-09-20 08:00:01 推送成功。
2018-09-21 08:00:00 推送成功。
2018-09-22 08:00:00 推送成功。
2018-09-23 08:00:00 推送成功。
2018-09-24 08:00:00 推送成功。
2018-09-25 08:00:00 推送成功。
2018-09-26 08:00:00 推送成功。
2018-09-27 08:00:00 推送成功。
2018-09-28 08:00:00 推送成功。
2018-09-29 08:00:00 推送成功。
2018-09-30 08:00:00 推送成功。
2018-10-01 08:00:00 推送成功。

关于Server酱详细的介绍和用法,请查看Server酱的使用说明,很详细也很简单。
另外,Server酱的目的是服务器异常报警,请勿滥用。

没图说个...好吧,先看图:


效果图

我们看到,需要获取的内容有鸡汤文和天气。鸡汤我用的是金山词霸的接口 http://open.iciba.com/dsapi/,获取天气则是顺手用了高德的地图的接口。

获取鸡汤

金山词霸每日一文的接口是GET方式调用直接返回,格式如下:

{
    "sid": "3143",
    "tts": "http://news.iciba.com/admin/tts/2018-10-01-day.mp3",
    "content": "A man has free choice to begin love, but not to end it.",
    "note": "一个人可以选择爱上谁,当他要结束爱情时,他是没有选择的。",
    "love": "1150",
    "translation": "小编的话:爱情一直是不变的话题。遇见了心爱的人,可以说是幸运的,无论结局怎样,都可以说是幸福的。白头到老,固然很好,如果分手,或者为爱情伤心,也很幸福,因为毕竟爱过。每个人对爱情的理解不尽相同,毕竟感情这东西,如人饮水冷暖自知。",
    "picture": "http://cdn.iciba.com/news/word/20181001.jpg",
    "picture2": "http://cdn.iciba.com/news/word/big_20181001b.jpg",
    "caption": "词霸每日一句",
    "dateline": "2018-10-01",
    "s_pv": "0",
    "sp_pv": "0",
    "tags": [{
        "id": null,
        "name": null
    }],
    "fenxiang_img": "http://cdn.iciba.com/web/news/longweibo/imag/2018-10-01.jpg"
}

我们需要的是日期、英文、中午翻译和小编的话,所以可以这样写:

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']
    translation = json_data['translation']

    return date, content, note, picture, translation

这里我们用到了requests这个库,基本操作。

获取天气

我用的是高德地图的天气接口 https://lbs.amap.com/api/webservice/guide/api/weatherinfo,你们可以选择其他的。

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

制作鸡汤

我们需要把获取到的天气和鸡汤内容按照Markdown格式拼接起来:

def make_soup():
    """
    制作鸡汤
    """
    soup = get_soup()

    weather = get_weather()

    if weather is None:
        time.sleep(3)
        weather = get_weather()

    title = "早上好!"
    desp = "#### {date}\n\n白天{dayweather},夜晚{nightweather},温度{nighttemp}℃ ~ {daytemp}℃。\n\n" \
           "*{content}*\n\n{note}\n\n![]({picture})\n\n{translation}" \
        .format(date=soup[0],
                dayweather=weather['dayweather'],
                nightweather=weather['nightweather'],
                nighttemp=weather['nighttemp'],
                daytemp=weather['daytemp'],
                content=soup[1],
                note=soup[2],
                picture=soup[3],
                translation=soup[4])

    push_wx(title, desp)

推送鸡汤

然后通过调用Server酱的接口,将鸡汤送出去,以供享用~

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']))

每天发送鸡汤

这鸡汤肯定是不能每天手动发的啦,我们需要一个定时任务,每天同一时间点去发送。这时候,就需要写一个定时任务了。这里我们用到了APScheduler这个库,不了解的去看一下官方文档,这里以每天早上8点钟为例。

最后一步,启动整个任务:

if __name__ == '__main__':
    print(get_time() + " 开始执行任务")
    scheduler.add_job(make_soup, 'cron', day_of_week='0-6', hour=8, minute=00, second=00)
    scheduler.start()

在服务器上运行

把这个py文件上传到自己的服务器,以Python3,CentOS为例,通过命令:

nohup python3 -u chicken_soup.py > nohup.out 2>&1 &

去启动脚本,这样把终端关掉也可以在后台运行了,而且会生成一个文件用于保存打印的内容。

完整代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import requests
import time
from apscheduler.schedulers.blocking import BlockingScheduler

server_url = "https://sc.ftqq.com/Server酱SCKEY.send"
soup_url = "http://open.iciba.com/dsapi/"
weather_url = "http://restapi.amap.com/v3/weather/weatherInfo?city=城市id&key=高德地图key&extensions=all"

scheduler = BlockingScheduler()


def get_time():
    """
    获取当前时间
    """
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())


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 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']
    translation = json_data['translation']

    return date, content, note, picture, translation


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_soup():
    """
    制作鸡汤
    """
    soup = get_soup()

    weather = get_weather()

    if weather is None:
        time.sleep(3)
        weather = get_weather()

    title = "早上好!"
    desp = "#### {date}\n\n白天{dayweather},夜晚{nightweather},温度{nighttemp}℃ ~ {daytemp}℃。\n\n" \
           "*{content}*\n\n{note}\n\n![]({picture})\n\n{translation}" \
        .format(date=soup[0], dayweather=weather['dayweather'], nightweather=weather['nightweather'],
                nighttemp=weather['nighttemp'], daytemp=weather['daytemp'],
                content=soup[1],
                note=soup[2],
                picture=soup[3],
                translation=soup[4])

    push_wx(title, desp)


if __name__ == '__main__':
    print(get_time() + " 开始执行任务")
    scheduler.add_job(make_soup, 'cron', day_of_week='0-6', hour=8, minute=00, second=00)
    scheduler.start()

本篇教程到此结束,去愉快的玩耍吧。国庆快乐~!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,960评论 3 119
  • 自从前天数码宝贝第七弹开播以来,朋友圈已经炸开锅好久了。首先是截图留念,随后是音乐分享,再来数码宝贝图鉴科普,...
    adames阅读 391评论 1 0
  • 都说自己很努力,结果说事实。是白努力、努力没有效果、自认为很努力
    风萧001阅读 71评论 0 0