Пока особо серьёзное откладываю на потом, есть как я говорил уже идея для твиттер, очень классная идея для Google+, но это всё отнимет уйму времени. Гораздо эффективней по горячим следам из того что уже есть сделать что-то интересное. И это интересное - лёгкий двиг на питоне для блога. Никаких наворотов не планируется, кое-какие социальные фичи, и вместе с авторскими публикациями, кое что из автонаполнения актуальными новостями - ну как же без этого. Естественно всё это под GAE. При освоении новых технологий буду держать в курсе.
Делаем mash-up приложение на трэндах
Разделы
- квоты (2)
- amazon (3)
- amazon api (1)
- atom (1)
- blogger (1)
- bottle (3)
- bug (2)
- cron (1)
- datastore (6)
- facebook (1)
- facebook api (1)
- google api (3)
- google app engine (7)
- google plus (1)
- google storage (1)
- oauth (5)
- picasa (1)
- shorten url (1)
- twitter (6)
- twitter api (1)
- wordpress (1)
- youtube (1)
Показаны сообщения с ярлыком twitter. Показать все сообщения
Показаны сообщения с ярлыком twitter. Показать все сообщения
суббота, 16 июня 2012 г.
Побочный продукт
Из того что было использовано в первом проекте удалось создать некий сервис по работе с Twitter. Сервис сам так себе и служит скорей для того что бы пощупать скрипт, который содержит расширенный функционал. Вообщем об этом всё есть на сайте. На этом изучение Twitter API для себя я считаю закрытым.
суббота, 5 мая 2012 г.
Сокращённые урлы
Вообщем последние штрихи (ну конечно не считая дизайна, который оставляет желать лучшего). Прикрутил обновления на твиттер, не совсем кроспостинг, а самое интересное, с твитами и ретвитами. Ну с ретвитами всё более мене обычно (см предыдущий пост), а в твитах длинные урлы не очень как-то смотрятся. Хорошо полазив в самом Twitter Api обнаружил что t.co твиттер оставил для внутреннего пользования. Поэтому пришлось поискать сторонние сервисы. Т.к. я попробовал не один попробую представить краткий обзор.
BitLy: Где-то здесь можно зарегистрироваться прямо через твиттер. И для того что бы сокращать урлы, надо получить ключ и логин. Внимательно: логин - это не имя в твиттере, а там где сcылки 'Public Timeline' вида: http://bitly.com/u/o_xxxxxxxxx.rss, можно определить свой логин, который начинается с 'o_'. Как им пользоваться без OAuth (c OAuth - курить я не стал) см. ниже:
Вообщем оно работало но не долго... Спустя сутки перестало, причины в чём же дело я выяснять не стал, толи лимит исчерпался, толи OAuth не подключён. Ждать когда это само собой рассосётся я не стал.BitLy: Где-то здесь можно зарегистрироваться прямо через твиттер. И для того что бы сокращать урлы, надо получить ключ и логин. Внимательно: логин - это не имя в твиттере, а там где сcылки 'Public Timeline' вида: http://bitly.com/u/o_xxxxxxxxx.rss, можно определить свой логин, который начинается с 'o_'. Как им пользоваться без OAuth (c OAuth - курить я не стал) см. ниже:
from google.appengine.api import urlfetch
from urllib import quote, unquote, urlencode
import logging
try:
import json
except ImportError:
import simplejson as json
def bit_shorten(uri):
params = {'login' : BITLY_LOGIN,
'apiKey' : BITLY_KEY,
'domain' : "bit.ly",
'uri' : uri.encode('utf8'),
}
bit_url = "http://api.bit.ly/v3/shorten?%s" % urlencode(params, doseq=True)
try:
res = urlfetch.fetch(bit_url)
except urlfetch.DownloadError, msg:
logging.error(str(msg))
return ""
if res.status_code != 200:
logging.error(res.status_code)
return ""
try:
jj = json.loads(res.content)
except Exception, msg:
logging.error(msg)
return ""
if jj["status_txt"] != "OK":
logging.error(jj["status_txt"])
return ""
else:
return jj["data"]["url"]
Google: Набрал в поиске кто ещё умеет сокращать урлы и на удивление наткнулся на гугл (Кто в твиттере сидит наверное видел ссылки вида goo.gl). Решил попробовать прикрутить его. Для начала идём сюда. Там можно выбрать любой API который предоставляет гугл. Я ограничился только 'Shorten URL'. Честно скажу я хотел сначала использовать OAuth с ключами от серверного приложения, но "что-то пошло не так". И быстро нашёл оправдание что мне не потоком же эти урлы сокращать (лимит в сутки там 1 000 000 запросов), и решил сделать без авторизации но с ключём (без ключа можно тоже слать, но лимит не известен). Выглядит это так:
from google.appengine.api import urlfetch
from urllib import quote, unquote, urlencode
import logging
try:
import json
except ImportError:
import simplejson as json
def gog_shorten(uri):
params = {"key" : GOOGLE_KEY, "longUrl" : uri.encode('utf8')}
gog_url = "https://www.googleapis.com/urlshortener/v1/url"
headers = {"Content-Type" : "application/json"}
payload = json.dumps(params)
try:
res = urlfetch.fetch(gog_url, method=urlfetch.POST, headers=headers, payload=payload)
except urlfetch.DownloadError, msg:
logging.error(str(msg))
return ""
if res.status_code != 200:
logging.error(res.status_code)
return ""
try:
jj = json.loads(res.content)
except Exception, msg:
logging.error(msg)
return ""
return jj["id"]
И это пока пашет... тьфу-тьфу-тьфу.
воскресенье, 29 мая 2011 г.
OAuth для твиттера (продолжение)
Буду краток. Вчера времени не хватило, не успел выход сделать:
Листинг cookie.py:
@route('/exit')
@route('/exit/')
def exit_view():
del_cookie()
redirect("/")
И кстати заодно файлик для работы с куками:Листинг cookie.py:
@route('/login')
#!/usr/bin/env python
# encoding: utf-8
from bottle import route, run, view, request, redirect, response, post, abort, debug, error
import logging
import hmac
import uuid
import base64
from google.appengine.ext import db
from datetime import datetime
from datetime import timedelta
from models import Users
from oauth import TwitterClient
def generate_rnd_hash(uid):
h = hmac.new(str(uid))
h.update(uuid.uuid4().bytes)
return base64.b64encode(h.digest() + uuid.uuid4().bytes, ['+', '-']).replace('=', '').replace('+', '')
def set_cookie(uid, user_info = {}):
last_error = "ok"
hash = generate_rnd_hash(uid)
dt = datetime.utcnow() + timedelta(seconds = 60*60*24*7)
exp_gmt = dt.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
user = Users.get_by_key_name(str(uid))
if not user:
user = Users(key_name=str(uid))
if user_info:
user.uid = user_info["uid"]
user.username = user_info["username"]
user.name = user_info["name"]
user.image = user_info["image"]
user.token = user_info["token"]
user.secret = user_info["secret"]
user.hash = hash
user.hashex = dt
user.put()
try:
response.set_cookie('sid', hash, secret = None, \
**{'expires' : exp_gmt, 'path' : '/'})
except Exception, msg:
logging.error(msg)
def del_cookie():
uid = get_cookie()
user = Users.get_by_key_name(str(uid)) if uid else None
if user:
user.delete()
try:
response.set_cookie('sid', "", secret = None, \
**{'path' : '/'})
except Exception, msg:
logging.error(msg)
def get_cookie():
hash = request.get_cookie("sid")
logging.debug(hash)
key = Users.all(keys_only=True).filter("hash = ", hash).fetch(1)
key = long(key[0].name()) if key else 0
return key
OAuth для твиттера
Этот интерфейс авторизации придумали для того что бы свой пароль пользователь не оставлял на третьих сайтах, а авторизовался непосредственно там он создал аккаунт - у провайдера. В данном примере речь пойдёт о Twitter.
Итак мы зарегистрировали приложение в предыдущем посте. И получили два пин-кода: ключ, и секрет. С помощью их мы можем теперь получить, если пользователь разрешит, пользовательский токен, и секрет - пользовательские пин-коды. Ключей везде по двое, что бы обеспечьте защиту канала связи.
По большому счёту если нет желания со всем этим заморачиваться - то и не надо, для это есть уже готовые библиотеки, сделанные прямо для авторизации в твиттере через GAE-приложение, и даже не одна. Я взял AppEngine-OAuth-Library by Mike Knapp, которая состоит из одного файла и маленьким примерчиком.
Собственно весь процесс авторизации выглядит следующим образом:
service, token, secret, id, username, name, picture. Теперь в твиттер можно отправлять авторизованные запросы:
Итак мы зарегистрировали приложение в предыдущем посте. И получили два пин-кода: ключ, и секрет. С помощью их мы можем теперь получить, если пользователь разрешит, пользовательский токен, и секрет - пользовательские пин-коды. Ключей везде по двое, что бы обеспечьте защиту канала связи.
По большому счёту если нет желания со всем этим заморачиваться - то и не надо, для это есть уже готовые библиотеки, сделанные прямо для авторизации в твиттере через GAE-приложение, и даже не одна. Я взял AppEngine-OAuth-Library by Mike Knapp, которая состоит из одного файла и маленьким примерчиком.
Собственно весь процесс авторизации выглядит следующим образом:
@route('/login')
@route('/login/')
def login_view():
callback_url = "http://%s/verify" % request.environ["HTTP_HOST"]
client = TwitterClient(TWITTER_KEY, TWITTER_SECRET, callback_url)
redirect(client.get_authorization_url())
@route('/verify')
@route('/verify/')
def verify_view():
callback_url = "http://%s/verify" % request.environ["HTTP_HOST"]
auth_token = request.GET.get('oauth_token', "")
auth_verifier = request.GET.get('oauth_verifier', "")
client = TwitterClient(TWITTER_KEY, TWITTER_SECRET, callback_url)
try:
user_info = client.get_user_info(auth_token, auth_verifier=auth_verifier)
except Exception, msg:
redirect("/")
set_cookie(user_info["uid"], user_info)
redirect("/")
Собственно запрос на авторизацию и её проверка. В случаее успеха имеем словарик сservice, token, secret, id, username, name, picture. Теперь в твиттер можно отправлять авторизованные запросы:
timeline_url = "http://twitter.com/statuses/user_timeline.xml"
result = client.make_request(url=timeline_url, token=user_token,
secret=user_secret)
суббота, 28 мая 2011 г.
Твиттер
Как я уже сообщил что одну неделю приложение было не работоспособно из за бага. За это время пришло понимание каким наконец приложение должно быть. И будет оно таким:
После ввода капчи, приложение можно считать зарегистрированным.
- твиттер-ориентированным, или дословно твиттер-приложением.
- больше ориентированно на сами твиты, чем на фолловеров.
- ну и новости, тредны тоже должны быть.
- Application Name - уникальное название приложения
- Description - описание.
- Application Website - домашняя страница приложения.
- Organization - можно указать себя.
- Application Type - либо вэб, либо десктопное.
- Callback URL - если десктопное, то надо указать куда будет перенаправлять твиттер авторизованных, через OAuth пользователей (подробней об этом уже в следующем посте).
- Application Icon - иконка.
После ввода капчи, приложение можно считать зарегистрированным.
Подписаться на:
Сообщения (Atom)
Обо мне
Мои проекты
Постоянные читатели
Архив блога
Copyright © trendec. Технологии Blogger.