Twitter notifier

This commit is contained in:
Ruud committed 2011-10-09 14:01:45 +02:00
1 parent 4aeb67197e
commit 49a7a9129b
3 files changed
+118 -31

No files matched your search

@@ -16,11 +16,15 @@ config = [{
'type': 'enabler', 'type': 'enabler',
}, },
{ {
'name': 'username', 'name': 'access_token_key',
'advanced': True, 'advanced': True,
}, },
{ {
'name': 'password', 'name': 'screen_name',
'advanced': True,
},
{
'name': 'access_token_secret',
'advanced': True, 'advanced': True,
}, },
], ],
+44 -29
View File
@@ -1,7 +1,11 @@
from couchpotato.api import addApiView
from couchpotato.core.helpers.request import jsonified, getParam
from couchpotato.core.helpers.variable import cleanHost
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.notifications.base import Notification from couchpotato.core.notifications.base import Notification
from couchpotato.environment import Env from flask.helpers import url_for
from pytwitter import Api, parse_qsl from pytwitter import Api, parse_qsl
from werkzeug.utils import redirect
import oauth2 import oauth2
import urllib import urllib
@@ -10,8 +14,10 @@ log = CPLog(__name__)
class Twitter(Notification): class Twitter(Notification):
consumer_key = "3POVsO3KW90LKZXyzPOjQ" consumer_key = '3POVsO3KW90LKZXyzPOjQ'
consumer_secret = "Qprb94hx9ucXvD4Wvg2Ctsk4PDK7CcQAKgCELXoyIjE" consumer_secret = 'Qprb94hx9ucXvD4Wvg2Ctsk4PDK7CcQAKgCELXoyIjE'
request_token = None
urls = { urls = {
'request': 'https://api.twitter.com/oauth/request_token', 'request': 'https://api.twitter.com/oauth/request_token',
@@ -19,10 +25,16 @@ class Twitter(Notification):
'authorize': 'https://api.twitter.com/oauth/authorize', 'authorize': 'https://api.twitter.com/oauth/authorize',
} }
def __init__(self):
super(Twitter, self).__init__()
addApiView('notify.%s.auth_url' % self.getName().lower(), self.getAuthorizationUrl)
addApiView('notify.%s.credentials' % self.getName().lower(), self.getCredentials)
def notify(self, message = '', data = {}): def notify(self, message = '', data = {}):
if self.isDisabled(): return if self.isDisabled(): return
api = Api(self.consumer_key, self.consumer_secret, self.conf('username'), self.conf('password')) api = Api(self.consumer_key, self.consumer_secret, self.conf('access_token_key'), self.conf('access_token_secret'))
try: try:
api.PostUpdate('[%s] %s' % (self.default_title, message)) api.PostUpdate('[%s] %s' % (self.default_title, message))
@@ -32,52 +44,55 @@ class Twitter(Notification):
return True return True
def getAuthorization(self, referer): def getAuthorizationUrl(self):
referer = getParam('host')
callback_url = cleanHost(referer) + '%snotify.%s.credentials/' % (url_for('api.index').lstrip('/'), self.getName().lower())
oauth_consumer = oauth2.Consumer(self.consumer_key, self.consumer_secret) oauth_consumer = oauth2.Consumer(self.consumer_key, self.consumer_secret)
oauth_client = oauth2.Client(oauth_consumer) oauth_client = oauth2.Client(oauth_consumer)
resp, content = oauth_client.request(self.url['request'], 'POST', body = urllib.urlencode({'oauth_callback': referer + 'twitterAuth/'})) resp, content = oauth_client.request(self.urls['request'], 'POST', body = urllib.urlencode({'oauth_callback': callback_url}))
if resp['status'] != '200': if resp['status'] != '200':
log.error('Invalid response from Twitter requesting temp token: %s' % resp['status']) log.error('Invalid response from Twitter requesting temp token: %s' % resp['status'])
return jsonified({
'success': False,
})
else: else:
request_token = dict(parse_qsl(content)) self.request_token = dict(parse_qsl(content))
Env.setting('username', section = 'twitter', value = request_token['oauth_token']) auth_url = self.urls['authorize'] + ("?oauth_token=%s" % self.request_token['oauth_token'])
Env.setting('password', section = 'twitter', value = request_token['oauth_token_secret'])
auth_url = self.url['authorize'] + "?oauth_token=" + request_token['oauth_token'] log.info('Redirecting to "%s"' % auth_url)
return jsonified({
'success': True,
'url': auth_url,
})
log.info('Your Twitter authentication url is "%s"' % auth_url) def getCredentials(self):
return auth_url
def getCredentials(self, key): key = getParam('oauth_verifier')
request_token = {
'oauth_token': self.conf('username'),
'oauth_token_secret': self.conf('password'),
'oauth_callback_confirmed': True
}
token = oauth2.Token(request_token['oauth_token'], request_token['oauth_token_secret']) token = oauth2.Token(self.request_token['oauth_token'], self.request_token['oauth_token_secret'])
token.set_verifier(key) token.set_verifier(key)
log.info('Generating and signing request for an access token using key: %s' % key)
oauth_consumer = oauth2.Consumer(key = self.consumer_key, secret = self.consumer_secret) oauth_consumer = oauth2.Consumer(key = self.consumer_key, secret = self.consumer_secret)
oauth_client = oauth2.Client(oauth_consumer, token) oauth_client = oauth2.Client(oauth_consumer, token)
resp, content = oauth_client.request(self.url['access'], method = 'POST', body = 'oauth_verifier=%s' % key) resp, content = oauth_client.request(self.urls['access'], method = 'POST', body = 'oauth_verifier=%s' % key)
access_token = dict(parse_qsl(content)) access_token = dict(parse_qsl(content))
if resp['status'] != '200': if resp['status'] != '200':
log.error('The request for an access token did not succeed: ' + str(resp['status'])) log.error('The request for an access token did not succeed: %s' % resp['status'])
return False return 'Twitter auth failed'
else: else:
log.info('Your Twitter access token is %s' % access_token['oauth_token']) log.debug('Tokens: %s, %s' % (access_token['oauth_token'], access_token['oauth_token_secret']))
log.info('Access token secret is %s' % access_token['oauth_token_secret'])
Env.setting('username', section = 'twitter', value = access_token['oauth_token']) self.conf('access_token_key', value = access_token['oauth_token'])
Env.setting('password', section = 'twitter', value = access_token['oauth_token_secret']) self.conf('access_token_secret', value = access_token['oauth_token_secret'])
self.conf('screen_name', value = access_token['screen_name'])
return True self.request_token = None
return redirect(url_for('web.index') + 'settings/notifications/')
@@ -0,0 +1,68 @@
var TwitterNotification = new Class({
initialize: function(){
var self = this;
App.addEvent('load', self.addRegisterButton.bind(self));
},
addRegisterButton: function(){
var self = this;
var setting_page = App.getPage('Settings');
setting_page.addEvent('create', function(){
var fieldset = setting_page.tabs.notifications.groups.twitter,
l = window.location;
var twitter_set = 0;
fieldset.getElements('input[type=text]').each(function(el){
twitter_set += +(el.get('value') != '');
});
new Element('.ctrlHolder').adopt(
// Unregister button
(twitter_set > 0) ?
[
self.unregister = new Element('a.button.red', {
'text': 'Unregister "'+fieldset.getElement('input[name*=screen_name]').get('value')+'"',
'events': {
'click': function(){
fieldset.getElements('input[type=text]').set('value', '').fireEvent('change');
self.unregister.destroy();
self.unregister_or.destroy();
}
}
}),
self.unregister_or = new Element('span[text=or]')
]
: null,
// Register button
new Element('a.button', {
'text': twitter_set > 0 ? 'Register a different account' : 'Register your Twitter account',
'events': {
'click': function(){
Api.request('notify.twitter.auth_url', {
'data': {
'host': l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '')
},
'onComplete': function(json){
window.location = json.url;
}
});
}
}
})
).inject(fieldset.getElement('.test_button'), 'before');
})
},
});
window.addEvent('domready', function(){
new TwitterNotification();
});