2017年08月06日

ツイートの「公式RT直後のツイート」と「コメント付RT」の抜き出し(Python+Tweepy+Flask)【環境&スクリプト編】

車輪の再発明になりますが、Pythonの勉強がてら「公式リツイート直後のツイート...

参考にしたサイト

Python+Tweepy+Flaskを用いてCGIで実施する上で下記サイトを参考にさせて頂きました。

ディレクトリ構成


RtKumaFlask
│  .htaccess…Apach用設定ファイル
│  app.py…メインスクリプト
│  index.cgi…CGIモード用ファイル

└─templates
        index.html… テンプレートファイル

続いて、環境とスクリプト関連です

環境&スクリプト

Flaskが必要になるのでサーバ側で下記コマンドでFlaskをローカルにインストールしています。
> python3.5 -m pip install requests --user
まずはFlaskを用いたメインのスクリプトになります。

app.py 

#!/usr/local/bin/python3.5

import os
import logging
import tweepy
from flask import Flask, session, redirect, render_template, request

# KEY Information
CONSUMER_KEY="*****************"
CONSUMER_SECRET="******************************"
SECRET_KEY ="******************************"

CALLBACK_URL = 'http://kumanabe.s1003.xrea.com/cgi/RtKumaFlask/'
#CALLBACK_URL = "http://localhost:5000/"

# Flask の起動
app = Flask(__name__)

# flask の session を使うにはkeyを設定する必要がある.
app.secret_key = SECRET_KEY

@app.route('/')
def index():
""" root ページの表示 """
# Formを表示するかどうか
statusID = request.args.get('statusId')
if statusID:
# StatusIDを取得できていればFormは表示せずに認証に移る(template/index.html)
# StatusIDは後で使うので保存
formOn = 0
session['stausID'] = statusID
else:
# StatusIDを取得できていればFormを表示する(template/index.html)
formOn = 1

# ReTweet情報の取得
tweetList = user_rtinfo()

# templates/index.html を使ってレンダリング.
return render_template('index.html', tweetList=tweetList, formOn=formOn)

@app.route('/twitter_auth', methods=['GET'])
def twitter_auth():
""" 連携アプリ認証用URLにリダイレクト """
# tweepy でアプリのOAuth認証を行う
try:
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET,CALLBACK_URL)
redirect_url = auth.get_authorization_url()
# 認証後に必要な request_token を session に保存
session['request_token'] = auth.request_token
except:
logging.error("Auth Error")

return redirect(redirect_url)

def user_rtinfo():
""" user の timeline のリストを取得 """
# request_token と oauth_verifier のチェック
token = session.pop('request_token', None)
verifier = request.args.get('oauth_verifier')
if token is None or verifier is None:
return False # 未認証ならFalseを返す

# tweepy でアプリのOAuth認証を行う
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL)

# Access token, Access token secret を取得.
auth.request_token = token
try:
auth.get_access_token(verifier)
except tweepy.TweepError:
return {}

# tweepy で Twitter API にアクセス
api = tweepy.API(auth)

# 検索したいstatusIDをsessionから取得
statusId = session.pop('stausID',None)
# RTから7日以内のTweetを取得する方針
RTDate = 7
try:
retweeters = api.retweets(id=statusId) #rtした人一覧
except:
print ("Auth or api error. Would you please move to prev page?</br>")
return ""

# RTに関係したTweetをリストで保存する
tweetList = []
#                            秒  分  時間  日
statusIdAfterxDays = int(statusId) + 2**22 * 1000 * 60 * 60 * 24 * RTDate
for retweeter in retweeters:
postlineon = 0;
postline ="";

for tweet in tweepy.Cursor(api.user_timeline, id = retweeter.user.id, since_id = str(int(statusId)-1), max_id = statusIdAfterxDays, cursor = -1).items():
if hasattr(tweet,"retweeted_status"):
if str(tweet.retweeted_status.id) == str(statusId):
if(postlineon == 1):
# ひとつ後のTweetがあればリストに放り込む
tweetList.append(postTweet)

# RT自身をリストに保存
tweetList.append(tweet)
break

# 新しい方から順次Tweetを1つ分だけ保存しておく
postlineon = 1;
postTweet = tweet;

# ここから先はコメント付Retweet関連
maxId = statusIdAfterxDays # 検索結果用ID
maxIdOld = statusIdAfterxDays # 検索結果用ID

# コメント付Rtはコメント先のRTのリンクで検索するので、検索用のURLを作成して検索
statusTweet = api.get_status(statusId)
userId = statusTweet.user.screen_name
searchWord = "https://twitter.com/" + userId + "/status/" + statusId
for tweet in tweepy.Cursor(api.search, q=searchWord,since_id = str(int(statusId)-1),max_id=maxId, cursor = -1).items():
tweetList.append(tweet)

return tweetList

if __name__ == '__main__':
app.run(debug=True)

template/index.html

<!DOCTYPE html>
<script>window.twttr = (function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0],
t = window.twttr || {};
if (d.getElementById(id)) return t;
js = d.createElement(s);
js.id = id;
js.src = "https://platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js, fjs);

t._e = [];
t.ready = function(f) {
t._e.push(f);
};
return t;
}(document, "script", "twitter-wjs"));</script>

<html>
<head>
<title>KumaKuma RT Checker</title>
</head>
<body>
<h1>KumaKuma RT Checker</h1>
{% if tweetList == False %}
{% if formOn == 1 %}
<form>
TweetのStatusIDから対象の「RTの直後のTweet」「コメント付RT」を表示</br>
Tweet Status ID : <input type="text" name="statusId"></br>
<input type="submit" value="Checking Tweet after RT">
</form>
{% else %}
<p><a href="{{ url_for('twitter_auth') }}">連携アプリ認証をします。自動的に遷移しない場合はクリック</a></p>
<meta http-equiv="refresh" content="1;URL={{ url_for('twitter_auth') }}">
{% endif %}
{% elif tweetList == "" %}
Retweet wasn't found</br>
{% else %}
{% for tweet in tweetList %}
<blockquote class="twitter-tweet" data-lang="ja">
<p lang="ja" dir="ltr"> {{ tweet.text }} </p> &mdash;
{{ tweet.user.screen_name }}/{{ tweet.user.name }}
<a href="https://twitter.com/{{ tweet.user.screen_name }}/status/{{ tweet.id_str }}">
{{ tweet.created_at }}</a>
</blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
{% endfor %}
{% endif %}

<footer>
</footer>
</body>
</html>
続いてCGIモードで動かすための追加のファイルになります。

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /cgi/RtKumaFlask/index.cgi/$1 [QSA,L]

index.cgi(実行権限を付加)

#!/usr/local/bin/python3.5

import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)
試行錯誤で結構苦労しましたが、何とか動作するようになりました

ローカル環境でのFlask立ち上げ方法


ちなみに意外と忘れがちなローカルでのFlask環境の立ち上げ方法ですが、下記コマンドを実行した上で「http://localhost:5000/」にアクセスとなります。

> python .\app.py
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 793-106-220
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

スポンサーリンク
posted by くまなべ at 08:02 | Comment(0) | TrackBack(0) | Python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180564062
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック