歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python2】Twitterの検索結果を自動でリツイートするbotを作りました

@kayourockというアカウントを運営しているのですが、 ここ1年以上、ツイートの内容も更新できないし、自分の力で音楽をdigる時間も少なくなってきてしまいました。

twitter.com

謡曲のようなノスタルジックなメロディーのロック/ポップスを紹介。日本ならではの音楽を応援します。

歌謡ロックbotの特徴は以下の通りです。
・一定時間ごとに楽曲のYoutube動画とAmazon.jp(または公式サイト等)へのリンクをツイート。
・関連する最新情報をリツイートします。
・常時リクエストを受け付けています。

そこで、「歌謡ロック」他、アカウントに関係のある情報を検索して自動でリツイートする機能を付けてみました。

本当はPython3系を使いたかったのですが、今まで使って慣れているpython-twitterが3系に非対応のため、ひとまず2系で実装しました。 oauth tokenを別ファイル(secret.py)にしてimportする等、こちらの記事を参考にしています。 今考えるとjsonとかを読み込む形で書けば良かったですが。

akiniwa.hatenablog.jp

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

import time
from datetime import datetime
import twitter
import secret

api = twitter.Api(
    consumer_key = secret.twDict['consumer_key'],
    consumer_secret = secret.twDict['consumer_secret'],
    access_token_key = secret.twDict['access_token_key'],
    access_token_secret = secret.twDict['access_token_secret']
    )

def get_search(term):
    return api.GetSearch(term=term, count=100, result_type='recent')

def post_retweet(tweetid):
    try:
        api.PostRetweet(tweetid)
    except:
        print(u'既にリツイートされています') # って書いてるけど、相手にブロックされている場合もこちら

def search_and_retweet(term, rm_nonurl=False):
    for t in get_search(term):                                           
        nowtime = int(time.mktime(datetime.now().timetuple()))
        # ツイート内容及びscreen nameにbotが含まれる場合、除外する
        if u'bot' in t.text or u'bot' in t.user.screen_name:
            break
        # urlが含まれないツイートを排除する(引数で設定)
        if rm_nonurl is True and len(t.urls) == 0: 
            break
        # 1時間以内のツイートをリツイートする
        if t.created_at_in_seconds in range(nowtime-60*60, nowtime):
            post_retweet(t.id)

search_and_retweet(u'歌謡ロック')
search_and_retweet(u'和ロック', True)
search_and_retweet(u'歌謡メタル', True)