Twitter notifier
This commit is contained in:
@@ -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,
|
||||
},
|
||||
],
|
||||
|
||||
@@ -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/')
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
Reference in New Issue
Block a user