tweepyの導入とpython対話型コンソール上での操作(4)

少し慣れてきたので公式documentを参照しながらコードにする道筋を立てていく。

API Reference — tweepy 3.5.0 documentation

 

Followしているユーザーのリストを作成する。

テストユーザーとしてフォローの多い人を使用

@anzusayuri5555

python

>>> import twpy

>>> api = twpy.api

>>> fl = api.friends_ids('anzusayuri5555')

>>> type (fl)

<class 'list'>

>>> len(fl)

5000

対象ユーザーのフォローが6401人だったので、どうやら上限の5000で停止した模様。

残り1401人を取得するには?

cursorを使用したpagingが必要になるようなのでtwpy.pyに以下のコードを追加する。

cursor = tweepy.Cursor

これによってCursorを使ったページングが可能になった。

Cursorは配列の番号のようなものをどこかに格納しておいて使うものかと思っていたが、どうやらもう少し複雑なもののようだ。ここではブラックボックスのまま、こうすれば使えるもんだということにしてしまって続ける。

python

>>> import twpy

>>> api = twpy.api

>>> 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)

 余談だが、上のコードは動かなかった。

参考にしたのは以下のサイト。

3846masa.hatenablog.jp

 

次は、

任意のユーザーのTweetを最新のものから任意の個数取得し、

取得した範囲を記憶し、次回取得時、

同じユーザーのTLを最新から前回取得した最新のものまで、

これまでに取得した最古のものの次から任意の個数まで、

取得する方法を調べる。

 

 

 

tweepyの導入とpython対話型コンソール上での操作(3)

RT機能のテスト

>>> tltest=api.home_timeline()

>>> tltest[0].text

"本日は晴天なり云々"

>>> twtid = tltest[0].id

>>> api.retweet(twtid)

たぶん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にアップロードされた絵付きのもの

 

2.pixivなどの外部サイトを参照するもの(外部サイトに飛ばないと画像は見られない)

 3.他にもあるかもしれないけれどちょっと分からない…

 

 

 必要な機能

1.フォロー一覧を取得し、保存されているデータを更新する。

2.与えられたユーザーのTweetをn件取得する。ただし、保存されているデータを参照し、未読のTweetを新しい順に取得する。

3.与えられたTweetが画像付きか判定しRTする 

4.1~3の機能をスケジュールにしたがって実行する。

 

 

 

 

 

tweepyの導入とpython対話型コンソール上での操作(2)

前回の復習

コマンドプロンプトを起動

python

>>> import twpy

# twpy.pyは前回のものを流用

>>> api=twpy.api

>>> tl=api.user_timeline ('tokyoshashinbu', count = 200)

 ここまでで@tokyoshashinbuの最新のTweetが200個まで取得できた。

>>> type(tl)

<class 'tweepy.models.ResultSet' >

ResultSetという型式で保存されているっぽい?

とりあえず hoge[i].key でアクセスできる、辞書を要素とした配列のようだ。

(i=要素の番号, key=属性の名前)

>>> tl_json = tl[0]._json

>>> type(tl_json)

<class 'dict' >

>>> tl_json.keys()

dict_keys(['created_at', 'user', ..., 'possibly_sensitive'])

>>> tl_json['text']

'本日は晴天なり云々'

jsonという名前は何か特別なもののようだが、

typeを見るとdictなのでここでは単なる辞書として扱う。

辞書としてキーを列挙したり、辞書内の要素にアクセスできることを確認した。

Pythonを学ぼう 第15回 辞書の操作 - ほぷしぃ

 

さて、前回entitiesの中身にアクセスし、media -> type -> photo という経路でTweetが画像付きであることが確認できそうだということを思いついたので可能かどうか挑戦する。

statsbeginner.hatenablog.com

 

>>> 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)

準備済だったこと

www.slideshare.net

 

上記slideshareを参考にpython3.5のインストール

pipはデフォルトで同時にインストールされる

環境変数にC:/Users/userを追加

sublimeのインストールおよび日本語化

 

 

最初にやったこと

statsbeginner.hatenablog.com

ここを参考にtweepyのインストール

Twitter開発者ページから各種キーを取得

例にあるのと同じ方法でimport用pyファイルの作成

 

対話型コンソールでのテストの前準備

対話型コンソールの起動

python

>>>

 作成したimport用pyファイルのimport

>>>import twpy

apiオブジェクトを得る

>>>api = twpy.api

 

tweepyを用いてAPIを通してTwitterにアクセスするテスト

現在の自分のTLの最新のTweetのTextを表示する

>>>print (api.home_timeline()[0].text)

本日は曇天なり。

 

対象のユーザー(@hoge)の投稿を100件取得し、オブジェクトに格納する(最大200件、それ以上は強制的に200件にされる)

>>>hogetl=api.user_timeline('hoge', count=100)

api.user_timelineに関してはこちらが詳しい(tweepyが対応しているかどうかは不明)

syncer.jp

hogetlに取得した投稿は様々な属性に分けられて格納されている

>>>print(hogetl[0].id)

315159265358979323

>>>print(hogetl[0])

最後のはすべての情報が表示される。とてつもなく多い。

取得可能な属性を知りたい場合は以下のように入力すると羅列される。Tweetによってあるものとないものがある模様。

>>>dir(hogetl[0])

['__class__', '_delattr__', ... 'user']

 

 

次にやること

画像付きURLを見分けるのは

>>>hogetl[i].entities

の中にあるtype='photo'でいいだろうか?それをもっとスマートに取り出すことはできるか?

 

JSONを使用して保存・解析ができるか?