twitter管理アプリの機能追加

· ☕ 1

昨日のツールではフォローしているかとされているかしか取得できていないので、もう少し詳細情報を付与していく。

lambdaの元になるpython作成

今日やるのは

  • dynamoのフルスキャン

  • 詳細最終取得日がない物⇒詳細最終取得日が古い物順にソート

  • ↑から15件ほどユーザー詳細情報を取得

  • データ加工

  • dynamoに登録

dynamoのフルスキャン

昨日と同じのの使いまわし

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def scanDynamo(tableName):
    dynamodb = boto3.resource('dynamodb')
    dynamodb_table = dynamodb.Table(tableName)
    response = dynamodb_table.scan()
    data = response['Items']
    while 'LastEvaluatedKey' in response:
        response = dynamodb_table.scan(
            ExclusiveStartKey=response['LastEvaluatedKey'])
        data.extend(response['Items'])

    return data

詳細最終取得日が古い物順にソート

フォローされてるか、フォローしてる人だけを対象にしてからソート

1
2
users = list(filter(lambda x:x['follow'] or x['followed'],users))
users.sort(key=lambda x: x['last_get_detail'])

↑から15件ほどユーザー詳細情報を取得

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def getDetail(userId):
    sleepTime = random.random() * 30
    time.sleep(sleepTime)
    res = requests.get(
        f'https://api.twitter.com/1.1/users/show.json?user_id={userId}',
        auth=getOauth()
    ).json()
    if 'errors' in res:
        if res['errors'][0]['code'] != 50:
            print(res)
            raise RuntimeError(res)

    result = {'name': res['name']
              , 'description': res['description'] if res['description'] != '' else None
              , 'location': res['location'] if res['location'] != '' else None
              , 'last_get_detail': getNow()
              , 'last_tweeet_date': datetime.datetime.strptime(
                 res['status']['created_at'], '%a %b %d %H:%M:%S +0000 %Y').strftime("%Y/%m/%d %H:%M:%S"), 'last_tweeet': res['status']['text']
             }

    return result

targetUsers = dict(map(lambda val: (int(val['id']), val), users[:15]))
[targetUsers[x['id']].update(getDetail(x['id'])) for x in targetUsers.values()]

dynamoに登録

昨日と同じ

1
2
3
4
dynamoDB = boto3.resource('dynamodb')
table = dynamoDB.Table('twitter_follower_dev')

[putDynamo(val) for val in targetUsers.values()]

結果

できた。

dynamo


るな
るな
エンジニア