目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

Python3000でWassrクライアントを作ったよ。

Python Hack-a-thonのお題として作ったのですが、久しぶりのPythonかつPython3000で実装したので思いの外時間がかかってしまいました。
ここ最近ずっとPerlを書いていたので、Python的にはちょっと微妙な感じがするかも知れないです。

とりあえず、githubにソースはおいてありますが、これ以上改良する気はあまりないです。

wassr_minus/__init__.py

#!python3
#coding: utf8

import json
import urllib.parse
import urllib.request
import wassr_minus.api_uri

REALM    = 'API Authentication'
LOCATION = 'http://api.wassr.jp:80'

class WassrMinus(object):
    '''
    ひんそーなクライアント
    '''
    def __init__(self, user=None, password=None, source='pyWassr'):
        self.user     = user
        self.password = password
        self.source   = source
        self._connect()

    def _connect(self):
        '''
        HTTPコネクションを張る
        '''
        auth_handler = urllib.request.HTTPBasicAuthHandler()
        auth_handler.add_password(
            realm  = REALM,
            uri    = LOCATION,
            user   = self.user,
            passwd = self.password
        )
        opener = urllib.request.build_opener(auth_handler)
        opener.addheaders = [('User-agent', 'Pyhon Wassr Client')]
        urllib.request.install_opener(opener)

    def user_timeline(self, id=None):
        if id != None:
            uri = wassr_minus.api_uri.USER_TIMELINE + '?id=%s' % id
        else:
            uri = wassr_minus.api_uri.USER_TIMELINE

        return self.get_status(uri)

    def friends_timeline(self):
        return self.get_status(wassr_minus.api_uri.FRIENDS_TIMELINE)

    def public_timeline(self):
        return self.get_status(wassr_minus.api_uri.PUBLIC_TIMELINE)

    def replies(self):
        return self.get_status(wassr_minus.api_uri.REPLIES)

    def show(self, id=None):
        if id != None:
            uri = wassr_minus.api_uri.SHOW + '?id=%s' % id
        else:
            uri = wassr_minus.api_uri.SHOW

        return self.get_status(uri)

    def get_status(self, uri):
        return json.loads(urllib.request.urlopen(uri).read().decode('utf8', 'ignore'))

    def update(self, comment):
        params = urllib.parse.urlencode({'source': self.source, 'status': comment})
        urllib.request.urlopen(wassr_minus.api_uri.UPDATE, params)

wassr_minus/api_uri.py

#!python3
#coding: utf8


BASE_URL         = 'http://api.wassr.jp/statuses/';
UPDATE           = BASE_URL + 'update.json';
USER_TIMELINE    = BASE_URL + 'user_timeline.json';
FRIENDS_TIMELINE = BASE_URL + 'friends_timeline.json';
PUBLIC_TIMELINE  = BASE_URL + 'public_timeline.json';
REPLIES          = BASE_URL + 'replies.json';
SHOW             = BASE_URL + 'show.json';