読者です 読者をやめる 読者になる 読者になる

TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

Pythonで百人一首ボットを作ってみる!! パート1

皆さん
こんにちは、こんばんは
TomoProgです。

前々回のブログ「Python使ってつぶやいてみた」でTwitterへ投稿するやり方を学びました。
これを応用して百人一首ボットを作ってみたいと思います。

それでは頑張っていきましょう!!

百人一首ボットの仕様

まずは仕様を考えるところからスタートです。
とりあえず、考えてみた仕様はこんな感じ。

  • 何分か毎に百首の中から一首ランダムに選びTwitterに投稿する。
  • 投稿する内容はランダムに選ばれた歌の上の句、下の句、歌人名、現代語訳、絵札の画像とする。

何分毎にするかは後々決めていきます。
また、投稿する内容が多いので、投稿を分割するかもしれません。
その辺りは作りながら決めていきましょう!!

絵札の画像を集めてみる

一番時間がかかりそうな絵札画像の収集からやっていきます。
百人一首の絵札の画像は探せば沢山の種類がネット上にありますが、今回は下記のサイトの絵札画像を収集していきます。
Ogura Hyakunin Isshu - Wikimedia Commons

このサイトに表示されている画像はサムネイル用なので、前回の画像収集プログラムの時にもやったようにaタグのhref属性のURLから取得していきます。

<!-- imgタグのsrc属性はサムネイル用なので、aタグのhref属性のURLからオリジナルを取得していく -->
<a href="/wiki/File:Hyakuninisshu_003.jpg" class="image">
<img alt="" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Hyakuninisshu_003.jpg/86px-Hyakuninisshu_003.jpg" width="86" height="120" ・・・ />

そしてここで気づいたのです。
そう。このhref属性はルート記号("/")から始まってるのです。

普通にhref属性の内容でURLを開こうとすると「404 Not Found」でオリジナルの画像のURLまで辿りつけないのです・・・。

というわけで、href属性の前方にルートディレクトリのパス(https://commons.wikimedia.org/)をつけて、そのURLにアクセスし、画像を集めることにしました。

これでなんとか画像はすべて全部ゲット出来ました!!

f:id:TomoProg:20160217232156j:plain

とりあえず画像付きでつぶやいてみる

画像をTwitter上に投稿するコードを公式のサンプルプログラムを参考に書いてみることにします。
twitterモジュールのドキュメントにアップロードのやり方が書いてあったので、参考に書いてみました。
twitter 1.17.1 : Python Package Index

#-*- coding:utf-8 -*-

from twitter import *
import json

# global変数
conf_file_name = "conf.json"

def main():
    """
        Content:
            エントリーポイント
    """
    # 設定ファイル読み込み
    with open(conf_file_name) as f:
        conf_data = json.loads(f.read())

    # Twitterアプリ認証
    app_auth = OAuth(conf_data["access_token"],
                conf_data["access_token_secret"],
                conf_data["consumer_key"],
                conf_data["consumer_secret"])
    app = Twitter(auth=app_auth)

    # 画像をつぶやく
    with open("001.jpg", "rb") as image_f:
        image_data = image_f.read()

    t_up = Twitter(domain="upload.twitter.com", auth=app_auth)
    id_img = t_up.media.upload(media=image_data)["media_id_string"]

    app.statuses.update(status="画像アップロードテスト", media_ids=id_img)

    print("Success!!")

if __name__ == "__main__":
    main()

Twitterクラスのdomain引数に"upload.twitter.com"を指定して新しく画像アップロード用のインスタンスを作成するみたいです。

さて、実行してみると・・・
f:id:TomoProg:20160218002434j:plain

画像が投稿できました!!

今日の成果

  • 百人一首の画像ファイルは全部ゲット出来た!!
  • Twitterに画像を投稿することが出来た!!


さて、今日はこの辺で終わりにします。
パート2を乞うご期待!!
それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@TomoHelloxxx) | Twitter