PythonとTwitterAPIでクローリング２〜ユーザー検索機能の実装

#今回すること
　前回まではツイートの単純な検索を行うButlerクラスと、ツイートを取り扱うためのTweetクラスを実装しました。
　今回はButlerクラスにUserを検索する機能とUserクラスを実装していきたいと思います。
#前回までの実装
　先に前回までのコードを載せておきます。

```python:tweet_butler.py
from . import config
from requests_oauthlib import OAuth1Session
import json

class Butler:
    def __init__(self,setting = config):
        self.api = OAuth1Session(setting.Consumer_Key, setting.Consumer_Secret_Key, setting.Access_Token, setting.Access_Secret_Token)
        self.search_url = "https://api.twitter.com/1.1/search/tweets.json"

    def search(self,word,count=10):
        params = {"q":word,"count":count}
        res = self.api.get(self.search_url, params = params)
        if res.status_code == 200:
            search_results = json.loads(res.text)
        tweets = [Tweet(result) for result in search_results["statuses"]]
        return tweets

class Tweet:
    def __init__(self,tweet):
        self.dict = tweet
        self.tweet_id = tweet["id"]
        self.user_id = tweet["user"]["id"]
        self.user_name = tweet["user"]["screen_name"]
        self.text = tweet["text"]
        self.created_at = tweet["created_at"]
        self.favorite_count = tweet["favorite_count"]
        self.hashtags = tweet["entities"]["hashtags"]
        self.symbols = tweet["entities"]["symbols"]
        self.mention = tweet["entities"]["user_mentions"]

    def get_text(self):
        return self.text
```

#ユーザ検索の方法
　APIの検索は、あるURLにGETリクエストを送るだけでできます。
　ユーザの検索の際には以下の三つの方法があるようです。
　・users/lookup
　・users/search
　・users/show
　searchはある単語に対してヒットするユーザーを検索するもので、showはidやscreen_nameが一致するユーザを一人だけ出力するもので、lookupはshowの複数人に拡張したもので、idやscreen_nameにリストを入力することができます。
　どれも実装自体は難しくありませんが、今回はshowをまず使います。

#ユーザ検索機能の実装
　まず必要なのはAPIのトークンです。これは前回説明したので省きます。
　[PythonとTwitterAPIでクローリング１〜簡易な検索機能](https://qiita.com/aoki_aiota/items/8944dc7326dd51007d79)

　次にusers/showのresource URLです。
　https://api.twitter.com/1.1/users/show.json
　また実装するにあたってこのAPIに投げるjsonファイルについて知っておく必要があります。

```json

{
  "Name": "name",
  "user_id": "id",
  "screen_name": "screen_name",
  "include_entities": "include_entities",
}
```
　以上の四つがjsonファイルの入力として用いることのできる要素です。このうち`Name,user_id,screen_name`のうちどれかが必ず必要となります。

　あとは実装です。これは前回までとあまり変わりません。Butlerクラスのメソッドとして実装します。
##Butler.get_user_by_id()
　まず、showAPIを用いてIDからユーザを取得するメソッドです

```python:tweet_butler.py
class Butler:
    def __init__(self, setting = config):
        self.get_user_url = "https://api.twitter.com/1.1/users/show.json"
              :
              :

    def get_user_by_id(self, id):
        params = {"user_id":user_id}
        res = self.api.get(self.get_user_url, params = params)
        if res.status_code == 200:
            search_results = json.loads(res.text)
        else:
            assert False, "{} error happen in get_user_by_id method".format(res.status_code)
        return User(search_results)
```

##Butler.get_user_by_name
　次に`screen_name`からユーザを手に入れるメソッドです。使うAPIは同じものです

```python:tweet_butler.py
        :
        :
def get_user_by_name(self,name):
        params = "Name":name}
        res = self.api.get(self.get_user_url, params =params)
        if res.status_code == 200:
            search_results = json.loads(res.text)
        else:
            assert False, "{} error happen in get_user_by_name method".format(res.status_code)
        return User(search_results)
```

#Userクラスの実装
　今回はUserクラスには特に大したきのはつけません。

```python:tweet_butler.py

class User:
    def __init__(self, user_dict):
        self.dict = user_dict
        self.id = user_dict["id"]
        self.name = user_dict["name"]
        self.screen_name = user_dict["screen_name"]

```

　すごく手抜きですみません。

#Tweetクラスの改良
　レスポンスで返ってくるtweetオブジェクトの中にuserオブジェクトが入っているようなので、Tweetクラスのメソッドとしてget_userメソッドを新たに増やします。あとはクラス変数の名前をいくつか変えています。

```python:tweet_butler.py
class Tweet:
    def __init__(self,tweet):
        self.dict = tweet
        self.id = tweet["id"]
        self.user_id = tweet["user"]["id"]
        self.user_name = tweet["user"]["screen_name"]
        self.text = tweet["text"]
        self.created_at = tweet["created_at"]
        self.favorite_count = tweet["favorite_count"]
        self.hashtags = tweet["entities"]["hashtags"]
        self.symbols = tweet["entities"]["symbols"]
        self.mention = tweet["entities"]["user_mentions"]
    
    def get_text(self):
        return self.text
    
##########ここから下が新たに増やした部分###########
    def get_user(self):
        return User(self.dict["user"])


```

#続く
　次は、ユーザ検索をusers/search APIを用いて検索できるようにするのと、特定のユーザのツイートを取得できるようにしたいと思います。

　
#参考
[Twitter の特定ユーザーのツイートを取得](https://qiita.com/ekzemplaro/items/eb19955aa1fd01a59eff)
[twitter developer](https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-lookup)