2013-04-05 2 views
3

Twitter только недавно сделал следующее обязательным:Как передать oauth_callback значение OAuth/request_token с Twython

1) Вы должны пройти значение oauth_callback для OAuth/request_token. Это необязательно. Даже если у вас уже есть на dev.twitter.com. Если вы делаете вне OAuth, пройдите oauth_callback=oob.

2) Вы должны пройти по oauth_verifier, который вы либо получили от вашего выполненного обратного вызова, либо что вы получили ручной ввод вашего конечного пользователя в oauth/access_token. Вот щебет нить (https://dev.twitter.com/discussions/16443)

Это заставило Twython get_authorized_tokens бросить эту ошибку:

Request: oauth/access_token 

Error: Required oauth_verifier parameter not provided 

У меня есть два вопроса:

1. Как вы передать значение oauth_callback в oauth/request_token с Twython?

2. Как вы проходите вдоль oauth_verifier?

Я могу получить oauth_verifier с запросом.GET ['oauth_verifier'] из URL-адреса обратного вызова, но я понятия не имею, что делать с помощью Twython. Я ищу везде, но не нашел ответов, поэтому решил опубликовать это. Это мой первый пост, так будьте добры;)

Вот мой код:

def register_twitter(request): 
    # Instantiate Twython with the first leg of our trip. 
    twitter = Twython(
     twitter_token = settings.TWITTER_KEY, 
     twitter_secret = settings.TWITTER_SECRET, 
     callback_url = request.build_absolute_uri(reverse('account.views.twitter_thanks')) 
    ) 

    # Request an authorization url to send the user to 
    auth_props = twitter.get_authentication_tokens() 

    # Then send them over there 
    request.session['request_token'] = auth_props 
    return HttpResponseRedirect(auth_props['auth_url']) 


def twitter_thanks(request, redirect_url=settings.LOGIN_REDIRECT_URL): 

    # Now that we've got the magic tokens back from Twitter, we need to exchange 
    # for permanent ones and store them... 
    twitter = Twython(
     twitter_token = settings.TWITTER_KEY, 
     twitter_secret = settings.TWITTER_SECRET, 
     oauth_token = request.session['request_token']['oauth_token'], 
     oauth_token_secret = request.session['request_token']['oauth_token_secret'], 
    ) 

    # Retrieve the tokens 
    authorized_tokens = twitter.get_authorized_tokens() 

    # Check if twitter user has a UserProfile 
    try: 
     profile = UserProfile.objects.get(twitter_username=authorized_tokens['screen_name']) 
    except ObjectDoesNotExist: 
     profile = None 
+0

Ваш 'reverse ('account.views.twitter_thanks')' неверен, он должен быть 'reverse ('account: twitter_thanks')'. Можете ли вы опубликовать у вас коды URL – catherine

+0

@catherine На самом деле 'reverse ('account.views.twitter_thanks')' отлично работает. Вот URL: 'url (r '^ register/twitter/thanks /? $', 'Account.views.twitter_thanks', name = 'twitter_thanks')'. Приятно знать короткий способ написания обзора, хотя, спасибо за это. – BuddyTeal

+0

Откуда у вас эти коды? На самом деле, ваши коды совпадают с моим входом в Twitter, и он отлично работает. – catherine

ответ

2

Я решил свой ответ. Вот решение, если оно может помочь кому-либо еще:

В файле Twython.py я добавил новый параметр oauth_verifier в конструктор класса Twython. Я получаю значение oauth_verifier от callback_url в моем представлении twitter_thanks.

В get_authorized_tokens я удалил эту строку кода:

response = self.client.get(self.access_token_url) 

и добавил следующий код:

callback_url = self.callback_url or 'oob' 
request_args = urllib.urlencode({'oauth_callback': callback_url, 'oauth_verifier':self.oauth_verifier }) 
response = self.client.post(self.access_token_url, params=request_args) 

Он теперь работает как шарм и OAuth 1.0A требованиям.