Пример #1
0
def postTweet(session, res_text, src_tweet_id):

    unavailableCnt = 0

    url = "https://api.twitter.com/1.1/statuses/update.json"  #ツイートポストエンドポイント

    while True:
        reset = check_limit.checkLimit(session)

        try:
            res = session.post(url,
                               params={
                                   'status': res_text,
                                   'in_reply_to_status_id': src_tweet_id
                               })
        except SocketError as e:
            print('ソケットエラー errno=', e.errno)
            if unavailableCnt > 10:
                raise

            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            unavailableCnt += 1
            continue

        if res.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        if res.status_code == 403:  #post文重複対策
            res_text = res_text + '_'
            unavailableCnt += 1
            continue

        unavailableCnt = 0

        if res.status_code != 200:
            raise Exception('Twitter API error %d' % res.status_code)
        else:
            break
Пример #2
0
def main_loop(search_word, session):
    total = -1
    total_count = 0
    cnt = 0

    url = 'https://api.twitter.com/1.1/search/tweets.json'  # ツイートを検索して取得するためのエンドポイント

    loop_start_time = get_tweet.FIRST_LOOP_START_TIME

    # 1回のループで100ツイートを取得します。
    while True:
        next_reset_time = check_limit.checkLimit(
            session)  # 回数制限を迎えていたら回復するまで待機。
        tweets_get_time = time.mktime(
            datetime.datetime.now().timetuple())  #現在時刻取得

        unavailableCnt = 0  # ツイートの取得に失敗した回数。

        try:
            res = session.get(url, params={
                'q': search_word,
                'count': 100
            })  # 検索し、100件のツイートを取得。
        except SocketError as e:
            print('ソケットエラー errno=', e.errno)
            if unavailableCnt > 10:
                raise

            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            unavailableCnt += 1
            continue

        if res.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        if res.status_code != 200:
            raise Exception('Twitter API error %d' % res.status_code)

        loop_start_time, count, total_text = get_tweet.getTweet(
            res, loop_start_time, next_reset_time,
            session)  # 100件のツイートからリプライのみを抽出してペアで取得する。

        # ファイル書き込み
        date = datetime.date.today()
        fname = 'tweet/' + search_word + 'tweet' + str(date) + '.txt'

        if not os.path.exists("tweet"):
            os.mkdir("tweet")

        f = open(fname, 'a', encoding='utf-8')
        for i in range(0, len(total_text)):
            f.write(str(total_text[i]) + "\n")
        f.close()

        total_count += count
        print('total_count=', total_count, 'start_time=', loop_start_time)

        current_time = time.mktime(datetime.datetime.now().timetuple())
        # 処理時間が2秒未満なら2秒wait
        if current_time - tweets_get_time < 2:
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 2)

        #デバッグ用
        if total > 0:
            cnt += 100
        if total > 0 and cnt >= total:
            break
Пример #3
0
def main_loop(search_word, session):
    get_words_total_count = 0
    url = 'https://api.twitter.com/1.1/search/tweets.json'  # ツイートを検索して取得するためのエンドポイント

    loop_start_time = get_tweet.FIRST_LOOP_START_TIME

    # 1回のループで100ツイートを取得します。
    while True:
        next_reset_time = check_limit.checkLimit(
            session)  # 回数制限を迎えていたら回復するまで待機。
        tweets_get_time = time.mktime(
            datetime.datetime.now().timetuple())  #現在時刻取得

        unavailableCnt = 0  # ツイートの取得に失敗した回数。

        try:
            res = session.get(url, params={
                'q': search_word,
                'count': 100
            })  # 検索し、100件のツイートを取得。
        except SocketError as e:
            print('ソケットエラー errno=', e.errno)
            if unavailableCnt > 10:
                raise

            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            unavailableCnt += 1
            continue

        if res.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        if res.status_code != 200:
            raise Exception('Twitter API error %d' % res.status_code)

        loop_start_time, count, total_text = get_tweet.getTweet(
            res, loop_start_time, next_reset_time,
            session)  # 100件のツイートからリプライのみを抽出してペアで取得する。

        # ファイル書き込み
        date = datetime.date.today()
        write_to_file(total_text, search_word + 'tweet' + str(date))

        get_words_total_count += count
        print('total_count=', get_words_total_count, 'start_time=',
              loop_start_time)

        current_time = time.mktime(datetime.datetime.now().timetuple())
        # 処理時間が2秒未満なら2秒wait
        if current_time - tweets_get_time < 2:
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 2)
Пример #4
0
def getTweet(res, start_time, reset, session):
    res_text = json.loads(res.text)
    url1 = 'https://api.twitter.com/1.1/statuses/user_timeline.json'  #今回こちらは使わない
    url2 = 'https://api.twitter.com/1.1/statuses/lookup.json'

    cnt_req = 0
    max_tweet = start_time

    total_text = []  # tweet本文(発話/応答)のリスト
    tweet_list = []  # n_reply_to_status_idと応答tweetの対のリスト

    # 応答tweetを探す。
    for tweet in res_text['statuses']:
        status_id = tweet['in_reply_to_status_id_str']  # 発言tweetのid
        tweet_id = tweet['id']  # 応答tweetのid

        if status_id != None:  # 当該tweetが応答かどうかの判断
            tweet_time = tweet_id2time(tweet_id)
            if tweet_time <= start_time:  # 前回処理より新しいtweetのみ処理する
                continue

            if max_tweet < tweet_time:
                max_tweet = tweet_time

            res_sentence = tweet['text']
            #RTを対象外にする
            if res_sentence[0:3] == "RT ":
                continue

            res_sentence = screening(res_sentence)
            if res_sentence == '':
                continue

            tweet_list.append([status_id, res_sentence])  # 発言側idと応答文

    if len(tweet_list) == 0:  # 1つも応答tweetが無かった時。
        return max_tweet, cnt_req, total_text

    #複数status_idを連結する
    id_list = tweet_list[0][0]
    for i in range(1, len(tweet_list)):
        id_list += ','
        id_list += tweet_list[i][0]

    #--------------------------------------------------------------------------*
    #                                                                          *
    # 発話tweet抽出取得                                                        *
    #                                                                          *
    #--------------------------------------------------------------------------*

    #複数status_id指定で発話tweet取得
    unavailableCnt = 0
    while True:
        try:
            req = session.get(url2,
                              params={
                                  'id': id_list,
                                  'count': len(tweet_list)
                              })  # 発言tweetの取得。
        except SocketError as e:
            print('ソケットエラー errno=', e.errno)
            if unavailableCnt > 10:
                raise

            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            unavailableCnt += 1
            continue

        if req.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        unavailableCnt = 0

        if req.status_code == 200:
            req_text = json.loads(req.text)
            break
        else:
            raise Exception('Twitter API error %d' % res.status_code)

    # 発話tweet本文スクリーニング
    for i in range(0, len(tweet_list)):
        for j in range(0, len(req_text)):
            if req_text[j]['id_str'] == tweet_list[i][0]:
                req_sentence = req_text[j]['text']

                if len(req_text) <= 0:
                    print(req_text)
                    continue

                req_sentence = req_text[j]['text']
                #RTを対象外にする
                if req_sentence[0:3] == "RT ":
                    continue

                req_sentence = screening(req_sentence)

                #スクリーニングの結果、ブランクだったら対象外
                if req_sentence == '':
                    continue
                # 発話tweetと応答tweetを対で書き込み
                if req_sentence != tweet_list[i][1]:
                    total_text.append("REQ:" + req_sentence)
                    total_text.append('RES:' + tweet_list[i][1])
                    cnt_req += 1

    max_tweet = max(max_tweet, start_time)
    return max_tweet, cnt_req, total_text
Пример #5
0
        reset = check_limit.checkLimit(session)  # 回数制限確認
        get_time = time.mktime(datetime.datetime.now().timetuple())  #getの時刻取得

        try:
            res = session.get(url,
                              params={
                                  'q': setting.BOT_SCREEN_NAME,
                                  'since_id': since_id,
                                  'count': 100
                              })  # Botへのメンションツイートの確認
        except SocketError as e:
            print('ソケットエラー errno=', e.errno)
            if unavailableCnt > 10:
                raise

            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            unavailableCnt += 1
            continue

        if res.status_code == 503:
            # 503 : Service Unavailable
            if unavailableCnt > 10:
                raise Exception('Twitter API error %d' % res.status_code)

            unavailableCnt += 1
            print('Service Unavailable 503')
            check_limit.waitUntilReset(
                time.mktime(datetime.datetime.now().timetuple()) + 30)
            continue

        if res.status_code != 200: