tweepyの導入とpython対話型コンソール上での操作(4)
少し慣れてきたので公式documentを参照しながらコードにする道筋を立てていく。
API Reference — tweepy 3.5.0 documentation
Followしているユーザーのリストを作成する。
テストユーザーとしてフォローの多い人を使用
>>> import twpy
>>> fl = api.friends_ids('anzusayuri5555')
>>> type (fl)
<class 'list'>
>>> len(fl)
5000
対象ユーザーのフォローが6401人だったので、どうやら上限の5000で停止した模様。
残り1401人を取得するには?
cursorを使用したpagingが必要になるようなのでtwpy.pyに以下のコードを追加する。
cursor = tweepy.Cursor
これによってCursorを使ったページングが可能になった。
Cursorは配列の番号のようなものをどこかに格納しておいて使うものかと思っていたが、どうやらもう少し複雑なもののようだ。ここではブラックボックスのまま、こうすれば使えるもんだということにしてしまって続ける。
>>> import twpy
>>> cursor = twpy.cursor
>>> friends_ids = []
>>> user_info = api.get_user('anzusayuri5555')
>>> for friend_id in cursor(api.friends_ids, user_id = user_info.id).items():
... friends_ids.append(friend_id)
...
>>> len(friends_ids)
6401
Cursorを使用してfriends_idsという配列にフォローしているユーザーのidの配列を格納できた。
>>> for friend_id in cursor(api.friends_ids('anzusayuri5555')).items():
... friends_ids.append(friend_id)
余談だが、上のコードは動かなかった。
参考にしたのは以下のサイト。
次は、
任意のユーザーのTweetを最新のものから任意の個数取得し、
取得した範囲を記憶し、次回取得時、
同じユーザーのTLを最新から前回取得した最新のものまで、
これまでに取得した最古のものの次から任意の個数まで、
取得する方法を調べる。
tweepyの導入とpython対話型コンソール上での操作(3)
RT機能のテスト
>>> tltest=api.home_timeline()
>>> tltest[0].text
"本日は晴天なり云々"
>>> twtid = tltest[0].id
たぶんtltest[0]と同じでオブジェクトの中身が全部列挙されている文字列が延々と続く。
web上で確認したところRTはできていた。
試しに削除してみる。
>>> api.destroy_status(api.user_timeline('orenoyome')[0].id)
web上で確認したところ先ほどのRTの削除はできていた。
ファイル出力
>>> apilimit=api.rate_limit_status()
>>> import json
>>> f = open('workfile', 'w')
>>> json.dump(apilimit, f)
>>> f.close()
APIはトータルで15分で180ということなのかな。
絵師さんのTweetをRTするbotについて(1)
作りたい機能:
フォローしている絵師さんのTweetのうち、絵付きのものを取りこぼすことなくRTする。絵付きTweetがあまりない時間であれば、過去の絵付きTweetをRTする。
頻度:
新規の絵付きTweet:絵師さんがTweetした後速やかに。
過去の絵付きTweet:新規Tweetがないときに。
絵付きTweetとは何か?
1.Twitterにアップロードされた絵付きのもの
てすと pic.twitter.com/vFM35VPBkL
— Mark Deriv (@orenoyome) 2016年6月4日
2.pixivなどの外部サイトを参照するもの(外部サイトに飛ばないと画像は見られない)
てすと、渋を指定した場合 https://t.co/VJlPAExm9E
— Mark Deriv (@orenoyome) 2016年6月4日
3.他にもあるかもしれないけれどちょっと分からない…
必要な機能
1.フォロー一覧を取得し、保存されているデータを更新する。
2.与えられたユーザーのTweetをn件取得する。ただし、保存されているデータを参照し、未読のTweetを新しい順に取得する。
3.与えられたTweetが画像付きか判定しRTする
4.1~3の機能をスケジュールにしたがって実行する。
tweepyの導入とpython対話型コンソール上での操作(2)
前回の復習
コマンドプロンプトを起動
>>> import twpy
# twpy.pyは前回のものを流用
>>> tl=api.user_timeline ('tokyoshashinbu', count = 200)
ここまでで@tokyoshashinbuの最新のTweetが200個まで取得できた。
>>> type(tl)
<class 'tweepy.models.ResultSet' >
ResultSetという型式で保存されているっぽい?
とりあえず hoge[i].key でアクセスできる、辞書を要素とした配列のようだ。
(i=要素の番号, key=属性の名前)
>>> type(tl_json)
<class 'dict' >
>>> tl_json.keys()
dict_keys(['created_at', 'user', ..., 'possibly_sensitive'])
>>> tl_json['text']
'本日は晴天なり云々'
jsonという名前は何か特別なもののようだが、
typeを見るとdictなのでここでは単なる辞書として扱う。
辞書としてキーを列挙したり、辞書内の要素にアクセスできることを確認した。
さて、前回entitiesの中身にアクセスし、media -> type -> photo という経路でTweetが画像付きであることが確認できそうだということを思いついたので可能かどうか挑戦する。
>>> tl[0].entities['media'][0]['type']
'photo'
>>> tl[0]._json['entities']['media'][0]['type']
'photo'
辞書・配列のkeyがごちゃっとしているが、この経路でphotoの情報まで到達可能。
文字だけのTweet等でどこかのkeyが存在しない場合は
KeyError: 'media'
のようなエラーが帰る。
また、_jsonの内容はtl[0]の中身と同じっぽい。確認はしてない。
tweepyの導入とpython対話型コンソール上での操作(1)
準備済だったこと
上記slideshareを参考にpython3.5のインストール
pipはデフォルトで同時にインストールされる
環境変数にC:/Users/userを追加
sublimeのインストールおよび日本語化
最初にやったこと
ここを参考にtweepyのインストール
Twitter開発者ページから各種キーを取得
例にあるのと同じ方法でimport用pyファイルの作成
対話型コンソールでのテストの前準備
対話型コンソールの起動
>>>
作成したimport用pyファイルのimport
>>>import twpy
apiオブジェクトを得る
tweepyを用いてAPIを通してTwitterにアクセスするテスト
現在の自分のTLの最新のTweetのTextを表示する
>>>print (api.home_timeline()[0].text)
本日は曇天なり。
対象のユーザー(@hoge)の投稿を100件取得し、オブジェクトに格納する(最大200件、それ以上は強制的に200件にされる)
api.user_timelineに関してはこちらが詳しい(tweepyが対応しているかどうかは不明)
hogetlに取得した投稿は様々な属性に分けられて格納されている
>>>print(hogetl[0].id)
315159265358979323
>>>print(hogetl[0])
最後のはすべての情報が表示される。とてつもなく多い。
取得可能な属性を知りたい場合は以下のように入力すると羅列される。Tweetによってあるものとないものがある模様。
>>>dir(hogetl[0])
['__class__', '_delattr__', ... 'user']
次にやること
画像付きURLを見分けるのは
>>>hogetl[i].entities
の中にあるtype='photo'でいいだろうか?それをもっとスマートに取り出すことはできるか?
JSONを使用して保存・解析ができるか?