ラベル Flask の投稿を表示しています。 すべての投稿を表示
ラベル Flask の投稿を表示しています。 すべての投稿を表示

2014年4月9日水曜日

高専プロコン競技部門練習場にツイッターボットを導入したお話

競技練習場のツイッターボット(@KPCP2014)を作りましたー。

別にそんなに難しい話じゃないんですけどね。

一応、(自分なりに)お行儀よく書いてみたから記事にしておきます。

TwitterのAPIを叩くためのライブラリはPythonで有名なTwitterライブラリであるtweepy(https://github.com/tweepy/tweepy)を使いました。(競技場はPythonで書かれています)

ふつうにやった場合。
ー> HTTPの通信のレスポンスを返す間にTwitterのAPIにアクセスしてツイートする。


_人人人人人人人人_
> お行儀が悪い <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
だって、HTTPのレスポンスを返す間に他のところにHTTPリクエストを送るとかなんかエグいじゃないですか。
今回はツイートだけできればいいのでQueueにツイートをためておいて。Workerプロセスを立ち上げておくことでツイートを行う機構を作ってみました。

今回使ったQueueを作るシステムはRabbitMQを使いました。

今回作ったTweetBotシステムは
├── bot_client.py
├── bot_server.py
└── messages
    └── update_ranking.tpl

ツイートのJinja2のテンプレートをmessagesの中に配置します。(Jinja2なのはWeb側に使ってるフレームワークがFlaskだからです)
あとは、ツイートサーバとなるbot_server.pyを
nohup python bot_server.py &
みたいな感じで実行してやって。

ツイートを行いたいPythonスクリプトにて
import bot_client
bot_client.tweet(テンプレートファイル名, パラメータ...)
みたいな感じで関数を呼んでやればツイートを行うことが出来ます。

まとめ

いつもみたいに適当にツイート機能を実装してしまえばよかったんですけど、そろそろ、Python+Flask環境から簡単に構築できるツイートボットシステムが欲しかったので作ってみました。作った奴はまとめてgithubにあげてあります。(https://github.com/higumachan/python_tweet_bot)暇があったら見てみてください。

2012年12月13日木曜日

PythonとFlaskとMongoDBで後輩のお手伝いをした話

昨日はJOI(情報オリンピック)の予選の模擬試験を後輩(@kagamiz)がやるのをお手伝いしました

システム側の運営をやった感じです。(@kagamizは問題を作りました)

今回もMongoDB+Flaskで頑張りました。

実装

今回の主な実装となったのは
1. ログイン処理
2. 解答の提出処理
3. 採点スクリプト

の3つです。

1つ目はlogin用の使いまわしやすいモジュールを自分で書いてあるのでそれをクローンしてくるだけで瞬殺でした。

MongoDBで {_id: int, username: string, passwd: string} みたいな感じのコレクションを用意しておいて 以下のように

!python

import functools
from flask import session

def require_login(func):
@functools.wraps(func)
def wrapeer(*args, **kwargs):
    if (session.has_key("username") == True and
    session.has_key("passwd") == True):
        user = g.db.users.find_one({"username": session["username"]});
        if (user == None):
            return ("Invalid User");
        kwargs["user"] = user;
    else:
        path = request.path;
        get_request = urllib.urlencode({
            "redirect": path
        });
        return (redirect("/login?" + get_request));

    return func(*args, **kwargs);
return wrapeer;

こんな感じで書いてこれをViewのデコレータにしてあげればデコレータをつけたViewに入るときにloginしていなければログイン画面へリダイレクトするという処理がかけます(うーん便利だなーデコレータは!) Pythonのデコレータはすごく便利なので後日まとまって記事がかけるといいな〜と思っています。

2つ目はフォルダのパーミッションに気をつけさえすればそんなに難しいことではありません。

3つ目は頑張って書きました。 正直データベースからデータを引っ張ってきてゴニョゴニョするだけです。

参加状況

最初はICT委員会(僕の入ってる部活のようなものです)内でやる厳かなものだと思ってたのですが@kagamizくんがTwitterで一般の人にも告知したところ。なんと128人も参加者が来ました(切りが良い!) なんか、落としたらどうしようって感じで怖かったです。

トラブル

  1. ソースファイルの提出が一時間できなくなった(そこまで致命的ではない)
  2. 登録処理が5分間ほどできなくなった(致命的)
  3. 採点する際に空ファイルを提出された時に正解と出してしまっていた(致命的)

1に関しては些細なミスが招いたものですでに他の解凍ファイルを提出した状況下でしかテストをおこなっていなかったことに起因します。これからはテストをもっとしっかりやりたい。

2に関しては登録した時の確認メールを送る処理の中でこけていました。原因の究明も大事なのですがかなり致命的な場所でのエラーだったので、一旦メール確認の機能を切ることにより対処しました。

3は解答ファイルのほうが小さかった場合の処理のbrakeの前にフラグを折ってなかったことに起因しました。

まあ、致命的な奴は5分くらいで対処できたので初めてにしては上出来なのではないでしょうか?

まとめ

正直、短時間で100人以上が同時に参加するサイトを管理するという。経験が少なかったので短い間でしたけどその体験ができてよかったです。

まあ、いくつかトラブルがありましたが無事終了させることがあってよかったです。

2012年6月9日土曜日

早起きして Flask MongoDB を使ってWebアプリケーションを作ってみた

昨日、一時間早起きして作ったサービスを今日公開しました。

twitter 流速 スカウター

内容はTwitterでの自分のタイムラインの流れる速さ(ツイート/時)を測ってランキングを作るというサービスです

画面はこんなかんじです

作ったフローは以下のようになっています

  1. 眠い目を擦りながら、いつも使っているflaskの足場をコピペ
  2. 少し、頭がすっきりしてきたと同時に前に書いた記事で作ってあるFlask用のTwitterPluginをgithubからクローン!
  3. 目が覚めて、ガリガリ書く(MongoDBなので最初にがっちりDBを決めなくてもいいから楽でいいです[ごめんなさい情弱で])

こんな感じで(全体的な)ロジックは書きあがりました。

それを@pinkrootさんに丸投げしてHTMLとCSSと部品とかを作ってもらう

なんか、tweepyの中のtwitterとの連携部分でバグって戸惑う

しょうがないから寝る。

次の日も早起きしてデバッグ。

結局別ウィンドウで認証してたのが悪いらしい(3回に2回くらい401エラーが出てた状態)

しょうがないから同じウィンドウで認証するように書きなおす

出来たので、@pinkrootに報告。@pinkroot「よし公開しよう」との事で公開

@refiuteくんが

とのことです

そこで

14分後くらいかな

というわけです。結構がんばったので

という感じでお褒めの言葉をいただきました。

ちなみに同じような感じでユーザの検索機能も追加しました!!

今回の反省点

  1. ちゃんと計測が何回行われたかわかるDBの設計にしなかった
  2. また、さーばを(ry
  3. ランキング機能くらいはちゃんと最初から作っておくべきだったな

2012年5月1日火曜日

WebベースのTwitterClientを作るまで

まず、どうして作ったのか。うちの学校では基本的に学内回線からTwitterできません(スマフォClient、テザリング、ポケットWiFiとか使えばいいんだけど)しかも、私はガラケーです。

最後の望みで合ったTabtterの仕様期間も切れてしまったので、作ってみようかなと思いました。

実装はPython+Flaskです

今回の実装は実装速度を重視したので、ステップの横に所要時間を書いて行きます。

  1. Twitterの認証:前々に紹介したFlaskでTwitter認証を行うモジュールで一瞬でした(10分)
  2. TimeLineの取得:Tweepyというライブラリを使って瞬殺。(5分)
  3. Tweetする:Tweepyで瞬殺(3分)
  4. もう取得したTweetはTimeLineに表示しない:取得したTweetIDの最大を持っておいて次に取得したときそのさっきのTweetIDの最大より大きい間でWhileを回す。(8分)
  5. 適当なHTMLを書く(8分)
  6. ajaxでTimeLineを更新するために適当なjavascriptを書く(8分)
  7. アイコンをtwitter.comから取得するのではなく、TwitterClientのサーバで通信を行いそれをクライアント側に返す(10分)
以上で最小構成のTwitterクライアントが完成です。
Timelineが確認できて、TweetをPOSTできるだけですが。所要時間が所要時間ですし。
まあ、いいかなってかんじです。
なぜ、WebベースのTwitterクライアントなら学内からできるのかというと。
twitter.comとの通信をすべて自前のサーバに任せてしまえば、学内のネットからは自前のサーバに接続するだけなので、その自前のサーバがブロックされない限りはブロックされないようになるというしくみです。なので、アイコンもサーバから取得するようにするのです。


http://pythonmongo-higumachan.dotcloud.com/

これが作ったクライアントです。
ちなみにデプロイで詰まってしまったのでデプロイでするのに実装時間の4倍かかってしまいました。

2012年4月7日土曜日

Flaskをmod_wsgiでデプロイ

今まで、避けていたwsgiでのデプロイを今日はやりました。

まず、Flaskの公式(http://flask.pocoo.org/docs/deploying/mod_wsgi/#installing-mod-wsgi)を見てApacheを設定してみる。

動かなかったので、http://zafiel.wingall.com/archives/2011110419102309.phpの設定を真似てみました。

そうしたら動きました。

しかし、Flask.gとPitがうまく動かなかった。
Pitの方はDocumentRootの関係かと思われる。

[まとめ]
できたこと
Flaskで書いたアプリがApache上で動いた。
出来てないこと
Pythonがエラー吐いて死んだ時のTraceがApacheのErrorLogに出てこない(print で出力した値は出てくる)
PitでのPassword管理が出来ていない。
Flask.gがまだうまく使えてない。

2012年4月5日木曜日

Flask用のTwitterOAuthモジュール作ってみました

現在TwitterAPIを使うサービスを作っているのですが。
そこで、問題になるのが認証なんですね。
毎回毎回結構めんどくさいです。

それなので、今回はFlaskでTwitterに簡単に認証するモジュールを作ってみました。

https://github.com/higumachan/flask_twitter
使い方は結構簡単にしたつもりで、
@app.route("/path/to")
@twitter_login
def view(api=None):
    pass
こんな感じでビューにデコレータを追加するだけで、Twitterに認証されてればそのビューに入り、認証されていなければ認証画面に入る。という感じです。
認証からのCallbackになってるビューにこのように書けばOKです

@app.route("/path/to")
@twitter_callback
def view():
    return (make_response("ようこそ"))

今回初めてデコレータを使ったのですが、今まで何に使うのかわからなかったのですがたしかに便利だな〜って感じがありました。

TwitterのサービスをFlaskで作るときは使ってみてください。

2012年4月4日水曜日

Djangoは重い(規模の大きさ的な意味で)のでflaskを始めました

Python大好きな私ですが、ちょっと、Djangoは重い(動作的な話ではありません)です。Djangoをやるのがだんだんめんどくさくなってしまいます。
いろんな、アプリケーションを起動したり、manage.pyを使ってやったり、modelをいちいち作ったりとちょっと、今やってる「早くモノを作る」というのは向かない気がしました。
今まではDjangoを使うまでもないやつはcgiで書いてました(情弱ですよねww
Sinatraでも始めようかと思いましたが、ちょっとこれからRubyの勉強するのもメンドクサイので、Sinatraから影響を受けていると言われているFlaskを初めて見ました。Djangoほどいろいろやってくれるわけではないですが、さっと作るにはとても便利だと思いました。
プラグイン入れないとO/Rワッパーがないらしいですが最近はもっぱらMongoDBなのでモウマンタイです。

あと、FlaskでTwitterにsigninするモジュールを書いたので次はその話でも書きましょうかね