You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.7 KiB

14 years ago
from couchpotato.api import addApiView
from couchpotato.core.helpers.request import jsonified, getParam
from couchpotato.core.helpers.variable import cleanHost
14 years ago
from couchpotato.core.logger import CPLog
from couchpotato.core.notifications.base import Notification
14 years ago
from flask.helpers import url_for
14 years ago
from pytwitter import Api, parse_qsl
14 years ago
from werkzeug.utils import redirect
14 years ago
import oauth2
import urllib
log = CPLog(__name__)
class Twitter(Notification):
14 years ago
consumer_key = '3POVsO3KW90LKZXyzPOjQ'
consumer_secret = 'Qprb94hx9ucXvD4Wvg2Ctsk4PDK7CcQAKgCELXoyIjE'
request_token = None
14 years ago
urls = {
'request': 'https://api.twitter.com/oauth/request_token',
'access': 'https://api.twitter.com/oauth/access_token',
'authorize': 'https://api.twitter.com/oauth/authorize',
}
14 years ago
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
14 years ago
14 years ago
api = Api(self.consumer_key, self.consumer_secret, self.conf('access_token_key'), self.conf('access_token_secret'))
14 years ago
mention = self.conf('mention')
if mention:
message = '%s @%s' % (message, mention.lstrip('@'))
14 years ago
try:
api.PostUpdate('[%s] %s' % (self.default_title, message))
except Exception, e:
log.error('Error sending tweet: %s' % e)
return False
return True
14 years ago
def getAuthorizationUrl(self):
referer = getParam('host')
callback_url = cleanHost(referer) + '%snotify.%s.credentials/' % (url_for('api.index').lstrip('/'), self.getName().lower())
14 years ago
oauth_consumer = oauth2.Consumer(self.consumer_key, self.consumer_secret)
oauth_client = oauth2.Client(oauth_consumer)
14 years ago
resp, content = oauth_client.request(self.urls['request'], 'POST', body = urllib.urlencode({'oauth_callback': callback_url}))
14 years ago
if resp['status'] != '200':
log.error('Invalid response from Twitter requesting temp token: %s' % resp['status'])
14 years ago
return jsonified({
'success': False,
})
14 years ago
else:
14 years ago
self.request_token = dict(parse_qsl(content))
14 years ago
14 years ago
auth_url = self.urls['authorize'] + ("?oauth_token=%s" % self.request_token['oauth_token'])
14 years ago
14 years ago
log.info('Redirecting to "%s"' % auth_url)
return jsonified({
'success': True,
'url': auth_url,
})
14 years ago
14 years ago
def getCredentials(self):
14 years ago
14 years ago
key = getParam('oauth_verifier')
14 years ago
14 years ago
token = oauth2.Token(self.request_token['oauth_token'], self.request_token['oauth_token_secret'])
14 years ago
token.set_verifier(key)
oauth_consumer = oauth2.Consumer(key = self.consumer_key, secret = self.consumer_secret)
oauth_client = oauth2.Client(oauth_consumer, token)
14 years ago
resp, content = oauth_client.request(self.urls['access'], method = 'POST', body = 'oauth_verifier=%s' % key)
14 years ago
access_token = dict(parse_qsl(content))
if resp['status'] != '200':
14 years ago
log.error('The request for an access token did not succeed: %s' % resp['status'])
return 'Twitter auth failed'
14 years ago
else:
14 years ago
log.debug('Tokens: %s, %s' % (access_token['oauth_token'], 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'])
14 years ago
14 years ago
self.request_token = None
14 years ago
14 years ago
return redirect(url_for('web.index') + 'settings/notifications/')