僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

tweepyとtwitterAPIでPythonからtwitterを操作してみた

f:id:htmllifehack:20170909225629j:plain

TwitterAPIに登録するとTwitterのアプリを作成できます。

設定の画面にあるアプリ連携ってやつですね。

このAPIを使うことで外部からツイートしたりタイムラインを取得したりできるわけです。

外部ってのが例のごとくPythonになります。

PythonにはTweepyというTwitterを比較的簡単に操作できるモジュールがあるのです。

画像収集スクリプトよりは簡単にできましたが一応ハマった部分があったのでメモっておこうと思います。

www.htmllifehack.xyz


ちなみに今回やったことは、

Tweppyを使ってPythonからツイートする

タイムラインを取得する

キーワード検索で特定のツイートを取得する、です。

それでは行ってみようー



Twitter APIとはなにか

APIってのはソフトウェアの機能を一般公開することで皆々様とその機能を共有しようじゃないか!っていうもの。

Twitter APIでいえば、ツイートの機能やタイムラインの機能をTwitterを介さずに外部からその機能を使えるよってこと。

なのでAPIに登録しちゃえばPythonを使ってターミナルからツイートしたり、ほかのユーザーのツイートを確認したりができる。

なのでコード次第でBotも作れるし、自動フォローもできるし、市場調査だってできたりする。

ただAPIには制限があって、例えば何時間に何回までしか使えないだとか連続で使えないだとかそんなところ。

ちなみにAPIを使わない方法もあるが僕にはまだ理解できない。

TwitterAPIに登録

APIがなんなのかわかったところで実際に登録してみよう。

やってみないとどんなもんなのかわからないでしょ。

事前準備するもの。

・電話番号を登録したTwitterアカウント

APIに登録すると、Consumer Key、Consumer Secret、Access Token、Access Token Secretが得られます。

この4つのキーを使って認証します。

TwitterAPIの登録はこちらの記事を参照ください。

Python3でTwitterAPIを使い方をどのサイトにも負けないくらい丁寧に解説してみた

PythonでTwitterを操作する。(アカウント編)

下準備

Twitterを操作できるモジュールはいろいろあるようですが、今回はtweepyを使います。

$ sudo pip install tweepy
# coding:utf-8

import tweepy

Consumer_key = '00LtW*****************'
Consumer_secret = 'iqnFIN***********************************'
Access_token = '39373094**************************************'
Access_secret = '2zH******************************************'

auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret)
auth.set_access_token(Access_token, Access_secret)

api = tweepy.API(auth)

print('ok')

consumer_key、consumer_secret、access_token、access_secretはtwitterAPIに登録するともらえるキーです。

authはOAuthの情報を入れたものです。

で.set_access_tokenがアクセストークンをセットする関数なんじゃないかと思われます。

OAuthってのはログインIDやパスワードを入力しないで認証が取れる認証方式の一種です。

信頼あってこその方式ですね。

参考サイト

http://wa3.i-3-i.info/word11616.html

Dropbox・Evernote・Twitter を使うアプリで見かける「OAuth認証」って何? | AppBank – iPhone, スマホのたのしみを見つけよう

api = tweepy.api(auth)はたぶんtweepyを使ってapi情報を取得する動きがあるんですが、インスタンスというらしいです。

クラスとかインスタンスがまだいまいちわかってないのであれですね、基本的なところも勉強する必要がありますね。

最後にちゃんとtweepyが読み込まれるか、キーは合っているか確認のため大丈夫ならokと表示させるようにしました。

importErrorの場合はtweepyがどのディレクトリにインストールされたのか確認する必要があります。

importの前にパスを書き込んであげるとちゃんと読んでくれますよ。

前回の記事を参考にしてください。

【Python3】progressbarとtqdmがImportErrorになったのでsys.pathで導いてあげた - 僕の世界観を変えてみる

not found の場合はファイル名を確認してください。

tweepy.pyという名前で保存してるとそのファイルを読み込んじゃうので読み込むモジュールとは異なる名前で保存しないとダメです。

pythonからツイートする

tweepyの...なんか書こうとしたけど忘れたwまいいかw

# coding:utf-8
import sys
sys.path.append('/home/toor/ドキュメント/python') #tweetpy.pyのパスを指定
import tweetpy # .pyは書かなくてもimportできた

api = tweetpy.api # apiと打つだけでtweetpy.apiを指示できる
api.update_status(status='pythonからツイートしてます') # 連続で同じ内容のツイートはできない

上の項目で作ったtweetpy.pyをimportします。

僕の場合はドキュメント/pythonに保存しているのでsys.pathでパスを指定しました。

コメントにあるようにapiと入力することでtweetpy.apiを読み込んでます。

ツイートするときはupdate_statusを使うようです。

tweepyのバージョンによって書き方がことなるようで

api.update_status('pythonnからツイート')でokって書かれた記事もあったんですけど、これだとツイートできませんでした。

僕が使っているのはバージョン3.5で、その記事だと2.Xだったような?

ということなので気を付けましょう。

ちなみに同じ内容のツイートを連投するとエラーがでます。

tweepy.error.TweepError: [{'code': 187, 'message': 'Status is a duplicate.'}]

これはコードうんぬんではなくtwitter側がスパム防止のために講じた策のようです。

どうしてもスパム行為したい場合は文章の最後に時刻を入れると回避できそうです。

凍結されたくないので僕はやってません。

タイムラインを表示してみる

# coding:utf-8
import sys
sys.path.append('/home/toor/ドキュメント/python') 
import tweetpy

api = tweetpy.api 
for result in api.home_timeline(count=10):
    print(result.text)

タイムラインの表示はapi.home_timeline()で行います。

引数にcount=10を入れると10件分表示される形となります。

最後に.textにした理由は、テキストにしないと他の情報も入ってきてすごい量になっちゃうからです。

やってみたらわかると思います。

で、for文使ったのは.textを使うためです。

print(api.home_timeline(count=10).text)にするとAttributeErrorになっちゃうんです。

textの使い方間違えてる?

取得した結果が以下

toor@toor-VirtualBox:~/ドキュメント/python$ python3 twesc.py
RT @momokurumy: 「子供の頃「地球最後の日に何する?」って話で「ご馳走食べに行く」とか「遊園地で遊び倒す」とか答えたヤツに地球最後の日にそんなとこ営業してるわけないって笑ってたじゃないですか?でも今の日本ならそれ行けそうですよねw」って今日お客さんと話して悲しく笑…
RT @24000cm: この人オタクの願望でどんどん乳を盛られて可哀想だと思う https://t.co/n94Hcu9kmf
マルチサービスで勝つには?UNITED 金子社長に聞く「新規事業に強い組織づくり」 https://t.co/jYD1Iy8loe
@kpx_gt フォロパありがとうございます(^^)

普段は占い師で字相を見ています。
実力を上げるために様々な方の字を見ています。

もし良かったら、
筆跡占いに協力してもらえませんか笑笑??
メルマガは、お客様をリピーターにするために強力な効果を発揮します。https://t.co/SeXCO7ilIp #人を動かす文章添削サービス
そろそろソフトバンクが2年になるので、とりあえず今の機種をsimフリー化しておいた(^ω^)

#simフリー #iPhoneSE
【相互フォロー支援アカウント】当アカウントを上手に使ってフォロワーを増やしましょう。<手順> 当アカウントをフォロー→このツイートをRT→当アカウントのフォロアーをフォローRTすればする程フォロー返しで自身のフォロワーが増えていきます。 (#sougofollow) 86
RT @simanekomama: @chan_yamamoto (1)日米の演習が 北朝鮮の態度を さらに エスカレートしているのではないか。という指摘 が、前提。
 (2)エスカレートしている行為を 一端休む、という選択肢をとるかどうか、という話
(3)圧力だけでなく、対話…
RT @simanekomama: @chan_yamamoto 働きかけというのは、対話を持つうえで必要です。
ブログ記事紹介:[Vagrant] Plugins #global-status「起動しているBOXの一覧を表示」 https://t.co/geFO2mFz9I
#Server #vagrant https://t.co/iQqWgpmPy3

ちなみにリストで指定するとfor使わなくても平気みたいです。

print('リスト表示の場合\n' + api.home_timeline()[1].text)
for result in api.home_timeline(count=1):
    print('for文の場合\n' + result.text)

表示結果

toor@toor-VirtualBox:~/ドキュメント/python$ python3 twesc.py
リスト表示の場合
ブログ記事紹介:ゲーム脳を鍛えよう https://t.co/3meyYrUzGi
#Game #Human skill https://t.co/TDCaW6sCOd
for文の場合
電子書籍 (Kindle版) 「たった1日で基本が身に付く! JavaScript超入門」2,225円、出版社:技術評論社、著:WINGSプロジェクト/片渕彼富、監修:山田祥寛
https://t.co/aKapMnAeJr

結果はどっちでも同じですね。

キーワード検索してみる

# coding:utf-8
import sys
sys.path.append('/home/toor/ドキュメント/python')
import tweetpy 

api = tweetpy.api 
search = api.search(q='python',lang='ja',count=10) 
for result in search:
    print(result.text)

api.searchでキーワード検索ができるようです。

q = クエリのことでこれはpython関連のツイート検索しています。

count = で何件分表示するか指定できます。

lang = これで日本語を指定しないとなんだかわからないツイートも表示されるのでjaにしています。

APIリファレンスによるとISO 639-1コードで指定できるようです。

表示結果

toor@toor-VirtualBox:~/ドキュメント/python$ python3 twpytest.py
RT @24motz: Pythonを使う人の大多数はもはやプログラマーではないという、恐るべき現実を理解したのが今年の収穫 #pyconjp
「PyCon APAC 2017 in Malaysia」参加レポート:Day2:Jessica McKellar氏キーノート,「美しいコーディング」とは,Pythonで「見える」物理/数学教育 #gihyojp https://t.co/pWA6sVpejL
highSierraでもpythonは2.7なのかあ。
Appleはどうするんだろう?
#pyconjp 遅ればせながら、上げさせて頂きます😃
ご参考になれば、幸いです。

PyCon JP 2017チュートリアル「Pythonを用いたデータ分析入門」に参加してまいりました
https://t.co/4YQhTp6lZ3
みんなPythonどう使ってるんや
推し言語はhaskell

世間はpythonだけども
RT @24motz: Pythonを使う人の大多数はもはやプログラマーではないという、恐るべき現実を理解したのが今年の収穫 #pyconjp
あ゛あ゛あ゛あ゛待ってーーー・・・。pythonも参照渡しなのかーーー・・・。
どうでもいいけど、Pythonの使い手は、Pythonist, Pythonia, Pythoner, Pythonistaと、呼称が人によって違ってめちゃくちゃ
@aka__cs タヌキも見てます…←

ちゃんと絵文字も表現できるようですね。

まとめ

これでpythonからツイートができるようになりました。

次回は自動でフォローできるような仕組みを作っていこうかと思います。

それにしても、pythonもいきなりスクレイピングから入ったので基本的な知識が足りなくて苦戦しています。

Progateも無料でできるところまでは終わってしまったのでもう一回最初からやろうかな。

あとpython以外にPHPでいじってるひともいるようでPHPの記事も多く出てきます。

PHPも理解できたらもっと早くやりたいことができそうですね。

参考サイト

Tweepyを使って、PythonでTwitterのAPIを超簡単に操作する - StatsBeginner: 初学者の統計学習ノート
Tweepyのstatusリストで何が取れるのかわからなかったので、取り出してみた - Qiita
API Reference — tweepy 3.5.0 documentation