diff --git a/couchpotato/core/notifications/twitter/__init__.py b/couchpotato/core/notifications/twitter/__init__.py index 1c0eb6d2..6bdd5348 100644 --- a/couchpotato/core/notifications/twitter/__init__.py +++ b/couchpotato/core/notifications/twitter/__init__.py @@ -16,11 +16,15 @@ config = [{ 'type': 'enabler', }, { - 'name': 'username', + 'name': 'access_token_key', 'advanced': True, }, { - 'name': 'password', + 'name': 'screen_name', + 'advanced': True, + }, + { + 'name': 'access_token_secret', 'advanced': True, }, ], diff --git a/couchpotato/core/notifications/twitter/main.py b/couchpotato/core/notifications/twitter/main.py index dd896fa8..f3891956 100644 --- a/couchpotato/core/notifications/twitter/main.py +++ b/couchpotato/core/notifications/twitter/main.py @@ -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.notifications.base import Notification -from couchpotato.environment import Env +from flask.helpers import url_for from pytwitter import Api, parse_qsl +from werkzeug.utils import redirect import oauth2 import urllib @@ -10,8 +14,10 @@ log = CPLog(__name__) class Twitter(Notification): - consumer_key = "3POVsO3KW90LKZXyzPOjQ" - consumer_secret = "Qprb94hx9ucXvD4Wvg2Ctsk4PDK7CcQAKgCELXoyIjE" + consumer_key = '3POVsO3KW90LKZXyzPOjQ' + consumer_secret = 'Qprb94hx9ucXvD4Wvg2Ctsk4PDK7CcQAKgCELXoyIjE' + + request_token = None urls = { 'request': 'https://api.twitter.com/oauth/request_token', @@ -19,10 +25,16 @@ class Twitter(Notification): '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 = {}): 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: api.PostUpdate('[%s] %s' % (self.default_title, message)) @@ -32,52 +44,55 @@ class Twitter(Notification): 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_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': log.error('Invalid response from Twitter requesting temp token: %s' % resp['status']) + return jsonified({ + 'success': False, + }) else: - request_token = dict(parse_qsl(content)) + self.request_token = dict(parse_qsl(content)) - Env.setting('username', section = 'twitter', value = request_token['oauth_token']) - Env.setting('password', section = 'twitter', value = request_token['oauth_token_secret']) + auth_url = self.urls['authorize'] + ("?oauth_token=%s" % self.request_token['oauth_token']) - 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) - return auth_url + def getCredentials(self): - def getCredentials(self, key): - request_token = { - 'oauth_token': self.conf('username'), - 'oauth_token_secret': self.conf('password'), - 'oauth_callback_confirmed': True - } + key = getParam('oauth_verifier') - 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) - 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_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)) if resp['status'] != '200': - log.error('The request for an access token did not succeed: ' + str(resp['status'])) - return False + log.error('The request for an access token did not succeed: %s' % resp['status']) + return 'Twitter auth failed' else: - log.info('Your Twitter access token is %s' % access_token['oauth_token']) - log.info('Access token secret is %s' % access_token['oauth_token_secret']) + log.debug('Tokens: %s, %s' % (access_token['oauth_token'], access_token['oauth_token_secret'])) - Env.setting('username', section = 'twitter', value = access_token['oauth_token']) - Env.setting('password', section = 'twitter', value = access_token['oauth_token_secret']) + self.conf('access_token_key', value = access_token['oauth_token']) + 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/') diff --git a/couchpotato/core/notifications/twitter/static/twitter.js b/couchpotato/core/notifications/twitter/static/twitter.js new file mode 100644 index 00000000..2c4e6e31 --- /dev/null +++ b/couchpotato/core/notifications/twitter/static/twitter.js @@ -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(); +});