Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2010 08:33:16

4umak
От:
Зарегистрирован: 2010-10-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Совершенно не получается джангой авторизоваться в твиттере и авторизацию эту забить в сессию. Доки tweepy по oauth читал. На десктопном приложении всё прекрасно работает. А вот в django это перенести никак не получается…

Объясните уж, пожалуйста, совсем на пальцах. И, желательно, с наглядными примерами:)

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



Офлайн

#2 Окт. 6, 2010 09:23:05

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Что конкретно не получается? Какие ошибки? Как вы диагностировали?



Офлайн

#3 Окт. 6, 2010 09:44:17

4umak
От:
Зарегистрирован: 2010-10-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Daevaorn
Что конкретно не получается? Какие ошибки? Как вы диагностировали?
В общем, добрался я в итоге до вот такого кода:
def authorisation(request):
CONSUMER_KEY =
CONSUMER_SECRET =
CALLBACK_URL = 'http://127.0.0.1:8000/info/'

# процесс авторизации
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL)
auth_url = auth.get_authorization_url()
return redirect(auth_url)
verifier = request.GET.get('oauth_verifier')
auth.get_access_token(verifier)
request.session['token'] = auth

def info(request):
old_token = request.session.get('token')
if not old_token:
return HttpResponse("Something went wrong! Tokens do not match")
else:
user = api.get_user(user)
max_pages = tweet_count / 100 + 1
return render_to_response('info.html', locals())
Функция авторизации, вроде как, проходит. Но как это по-человечески записать в сессию, чтобы потом можно было вызывать в других представлениях? Просто в этом хаосе токенов чёрт ногу сломит:(



Офлайн

#4 Окт. 6, 2010 10:11:41

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Сохранять в сессию надо access_token, что и написаер в документации

http://joshthecoder.github.com/tweepy/docs/auth_tutorial.html#oauth-authentication
It is a good idea to save the access token for later use. You do not need to re-fetch it each time.



Офлайн

#5 Окт. 6, 2010 10:18:02

4umak
От:
Зарегистрирован: 2010-10-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Daevaorn
Сохранять в сессию надо access_token, что и написаер в документации
http://joshthecoder.github.com/tweepy/docs/auth_tutorial.html#oauth-authentication
It is a good idea to save the access token for later use. You do not need to re-fetch it each time.
Читал. Но всё равно не понял:( можно показать на примере текущего кода?



Офлайн

#6 Окт. 6, 2010 13:50:46

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Вам надо вот эти два значения добавить:

auth.access_token.key
auth.access_token.secret
Потом при последующем использовании их прокидывать в auth:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(key, secret)
А потом уже и в api:
api = tweepy.API(auth)
api.update_status('tweepy + oauth!')
Это всё из доки. Как ещё более подробно описать это, я не знаю:-)



Офлайн

#7 Окт. 6, 2010 14:03:09

4umak
От:
Зарегистрирован: 2010-10-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Daevaorn, так, спасибо, сейчас попробую:)



Офлайн

#8 Окт. 7, 2010 09:56:51

4umak
От:
Зарегистрирован: 2010-10-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Хм. Всё равно не получается. Вот полный код views.py:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from django.http import HttpResponse
from django.shortcuts import render_to_response, redirect
import tweepy

CONSUMER_KEY = ''
CONSUMER_SECRET = ''
CALLBACK_URL = 'http://127.0.0.1:8000/'

def hello(request):
return HttpResponse('Hello!')

def auth(request):
# процесс авторизации
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL)
auth_url = auth.get_authorization_url()
return redirect(auth_url)
verifier = request.GET.get('oauth_verifier')
auth.get_access_token(verifier)
session.set('token', (auth.access_token.key, auth.access_token.secret))
#request.session['token'] = auth

def main(request):
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token('token', 400001)
api = tweepy.API(auth)
# Если раскомментировать следующую строку, то появляется ошибка "argument 2 to map() must support iteration". Какой ещё вообще map()? Если не раскомментировать, то всё нормально, но переменной token_info передаётся None. Т.е. получается, что эта долбаная сессия всё-таки пустая??
# user = api.get_user(user)
# tweet_count = user.statuses_count
token_info = request.session.get('token')
return render_to_response('main.html', locals())
и urls.py:

from django.conf.urls.defaults import *
from back2tweet.views import *

urlpatterns = patterns('',
(r'^$', main),
(r'^auth/$', auth),
(r'^hello/$', hello),
Помогите, пожалуйста, заставить ЭТО работать. Я уже даже не знаю, куда копать…



Отредактировано (Окт. 7, 2010 09:59:54)

Офлайн

#9 Окт. 8, 2010 21:06:19

4umak
От:
Зарегистрирован: 2010-10-06
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Tweepy и OAuth

Код я немного переписал и, кажется, даже получилось локализовать место одной из ошибок:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from django.http import HttpResponse
from django.shortcuts import render_to_response, redirect
import tweepy

CONSUMER_KEY = 'QQNHQPSoOSWzBwNWMu4G2w'
CONSUMER_SECRET = 'B97Fnf7Cf8qfU15WyP1TmTnKVBDAtBH8UGUbGgPWe0'
CALLBACK_URL = 'http://127.0.0.1:8000/'

def hello(request):
return HttpResponse('Hello!')

def auth(request):
# процесс авторизации
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, CALLBACK_URL)
try:
auth_url = auth.get_authorization_url()
except tweepy.TweepError:
return HttpResponse('Error! Failed to get request token.')
request.session['request_token'] = (auth.request_token.key, auth.request_token.secret)
return redirect(auth_url)
verifier = request.GET.get('oauth_verifier')
token = request.session.get('request_token')
del request.session["request_token"]
auth.set_request_token(token[0], token[1])
try:
auth.get_access_token(verifier)
except tweepy.TweepError:
print 'Error! Failed to get access token.'
request.session['access_token'] = (auth.access_token.key, auth.access_token.secret)

def main(request):
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token('access_token', 400001)
api = tweepy.API(auth)
# Если раскомментировать следующую строку, то появляется ошибка "argument 2 to map() must support iteration". Какой ещё вообще map()?
# user = api.get_user('4umak')
# tweet_count = user.statuses_count
tweet_count = request.session.get('access_token')
return render_to_response('main.html', locals())
Вот тут:
auth.get_access_token(verifier)
как мне кажется, он ничего не получает. Потому что потом в сессию ‘access_token’ ничего не записывается и при проверке оно выводит только None. Почему так - лично я никак понять не могу. Судя по документации, делать нужно именно так.

И ещё, что всё-таки за ошибка такая “argument 2 to map() must support iteration”(см. комментарии в представлении main)? Причины её появления я тоже как-то не очень прослеживаю…

Может у кого-нибудь найдётся какая-нибудь дельная мысль?:)



Отредактировано (Окт. 8, 2010 21:25:08)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version