LIVA君(LINUX MINT)からPython+ tweepy+PyEphemで明日の日の出と日の入り時刻をお知らせするようにしました

毎日正時の時報をただ淡々と吐き出すLIVA君なんですが、なんかもう少し賢いところ見て見たい。

LIVA君(LINUX MINT)からPython+tweepy+cronで時報をお知らせするようにしました – happyman web

色々検索していたら、Pythonで日の出と日の入り時刻を計算するモジュール 「PyEphem」があるらしい。

Python で天文計算

解説が丁寧なので自分でもやれる気がした。

1.名古屋市の日の出と日の入り時刻を計算してみる。

名古屋市の日の出日の入りをPythonで計算するには、新しいモジュール「PyEphem」というものを組み込む必要があるらしい。

$pip install ephem

あとはアンチョコを真似て、こんなソースを作りました。

import ephem
import datetime

#日の出と日の入りの場所を設定
nagoya = ephem.Observer()
nagoya.lat = '35.1855875' 
nagoya.lon = '136.8990919'

#Pyephem で使用する時刻は、世界時で設定。
nagoya.date = datetime.datetime.utcnow()

#明日の太陽の日の出日の入りを計算
sun = ephem.Sun()
print('次の名古屋城の日の出時刻:', ephem.localtime(nagoya.next_rising(sun)))
print('次の名古屋城の日の入り時刻:', ephem.localtime(nagoya.next_setting(sun)))

走らせると、こんな感じ。

すごいね。計算してくれる。

2.自慢したくなったのでTwitterで垂れ流ししたくなった。

ただの時報だけでは糞面白くないので、有る時間に明日の日の出と日の入り時間をツイートするようにしてみます。

ただこのソースを貼っても上手く行かない。

TypeError: can only concatenate str (not "datetime.datetime") to str

こんなエラーを吐き出す。どうやらdatetime型から文字列型に変換する必要があるらしい。

【Pythonエラー】can only concatenate str (not “datetime.datetime”) to str – IT技術総合Wiki | CWiki

直したらでました!

3.格好悪いのでツイートに改行を入れたくなったよ。

なんか見た目が格好悪いので、改行を入れたくなりました。

どうやったら上手く行くのか少し調べていると、「+”\n”+」を間に入れてやるらしい。

上手くいきました。

今回作ったソースはこんな感じ。

import tweepy
import ephem
from my_module import #ツイート用のモジュール
from pprint import pprint
import datetime

#日の出と日の入りの場所を設定
nagoya = ephem.Observer()
nagoya.lat = '35.1855875' 
nagoya.lon = '136.8990919'

nagoya.date = datetime.datetime.utcnow()

sun = ephem.Sun()
timesunrise_str = ephem.localtime(nagoya.next_rising(sun)).strftime('%Y/%m/%d %H:%M:%S')
timesunset_str = ephem.localtime(nagoya.next_setting(sun)).strftime('%Y/%m/%d %H:%M:%S')
print('明日の名古屋城の日の出時刻:', ephem.localtime(nagoya.next_rising(sun)))
print('明日の名古屋城の日の入り時刻:', ephem.localtime(nagoya.next_setting(sun)))

# メッセージを指定
message = "窓際おじさんのはぴぞうは寝ます。"+"\n"+"明日の名古屋城の日の出時刻は"+timesunrise_str+"です。"+"\n"+"明日の名古屋城の日の入り時刻は"+timesunset_str+"です。"+"\n"+"おやすみなさい"

# 関数
def CreateTweet(message):
    tweet = haptweepyapi.ClientInfo().create_tweet(text=message)
    return tweet

# 関数実行・結果出力
pprint(CreateTweet(message))