【Twitter×Python】自分専用のエゴサーチボットを作る方法



【Twitter×Python】自分専用のエゴサーチボットを作る方法

月間利用者数は 3,000万人以上、日本で2番目に人気のある SNS ツイッター。

自分のアカウントがタグ付けされたツイートや、フォローしているアカウントに関する情報は通知されますが、それ以外の場合は自分に関係することがツイートされていても知る術がありません。

例えば私の場合は、知らない間に自分のお仕事に対する評価がツイートされていました。

image

掲載許可得ていないためアカウント名は非表示にしています。こうした生の評価、モチベーション上がりますね!ありがとうございます!

この情報ってたまたま知人が教えてくれたから気づきましたが、教えてくれなかった知らないままですよね。(Twitter 検索すればいいのでしょうが...)

今回はこうした経験を生かして、自分の知らないところでツイートされている情報をキャッチアップ(通知)できるプログラムを作成してみました。

とりあえずコードをコピーして、メールアドレスやキーワード、APIキーなどを変更すれば誰でも無料で利用できると思いますので、ご興味ある方は実際にプログラムを動かしてみてください。

使用するプログラミング言語; Python
目次
  1. 【Twitter×Python】誰かが自分の事をツイートしてたら自動お知らせしてくれるメールシステムを無料で作る
  2. プログラムの作成プロセス
  3. Twitter API の使い方
  4. Twitter APIで取得したデータをメール送信してみる
  5. Twitter APIで定期的に該当キーワードを検索し、メール通知くれるボットを作成
  6. Twitter APIを使う様子の動画
  7. まとめ

【Twitter×Python】誰かが自分の事をツイートしてたら自動お知らせしてくれるメールシステムを無料で作る

プログラムの作成プロセス

image

イメージ:https://pythonchannel.com/twitter_search_bot/

今回の「ツイート通知」プログラム、いくつかやり方はあると思いますが、今回は以下の内容でチャレンジ。

  • ツイート情報は Twitter Search API で取得
  • 自動通知のメールは、 Python標準モジュールの smtplib を使用
  • プログラムを実行するサーバーは暫定的に Pythonanywhere を利用

今回メインとなるのは「 Twitter Search API」。 API というと「ちょっと難しそう」「使ったことないし...」 と気持ち的にハードルが上がる方も多いと思いますが、大丈夫です。 API キーさえ取得すれば、あとはコピペでとりあえずいけます。

参考までに Twitter API から順を追ってご紹介させていただきます。

Twitter API の使い方

Twitter API は、今回利用する「Search」以外にも「ログイン」や「広告」、「ツイート」などいくつか種類があります。また Search API も無料の "Standard" から "Premium"、 "Enterise" など種類が存在。まずは Twitter にログインした状態で下記の Developer ページにアクセスしてみましょう。(下図参照)

https://developer.twitter.com/en/dashboard

Twitter の開発用ページにアクセスしたら、右上のアカウント名をクリックし、「Apps」 をクリック(上図参照)。

そして Twitter の Appページにアクセスしたら、「Create an app」 をクリック(上図参照)。そして API 取得に際して以下のようなアプリ情報を入力する必要があります。 入力は日本語でも OK で、恐らくここの記述が理由で API を利用できないというのはあまりないと思いました。

必須事項を一通り入力し、決定ボタンを押すと API に関する情報を以下のように提供してもらえます。

メニュータブを「Keys and tokens」 に合わせると、APIキーを確認できます。一般的な API というと「公開キー」と「秘密キー」ですが、Twitter API の場合は、キー以外に Token も発行されます。利用にあたって、この 4つの情報が必要になりますのでメモ帳などに保存しておきましょう。

いきなりプログラムの登場ですが、Python の場合は、「認証ライブラリ(requests-oauthlib)」を使って Twitter API を使う方法と「tweepy」というライブラリを使う方があります。手続きとしてはどちらも同じ様な流れですが、取得情報量などの機能面で違いがあり、 tweepy の方が劣勢。例えば一回のアクセスで取得できるツイート量は 15、 requests-oauthlib の場合は 100 まで取得可能。この様なことから今回は、 requests-oauthlib を使用して Twitter API を使っていきたいと思います。

そして実際のプログラム例が上図の通りで、API キーとトークンをセットして、Twitter Search API のスタンダード(https://api.twitter.com/1.1/search/tweets.json?q=)にアクセス。ちなみにPremium プランの場合は、 URL のアクセスポイントが違ってきて、 https://api.twitter.com/1.1/tweets/search/30day/my_env_name.json などに。

パソコンで本稿を閲覧中の方は、オンラインで Python できる Google Colab にアクセスして、下記コードをコピペし、ご自身の API キーをセットして試してみてください。

上図のコードを今確認する

import json
from requests_oauthlib import OAuth1Session
API_KEY = "yOgm1fpB3v8HSpyFgU2Upeal5"
API_SECRET = "7SJqLfGpg58fn7dFFJnXBzYh2FgUFsYo2kRNzfnqEGyxTJYknb"
TOKEN = "2596440072-EQZA1RYOoY6AoX9QKNZTl5BuhEAvTCtUO0oIutr"
TOKEN_SECRET = "GLKilLFsmePrF8HhicYnIxdFUMdOtYnHKLfXji4X0znrl"

mytwitter = OAuth1Session(API_KEY, API_SECRET, TOKEN, TOKEN_SECRET)

API_Plan_Standard = "https://api.twitter.com/1.1/search/tweets.json?q="
how_many_get_data = 1000
what_type_result_data = "resent"  # mixed, recent, popular
search_keyword = "安倍晋三"

url = API_Plan_Standard + search_keyword + "&result_type=" + what_type_result_data + "&count=" + str(how_many_get_data)
response = mytwitter.get(url)

response_data = json.loads(response.text)
response_data


上図のコードを今確認する

first_data = response_data['statuses'][0]
who = first_data['user']['name']
when = first_data['created_at'][:16]
what = first_data['text']
where = first_data['place']
retweet = first_data['retweet_count']
twitter_url = 'https://twitter.com/oshimamarasa/status/' + str(first_data['id'])

print(who)
print(when)
print(what)
print(where)
print(retweet)
print(twitter_url)

Twitter API を使うと JSON 形式で該当データが返ってきますので、それを上図の様なプログラムで必要な情報を取得処理。(Pythonの "辞書" や "リスト" の知識部分です) 私、大島孝之に関するツイート情報を検索して取得できたことが確認できますね。

Twitter APIで取得したデータをメール送信してみる

上図のコードを今確認する

import smtplib
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login('***@gmail.com', 'Googleのパスワード')

from email.mime.text import MIMEText
from email.utils import formatdate
msg = MIMEText('こんにちは')
msg['Subject'] = 'タイトル'
msg['From'] = '***@gmail.com'
msg['To'] = '***@yahoo.co.jp'
msg['Date'] = formatdate()
sender_email = "***@gmail.com" 
receiver_email = "***@yahoo.co.jp" 
smtpobj.sendmail(sender_email, receiver_email, msg.as_string())
smtpobj.close()
print('mail sended!')

Twitter API で、フォローやフォロワーからでは通知されない情報を取得できることが分かりました。次はこの機能をループ処理して、定期的にプログラムが Twitte 内を検索し、該当情報あればメールなどで知らせてくれると助かりますよね。

まずは Python でメールを送って、それから Twitte API 機能を付け加えたいと思います。メール送信に関するシンプルなプログラムは上図の様なイメージで、 20 行未満でプログラムからメールを送れます。実際にコピペして試してみて下さい。

プログラムを実行すると上図の様に宛先にメールが届いていると思います。

一行目の import smtlib の "smtlib" は Python の標準モジュールなので pip install は不要です。メール送信に関しては、 SendGrid などもありますが、 Mac の場合セキュリティー関係でうまくいきませんでした、 Linux で使う分には OK なのですが...

「メール」、「Twitter API」を使える様になりましたので、この機能を組み合わせてみたいと思います。

Twitter APIで定期的に該当キーワードを検索し、メール通知くれるボットを作成

上図のコードを今確認する

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import json, time
from requests_oauthlib import OAuth1Session
from jinja2 import Environment, BaseLoader
from email.mime.multipart import MIMEMultipart


  # Twitter API
API_KEY = "AYHDHrOF2VBWzDjMYZ5m6G7BC"
API_SECRET = "KVQSj4jiTcX9Z33oVpYGThcfwK4mWt2mKX4uFb5pvoQYJ37qlJ"
TOKEN = "2596440072-FZlZMabofR8izxDDUjPO3RUf7i8xozsVM1tFZ6k"
TOKEN_SECRET = "beXDRO4FH4gXCN8xuWgrSREUdbx4Omxw9nyiWsc1P7Azp"
API_Plan_Standard = "https://api.twitter.com/1.1/search/tweets.json?q="
limit_get_data_per_time = 30
what_type_result_data = "resent"  # mixed, recent, popular
mytwitter = OAuth1Session(API_KEY, API_SECRET, TOKEN, TOKEN_SECRET)

API_Plan_Standard = "https://api.twitter.com/1.1/search/tweets.json?q="
how_many_get_data = 30
what_type_result_data = "resent"  # mixed, recent, popular
search_keyword = "安倍晋三"

while True:
    url = API_Plan_Standard + search_keyword + "&result_type=" + what_type_result_data + "&count=" + str(how_many_get_data)
    response = mytwitter.get(url)
    response_data = json.loads(response.text)
    how_many_do_you_have = response_data['search_metadata']['count']
    print('items = ' + str(how_many_do_you_have))

    loop_counter = 0
    who = []
    when = []
    what = []
    twitter_url= []

    while loop_counter < how_many_do_you_have:
        first_data = response_data['statuses'][loop_counter]
        who.append(first_data['user']['name'])
        when.append(first_data['created_at'][:16])
        what.append(first_data['text'])
        twitter_url.append('https://twitter.com/oshimamarasa/status/' + str(first_data['id']))
        loop_counter += 1

    data_list = zip(who, when, what, twitter_url)
    context = {'data_list':data_list}

    # mail
    html_template = """\
    <p>つぶやかれています。</p>
    {% for d in data_list %}
        <li>who; {{ d.0 }}</li>
        <li>when; {{ d.1 }}</li>
        <li>what; {{ d.2 }}</li>
        <li>url; {{ d.3 }}</li>
        <hr>
    {% endfor %}
    """

    text_template = """\
    つぶやかれています。
    {% for d in data_list %}
        who ; {{ d.0 }}
        when ; {{ d.1 }}
        what ; {{ d.2 }}
        url ; {{ d.3 }}
        
    {% endfor %}
    """
    
    template = Environment(loader=BaseLoader).from_string(html_template)
    template2 = Environment(loader=BaseLoader).from_string(text_template)
    html_out = template.render(context)
    text_out = template2.render(context)

    # メール機能
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login('***@gmail.com', 'Google Password')

    msg = MIMEMultipart('alternative')
    msg['Subject'] = 'つぶやかれてますよ'
    msg['From'] = '***@yahoo.co.jp'
    msg['To'] = '***@gmail.com'
    #print(msg)
    sender_email = "***@gmail.com"  # Enter your address
    receiver_email = "***@yahoo.co.jp"  # Enter receiver address
    part1 = MIMEText(text_out, 'plain')
    part2 = MIMEText(html_out, 'html')
    msg.attach(part1)
    msg.attach(part2)
    smtpobj.sendmail(sender_email, receiver_email, msg.as_string())
    smtpobj.close()
    
    print('mail sended!')
    time.sleep(10)

この辺りのプログラムになると複雑になってきますので、プログラミングにご興味ある方はコードをコピペして、 APIキーなどを変え、自分のパソコンで実行してみてください。

【プログラム内の変更箇所】

  • APIとトークンのキー
  • メールアドレス
  • Twitte内の検索キーワード

プログラムの概要としては、無限ループで 10秒毎に Twitte API で Twitter 内をクロールし、検索キーワードの該当データ(ツイート)をメールでお知らせ。

Twitte API、メール機能についてはこれまで紹介してきた内容ですが、 Twitte API のデータを "メール" に載せるために "jinja2" というテンプレート機能を利用。この jinja は、 Flask や Django などでも使われる機能になりますので、これからもプログラミングをやっていこうと思っている方は把握しておきましょう。

そして100行ぐらいのプログラムを実行すると上図の様に、 10秒毎にメールが届きます。

本プログラムはテスト的なもので、実用的ではありません。例えば情報取得がうまくいかないとエラーがでます。 try 文などでうまく交わしましょう。 また上図プログラムは 10 秒毎に実行していますが、これではメール送信回数の上限に抵触する可能性があります。また Twitte API のアクセスリミットも 15分毎に 180回と決まっていますので実際に利用する際は、プログラムの実行間隔を調整して下さい。

ローカル環境でボットプログラムがうまくいったら、次はサーバーにセットすれば自動で通知してくれるシステムを構築できますね。 VPSサーバーや AWS などを利用であればそちらにセットすれば OK でしょうが、そういう方は稀でしょう。

2020年3月ぐらいまではオラクル・クラウドの無料利用枠が使えていましたが、現在は❌ですね。そのため今回の様なプログラムを無料で利用できる環境を調べたところ Pythonanywhere というプラットフォームが妥当と判断。

Pythonanywhere にプログラムをセットして、nohup というコマンドで実行してみるとシステム側で Python プログラムが動き続けてくれます。(まだ半日ほどしか検証できていませんが...)

nohup python3 -u twitter_Search_loop.py > ./twitter_loop.log  2>&1 &

VPS などの Linux サーバーであれば kill コマンドでプログラムの実行を止められますが、 Pythonanywhere の場合はターミナルを切る必要あります。ご注意ください。

Twitter APIを使う様子の動画

Google Colab

プログラム全体

AIエンジニアに必要なスキルが身に付く

CodeCampの無料体験はこちら

まとめ

API、いかがでしょうか?今回は Twitter API でしたが、一度要領を覚えると Google や Facebook などいろいろなサービスの API を抵抗なく使える様になります。今回の様に個人的に使う分もヨシ!でしょうし、少し頑張ってマネタライズを狙ってみるのも面白いかもしれません。

image

本プログラムを元に課金型 Web アプリを作成した事例 Twitterで私、つぶやかれている?App

「API、使えたらカッコよさそうだけど....」 「Python 興味はあるんだけどな...」 と立ち止まっておられる方、無料のプログラミング体験、もしくはプログラミング・スクール担当者へ LINE して、一歩前進してみませんか? 昨日までできなかった事ができる様になると、ちょっと自分にも自信つきますよね。

「そういえば今、時間あるな」 「たまにはパソコンを有効活用してみようか...」という方は、 CodeCamp でオンラインのマンツーマンレッスンをご体験ください。きっと明るい未来がやってきますよ。

オシママサラ
この記事を書いた人
オシママサラ
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp