【问题标题】:TweepError(error_msg, resp, api_code=api_error_code) tweepy.error.TweepError: [{'code': 215, 'message': 'Bad Authentication data.'}]TweepError(error_msg, resp, api_code=api_error_code) tweepy.error.TweepError: [{'code': 215, 'message': 'Bad Authentication data.'}]
【发布时间】:2018-04-12 11:46:25
【问题描述】:

我正在尝试使用 tweepy 库以给定的主题标签流式传输实时推文。我正在使用取自https://galeascience.wordpress.com/2016/03/18/collecting-twitter-data-with-python/的以下代码

我是 python 编码和 API 的新手

import tweepy
from tweepy import OAuthHandler
import json
import datetime as dt
import time
import os
import sys



def load_api():
    ''' Function that loads the twitter API after authorizing the user.   '''

    consumer_key = 'xxx'
    consumer_secret = 'xxx'
    access_token = 'yyy'
    access_secret = 'yyy'
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_secret)
    # load the twitter API via tweepy
    return tweepy.API(auth)


def tweet_search(api, query, max_tweets, max_id, since_id, geocode):
''' Function that takes in a search string 'query', the maximum
    number of tweets 'max_tweets', and the minimum (i.e., starting)
    tweet id. It returns a list of tweepy.models.Status objects. '''

   searched_tweets = []
   while len(searched_tweets) < max_tweets:
     remaining_tweets = max_tweets - len(searched_tweets)
     try:
         new_tweets = api.search(q=query, count=remaining_tweets,
                                since_id=str(since_id),
                                max_id=str(max_id-1)) 
  #                                    geocode=geocode)
        print('found',len(new_tweets),'tweets')
        if not new_tweets:
            print('no tweets found')
            break
        searched_tweets.extend(new_tweets)
        max_id = new_tweets[-1].id
    except tweepy.TweepError:
        print('exception raised, waiting 15 minutes')
        print('(until:', dt.datetime.now()+dt.timedelta(minutes=15), ')')
        time.sleep(15*60)
        break # stop the loop
return searched_tweets, max_id


 def get_tweet_id(api, date='', days_ago=7, query='a'):
    ''' Function that gets the ID of a tweet. This ID can then be
    used as a 'starting point' from which to search. The query is
    required and has been set to a commonly used word by default.
    The variable 'days_ago' has been initialized to the maximum
    amount we are able to search back in time (9).'''

    if date:
        # return an ID from the start of the given day
       td = date + dt.timedelta(days=1)
       tweet_date = '{0}-{1:0>2}-{2:0>2}'.format(td.year, td.month, td.day)
       tweet = api.search(q=query, count=1, until=tweet_date)
    else:
        # return an ID from __ days ago
        td = dt.datetime.now() - dt.timedelta(days=days_ago)
        tweet_date = '{0}-{1:0>2}-{2:0>2}'.format(td.year, td.month, td.day)
        # get list of up to 10 tweets
        tweet = api.search(q=query, count=10, until=tweet_date)
        print('search limit (start/stop):',tweet[0].created_at)
       # return the id of the first tweet in the list
       return tweet[0].id


 def write_tweets(tweets, filename):
   ''' Function that appends tweets to a file. '''

    with open(filename, 'a') as f:
        for tweet in tweets:
            json.dump(tweet._json, f)
            f.write('\n')


def main():
     ''' This is a script that continuously searches for tweets
        that were created over a given number of days. The search
        dates and search phrase can be changed below. '''



    ''' search variables: '''
    search_phrases = ['#Messi']
    time_limit = 1.5                           # runtime limit in hours
    max_tweets = 200                           # number of tweets per      search (will be
                                           # iterated over) - maximum is 100
min_days_old, max_days_old = 1, 5          # search limits e.g., from 7 to 8
                                           # gives current weekday from last week,
                                           # min_days_old=0 will search from right now


    # loop over search items,
    # creating a new file for each
    for search_phrase in search_phrases:

        print('Search phrase =', search_phrase)

    ''' other variables '''
        name = search_phrase.split()[0]
        json_file_root = name + '/'  + name
        os.makedirs(os.path.dirname(json_file_root), exist_ok=True)
        read_IDs = False

    # open a file in which to store the tweets
        if max_days_old - min_days_old == 1:
            d = dt.datetime.now() - dt.timedelta(days=min_days_old)
            day = '{0}-{1:0>2}-{2:0>2}'.format(d.year, d.month, d.day)
       else:
            d1 = dt.datetime.now() - dt.timedelta(days=max_days_old-1)
            d2 = dt.datetime.now() - dt.timedelta(days=min_days_old)
            day = '{0}-{1:0>2}-{2:0>2}_to_{3}-{4:0>2}-{5:0>2}'.format(
                  d1.year, d1.month, d1.day, d2.year, d2.month, d2.day)
        json_file = json_file_root + '_' + day + '.json'
        if os.path.isfile(json_file):
            print('Appending tweets to file named: ',json_file)
           read_IDs = True

    # authorize and load the twitter API
    api = load_api()

    # set the 'starting point' ID for tweet collection
    if read_IDs:
        # open the json file and get the latest tweet ID
        with open(json_file, 'r') as f:
            lines = f.readlines()
            max_id = json.loads(lines[-1])['id']
            print('Searching from the bottom ID in file')
    else:
        # get the ID of a tweet that is min_days_old
        if min_days_old == 0:
            max_id = -1
        else:
            max_id = get_tweet_id(api, days_ago=(min_days_old-1))
    # set the smallest ID to search for
    since_id = get_tweet_id(api, days_ago=(max_days_old-1))
    print('max id (starting point) =', max_id)
    print('since id (ending point) =', since_id)



    ''' tweet gathering loop  '''
    start = dt.datetime.now()
    end = start + dt.timedelta(hours=time_limit)
    count, exitcount = 0, 0
    while dt.datetime.now() < end:
        count += 1
        print('count =',count)
        # collect tweets and update max_id
        tweets, max_id = tweet_search(api, search_phrase, max_tweets,
                                      max_id=max_id, since_id=since_id,
                                      geocode=USA)
        # write tweets to file in JSON format
        if tweets:
            write_tweets(tweets, json_file)
            exitcount = 0
        else:
            exitcount += 1
            if exitcount == 3:
                if search_phrase == search_phrases[-1]:
                    sys.exit('Maximum number of empty tweet strings reached - exiting')
                else:
                    print('Maximum number of empty tweet strings reached - breaking')
                    break


if __name__ == "__main__":
    main()

它会抛出以下错误:

Traceback (most recent call last):
   File "search.py", line 189, in <module>
    main()
  File "search.py", line 157, in main
    since_id = get_tweet_id(api, days_ago=(max_days_old-1))
  File "search.py", line 80, in get_tweet_id
    tweet = api.search(q=query, count=10, until=tweet_date)
  File "/usr/local/lib/python3.5/dist-packages/tweepy/binder.py", line    245, in _call
   return method.execute()
  File "/usr/local/lib/python3.5/dist-packages/tweepy/binder.py", line 229, in execute
   raise TweepError(error_msg, resp, api_code=api_error_code)
  tweepy.error.TweepError: [{'code': 215, 'message': 'Bad Authentication data.'}]

我输入了相关的令牌,但它仍然不起作用。任何帮助将不胜感激。

【问题讨论】:

    标签: python twitter oauth tweepy


    【解决方案1】:

    这种情况很少见,但有时会因为后端的某些原因(?)而需要重新生成应用程序密钥。我不知道这是否是您的问题,但值得一试。

    此外,您实际上并不是在流式传输推文。有another request。您正在使用 Twitter 的 REST API 来搜索已经发生的推文。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多