100行代碼,每天早上喝一碗雞湯

在開始之前,我們先來(lái)介紹一下雞湯的載體。在這里要介紹一個(gè)東西,Server醬

關(guān)于Server醬,簡(jiǎn)單來(lái)說(shuō),就是可以通過(guò)服務(wù)器以微信公眾號(hào)的形式給微信發(fā)消息的一個(gè)工具,發(fā)送的內(nèi)容支持Markdown語(yǔ)法。而且每天醒來(lái)第一件事就是打開微信,這是一件必定會(huì)做的事情,沒(méi)有任何東西比Server醬更合適當(dāng)雞湯的載體了。

經(jīng)過(guò)我喝了差不多3個(gè)月的雞湯,發(fā)現(xiàn)Server醬是很穩(wěn)定的,沒(méi)有錯(cuò)過(guò)任何一天的雞湯。日志為證:

nohup: ignoring input
2018-07-09 10:55:25 開始執(zhí)行任務(wù)
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 推送成功。

關(guān)于Server醬詳細(xì)的介紹和用法,請(qǐng)查看Server醬的使用說(shuō)明,很詳細(xì)也很簡(jiǎn)單。
另外,Server醬的目的是服務(wù)器異常報(bào)警,請(qǐng)勿濫用。

沒(méi)圖說(shuō)個(gè)...好吧,先看圖:


效果圖

我們看到,需要獲取的內(nèi)容有雞湯文和天氣。雞湯我用的是金山詞霸的接口 http://open.iciba.com/dsapi/,獲取天氣則是順手用了高德的地圖的接口。

獲取雞湯

金山詞霸每日一文的接口是GET方式調(diào)用直接返回,格式如下:

{
    "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": "一個(gè)人可以選擇愛(ài)上誰(shuí),當(dāng)他要結(jié)束愛(ài)情時(shí),他是沒(méi)有選擇的。",
    "love": "1150",
    "translation": "小編的話:愛(ài)情一直是不變的話題。遇見(jiàn)了心愛(ài)的人,可以說(shuō)是幸運(yùn)的,無(wú)論結(jié)局怎樣,都可以說(shuō)是幸福的。白頭到老,固然很好,如果分手,或者為愛(ài)情傷心,也很幸福,因?yàn)楫吘箰?ài)過(guò)。每個(gè)人對(duì)愛(ài)情的理解不盡相同,畢竟感情這東西,如人飲水冷暖自知。",
    "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這個(gè)庫(kù),基本操作。

獲取天氣

我用的是高德地圖的天氣接口 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

制作雞湯

我們需要把獲取到的天氣和雞湯內(nèi)容按照Markdown格式拼接起來(lái):

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)

推送雞湯

然后通過(guò)調(diào)用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']))

每天發(fā)送雞湯

這雞湯肯定是不能每天手動(dòng)發(fā)的啦,我們需要一個(gè)定時(shí)任務(wù),每天同一時(shí)間點(diǎn)去發(fā)送。這時(shí)候,就需要寫一個(gè)定時(shí)任務(wù)了。這里我們用到了APScheduler這個(gè)庫(kù),不了解的去看一下官方文檔,這里以每天早上8點(diǎn)鐘為例。

最后一步,啟動(dòng)整個(gè)任務(wù):

if __name__ == '__main__':
    print(get_time() + " 開始執(zhí)行任務(wù)")
    scheduler.add_job(make_soup, 'cron', day_of_week='0-6', hour=8, minute=00, second=00)
    scheduler.start()

在服務(wù)器上運(yùn)行

把這個(gè)py文件上傳到自己的服務(wù)器,以Python3,CentOS為例,通過(guò)命令:

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

去啟動(dòng)腳本,這樣把終端關(guān)掉也可以在后臺(tái)運(yùn)行了,而且會(huì)生成一個(gè)文件用于保存打印的內(nèi)容。

完整代碼如下:

#!/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():
    """
    獲取當(dāng)前時(shí)間
    """
    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() + " 開始執(zhí)行任務(wù)")
    scheduler.add_job(make_soup, 'cron', day_of_week='0-6', hour=8, minute=00, second=00)
    scheduler.start()

本篇教程到此結(jié)束,去愉快的玩耍吧。國(guó)慶快樂(lè)~!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,172評(píng)論 3 119
  • 自從前天數(shù)碼寶貝第七彈開播以來(lái),朋友圈已經(jīng)炸開鍋好久了。首先是截圖留念,隨后是音樂(lè)分享,再來(lái)數(shù)碼寶貝圖鑒科普,...
    adames閱讀 454評(píng)論 1 0
  • 都說(shuō)自己很努力,結(jié)果說(shuō)事實(shí)。是白努力、努力沒(méi)有效果、自認(rèn)為很努力
    風(fēng)蕭001閱讀 99評(píng)論 0 0
  • 看那山火閱讀 504評(píng)論 0 0

友情鏈接更多精彩內(nèi)容