鉄は熱いうちに打て
=============================

「(第53回)Python mini Hack-a-thon」に参加しました

2015-04-11

更にPythonを修得するのと動機付けのために「(第53回)Python mini Hack-a-thon」に参加しました。

運営の皆様、へっぽこな私ですがお世話になりました。

会場を提供くださったビープラウド社様ありがとうございます。 作ったものは、Twitterをコマンドラインで見るやつです。

ソース

#!/usr/bin/env python
-*- coding: utf-8 -*-
--------------------------------------------------------------
__author__  = 'Kameko<kame@kamekokamekame.net>'
from requests_oauthlib import OAuth1Session
import json
import argparse
import yaml
from datetime import datetime
#import dateutil.tz
import pytz
Check config file
--------------------------------------------------------------
config = open('config.yaml').read()
data = yaml.load(config)
CK = data['twitter_key']['CK']    # Consumer Key
CS = data['twitter_key']['CS']    # Consumer Secret
AT = data['twitter_key']['AT']    # Access Token
AS = data['twitter_key']['AS']    # Access Token Secret
Set REST API URL
--------------------------------------------------------------
USER_TIME_LINE_URL = data['twitter_url']['USER_TIME_LINE_URL']
HOME_TIME_LINE_URL = data['twitter_url']['HOME_TIME_LINE_URL']
POST_STATUS_UPDATE = data['twitter_url']['POST_STATUS_UPDATE']
Set timezone
--------------------------------------------------------------
tz_tokyo = pytz.timezone('Asia/Tokyo')
Get someone's timeline
--------------------------------------------------------------
def show_user_timeline(oauth,args):
    params = {"screen_name":args.screen_name}
    req = oauth.get(USER_TIME_LINE_URL, params = params)
    # Check response
    if req.status_code == 200:
        timeline = json.loads(req.text)
    else:
        print ("Error: %d" % req.status_code)
    # display timeline
    for tweet in timeline:
        dt = datetime.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y')
        #dt.replace(tzinfo=dateutil.tz.tzutc()).astimezone(dateutil.tz.tzlocal())
        created_at = tz_tokyo.fromutc(dt).strftime('%Y-%m-%d %H:%M:%S')
        print "[%s]" % created_at ,
        print tweet["text"]
def show_home_timeline(oauth):
    params = {}
    req = oauth.get(HOME_TIME_LINE_URL, params = params)
    # Check response
    if req.status_code == 200:
        timeline = json.loads(req.text)
    else:
        print ("Error: %d" % req.status_code)
    # display timeline
    for tweet in timeline:
        # i.g. Sat Apr 11 06:10:12 +0000 2015
        dt = datetime.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y')
        #dt.replace(tzinfo=dateutil.tz.tzutc()).astimezone(dateutil.tz.tzlocal())
        created_at = tz_tokyo.fromutc(dt).strftime('%Y-%m-%d %H:%M:%S')
        print "[%s]" % created_at ,
        print "@%s :" % tweet["user"]["screen_name"] ,
        print tweet["text"]
def post_tweet(oauth,args):
    params = {"status":args.tweet}
    req = oauth.post(POST_STATUS_UPDATE, params = params)
    # Check response
    if req.status_code == 200:
        print "OK"
    else:
        print ("Error: %d" % req.status_code)
main flow
--------------------------------------------------------------
if __name__ == '__main__':
    # Get args
    parser = argparse.ArgumentParser(description='twitter command line tool')
    parser.add_argument('command')
    parser.add_argument('-s', '--screen_name')
    parser.add_argument('-t', '--tweet')
    parser.add_argument('-v')    # Display the request body
    parser.add_argument('--version', action='version', version='%(prog)s 2.0')
    args = parser.parse_args()
    # OAuth
    oauth = OAuth1Session(CK, CS, AT, AS)
    if args.command == "home":
        show_home_timeline(oauth)
    elif args.command == "timeline":
        show_user_timeline(oauth,args)
    elif args.command == "tweet":
        post_tweet(oauth,args)
    else:
        show_home_timeline(oauth)

動かしてみた

自分のタイムライン

$ ./twc.py home

@okusama27のタイムライン

$ ./twc.py --screen_name okusama27 timeline

Tweetの投稿

$ ./twc.py --tweet Hello,Python tweet
デモ

とりあえず、自分のhomeのTLと指定アカウントのみTLを見るところを作りました。

created_atのtimezoneをJSTにしたかっただけなのにハマりました。。。orz そして、教えていただきました #^^# エラー処理も何もせず。。うーん。

  • 感想1:もっと慣れないとPythonistには程遠い。。。

  • 感想2:Javadocみたいなの見たい。(あるのかな?あるよね。。)

  • 感想3:戻り値のクラスを知りたい。

以下は疑問点ですが、後ほど調べます。。。

  • 疑問1:C++のヘッダーファイルみたいなの作れます? メソッドの一覧とかだけ書いてあるファイルあるのか?コンパイルしないからいらないか。。

  • 疑問2:pydocみたいなのを出すためのコメントの書き方とかある?

あと、後悔 - 後悔1:テストコード書きたかった - 後悔2:eggとかにしたかった。 - 後悔3:同じこと2回も書いている!!

抱負:GWまでにはGithubで公開できるように続けて頑張ります。