def get_users_detail_in_follower(): before_table = diff_ff_table_to_user_table() if len(before_table) == 0: return True # FFTable <- Follower, FriendのDBよりid一覧 # Fromは詳細情報の存在が確定しているのでToより選択する。 table_count = 0 users = list() # Pythonの[]表記は、[開始:終点-1]。 while (True): end_point = min(table_count + 100, len(before_table)) try: users.extend(api.lookup_users(before_table[table_count:end_point])) except tweepy.RateLimitError: return False except tweepy.TweepError: slack_error_message(traceback.format_exc()) return False # 取得したいユーザー名一覧を座標が超えていたら終了。そうでなければ座標を100(取得数)ずらす。 if table_count + 100 > end_point: # tweepyのuserオブジェクト(戻り値)はそのままでは加工出来ない為、dictに変換する(ややこしい) users_dict = [v._json for v in users] set_users_detail(users_dict) return else: table_count += 100 return True
def get_redis(): """ Get the working redis instance """ try: r = redis.StrictRedis(host=os.getenv('REDIS_HOST', 'localhost'), port=os.getenv('REDIS_PORT', 6379), password=os.getenv('REDIS_PASSWORD'), db=0) r.get('test123') except Exception: r = False message = "redis unavailable. Uploaded videos will be duplicated on subsequent executions." logging.warning(message) slack_error_message(message) return r
def upload_video_to_facebook(video): """ Uploads a given video to Facebook Graph API """ session = get_facebook_session() files = {} if video['thumb_url']: thumb_response = requests.get(video['thumb_url']) files['thumb'] = thumb_response.content request_url = 'https://graph-video.facebook.com/v2.4/%s/videos' % (os.getenv('MTFV_FACEBOOK_ENTITY_ID')) response = session.post(request_url, data=video, files=files) if not response.ok: logging.warning(response.json()['error']['message']) slack_error_message(response.json()['error']['message']) return logging.info(response.content) slack_info_message('Uploaded "%s" to https://facebook.com/%s' % (video['title'], response.json()['id'])) set_value(video['guid'], response.json()['id'])
def get_valid_user(select_timestamp): user_list = list(db_user.find({select_timestamp: 0})) get_users_detail_in_follower() # follow, followerの取得漏れを防ぐ。 # 0件もヒットしなかった場合は、Slackに報告し、ランダムにユーザーを取得する。(お気に入りユーザー検索を続ける)。 if len(user_list) == 0: slack_error_message("%s 取得対象ユーザーが1件も見つかりませんでした。" % datetime.now()) sleep(600) get_valid_user(select_timestamp) # 1件ヒットの場合は、取得したユーザーを返す。 elif len(user_list) == 1: return user_list[0] # 2件以上ヒットの場合は、以下の処理を行う。 # 1. 取得したユーザーごとの得点テーブルを作る。 # 2. 他のselect_timestampが0以外(つまり計算されている)場合、スコアを+1する。 # 3. フォロワー数 / 2000をスコアに足す。 # 4. 最もスコアの多いユーザーを返す。 else: # ユーザーIDと得点の相対表を作っておく。 return sort_user_id_by_score(user_list, select_timestamp)
def get_facebook_session(): session = OAuth2Session( client_id=os.getenv('FACEBOOK_CLIENT_ID'), client_secret=os.getenv('FACEBOOK_CLIENT_SECRET'), access_token=os.getenv('FACEBOOK_AUTH_TOKEN'), ) request_url = "https://graph.facebook.com/%s?metadata=1" % (os.getenv('MTFV_FACEBOOK_ENTITY_ID')) response = session.get(request_url) if response.json()['metadata']['type'] == 'page': response = session.get('https://graph.facebook.com/%s/accounts' % (os.getenv('MTFV_FACEBOOK_USER_ID'))) data = [page for page in response.json()['data'] if page['id'] == os.getenv('MTFV_FACEBOOK_ENTITY_ID')] if not data: message = "Facebook user account doesn't have access token for page." logging.error(message) slack_error_message(message) exit() session = OAuth2Session( client_id=os.getenv('FACEBOOK_CLIENT_ID'), client_secret=os.getenv('FACEBOOK_CLIENT_SECRET'), access_token=data[0]['access_token'], ) return session
def get_user_action(user_id, page=1, tweet=True): try: select_function = api.user_timeline if tweet else api.favorites c = select_function(user_id=user_id, count=200, page=page) if len(c) == 0: return c_modify = [v._json for v in c] db = db_tweet if tweet else db_like db.insert_many(c_modify) get_user_action(user_id, page + 1, tweet=tweet) except tweepy.RateLimitError: logging.info("[UserTweet] Stop Iteration, process complete") slack_message("[%s] ツイート取得の上限に達しました" % "Timeline" if tweet else "Like") sleep(60 * 15) get_user_action(user_id, page, tweet=tweet) except tweepy.TweepError: slack_error_message(traceback.format_exc()) return