インフルエンサーおすすめ商品の自動集計サイトを作ってみた

＜2020/06/26 追記＞
稼働停止しました。サイトは残しておきます。

---
最近のインターネットは情報が溢れすぎていて、**価値ある情報が埋もれやすくなっている**ように感じます。例えば毎日止め処なく流れ続けるTwitterでは、どんなに素晴らしいツイートでも、あっという間にタイムラインの奥深くに消えてしまう。

そこで今回は、「いいね」が多いツイート内で紹介されているAmazonの商品をまとめることで、**埋もれてしまった素敵な商品を見つけることができる（かもしれない）サイト**を作りました。

# 作ったもの
[インフルエンサー アイテムズ](https://osusumekun.herokuapp.com/)
※ちなみにこのサイトからアイテムを購入されても、私には一銭も入りません…。

＜画面サンプル＞
![items.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280076/d4b31f28-eb75-8587-9372-0db4f70d4032.jpeg)
※上のサンプルの@kensuuさんがTwitterでよく面白い本をオススメしているので、自動で集計したいなーと思ったのがきっかけで作りました。

特定のTwitterアカウントのツイートを対象に、**Amazonの商品URLを含むツイートに絞って集計し、「いいね」の数でランキング化**するものです。

- 集計対象のユーザは固定（追加・削除はブラウザから容易に可）
- 集計対象ツイートは直近の「1ヶ月」と「1年」
- Amazon商品URLを含むツイートのみ対象
- ツイートの「いいね」数で商品をランキング化（商品1つに対するツイートが複数ある場合は、全ツイートの「いいね」の合計数でランキング化）
- 毎週自動更新（HEROKUを他に使いたいのでそのうち止めるかも）

# 処理の流れ
1. 指定ユーザのツイート取得
2. Amazonの商品単位でツイート情報を集計
3. 抽出した商品の情報（タイトルなど）を取得
4. 抽出した商品を含むツイートの埋め込みHTMLを取得
5. 指定ユーザのTwitterアカウント画像を取得
6. 表示に必要な情報をDBに保存
7. DBの情報を画面表示
8. 定期的に自動実行

それぞれ、メモ程度ですがざっくり書きます。

# 1. 指定ユーザのAmazonツイート取得
単純なツイートの取得は、情報やパッケージがありふれているので割愛します。対象ユーザのツイートの**「ツイート内容」**、ランキングに使用する**「いいね数」**やAmazon商品の**「リンク」**といった情報を取得します。

# 2. Amazonの商品単位でツイート情報を集計
リンク内に含むAmazonの商品コード（ASINコード）で集計してソートします。pandas DataFrameのgroupby()とsort_values()を使います。

```python
#「asin」（商品コード）単位に「favorites」（いいね数）を合計しソート
df.groupby('asin')['favorites'].sum().sort_values('favorites', ascending=False)
```

# 3. 抽出した商品の情報（タイトルなど）を取得
※API規約変更に伴い自由に使えなくなったので、今は使っていません。

上位20商品に対して、AmazonのAPIを使って情報を取得します。公式のリファレンスは少しわかりにくいのですが、**python-amazon-simple-product-api**というパッケージで簡単にできました。
参考：[Amazon Product APIをPythonで叩く簡単な方法](https://qiita.com/zabeth129/items/00d69d451a16ea3e714a)

これを使って、ASINから商品のタイトル、画像、作成者、リンクURLを取得して使用します。

```python
from amazon.api import AmazonAPI

#APIで商品情報取得
amazon = AmazonAPI(AMAZON_ACCESS_KEY, AMAZON_SECRET_KEY, AMAZON_ASSOC_TAG, region='JP')
product = amazon.lookup(ItemId='XXXXXX(ASINコード)')
title = product.title #タイトル
img_url = product.medium_image_url #画像URL
authors = product.authors #作成者（配列）
item_url = product.offer_url #リンクURL
```

# 4. 抽出した商品を含むツイートの埋め込みHTMLを取得
各商品へのツイートも表示させたいので、**ツイートの埋め込み情報をTwitter APIで取得します。**ツイート情報は既に上で取得済みですが、ツイートを公開するときは公式の埋め込みを使わないといけないみたいなので。

参考：[Python で Twitter API にアクセス](https://qiita.com/yubais/items/dd143fe608ccad8e9f85)

```python
import json
from requests_oauthlib import OAuth1Session

#パラメータ設定
twitter = OAuth1Session(CK, CS, AT, AS)
OEMBED_URL = 'https://publish.twitter.com/oembed'
params = {
    'url': 'http://XXXXXX' #ツイートURL
    'lang': 'ja',
    'hide_media': 'true', #ツイート内の画像を表示しない
}

#情報取得
res = twitter.get(OEMBED_URL, params=params)
data = json.loads(res.text)
html = data['html'] #埋め込みURL
```
これで、このような埋め込みツイートが取得できます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">職場の隣の人が、いつになく真剣な表情でPC見てると思ったら、全画面で銀魂を読んでいた</p>&mdash; よっしー (@yossymura) <a href="https://twitter.com/yossymura/status/1048096534309494784?ref_src=twsrc%5Etfw">2018年10月5日</a></blockquote>

※ちなみに、Twitter APIのキー取得は最近ハードルが上がりましたが、この辺りを参考にすれば問題なく取れます。

参考︰[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ　※2018年9月時点の情報](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)
[Twitter API の開発者アカウントに登録申請してみた](https://qiita.com/DanYuya/items/a4c021e65f30ce8e43de)

# 5. 指定ユーザのTwitterアカウント画像を取得
こちらもTwitterAPIで取得できます。ちょうど良い小さい画像を取得できました。

```python
#パラメータ設定
USER_URL = 'https://api.twitter.com/1.1/users/show.json'
params = {'screen_name': 'XXXXXX(ユーザ名)'}

#情報取得
res = twitter.get(USER_URL, params=params)
data = json.loads(res.text)
return data['profile_image_url_https']
```

# 6. 表示に必要な情報をDBに保存
今回も無料のHEROKUを使います。**HEROKUはCSVのようなファイル保存ができない**ようなので、データベースに保存することに。せっかくなので**Django**というフレームワークを使ってみました。例えばこんな感じでDBに情報を保存できます。

```python
new_product = Product(
            user_name = 'kensuu',
            title = '商品タイトル',
            item_url = '商品URL',
            medium_image_url = '商品画像URL',
            author = '作成者',
            tweet_htmls = '商品HTML'
        )
new_product.save() #これでDBに保存される
```
もう簡単なDB操作ならSQLを書かなくていいんですね。

# 7. DBの情報を画面表示
これまでに取得した情報をHTMLとして表示します。**HTML内に {{ *変数名* }} と書けばDBの情報を簡単に表示できます。**for文での繰り返しもできて便利。下記のように書けばproductの数分だけタイトルが表示されます。

```html
<ul>
    {% for product in products %}
        <li>{{product.title}}</li>
    {% endfor %}
</ul>
```

参考：[Djangoを最速でマスターする part1](https://qiita.com/gragragrao/items/373057783ba8856124f3)

# 8. 定期的に自動実行
HEROKU上でPythonファイルを定期的に実行します。これで表示する商品やツイート情報が自動的に更新されます。例えばこのような定期的コマンドをブラウザから簡単に設定できます。
<img width="768" alt="スクリーンショット 2018-10-29 22.13.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/280076/1da3fdad-6b3c-14fe-961f-86a2228fbf82.png">

参考：[Herokuでお天気Pythonの定期実行](https://qiita.com/seigo-pon/items/ca9951dac0b7fa29cce0)

以上です。

# あとがき
先日、[「ゴミ記事は書くな」はゴミ記事を増やすことにつながるから避けるべきでは？](https://qiita.com/dorarep/items/cda32733e5763d998af9)という投稿を見かけました。結果的には、[侍エンジニア塾のC言語の記事がヤバ過ぎる](https://qiita.com/hamichamp/items/7b7a7ee091a6856ac900)のような問題を招いていたり、他の記事でも賛否ありますが、**情報が増えることで価値のないものが溢れてしまうのは、良い悪いというより避けられない自然な流れ**だと思います。

例えばブログも、以前は一部の人しか使っていなかったものが大衆化し、多くの人にとって価値のない記事が溢れました。医療分野などでは、大きく問題になったこともありました。また、Twitterはその成れの果てのようなもので、世の中のツイートの99%はどうでもいい情報ですし、海外も含めデマツイートは大きな話題になりました。

**そんな中で価値ある情報を探すには、「何が書いてあるか」より「誰が書いたのか」に頼らざるを得なくなってきます。**そして、多くのフォロワーを持つ「インフルエンサー」は、その「誰か」として選ばれた人たち。そんな彼らがおすすめする商品には、それなりの信用が置けるのではないでしょうか。（ステマするような人は別として）

プログラミングが義務教育の一部になり、大衆化が更に進めば、**ネット上のプログラミング情報は、よりカオスになっていくでしょう。**「ネット上にはゴミコードしかない」なんて言われる日が来るかもしれない。そんな時に、**信用される人として、1つでも多く何かを作った実績を残しておく**とよさそうな気がします。

# さらにあとがき
と、ここまでは表向きの綺麗な内容ですが、せっかく作ったのなら、やっぱり**ちょっとはお金も欲しいじゃない**ですか。[開設後３週間で収益１０万円を得た個人開発サイトでやったことの全部を公開する](https://qiita.com/jabba/items/1a49e860a09a613b09d4)と同じような仕組みなので、多少儲けられるかなーとか思ったわけですよ。

というか家族を養う会社員としては、趣味に没頭するにも後押しが要るわけで。少しは稼がないとやってられない。なのに…なのにですよ。**Amazon様へのサイト登録申請結果**は…
<img width="582" alt="スクリーンショット 2018-10-29 22.29.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/280076/585bd4bb-accb-d985-d528-34dba1339c6a.png">

ひぇぇ…厳しいなぁ。。優等生サイトっぽく改善すれば承認されるのかもしれませんが、余計なもの足したくないし、Amazonに承認されるために四苦八苦するのは面白くないのでやめました。