40代おっさんの手習いで始めるPython（2018/05/21編）其の弐

現在手習い中のみであるため、あちこちのソースを参考にしながら適当にやってみたいことをチマチマ書いてる。

今日は、Twitterからどうやれば検索できるか、その結果を取得するにはってのを調べて
ソースをそのままコピーして貼り付けた後、適当にアレンジしてみた。

といっても、[ここ](https://qiita.com/yubais/items/dd143fe608ccad8e9f85)をほぼ本当に丸パクリした上で「あ、出来た」って感じなのだが。

```python:get_twitter_list.py
import os
import json
import BASE_bottle
from requests_oauthlib import OAuth1Session
from bottle import run,route,template,redirect,request,post
from bottle import TEMPLATE_PATH, jinja2_template as template
from collections import defaultdict

# index.pyが設置されているディレクトリの絶対パスを取得
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# テンプレートファイルを設置するディレクトリのパスを指定
TEMPLATE_PATH.append(BASE_DIR + "/views")

#ツイッターAPIを取得する(さすがにここは秘密)
CK = 'XXXXXX'         # Consumer Key
CS = 'XXXXXX'         # Consumer Secret
AT = 'XXXXXX'         # Access Token
AS = 'XXXXXX'         # Accesss Token Secert
twitter = OAuth1Session(CK, CS, AT, AS)

terms = ['えみつん','アルバム']  #新田恵海のアルバムについて検索したいので
search_str=" AND ".join(terms) #こうやってリストを AND で連結し
query = search_str
params = {
    'q': query,  # ここに検索クエリとして追加
    'count': 20
}

#検索API の json URL を指定して、oAuth APIでゲットを行う
url = 'https://api.twitter.com/1.1/search/tweets.json'
req = twitter.get(url, params=params)

result = []
if req.status_code == 200:
    tweets = json.loads(req.text)  #jsonのパーサを使って
    result = tweets['statuses']        
    #print("検索結果:" + str(result))
else:
    print("ERROR!: %d" % req.status_code)
    result = None

# パーサで読み込んだ結果を更に分割して表示する
for r in result:
    for k,v in r.items():
        if k in ['text', 'retweet_count', 'favorite_count', 'id', 'created_at']:
            print(k+':')
            print(v)
            print('    ')
    print('-----------------------------------------------------------------')
```

と言う感じで。

このままだと単なる丸パクリで申し訳ないので、取得した結果を bottle を使ってWebページに表示する形にしてみたい。

```html:top.tpl
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>検索結果表示</title>
</head>
<body>
    元データ<BR/>
    {{org_data}}
    <table>
        <caption>
        <strong>検索結果：{{query}}</strong>
        <details>
        <p>検索結果を表示する</p>
        </details>
        </caption>
        <thead>
        <tr><th>投稿時間</th><th>本文</th><th>アカウント名</th></tr>
        </thead>
        <tbody>
            {{tables}}
        </tbody>
        </table>
</body>
</html>

```

上記のテンプレートを入れて、そのうえで元ソースにこのように追加していく。

``` python:変更後
import os
import json
import BASE_bottle
from requests_oauthlib import OAuth1Session
from bottle import run,route,template,redirect,request,post
from bottle import TEMPLATE_PATH, jinja2_template as template
from collections import defaultdict

# index.pyが設置されているディレクトリの絶対パスを取得
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# テンプレートファイルを設置するディレクトリのパスを指定
TEMPLATE_PATH.append(BASE_DIR + "/views")

@route('/top0')
def get_search():
    #ツイッターAPIを取得する
    CK = 'XXXXXX'         # Consumer Key
    CS = 'XXXXXX'         # Consumer Secret
    AT = 'XXXXXX'         # Access Token
    AS = 'XXXXXX'         # Accesss Token Secert
    twitter = OAuth1Session(CK, CS, AT, AS)

    terms = ['えみつん','アルバム']
    search_str=" AND ".join(terms)
    query = search_str
    params = {
        'q': query,
        'count': 20
    }

    #検索API の json URL を指定して、oAuth APIでゲットを行う
    url = 'https://api.twitter.com/1.1/search/tweets.json'
    req = twitter.get(url, params=params)

    result = []
    if req.status_code == 200:
        tweets = json.loads(req.text)
        result = tweets['statuses']
    else:
        print("ERROR!: %d" % req.status_code)
        result = None

    tables_rows = ""
    org_data = ""
    for r in result:
        tables_rows = tables_rows + "<tr>"
        for k,v in r.items():
            #org_data = org_data + str(k) + ":" + str(v) + "<br/>"
            if k in ['text','created_at']:
                tables_rows = tables_rows + "<td>" + str(v) + "</td>"
            if k == 'user':
                for k2,v2 in v.items():
                    if k2 == 'screen_name':
                        tables_rows = tables_rows + "<td>" + str(v2) + "</td>"
        tables_rows = tables_rows + "</tr>"
    ret_text = template("top",query=query,tables=tables_rows,org_data=org_data)
    return ret_text        

if __name__ == "__main__":
    # localhost:8080 で公開するように実行
    run(host="localhost", port=8080, debug=True, reloader=True)
```

テンプレートの各変数に対して、Twitter検索結果を切り出して張り付けていく。
最終的に<tr><td>～</td></tr>の形式で返せばいいか、という雑な感じ。

一応検索結果をテーブル状にはできた。すごく雑だけど、割と短いコードでこれだけできるんだからいいな。
検索を細かくするには、[ここ](http://testpy.hatenablog.com/entry/2017/11/05/012906)を読んでquery の中にいろんなオプションを加えて実行すればよいってことも解った（というか普通のTwitter検索窓に入れる文言と同じだわな）ので、色々遊べそうではある。

というか、本当に面倒臭いことはPythonに適当にやらせとくのが良いのかなぁ、とは思えてきた。

あと、Twitter API が使えなくなるっていうニュースがながれてきたけど、今回使用したjsonのこれもダメになるんですかね。何一つわかってない感じで申し訳ない。