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

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)暇があったら見てみてください。

2013年3月13日水曜日

かわいいぼたんジェネレータを作ってみた!

前作ったこれを改造したものです

だれでも、簡単に◯◯ちゃんかわいいと呟くことの出来るボタンを作ることができます。

どのように作るかと言いますと

まずしたのページにてボタンを作るボタンをクリックします

次に1つだけの入力フォームにかわいいと呟きたい相手の名前を入力します(ちゃんは自動的につくので気をつけてください)

すると、

大体は前回と同じなのですが、今回実装した面白いことを2つほど紹介したいと思います。

  1. 画像を自動的に取得してくる
  2. タイトル画像の自動生成

まず、1についてなのですが、NAVER画像で項目について検索をかけてそのレスポンスをスクレイピングするだけです。

ソースは以下のようになってます。

これは前回書いた記事のクローラファーム上で動いています

これで、画像のurlを取得して表示という流れです。

2つ目は文字列を受け取ってPILで処理して画像に変換! …と言いたいところですが…今回はインチキをしましたw

このロゴジェネレータさんを使ってまた、クローリングでかいけつしました。

パラメータをつけてPOSTで送ってやるだけなんですけどね!

少し、BaseCrawlerを書きなおして置かないとダメなところも出てきてしまったので。書きなおしたりもしてやりきりました。

以下はソースです

色とかも弄れるのでパラメータが多いですね…

最近クローリングばっかりで問題解決してる気がするので。少し反省してちゃんとした解決方法も模索出来るようにして行きたいな〜と思っています。

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年12月8日土曜日

六花ちゃんが可愛いすぎて簡単なWebサービス作ってみました!

最近中二病でも恋したいにはまっています!

なぜはまっているかというと

六花ちゃんが可愛いからです

りっかちゃん

もう一度言います

六花ちゃんが可愛いからです

りっかちゃん

そんなそんな感じでただの萌豚な僕なのですが六花ちゃんが可愛すぎてこんなもの作ってみました。

りっかちゃんかわいいぼたん

このボタンを押すとTwitterの認証へ飛び認証すると 「りっかちゃんかわいい」とともに六花ちゃんの画像をつぶやきます。

開発言語はいつもの通りPythonです。 フレームワークもいつもの通りFlaskを使いました。

今回のサービスは一応Twitter認証を行うので自分で作ったFlask用のTwitterプラグインを使いました。そのプラグインについてはこの記事で詳しく書いてあります。

別に今回は殆ど思いつきで何も考えずに作ったので何かすごい技術を使ったわけではありません。しかしマイクロフレームワークの強みを生かして本当にすぐに作りました。

みなさん!りっかちゃんは可愛いです!

しかし、どうせ来季になると新しい嫁ができるので早いところ◯◯可愛いぼたんジェネレータにしていきたいと思います。

皆さんもぜひりっかちゃんかわいいと呟いて見ましょう

http://rikka.contents4you.com

http://blog-imgs-51.fc2.com/m/u/t/muttan0920/360bcb51-s.jpg

2012年11月17日土曜日

RSS配信機能を書いてみよう

今回は前回作ったアンテナサイトでRSSを配信したいとの要望が先輩@pinkrootからあったのでやってみました。

使用言語は僕おなじみのPythonです。

xmlをそのままごにょごにょしてもよかったのですが今回はあるものは使えの要領でライブラリを探してみました。

簡単に見つかりました。

PyRSS2Gen

これを使えば一瞬で出来てしまうのでは?

そんなことありませんでした、クローラをちょっとごにょごにょしてクロールした記事をまとめて一つの記事にしてRSSで配信というロジックになってしまったので。データベースのテーブルを増やしたりとかちょっとめんどくさかったです(だから簡単なものを作るならMongoDBでやろうと[要出典])。

まあ、そんなこんなで作りました。

googleリーダーで呼んでみた結果下のようにとれている感じがあるので大丈夫な感じがしました

今回はそんな感じです。

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月14日月曜日

Online Judge のようなものを作ってみる

最近、部活で後輩たちのテストを多くやるようになってきたので。
採点するのが結構大変かな〜と思って、AOJみたいな感じで問題作っておいて。
formからプログラムを送ると、コンパイルして実行までしてくれるシステムを作った。(もちろんUIはhoge)

さて、どうやって実装したか。

さすがに、プログラムが実行されるまでhttpのレスポンスが帰らないのはクソ実装すぎるので。

別のThreadを使って見ることにした。

Pythonで書いたのだが、モジュールがあったのですぐにかけた。

http://www.python.jp/doc/2.5/lib/module-threading.html
http://techno-st.net/2010/02/06/python-3.html

ここらへんを参考にすればいい。

次に、外部のプログラムの実行。
forkを考えたが、ちょっと調べてみると。

subprocessという標準ライブラリがあったのでそれを使ってみることにした。



import subprocess
subprocess.Popen(["echo", "hoge"]);

こんな感じで書けばecho hogeが実行される。

これは、stdinやstdoutの設定もできるし、そのコマンドが終わるまでプログラムが終わったりしないので、かなり便利だった。
一定時間まって、プロセスが終わっているかとかを確認して終わってなかったらKILLしてTLEにしてしまえばOK

一応、ソースをgithubに上げておきました。

https://github.com/higumachan/oknct_judge


2012年5月5日土曜日

PythonでFacebookAPIを使ってみよう

今日、昨日は主にFacebookへの認証周りを触っていました。もちろんPythonでです。
最終目標はTwitterの認証みたいな感じでFlask用の認証モジュールを作ることですね。

今日は認証がとれてデータを引っ張ってくることができたのでログを残します。

facebookもtwitterとほとんど同じですね。
違うのは認証ページからリダイレクトした先でさらにhttpアクセスしてアクセストークンを取得するというところです。
参考:FacebookのWallへポストするWebアプリ

簡単に手順を書きますと。

1.https://graph.facebook.com/oauth/authorize?client_id=[APP_KEY]&redirect_uri=[redirect_url]&scope=[permissions]にアクセスしてもらう。
2.redirect_uriのスクリプトでGETメソッドで与えられる。codeとSECRET_KEYを付け足してPOSTメソッドでアクセス。
3.access_tokenがかえってくる。

このような流れになってます。かえってきたaccess_tokenを保存しておけば毎回認証してもらわなくても大丈夫です。

認証をとった後のAPIへのアクセスなんですが、自分は最初pyfacebookというライブラリを使っていたのですが。ちょっと使いづらかったので、tweepyみたいな感じのライブラリfbpyを自分で実装してみました。一応githubにあげていますが、自分用なので、機能は自分が必要になったら実装するという感じですので、まだほとんど実装(ほぼ打ち込み業務)してません

github: https://github.com/higumachan/fbpy

これが、今日昨日やったことです。

fbpyの実装で関数を返す関数がとっても便利だって言う実感ができました。


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するモジュールを書いたので次はその話でも書きましょうかね