2013-09-30 2 views
14

Я пытаюсь сделать python для отправки твита для меня, используя Twython, но по какой-то причине все, что я пытаюсь, не работает.Использование Twython для отправки твита, twitter api error

Я следовал за Twython README, но все еще не мог добиться того, чего хочу.

Ниже мой последний Попытанные код:

from twython import Twython, TwythonError 

APP_KEY = "KEYHERE" 
APP_SECRET = "SECRETHERE" 

twitter = Twython(APP_KEY, APP_SECRET) 
auth = twitter.get_authentication_tokens() 

OAUTH_TOKEN = auth['oauth_token'] 
OAUTH_TOKEN_SECRET = auth['oauth_token_secret'] 

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 

try: 
    twitter.update_status(status='See how easy this was?') 
except TwythonError as e: 
    print e 

На выполнения кода я получаю следующую ошибку TraceBack:

Twitter API returned a 401 (Unauthorized), Invalid or expired token 

Кто-нибудь знает, что я делаю не так, и что более важно, как я исправить это?

У меня нет достаточного количества баллов за щедрость, но я очень благодарен за помощь!

Заранее спасибо

редактировать

Traceback (most recent call last): 
    File "C:\testtweet.py", line 20, in <module> 
    final_step = twitter.get_authorized_tokens(oauth_verifier) 
    File "C:\Python27\lib\site-packages\twython\api.py", line 313, in get_authorized_tokens 
    raise TwythonError('Unable to decode authorized tokens.') 
TwythonError: Unable to decode authorized tokens. 

выше является отслеживающий получил от кода, поставляемого @justhalf

Благодарности SMNALLY

+0

Ответил на вопрос. Решение полностью работает :) –

+0

причина, по которой код возвращается. API Twitter возвратил 401 (неавторизованный), недействительный или истекший токен', ему нужно '' oauth_verifier'' после 'get_authentication_tokens()' больше на нем [здесь] (https : //dev.twitter.com/docs/auth/implementing-sign-twitter) также [это может быть полезно] (http://stackoverflow.com/a/17308270/2541442) –

+0

[проверить этот ответ] (http: //переполнение стека.com/a/15857542/2541442), чтобы получить 'oauth_verifier' –

ответ

29

Существует гораздо более простой способ обновить сообщение, а не путь Twythonна самом деле показывает вас. Это займет больше работы на вашем консольном пространстве API, поэтому позвольте мне начать.

  1. Во-первых, вам нужно будет перейти к apps page.После того, как вы выбрали приложение, которое вы используете прямо сейчас, взгляните на страницу, которую вы указали. Вы должны находиться на вкладке по умолчанию. enter image description here

  2. Теперь, когда вы, где вы должны быть, нажмите на Настройки вкладку рядом с вкладке Подробности, как показано выше.

  3. После этого, прокрутите вниз, пока не увидите: enter image description here

  4. Выберите вариант, как показано выше. Теперь, после того как вы выбрали опцию прокрутки вниз, пока не увидите синюю кнопку с надписью Обновите настройки приложения этого твиттера.

  5. Теперь вернитесь на свой Подробнее tab. Идите в нижнюю часть и создайте необходимые маркеры, обратите внимание, что вам может потребоваться несколько раз щелкнуть по кнопкам, чтобы заставить его работать (также убедитесь, что ваш уровень доступа Чтение, запись и прямые сообщения, когда токен генерируется): enter image description here

  6. Теперь у вас есть все необходимое для подключения и размещения на вашем твиттере. У вас есть Consumer key и Consumer Secret, Access token и Access token secret. У вас есть все, что вам нужно.

Итак, перейдите к редактору кода и напишите следующий код котельной (эти клавиши не будут работать, я просто избавился от приложения, так что не взломать здесь: P Я дал им просто как указание длины ключей, которые вы должны ожидать):

from twython import Twython 

APP_KEY = '' # Customer Key here 
APP_SECRET = '' # Customer secret here 
OAUTH_TOKEN = '1936951807-z5bBNING8P1TU2onWvJh5dh8hoYlYAmNOaAx2OX' # Access Token here 
OAUTH_TOKEN_SECRET = 'QWJEZ7ridSeZGdxJELSBk7mupCpMA9q9sLCou5ywg' # Access Token Secret here 

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 

twitter.update_status(status="Hello from Python! :D") 

После этого, проверьте щебет, вы должны увидеть новый твит о том, «Привет от Python: D».

+0

Если ответ сработал для вас, скажите что-нибудь. Потому что я помогал другу с этой проблемой. Я дал ему такое же решение. –

+0

yeap, это хорошо работает, проголосовать за упоминание части настроек на странице приложений twitter, также я хочу добавить, убедитесь, что поле «Разрешить это приложение будет использоваться для входа в Twitter» ** не отмечено ** –

+0

@ SimonKB Вам не нужно, чтобы это включалось. Он был отключен для меня, и я смог опубликовать свое сообщение в твиттере. Я не думаю, что это важно на стороне клиента. –

3

Давайте попробуем выяснить вместе что пошло не так.

Я заметил это в documentation:

Now that you have the oauth_verifier stored to a variable, you'll want to create a new instance of Twython and grab the final user tokens

И код под ним:

twitter = Twython(APP_KEY, APP_SECRET, 
       OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 

final_step = twitter.get_authorized_tokens(oauth_verifier) 

Таким образом, кажется, что вы пропустили final_step?

Тогда после этого (из документации):

Once you have the final user tokens, store them in a database for later use!:

OAUTH_TOKEN = final_step['oauth_token'] 
OAUTH_TOKEN_SECERT = final_step['oauth_token_secret'] 

После того, что я думаю, вам нужно будет создать еще один новый экземпляр Twython с окончательным OAUTH_TOKEN и OAUTH_TOKEN_SECRET. Таким образом, полный код будет что-то вроде этого, я полагаю:

from twython import Twython, TwythonError 
import requests 

APP_KEY = "KEYHERE" 
APP_SECRET = "SECRETHERE" 

twitter = Twython(APP_KEY, APP_SECRET) 
auth = twitter.get_authentication_tokens() 

OAUTH_TOKEN = auth['oauth_token'] 
OAUTH_TOKEN_SECRET = auth['oauth_token_secret'] 

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 

### This is the part you're missing ### 
oauth_verifier_url = auth['auth_url'] 
oauth_verifier = requests.get(oauth_verifier_url) 

# Getting the FINAL authentication tokens 
final_step = twitter.get_authorized_tokens(oauth_verifier) 

OAUTH_TOKEN = final_step['oauth_token'] 
OAUTH_TOKEN_SECRET = auth['oauth_token_secret'] 

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET) 
### Up until this line ### 

try: 
    twitter.update_status(status='See how easy this was?') 
except TwythonError as e: 
    print e 

У меня нет ключа Twitter приложения, поэтому я не могу попробовать.

Но я думаю, этого должно быть достаточно, чтобы решить вашу проблему. Надеюсь, это поможет. =)

Обратите внимание, что я использовал пакет requests от Python.

+0

Hi @justhalf спасибо за ваш ответ. В вашей первой строке, где вы определяете 'твиттер', вы не можете иметь' OAUTH_TOKEN' и 'OAUTH_TOKEN_SECRET', потому что вы не смогли получить токены, часть, которую должны получить tokens - 'auth = twitter.get_authentication_tokens()' Если я 'print auth', я получаю номера маркера и все необходимое, но, похоже, оно истекает сразу, а также где я могу определить, какие учетные записи для входа/выхода? Есть предположения? Большое спасибо SMNALLY – SMNALLY

+0

Первый код в моем примере не является первой строкой, я скопировал его из документации. Он должен быть помещен после вашего первого определения 'twitter'. См. Обновление моего ответа. – justhalf

+0

извините, не ваше первое определение 'twitter', а второе. – justhalf

0

причина, почему код возвращается Twitter API returned a 401 (Unauthorized), Invalid or expired token он нуждается oauth_verifier после вызова get_authentication_tokens() Попробуйте thsse шагов для успешного вызова сайта & получить oauth_verifier

from twython import Twython, TwythonError 

twitter = Twython(APP_KEY, APP_SECRET) 

auth = twitter.get_authorization_tokens(callback_url='http://google.com') 
oauth_token = auth['oauth_token'] 
oauth_token_secret = auth['oauth_token_secret'] 
print auth 
print auth['auth_url'] 

аутентификация [ «auth_url» ] распечатать ответ примерно:

https://api.twitter.com/oauth/authenticate?oauth_token=xxxxxxxxx

просмотра к этому URL, чтобы разрешить приложению

enter image description here

После того, как приложение получает авторизацию, он будет посылать клиент вашего callback_url

callback_url будет добавлен с oauth_verifier

что-то вроде http://google.com/?oauth_verifier=xxxxxx&oauth_token=xxxxxx

в зависимости от веб-страницы использовании вам нужно GET ответ на oauth_verifier Теперь создайте новый Twython экземпляр

twitter = Twython(APP_KEY, APP_SECRET, oauth_token, oauth_token_secret) 
final_tokens = twitter.get_authorized_tokens(oauth_verifier) 

print final_tokens 

# these are the keys you will use to make calls on the users behalf from here on forward 
f_oauth_token = final_tokens['oauth_token'] 
f_oauth_token_secret = final_tokens['oauth_token_secret'] 

Обновление Twitter Статус:

twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN=f_oauth_token, OAUTH_TOKEN_SECRET=f_oauth_token_secret) 

try: 
    twitter.update_status(status='See how easy this was?') 
except TwythonError as e: 
    print e 

И делать настройки параметров программы Update Твиттера как было упомянуто @Games Brainiac

0

Я добавляю к следующему обсуждению что соединение с другим сервером также может препятствовать подключению к потоку api. Например, у меня был Rserve() открытый и продолжал получать ошибку 401, но когда я убил Rserve в моей командной строке, авторизация была предоставлена ​​...

0

Обычно, если вы хотите обновить статус с помощью своего приложения, вы должны быть аутентифицированы с использованием аутентификации OAuth1.1 (которая упоминается как аутентификация пользователя - в отличие от аутентификации только для приложений).

К сожалению, для тех, кто создает приложение Twitter, для этого требуется много дополнительного кода (где приложение auth требует только 3 или 4 строки кода).

Некоторое время назад я действительно опубликовал полный код для работы с OAuth1.1 с использованием Flask и Twython (без обработки ошибок, вы можете справиться с этим любым способом) here. Это решение использует файлы сеанса для обработки токенов, а затем очищает сеанс при выходе из системы. (код может быть не идеальным и, вероятно, может быть улучшен - я довольно начинающий программист)

Смежные вопросы