2017-07-09

【Python】Tweepyの使い方まとめ

Python Tweepyの使い方を解説するよ!



こんにちは、PythonエンジニアのDaiです。TwitterにはPython用のAPIが存在するのはご存知でしょうか。Tweepyというモジュールを利用すれば、ツイートデータを検索して取得したり、(search)タイムラインを取得したり(timeline)ツイートしたり(tweet)、いいねしたり(like)、リムーブしたり(remove)、フォローしたり(create_friendship)、それぞれの処理を自動化できます


いろいろなことができるようになります。これらの機能を利用して、Twitterのbotがつくられていたりしますね。今回は、そんな便利なTweepyの使い方を解説してみます。今回の記事を読み終えると、以下のことができるようになります!


  1. Tweepyのインストール
  2. Twitter apiを使ってログイン
  3. それぞれのユーザー名を取得し、そのユーザーのコメントにいいねとフォロー
  4. フォロワー数が100未満のユーザーはすべてリムーブ
  5. Tweepyから画像投稿
  6. Tweepyからツイート検索
  7. heroku schedulerを利用して、上記の機能を定期処理で自動化



環境

- Windows10
- python 3
- Cloud9を利用

Windows10で、Windows Subsystem for Linuxを利用して、Ubuntuから動かしています。Windowsユーザーの方でPythonを設定していない場合には、こちらを参照してください。

>> Windows Subsystem for LinuxでUbuntu環境を構築し、Python環境を整える

Tweepyのインストール

さて、使い方を紹介する前に、Tweepyをインストールしましょう。まずは、ターミナル上で以下のコマンドを入力し、Tweepyをインストールします。

$ sudo pip3 install tweepy

Tweepyを利用して、Twitterにログインしてみる


PythonからAPIを利用して、ツイッターからの情報とるためには、以下の情報が必要となります。コードを実際に書く前に、ツイッターアカウントを取得し、Twitter Application Managementへアクセスし、もろもろの設定をし、以下の4つの情報を取得してください

  • CONSUMER KEY
  • CONSUMER SECRET KEY
  • ACCESS TOKEN
  • ACCESS SECRET KEY

Twitter Application Management

Application registration & configuration for developers using the Twitter REST & Streaming APIs.

まず、Twitter Application Managementにアクセスしたら、Create New Appをクリックして新しいアプリケーションを作ります。Name, Description, Websiteを適当に入力し、Developer Agreementに同意してからCreate your Twitter applicationをクリックすれば完成です。


投稿を行うためにPermissionsタブでアプリケーションの権限をRead and Writeに設定します。Keys and Access Tokensのタブを開いてConsumer KeyとConsumer Secretを確認します。


そこで、以下の情報を取得してください。

  • CONSUMER KEY
  • CONSUMER SECRET KEY
  • ACCESS TOKEN
  • ACCESS SECRET KEY

さてここで取得したアクセストークンをもとに、APIを取得します。取得したCONSUMER_KEY CONSUMER_SECRET、ACCESS_TOKEN 、ACCESS_SECRETを代入し、Twitter APIを取得します。下の[xxxxxx]のところに、各種キーを設定してください。

# Tweepyライブラリをインポート
import tweepy
# 各種キーをセット
CONSUMER_KEY = 'xxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxx'
ACCESS_SECRET = 'xxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
#APIインスタンスを作成
api = tweepy.API(auth)


ユーザーのツイートにいいね(like)とフォロー(follow)を行う


さて、次に検索語句を指定し、検索します。そして、その語句を含んだツイートをリストにして取得します。それらのツイート一つ一つに、いいねとフォローをします。


下にコードをのせておきましたので、こちらのコードを見ながら、解説を見てください。

# Tweepyライブラリをインポート
import tweepy
# 各種キーをセット
CONSUMER_KEY = 'xxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxx'
ACCESS_SECRET = 'xxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
#APIインスタンスを作成
api = tweepy.API(auth)

q = "PythonとかScrapyとか使ってクローリングやスクレイピングするノウハウを公開してみる" #ここに検索キーワードを設定
count = 100
search_results = api.search(q=q, count=count)

for result in search_results:
    username = result.user._json['screen_name']
    user_id = result.id #ツイートのstatusオブジェクトから、ツイートidを取得
    print(user_id)
    user = result.user.name #ツイートのstatusオブジェクトから、userオブジェクトを取り出し、名前を取得する
    print(user)
    tweet = result.text
    print(tweet)
    time = result.created_at
    print(time)
    try:
        api.create_favorite(user_id) #ファヴォる
        print(user)
        print("をライクしました")
        api.create_friendship(user_id)
        print("をフォローしました")
    except:
        print("もうすでにふぁぼかフォローしてますわ")
    print("##################")

まず、qの中に、自分が検索したい語句を入れます。countには、検索結果の取得数を代入します。api.search()メソッドには、検索語句と、検索取得数を引数にとります。その結果がsearch_resultsにツイートがリスト型で取得されます。


今度は、リスト型で取得されたツイートに対して、一つ一つ情報を得ていきます。
api.create_favorite(user_id)では、指定したuser_idに対して、ファボすることができます。また、同様に、api.create_friendship(user_id)では、フォローを行うことができます。そのために、user_idをツイートオブジェクトから取得します。(user_id = result.id)


try句でくくっているのは、もしすでにファボをしているツイートをファボしたり、すでにフォローしている人にたいしてフォローしていると、エラーを起こしてしまうためです。そのため、try, exceptでエラーをキャッチしてあげています


一週間に一度、フォロワー数が100未満のユーザーはすべてリムーブする


最後に、自分のフォローしている人を取得して、その人が自分をフォローしていない人を選ぶ、さらに、その中でフォロワー数が100未満のユーザーはすべてリムーブするメソッドを作成します。先にコードを置いておきますね。

# Tweepyライブラリをインポート
import tweepy
# 各種キーをセット
CONSUMER_KEY = 'xxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxx'
ACCESS_SECRET = 'xxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
#APIインスタンスを作成
api = tweepy.API(auth)
userid = "never_be_a_pm" #ここに自分のuseridを入れる

followers_id = api.followers_ids(userid) #自分のアカウントのフォロワーをすべて取得する
following_id = api.friends_ids(userid) #自分のアカウントのフォロイングをすべて取得する
for following in following_id: #自分がフォローしているユーザーだけ取得する
    if following not in followers_id: #自分のフォローしているユーザーで、フォロワーに属さなユーザーを取得する 
        userfollowers = api.get_user(following).followers_count
        if userfollowers < 100:
            print("リムーブするユーザー名")
            username = api.get_user(following).name
            print(username)
            print("フォロワー数")
            print(userfollowers)
            api.destroy_friendship(following)


まず、user_idの中に自分のツイッターアカウントを代入します。
自分のフォロワーのIDをリスト形式に取得します。api.followers_ids(user_id)を利用することで、user_idをリスト形式で自分のフォロワーのidが取得されます(followers_id)
同様にapi.friends_id(user_id)で、自分がフォローしているユーザーを取得することができます。


アルゴリズム的には、まず

  1. 自分がフォローしているユーザーをfor文で回し
  2. もしそのユーザーが自分のフォロワーでなければ
  3. そのユーザーのフォロー数を調べ、
  4. 100人未満であれば(影響力がないので)
  5. リムーブする


という仕組みになっています。実際にリムーブしているのは、api.destroy_friendship(user_id)というメソッドですね。

Tweepyから画像つきツイートをする

こちらは以前、DMMのAPIからエロ画像を取得して投稿する試みで書いたコードです。画像を取得して、それをツイートするというコードなので、先に見てみてください。

import urllib.request
from requests_oauthlib import OAuth1Session # ライブラリ(1)
from bs4 import BeautifulSoup 
from TwitterAPI import TwitterAPI
import requests
import tweepy
import os


# 各種キーをセット
CONSUMER_KEY = '[CONSUMER_KEY]'
CONSUMER_SECRET = '[CONSUMER_SECRET]'
ACCESS_TOKEN = '[ACCESS_TOKEN]'
ACCESS_SECRET = '[ACCESS_SECRET]'

#apiを取得
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

# ツイート投稿用のURL
url = "https://api.twitter.com/1.1/statuses/update_with_media.json"

# DMMのAPP ID, AFFILIATE ID, 検索キーワードをセット

APPID = "[APPID]"
AFFILIATEID = "[AFFILIATEID]"
KEYWORD = "your keyword here"

#DMMのAPIを取得し、XMLをBeautifulsoupで取得
html = urllib.request.urlopen("https://api.dmm.com/affiliate/v3/ItemList?api_id=" + APPID + "&affiliate_id=" + AFFILIATEID + "%20&site=DMM.R18&service=digital&floor=videoa&hits=2&sort=date&keyword=" + KEYWORD + "&output=xml")
soup = BeautifulSoup(html,"html5lib")

#取得したXMLを整理して表示する

print("取得したデータを表示します")
print(soup.prettify())

#タイトル・女優・画像URL・動画URLを追加

items = soup.items #1つ1つのitemオブジェクトを取得
print("取得したitems数:{}".format(len(items.item)))
for item in items:
    print("--------------")
    title = item.title.string #動画タイトル
    title = (title[:40] + "..動画はこちら→") if len(title) > 75 else title #タイトルが40字過ぎたら省略
    print("title:{}".format(title))
    photoURL = item.imageurl.large.string  #画像URL
    print("photoURL:{}".format(photoURL))

    #動画によってはサンプル動画がない。ない場合エラーになるので、tryで囲む

    try:
        videoURL = item.samplemovieurl.size_476_306.string
        print("videoURL:{}".format(videoURL))

        #ツイート内容
        content = title + "|" + videoURL
        print("ツイート内容:{}".format(content))

        #DMMから取得した画像を一度ローカルに保存

        request = requests.get(photoURL, stream=True)
        filename = "temp.jpg"
        if request.status_code == 200:
            print("status_code == 200")
            with open(filename, 'wb') as image:
                for chunk in request:
                    image.write(chunk)
            api.update_with_media(filename, status = content)
            print("ツイートに成功しました")
            os.remove(filename)
        else:
            print("画像をダウンロードできませんでした")
    except Exception as e:
        print(e)
print("プログラムを終了しました")


Tweepyから画像をツイートするときのキモはここのコードですね。

videoURL = item.samplemovieurl.size_476_306.string
        print("videoURL:{}".format(videoURL))

        #ツイート内容
        content = title + "|" + videoURL
        print("ツイート内容:{}".format(content))

        #DMMから取得した画像を一度ローカルに保存

        request = requests.get(photoURL, stream=True)
        filename = "temp.jpg"
        if request.status_code == 200:
            print("status_code == 200")
            with open(filename, 'wb') as image:
                for chunk in request:
                    image.write(chunk)
            api.update_with_media(filename, status = content)
            print("ツイートに成功しました")
            os.remove(filename)
        else:
            print("画像をダウンロードできませんでした")
    except Exception as e:
        print(e)

ポイントは、

  • 画像を一度osを利用して、ローカルに保存する
  • 保存した画像の名前と、ツイート内容を引数に、以下のコードを実行する
api.update_with_media(filename, status = content)

というところです。一度データを保存しないと、普通に画像のURLをツイートしてしまいます。


Tweepyから検索する

まずはコードを見てみて下さい。

import urllib.request
from requests_oauthlib import OAuth1Session # ライブラリ(1)
from bs4 import BeautifulSoup 
from TwitterAPI import TwitterAPI
import requests
import tweepy
import os


# 各種キーをセット
CONSUMER_KEY = '[CONSUMER_KEY]'
CONSUMER_SECRET = '[CONSUMER_SECRET]'
ACCESS_TOKEN = '[ACCESS_TOKEN]'
ACCESS_SECRET = '[ACCESS_SECRET]'

#apiを取得
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

# twitter内を検索し、結果をエクセルに書き込む
for status in api.search(q='', lang='ja', result_type='recent',count=100): #qに検索語句,countに検索結果の取得数
    status.user.name #useridが出てくる
    status.user.screen_name)#ユーザー名が出てくる
    status.text #ツイート内容が出てくる
    status.created_at+ datetime.timedelta(hours=9),format #投稿時間が出てくる

キモはここですね。


# twitter内を検索し、結果をエクセルに書き込む
for status in api.search(q='', lang='ja', result_type='recent',count=100): #qに検索語句,countに検索結果の取得数
    status.user.name #useridが出てくる
    status.user.screen_name)#ユーザー名が出てくる
    status.text #ツイート内容が出てくる
    status.created_at+ datetime.timedelta(hours=9),format #投稿時間が出てくる

api.searchメソッドで、ツイートをリスト形式で取得します。一つ一つをfor文で取り出して、userid、ユーザー名、ツイート内容、投稿時間を取得しています。



Heroku schedulerを利用して、上記の機能を定期処理で自動化する


これらのコードを最終的には自動化します。heroku schedulerの使い方については前記事を見て参照してください。

【Pythonで定期処理】 Cloud9を利用して、Seleniumでherokuから定期実行する

Python Cloud9を利用して、定期処理をherokuから行う Cloud9というIDEを利用して、PythonからSeleniumを利用し、あるサイトでいいねを自動化するプログラムを作った。 これを定期実行を行いたい。検索してみると、crontabを使えば定期実行ができるようだが、cloud9上では実行できないらしい。 ほかの代替案を考えたとき、 heroku ...

最後に


こんな感じで、ツイッターのデータを取得したり検索したり、いろいろできます。ここには書いていませんでしたが、外部のAPIから情報を取得して、自動でツイートしたりすることもできます。(僕自身の、アダルトですが一つボットを作ってみました。)


【Python】Web上のデータを毎日自動収集して、Slackにぶち込んでみた - Cloud9, Heroku, Selenium, Slack API -

#背景 ちはっす。DAIです。 会社の同僚と自宅でよく作業会をやっています。音楽聞いて、料理食べて、あとはただコツコツとみんなでそれぞれが勉強するだけなのですが、とてもQOLが高いです。 さて、そんな作業会の中で、実際になんか役に立つ物作ろうぜ~って話でノリでつくったプログラム公開します


【Python】DMM Web APIでエッチなデータを取得し、Twitterで自動でえっちな投稿してみた

Pythonでエッチなプログラムを書いてみた こんにちは、 アダルトハッカーのDAIです。 前回、DMM Web APIを利用して、新人もののAVを取得 しました。今度は取得したXML形式のデータを使って、ツイッターに投稿してみました。(ちなみにツイッターの規定を読んだところ


APIから情報を引き出して、データをツイートするのは結構面白いので、面白そうなAPIがあればぜひ見てみてくださいね。

【Python】Pythonで遊んだAPIまとめ - DMM ・ Tinder ・ Twitter ・ Slack -

こんにちは、 アダルトサイエンティストのDAI です。会社ではJavaを書かなければならないのにもかかわらず、三大欲求に負けてPythonでエッチなことにしこしこ励んでいる毎日です。 僕のPythonデビューは2017年6月でした。 今では立派にDMMのAPIを利用して自分専用のエッチなBotをつくり、徐々にアダルトサイエンティストとしてキャリアを形成してきました。 ...

また、Tweepyを利用して、メッセージを送ったりと、ほかにもっといろいろなことができます。もしもっと応用的なことをやりたい場合は、公式ドキュメントを見てみてください!

Tweepy Documentation - tweepy 3.5.0 documentation


Python データ分析入門マニュアルに戻る

Python データ分析入門マニュアル - 実例を使ってWebスクレイピングからデータビジュアライゼーションまでやってみよう -

Python データ分析入門マニュアル Webスクレイピングからデータビジュアライゼーションを、プログラミングを学んだことのない人向けに0から解説するマニュアルです。何から学ぶべきか、環境構築はどうするかからはじまって、Webスクレイピング、データの前処理、そしてデータビジュアライゼーションまでを丁寧に解説します。 ...

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...