YU2TA7KA's BLOG ~take one step at a time~

派生開発、組み込み開発周りのこと。

半定型文をTweetするbotの実装(Python)

はじめに

Pythonを初めて使ったので、必要な処理を毎回ぐぐりながら実装しました。実装内容及び利用した機能をまとめます。末尾に実装コードを載せます。


ファイル構成

ファイル名 役割 備考
bot.py 投稿処理を行う
auth.py キー情報を記載する
db.txt 一部可変にする投稿内容のリスト 手動作成

実装に利用した機能

文字列結合

s = 'aaa' + 'bbb' + 'ccc'
print(s)
# aaabbbccc

ファイル操作(タブ区切りのファイルを読む)

#!/usr/bin/env python

for line in open('text.txt', 'r'):
    itemList = line[:-1].split('\t')
    print itemList

乱数生成

import random
random.randrange(start, stop)

文字コード設定

UNIX系なのでUTF-8のファイルに指定します。Winでファイル作ったものをラズパイ環境に持ってくるとS-JISで文字列処理に失敗します。*1

# coding: utf-8

重複投稿エラーの対応

レコードのデータ量が少ないと重複内容を投稿する場合があります。その場合、Twythonでは403エラーが返ってきます。これを例外処理して、定期実行を継続させます。

import twython
try:
   #正常処理
except twython.TwythonError:
   #エラー処理

その他

UNIX系なので改行コードはLFです。



実装コード

bot.py

#!/usr/bin/env python
# coding: utf-8
import random
import twython

# twitter configuration
from twython import Twython
from auth import (
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)

twitter = Twython(
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)

prefecture_list = []
municipality_list = []
title_list = []

# Read Data Base
for line in open('db.txt', 'r'):
    title, prefecture, municipality = line[:-1].split('\t')
    title_list.append(title)
    prefecture_list.append(prefecture)
    municipality_list.append(municipality)
    #print title, prefecture, municipality, title

# message create
list_max_num = len(prefecture_list)
list_num = random.randrange(0,list_max_num)
message = title_list[list_num] + 'の聖地は' + prefecture_list[list_num] + 'の' + municipality_list[list_num] + 'ですっ!'

try:
    # tweet
    print(message)
    twitter.update_status(status=message)
except twython.TwythonError as err_message:
    print err_message

auth.py

#*には各種キーを入れる
consumer_key  = '********'
consumer_secret = '********'
access_token = '********'
access_token_secret = '********'

db.txt

#タブ区切り  タイトル  都道府県名 自治体名
時をかける少女  東京都  台東区
シュタインズ・ゲート    東京都  千代田区
とある科学の超電磁砲    東京都  立川市

最初はタイトルを3番目の項目していたのですが、そうするとなぜか文字列処理時に先頭になるタイトル名が消失するという問題が発生しました。Pythonの文字列処理がよく解っていないのですが、そのため、タイトルを1番目の項目にしました。そしたら、解決しました。

おわりに

Pythonを初めて触ったので、わからないことのほうが多いです。しかし、ネット上に情報が大量にあるため、都度調べれば実装できてしまいます。規模が大きくなってきたら、ファイル構成とか管理方法とかも考えます。


*1:ただし、公式には宣言を入れるべきではないようです。 【python】# coding: utf-8はもうやめる - 静かなる名辞