Как я могу получить все твиты и атрибуты для данного пользователя с помощью Python?

Я пытаюсь получить данные из Twitter, используя Tweepy для имени пользователя, введенного в командной строке. Я хочу извлечь довольно много данных о статусе и пользователе, поэтому придумал следующее:

Обратите внимание, что я импортирую все необходимые модули в порядке, и у меня есть ключи oauth + (просто не включены здесь), а имя файла правильное, только что было изменено:

# define user to get tweets for. accepts input from user
user = tweepy.api.get_user(input("Please enter the twitter username: "))

# Display basic details for twitter user name
print (" ")
print ("Basic information for", user.name)
print ("Screen Name:", user.screen_name)
print ("Name: ", user.name)
print ("Twitter Unique ID: ", user.id)
print ("Account created at: ", user.created_at)

timeline = api.user_timeline(screen_name=user, include_rts=True, count=100)
    for tweet in timeline:
        print ("ID:", tweet.id)
        print ("User ID:", tweet.user.id)
        print ("Text:", tweet.text)
        print ("Created:", tweet.created_at)
        print ("Geo:", tweet.geo)
        print ("Contributors:", tweet.contributors)
        print ("Coordinates:", tweet.coordinates) 
        print ("Favorited:", tweet.favorited)
        print ("In reply to screen name:", tweet.in_reply_to_screen_name)
        print ("In reply to status ID:", tweet.in_reply_to_status_id)
        print ("In reply to status ID str:", tweet.in_reply_to_status_id_str)
        print ("In reply to user ID:", tweet.in_reply_to_user_id)
        print ("In reply to user ID str:", tweet.in_reply_to_user_id_str)
        print ("Place:", tweet.place)
        print ("Retweeted:", tweet.retweeted)
        print ("Retweet count:", tweet.retweet_count)
        print ("Source:", tweet.source)
        print ("Truncated:", tweet.truncated)

Я бы хотел, чтобы это в конечном итоге перебирало все твиты пользователя (до предела 3200). Но обо всем по порядку. Пока у меня две проблемы, но я получаю следующее сообщение об ошибке относительно ретвитов:

Please enter the twitter username: barackobamaTraceback (most recent call last):
  File " usertimeline.py", line 64, in <module>
    timeline = api.user_timeline(screen_name=user, count=100, page=1)
  File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
    raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 401
Traceback (most recent call last):
  File "usertimeline.py", line 42, in <module>
    user = tweepy.api.get_user(input("Please enter the twitter username: "))
  File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
    raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 404

Передача имени пользователя в качестве переменной также кажется проблемой:

Traceback (most recent call last):
  File " usertimleline.py", line 64, in <module>
    timeline = api.user_timeline(screen_name=user, count=100, page=1)
  File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
    raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 401

Я изолировал обе эти ошибки, т.е. они не работают вместе.

Простите мое незнание, я не слишком увлечен API-интерфейсами Twitter, но довольно быстро учусь. Документация Tweepy действительно отстой, и я много читал в сети, просто не могу исправить это. Если мне удастся разобрать это, я опубликую некоторую документацию.

Я знаю, как перенести данные в базу данных MySQL после извлечения (он будет делать это, а не печатать на экран) и манипулировать ими, чтобы я мог с ними что-то делать, просто выясняется, что у меня проблемы с . Есть ли у кого-нибудь идеи или есть другой метод, который я должен рассмотреть?

Любая помощь очень ценится. Ваше здоровье

РЕДАКТИРОВАТЬ:

Следуя предложению @Eric Olson сегодня утром; Я сделал следующее.

1) Создал совершенно новый набор учетных данных Oauth для тестирования. 2) Скопировал код в новый скрипт следующим образом:

Oauth

consumer_key = "(removed)"
consumer_secret = "(removed)"
access_key="88394805-(removed)"
access_secret="(removed)"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api=tweepy.API(auth)



# confirm account being used for OAuth
print ("API NAME IS: ", api.me().name)
api.update_status("Using Tweepy from the command line")

При первом запуске скрипта он работает нормально, обновляет мой статус и возвращает имя API следующим образом:

>>> 
API NAME IS:  Chris Howden

Затем с этого момента я получаю следующее:

Traceback (most recent call last):
  File "C:/Users/Chris/Dropbox/Uni_2012-3/6CC995 - Independent Studies/Scripts/get Api name and update status.py", line 19, in <module>
    api.update_status("Using Tweepy frm the command line")
  File "C:\Python32\lib\site-packages\tweepy-1.4-py3.2.egg\tweepy\binder.py", line 153, in _call
    raise TweepError(error_msg)
tweepy.error.TweepError: Twitter error response: status code = 403

Единственная причина, по которой я вижу, что он делает что-то подобное, заключается в том, что он отклоняет сгенерированный токен доступа. Мне не нужно продлевать токен доступа?


person chowden    schedule 26.03.2013    source источник


Ответы (2)


Если вы готовы попробовать другую библиотеку, вы можете попробовать rauth. Уже есть пример Twitter, но если вам лень и просто хотите рабочий пример, вот как я бы изменил этот демонстрационный скрипт:

from rauth import OAuth1Service

# Get a real consumer key & secret from https://dev.twitter.com/apps/new
twitter = OAuth1Service(
    name='twitter',
    consumer_key='J8MoJG4bQ9gcmGh8H7XhMg',
    consumer_secret='7WAscbSy65GmiVOvMU5EBYn5z80fhQkcFWSLMJJu4',
    request_token_url='https://api.twitter.com/oauth/request_token',
    access_token_url='https://api.twitter.com/oauth/access_token',
    authorize_url='https://api.twitter.com/oauth/authorize',
    base_url='https://api.twitter.com/1/')

request_token, request_token_secret = twitter.get_request_token()

authorize_url = twitter.get_authorize_url(request_token)

print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')

session = twitter.get_auth_session(request_token,
                                   request_token_secret,
                                   method='POST',
                                   data={'oauth_verifier': pin})

params = {'screen_name': 'github',  # User to pull Tweets from
          'include_rts': 1,         # Include retweets
          'count': 10}              # 10 tweets

r = session.get('statuses/user_timeline.json', params=params)

for i, tweet in enumerate(r.json(), 1):
    handle = tweet['user']['screen_name'].encode('utf-8')
    text = tweet['text'].encode('utf-8')
    print '{0}. @{1} - {2}'.format(i, handle, text)

Вы можете запустить это как есть, но обязательно обновите учетные данные! Они предназначены только для демонстрационных целей.

Полное раскрытие, я поддерживаю rauth.

person maxcountryman    schedule 29.03.2013
comment
Эйс, спасибо за ваши усилия. Тем временем мне удалось найти другой способ получить все, что я хотел, с помощью модуля tweepy, но это помогает немного лучше понять json. - person chowden; 02.04.2013
comment
Я опубликую то, что нашел, когда все будет готово. - person chowden; 02.04.2013

Вы получаете ответ 401, что означает «Неавторизованный». (см. коды состояния HTTP)

Ваш код выглядит хорошо. Использование api.user_timeline(screen_name="some_screen_name") работает для меня в старом примере, который я валял.

Я предполагаю, что вам либо нужно авторизовать приложение, либо возникла проблема с настройкой OAuth.

Возможно, вы уже нашли это, но вот короткий пример кода, с которого я начал: https://github.com/nloadholtes/tweepy/blob/nloadholtes-examples/examples/oauth.py

person Eric Olson    schedule 26.03.2013
comment
Ваше здоровье. Сегодня утром я провел небольшое расследование и добавил несколько дополнительных выводов к исходному сообщению ... - person chowden; 26.03.2013