예제 #1
0
def follow_target_user(user_screen_name, status):
    """
    指定したuser_screen_nameのユーザーで、statusのユーザーの自動フォロー処理を行う
    return: True or False(True = フォロー成功)
    """
    target_user_screen_name = status.user.screen_name
    # フォロワーが300人以下ならフォローしない
    followers_count = status.user.followers_count
    follow_target_min_follower_count = 300
    if followers_count < follow_target_min_follower_count:
        print("{}はフォロワーが{}人以下だったからフォローしなかったよ".format(
            target_user_screen_name, follow_target_min_follower_count))
        return False
    # user_screen_nameがDBに保存されていない場合はフォローしない
    own_user = twitter_user_repository.search_user(user_screen_name)
    # プロフィールか自己紹介に公序良俗に反する言葉が含まれていた場合はフォローしない
    if common_service.contain_dangerous_word(
            status.user.name) or common_service.contain_dangerous_word(
                status.user.description):
        print("{}は公序良俗に反する言葉が含まれていたからフォローしなかったよ".format(
            status.user.screen_name))
        return False
    # フォロー履歴が1年以内にあればフォローしない
    own_user_id = own_user.user_id
    target_user_id = status.user.id
    follow_opt = twitter_follow_repository.search_follow(
        own_user_id, target_user_id)
    year_ago = timeutil_service.culc_before_year(1)
    if (follow_opt is not None) and (follow_opt.upd_datetime > year_ago):
        print("{}は1年以内にフォローしたことあるからフォローしなかったよ".format(target_user_screen_name))
        return False
    # フォロー
    api = twitter_common_service.prepare_twitter_api(user_screen_name)
    follow_user(api, own_user_id, target_user_id)
    return True
예제 #2
0
def search_popular_tweet_and_retweet_only(user_screen_name, query,
                                          retweet_count):
    """
    user_screen_nameのTwitterユーザーでqueryで話題のつぶやきを探してretweet_count個リツイートする
    """
    # twitterのアクセス情報
    api = twitter_common_service.prepare_twitter_api(user_screen_name)
    search_results = twitter_common_service.search_tweet(
        api, query, 'popular', 100)

    if len(search_results) == 0:
        print('ツイート見つからなかったす。')
        return

    # いいね数の多い順のつぶやき一覧取得
    statuses = twitter_common_service.sort_by_favorite_count(
        search_results, True)
    # いいね数の多いretweet_count個のつぶやき取得
    top_statuses_dictionary = twitter_common_service.select_statuses(
        statuses, retweet_count)
    for status in top_statuses_dictionary.values():
        # リツイートリンク作る
        tweet_link = 'https://twitter.com/{}/status/{}'.format(
            status.user.screen_name, status.id)
        # リツイートする
        api.update_status(status=tweet_link)
예제 #3
0
def unfollow(user_screen_name, max_count):
    """
    指定したuser_screen_nameのユーザーで、上限max_countだけフォローを外していく。
    """
    print('---------------- user:{}でアンフォロー処理開始'.format(user_screen_name))
    api = twitter_common_service.prepare_twitter_api(user_screen_name)
    unfollow_count = 0
    stop_second = 90
    max_count = int(max_count)

    user_opt = twitter_user_repository.search_user(user_screen_name)
    # 対象ユーザーがDBにまだ登録されていないなら登録する。
    if user_opt is None:
        print("user:{}はDBに登録されてなかったからDB登録するよ".format(user_screen_name))
        search_insert_user(user_screen_name, user_screen_name)
        user_opt = twitter_user_repository.search_user(user_screen_name)

    own_user_id = user_opt.user_id
    friend_ids = api.friends_ids(user_screen_name)
    for friend_id in friend_ids:
        unfollow_success = unfollow_target_user(api, own_user_id, friend_id)
        if unfollow_success:
            unfollow_count = unfollow_count + 1
            print('「{}」人アンフォローした'.format(str(unfollow_count)))
            if unfollow_count % 3 == 0:
                print('「{}」人一気にアンフォローした...'.format(str(unfollow_count)))
                timeutil_service.sleep(stop_second)
        # アンフォロー人数が上限に達したら処理終了
        if unfollow_count >= max_count:
            print('---------------- user:{}でアンフォロー処理終了(フォロー人数:{})'.format(
                user_screen_name, str(unfollow_count)))
            return
예제 #4
0
def search_follow(user_screen_name, query, max_count):
    """
    指定したuser_screen_nameのユーザーで、queryで検索したツイッターユーザーをmax_count数フォローして、DBにフォローデータを登録
    """
    api = twitter_common_service.prepare_twitter_api(user_screen_name)
    follow_count = 0
    i = 0
    max_id = None
    search_count = 100
    stop_second = 90
    max_count = int(max_count)
    friend_ids = api.friends_ids(user_screen_name)

    # 対象ユーザーがDBにまだ登録されていないなら登録する。
    if twitter_user_repository.search_user(user_screen_name) is None:
        print("user:{}はDBに登録されてなかったからDB登録するよ".format(user_screen_name))
        search_insert_user(user_screen_name, user_screen_name)
        print("user:{}はDBに登録されてなかったからDB登録したよ".format(user_screen_name))

    for i in range(10):
        print('{}回目の検索'.format(str(i + 1)))
        if max_id is None:
            search_results = api.search(q=query, count=search_count)
        else:
            search_results = api.search(q=query,
                                        count=search_count,
                                        max_id=max_id)
        for status in search_results:
            print('---------------------------------------')
            if status.user.id in friend_ids:
                print('user_id:{}はすでにフォローしてたからフォローしなかったよ'.format(
                    status.user.id))
                continue
            follow_success = follow_target_user(user_screen_name, status)
            if follow_success is True:
                follow_count = follow_count + 1
                # 一気にフォローすると危険アカウント認定される恐れあるため、処理一時中断
                if follow_count % 10 == 0:
                    print('{}人一気にフォローした...'.format(follow_count))
                    timeutil_service.sleep_second(stop_second)
            print('「{}」人フォローした'.format(str(follow_count)))
            if follow_count >= max_count:
                print('{}人フォロー完了したから処理終了'.format(str(follow_count)))
                return
        # 一番古いツイートよりも古いツイートを探すため、一番古いツイートID取得
        max_id = search_results[-1].id
        # 一気にフォローすると危険アカウント認定される恐れあるため、処理一時中断
        print('{}人チェックした...'.format(search_count))
        timeutil_service.sleep_second(stop_second)
    print('{}回検索したから処理終了'.format(str(i + 1)))
예제 #5
0
def search_unpopular_tweet_and_tweet(user_screen_name, query):
    """
    user_screen_nameのTwitterユーザーでqueryで話題でないつぶやきを探して真似してツイートする
    """
    # twitterのアクセス情報
    api = twitter_common_service.prepare_twitter_api(user_screen_name)
    search_results = twitter_common_service.search_tweet(
        api, query, 'popular', 100)

    if len(search_results) == 0:
        print('ツイート見つからなかったす。')
        return

    # いいね数の少ない順のつぶやき一覧取得
    statuses = twitter_common_service.sort_by_favorite_count(
        search_results, False)
    # いいね数の多い1つのつぶやき取得
    unpopular_status_dictionary = twitter_common_service.select_statuses(
        statuses, 1)
    for status in unpopular_status_dictionary.values():
        # ツイートする
        api.update_status(status=status.text)
예제 #6
0
def post_top_tweet(message, word):

    search_comment = '「{}」でtweet検索するね...'.format(word)
    send_to_slack(message, search_comment)

    # twitterのアクセス情報
    api = twitter_common_service.prepare_twitter_api('virtual_techX')
    search_results = twitter_common_service.search_tweet(
        api, word, 'popular', 100)
    if len(search_results) == 0:
        send_to_slack(message, 'ツイート見つからなかったす。')
        return

    # いいね数の多い順のつぶやき一覧取得
    statuses = twitter_common_service.sort_by_favorite_count(
        search_results, True)
    # いいね数の多い5つのつぶやき辞書取得
    top_five_statuses_dictionary = twitter_common_service.select_statuses(
        statuses, 5)
    top_five_statuses = top_five_statuses_dictionary.values()
    # slackにポストする形式に整えた文章作成
    text = twitter_service.create_tweet_list_text(top_five_statuses)

    send_to_slack(message, text)