Help us understand the problem. What is going on with this article?

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の認証アカウントをつくる必要があります

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

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

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

ここでひとつ気を付ける点が
アプリを作成する際のApp Nameがツイート欄にも表示されます(画像右下の青色になってる部分)
app_name.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を使って遊べるみたいなので、興味のあるかたぜひ!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした