redditの簡単なbotを作ってみる

海外最大手のフォーラムサイトredditにも、最近大量に日本人の人口が増えました。

redditは最大手のフォーラムサイトのくせにオープンソースであり、スパム以外のソースを全部公開しているという大盤振る舞い。

APIも公開しているので、そのAPIに対するラッパー、ソフトウェア、OAuthアプリが大量にあるのです。
なので、botを作るくらいなら簡単に出来るようです。
ここを見ても、かなりの数の言語に対応したラッパーが作られていたりします。
なんというかすごくオープンな感じです。もっと日本で流行ってほしいですな。

その中でも今回は代表的なReddit APIラッパーであるPRAWを使用して作っていきます。
PRAWはpythonで動作するreddit APIラッパーです。かなり簡単にAPIを操作してコメント・submit・subredditの取得・subredditの立ち上げ・UPVOTE/DOWNVOTEなど大体のことができます。

pythonパッケージ管理ソフトpipが導入されていればコンソールから"pip install praw"でモジュールインストール完了。簡単です。

1.subreddit注目の上位5つのタイトルとスコアを取得
japanのsubredditを取得してみる。
[python]

– coding: utf-8 –

import praw

user agentを設定します。多分何にしても問題ないです

user_agent = ("Python bots")
r = praw.Reddit(user_agent=user_agent)
subreddit = r.get_subreddit("japan")
for submission in subreddit.get_hot(limit = 5):
print "Title: ", submission.title
print "Score: ", submission.score

[/python]

結果:

C:\>python C:\Python27\test.py
Title:  European products not available in Japan (for a present)?
Score:  13
Title:  For non-language teachers, how did you end up in Japan, and what do you
do for a living?
Score:  8
Title:  Prime Minister Shinzo Abe says Japan will provide 4 billion dollars in a
id for global efforts to promote disaster management over the next 4 years.
Score:  6
Title:  Japan budgets over $15 million for overseas universities in soft power p
ush
Score:  44
Title:  Extended Hokuriku shinkansen line goes into service
Score:  7

これだけで取得できます。非常に簡単です。

2.submit(テキストポストの投稿)を行う
実際に投稿も簡単にできます。投稿にはアカウント必須です。
しかし、redditは投稿数やカルマで監視してbotかどうかを判断されるため、作り立てで投稿もしていないアカウントだとほぼcapture認証を食らいます。
[python]

– coding: utf-8 –

import praw
user_agent = ("Python bots")
r = praw.Reddit(user_agent=user_agent)
r.login(‘username’, ‘password’) #ユーザー名とパスワードを入力
r.submit(‘投稿したいsubreddit’, ‘タイトル’, text="本文")
[/python]
こんな感じです。こちらも簡単。
ユーザー名パスワードをそのまま書くのはどうよって場合は、OAuth認証も可能なようです。
cronなんかを使えば定期的な自動投稿なんかが可能となると思います。・・・が、監視しておかないとcapture認証に引っかかる気もします・・・。

連番の画像をダウンロードするようなpythonスクリプト

案外、「ページ内の画像を全てダウンロード」「ログインが必要なページの画像ダウンロード」

な感じの解説はあるのですが、連番ダウンロードは案外ない。

このコードは
http://hoge.jp/1.jpg
http://hoge.jp/2.jpg
http://hoge.jp/3.jpg



みたいな感じの画像を連番で取得します。

自分用に作ったものなんで403なんかのerrorでbreakするというお粗末なコードになってますが。参考程度に。

pythonは3.xと2.xの情報がごっちゃになっててなかなか時間掛かった。shなんかで書いた方が早いだろうな・・・。
ちなみにpython2.x用です。3.xで動くかは知りません。

まあこの記事は、コードを綺麗にハイライトしてくれるWordpressプラグイン
Crayon Syntax Highlighterがちゃんと動作しているかのテストです。意味はないです。

[python]

!/usr/bin/python

coding:utf-8

from urllib2 import Request, urlopen, URLError,HTTPError
import os

baseurl =raw_input(‘ダウンロードするURL:’) #example:http://hoge.jp/
input_url = raw_input(‘画像形式:’) #pngとかjpgとか
number=1
folder=’./img/’
os.mkdir(folder) #フォルダ作成
while 1:
point=str(number)+’.’+input_url
url=baseurl+point
print ‘get:’+url
output = folder+os.path.basename(url)+’.’+input_url
try:
req = urlopen(url)
file = open(output, ‘wb’)
file.write(req.read())
file.close()
print ‘filesize:’+os.path.getsize(output)
except HTTPError,e:
print e.code
print ‘stop’
break
except URLError,e:
print e.code
print ‘stop’
break
else:
number=number+1
print(‘All complete – image:’+str(number-1))
[/python]