3
3
import tweepy
4
4
import requests
5
5
from functools import wraps
6
- from tweepy import RateLimitError
6
+ from tweepy import RateLimitError , TweepError
7
+ from requests import ConnectionError , Timeout
7
8
8
9
9
10
class NoTimelineError (ValueError ):
@@ -20,7 +21,7 @@ def __init__(self, consumer_key, consumer_secret,
20
21
access_token , access_token_secret , ** kwargs ):
21
22
self .consumer_key = consumer_key
22
23
self .consumer_secret = consumer_secret
23
- self .access_token_key = access_token
24
+ self .access_token_key = self . access_token = access_token
24
25
self .access_token_secret = access_token_secret
25
26
self .wait_on_ratelimit = kwargs .get ('wait_on_ratelimit' , False )
26
27
@@ -59,6 +60,13 @@ def wrapper(*args, **kwargs):
59
60
self ._bon_post = _rate_limited (requests .post )
60
61
61
62
63
+ @classmethod
64
+ def create_from (cls , instance , ** kwargs ):
65
+ my_kwargs = vars (instance )
66
+ my_kwargs .update (kwargs )
67
+ return cls (** my_kwargs )
68
+
69
+
62
70
@property
63
71
def bon_api_path (self , method = '' ):
64
72
return '%s/%s' % (self .botornot_api .rstrip ('/' ), self .api_version )
@@ -103,6 +111,9 @@ def _check_account(self, user_data, tweets):
103
111
return bon_resp .json ()
104
112
105
113
114
+ ####################
115
+ ## Public methods ##
116
+ ####################
106
117
107
118
108
119
def check_account (self , user ):
@@ -112,3 +123,34 @@ def check_account(self, user):
112
123
classification = self ._check_account (user_data , tweets )
113
124
114
125
return classification
126
+
127
+
128
+ def check_accounts_in (self , accounts , ** kwargs ):
129
+ #sub_instance_kwargs = vars(self)
130
+ #sub_instance_kwargs['wait_on_ratelimit'] = True
131
+ sub_instance = self .create_from (self , wait_on_ratelimit = True )
132
+ # BotOrNot(**sub_instance_kwargs)
133
+
134
+ max_retries = kwargs .get ('retries' , 3 )
135
+ num_retries = 0
136
+
137
+ for account in accounts :
138
+ for num_retries in range (max_retries + 1 ):
139
+ result = None
140
+ try :
141
+ result = sub_instance .check_account (account )
142
+ except (TweepError , NoTimelineError ) as e :
143
+ err_msg = '{}: {}' .format (
144
+ type (e ).__name__ ,
145
+ getattr (e , 'msg' , '' ) or getattr (e , 'reason' , '' ),
146
+ )
147
+ result = {'error' : err_msg }
148
+ except (Timeout , ConnectionError ) as e :
149
+ if num_retries >= max_retries :
150
+ raise
151
+ else :
152
+ time .sleep (2 ** num_retries )
153
+
154
+ if result is not None :
155
+ yield account , result
156
+ break
0 commit comments