WSLからtweepyとMeCabを使ってTwitterBotをつくる

# はじめに
みなさんこんにちは
Twitter大好きさんたろーです

今回はTwitterのTLからワードをとってきて、ツイートするBotをつくってみました。

つくったBotはこちら↓
https://twitter.com/PositiveYellBot

何から何まで初めて触るものばかりでしたので、もっと良い方法は山のようにあるはずです。むしろ教えてほしいです(´;ω;｀)
少しでも他の人の参考になれば嬉しいですね

ちなみにソースコードはGitHubで公開しています↓
https://github.com/Papyrustaro/PositiveYellBot


# 具体的な機能

①ツイート機能
TLから最新10件のデータ取得
→固有名詞があれば固有名詞を、なければ名詞群を抜きとる
→用意された定型文に抜き取った名詞を入れツイート

②フォロバ機能
フォロワーの中でフォローしていない人をフォローする

①を15分ごとに、②を1日ごとに実行する

# 開発環境
WSL(Ubuntu 18.04.3 LTS)
Python 3.6.8
pip 9.0.1

TwitterAPI認証アカウント
tweepy
MeCab
mecab-ipadic-NEologd(MeCabで使う辞書のようなもの)
cron

# 環境構築
## 1.TwitterAPI認証済アカウントの作成
APIKeyやAccessTokenを取得するために、TwitterAPIの認証アカウントをつくる必要があります

「なんのために使うのか」「どのように利用するのか」など<b>英語で</b>書かなきゃいけないんです...

私は翻訳突っ込んでも問題なかったですが、知り合いの中で認証されなかった人もいるのでお気を付けを

詳しい手順はこちらを参照→https://qiita.com/kngsym2018/items/2524d21455aac111cdee

ここでひとつ気を付ける点が
アプリを作成する際のApp Nameがツイート欄にも表示されます(画像右下の青色になってる部分)
<img width="228" alt="app_name.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276180/4d99eb3f-aaa1-95da-c024-7c3887e03a6d.png">

## 2.WSLのインストール
私はこちらの記事を参考にしてWindows10にWSLをインストールしました(少し前ですが)

そこまで手間じゃなく、とても優秀な子です^^
https://qiita.com/Aruneko/items/c79810b0b015bebf30bb

## 3.pip, tweepy
※注意: 私は安易にpipを利用しましたが、Pythonの環境構築には次の2つの記事を参考にしてもらったほうがいいです
https://qiita.com/Aruneko/items/c63ed3f5770569fb5e11
https://qiita.com/Aruneko/items/796d7eeb61e1f36ae4a0

以下私のやった環境構築を軽く

まずPythonですが、Ubuntuにはすでにinstallされていました

```
<バージョン確認>
python3 --version
```

pipのインストール

```
sudo apt install python3-pip
```


tweepyのイントール

```
pip3 install tweepy
```

## 4.MeCab(mecab-ipadic-NEologd)
### MeCabとは
オープンソースの形態素解析エンジン
これを利用することにより、文を解析、品詞分解してくれる(ざっくり)

他にも形態素解析エンジンは様々ですが、
・Pythonに対応
・ipadic辞書を使うことにより流行りの単語もわかる(辞書は週2回更新されているらしい)
という点からMeCabを採用しました

### インストール
こちらの記事を参考にしました
https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53
https://qiita.com/SUZUKI_Masaya/items/685000d569452585210c

```
sudo apt install mecab
sudo apt install libmecab-dev
sudo apt install mecab-ipadic-utf8

sudo pip3 install mecab-python3
```
mecab-ipadic-NEologdのインストールはこちらを
利用方法や環境ごとの注意なども書かれています
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

```
sudo apt install git make curl xz-utils file
cd /tmp
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n

(途中でyes/noきかれるのでyesと入力)
```

### PythonからMeCabを利用する
標準入力された文字列を形態素解析し、表示するサンプルプログラム

```mecab_sample.py
import sys
import MeCab

# ipadic辞書を利用する
# install先は echo `mecab-config --dicdir`"/mecab-ipadic-neologd" コマンドで確認
mt = MeCab.Tagger("-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd")

def showPartOfSpeech():
    str = input("解析したい文: ")
    res = mt.parseToNode(str)
    while res:
        print(res.feature)
        res = res.next

if __name__ == '__main__':
    showPartOfSpeech()
```

実行例

```
解析したい文: みりあスマブラやんないよ
BOS/EOS,*,*,*,*,*,*,*,*
名詞,固有名詞,人名,名,*,*,みりあ,ミリア,ミリア
名詞,固有名詞,一般,*,*,*,スマブラ,スマブラ,スマブラ
助動詞,*,*,*,不変化型,基本形,やん,ヤン,ヤン
形容詞,自立,*,*,形容詞・アウオ段,基本形,ない,ナイ,ナイ
助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
BOS/EOS,*,*,*,*,*,*,*,*
```

# 実装
## プログラム
冒頭でも書きましたが、ソースコードはGitHubに公開しているので
こちらを参照してください
https://github.com/Papyrustaro/PositiveYellBot

## cronによる自動化
### WSLでcronを使うということ
まず仕様の話をしなければなりません
cronによってPythonのプログラムを定期的に実行する、
ということで自動ツイートを実現しています

しかしWSLが起動していない間は動かないんです
つまり、WSLを起動していれば自動で呟くBotになります
私はそれでいいと感じましたが、常に動かすならサーバー借りたりしないとですかね...

WindowsのPCを起動をしてさえいれば、WSLを立ち上げなくても動かせる方法もあるみたいです

### 実行

```
crontab -e
```
でcronで実行したいコマンドと時間を記述

```
sudo service cron restart
```
で動きます

```
service cron status
```
でcronが現在動いているかチェック

今回私が書いたものを紹介

tweet.pyを15分に1回
follow.pyを1日に1回実行

標準出力をtweet_log.log, follow_log.log
エラー出力をtweet_log_err.log, follow_log_err.log
に書き込む処理

```
LANG=ja_JP.UTF-8

*/15 * * * * python3 /home/papyrus/positive_yell_bot/tweet.py >>/home/papyrus/positive_yell_bot/tweet_log.log 2>>/home/papyrus/positive_yell_bot/tweet_log_err.log

0 0 * * * python3 /home/papyrus/positive_yell_bot/follow.py >>/home/papyrus/positive_yell_bot/follow_log.log 2>>/ home/papyrus/positive_yell_bot/follow_log_err.log
```

記事はたくさんあります。どれ見てもかけるはず
https://qiita.com/onomame/items/71646c5517a39bcd01cc

# つまづいた点
## ツイートテキストにURLなども含まれる
home_timelineなどでstatus.textを持ってくるが中身を覗くと
RTやら@アカウント名やらURLが入ってます

正規表現を利用したりして取り除くしかなかったです...

## 特定のツイートにリプが来ているかわからない
これは私が知識不足なだけで、本当はそういう機能があるのかもしれないです

statusにはin_reply_to_status_idというものがある
これはこのツイートが誰かにリプライしているものか、を判断するもの
リプライされているか、判断できるようなものはなかった(statusの中身を全て見たがそれらしきものはない)

## フォロー上限
実は最初フォロバ機能も一緒に15分に1回呼んでいました
しかし、少しして「フォロー上限に達しましたよー」とエラーが

どうやらapi.create_friendship()はすでにフォローしている人もフォロー処理をするようだ

フォロワーが自分をフォローしているかどうかの処理、全探索は処理が大変そうだったのでおとなしく24時間に1回呼ぶことにしました...
(賢い書き方募集中)

## python'3'
UbuntuはpythonコマンドではPython3系ではなく2系が呼ばれるのがデフォ
今回のインストールは3系用にやっていたので
間違ってpythonコマンドを呼ぶとわけのわからないエラーがでます

これのせいで「なにもしてないのに壊れた」と何度かなりました

## cronが動かない

```
service cron restart
```
をしても「can't open or create /var/run/crond.pid: Permission denied」というようなエラーが出るかもしれない

詳しい原因はわからなかったが、sudoをつけることで解決

# おわりに
Python自体初めて書いたのですが、いやあ便利ですね
Python!Python!と世間で言われているのがわかった気がします
Twitter以外のAPIでもPythonを使って遊べるみたいなので、興味のあるかたぜひ!!