2chの中から炎上しているっぽいスレッドを拾ってくるスクリプトを書いてみたテスト

久しぶりにプログラミングネタでブログを書こうとしたらはてなダイアリーが落ちていて超絶やる気を無くしながら書いてます、ハイ。*1

で、今日は何のネタで書くかというと、前回の記事で「炎上」について書いたので、そんな炎上の舞台になることが多い某巨大匿名掲示板から炎上ネタを扱っているスレッドを引っ張ってくるというネタでやってみたいと思います。

ちなみに私のプログラミングスキルが超絶低いため、下記に掲載するプログラムそのまま使おうとすると以下のような危険が予想されます。

  • 2ch規制に引っかかってしばらく2chが見られなくなる*2
  • 警察のお世話になる(岡崎市立中央図書館事件的に考えて)

以上、そんな危険が予想されますので、参考にする際には注意を。

今回使ったのはtwopyというPythonで書かれた2chライブラリ。virtualenv環境に突っ込んで使っています。コードの量も少ないので、ちまちまコード読みながら勉強中です。

で、これが肝心のコードです。突っ込みどころたくさんなのでつっこんでもらえると嬉しいです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import twopy


CYBER_CASCADE_KEYWORDS = [u"炎上", u"", u"飲酒", u"未成年", u"カンニング"]
WATCH_URLS = {
    u"poverty": u"http://engawa.2ch.net/poverty/",
    u"news4vip": u"http://hayabusa.2ch.net/news4vip/",
    u"news4viptasu": u"http://hayabusa3.2ch.net/news4viptasu/"}

def get_board(url):
    board = twopy.Board(url)
    if board.retrieve() == 200:
        return board
    else:
        return None

def main():

    board = get_board(WATCH_URLS[u'poverty'])
    thread_list = [t for t in board if t.retrieve()[0] == 200]
    for thread in thread_list:
        if (any([enjou_word in thread.title for enjou_word in CYBER_CASCADE_KEYWORDS])):
            comments = [comment for comment in thread if comment.number != 1001]
            f = open(thread.title + ".dat", "w")
            for comment in comments:
                f.write(comment.render())
                f.write("\n")
            f.close()
        else:
            pass

if __name__ == "__main__":
    main()

やっていることは単純で、炎上したスレッドのタイトルに使われていそうな語が含まれているスレッドの中身をdat形式のファイルに書き出しているだけです。

例外処理とか必要十分なアクセス数とか考えられていない状態なので改善の余地が大ありどころか、もうツッコミどころ多いとは思っているんですけど、ツッコミどころが多いからといってブログ書かないと余計にダメ人間の道を進みそうなので書きました。

プログラミングしていると毎回思うのは、私の総合的な知識の足りなさなんですよね。文字コードをどうしたらいいとか、正規表現でどう表現したら良いのかとか。そういうのが分からなくて「こういうことがしたい!」ということを実際にコードでどう表現すれば良いのか分からないということがしょっちゅうです。

皆さん、こういう中途半端なコード書いたときもgithubやbitbucketにホスティングしているんでしょうか?それが何となく気になりました、と書いているときに思ったけれど、そういえばbitbucketはプライベートリポジトリが無制限でしたね…あとでプライベートリポジトリ作って遊んでみることにします。

*1:数日前の話しです。

*2:単にwait入れればいいだけなんでしょうが、どこにいれればいいんですかね?