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.

126 lines
5.0 KiB

14 years ago
from couchpotato.api import addApiView
from couchpotato.core.helpers.encoding import tryUrlencode
14 years ago
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
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 = {}, listener = None):
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
direct_message = self.conf('direct_message')
direct_message_users = self.conf('screen_name')
mention = self.conf('mention')
mention_tag = None
if mention:
if direct_message:
direct_message_users = '%s %s' % (direct_message_users, mention)
direct_message_users = direct_message_users.replace('@', ' ')
direct_message_users = direct_message_users.replace(',', ' ')
else:
mention_tag = '@%s' % mention.lstrip('@')
message = '%s %s' % (message, mention_tag)
14 years ago
try:
if direct_message:
for user in direct_message_users.split():
api.PostDirectMessage(user, '[%s] %s' % (self.default_title, message))
else:
update_message = '[%s] %s' % (self.default_title, message)
if len(update_message) > 140:
if mention_tag:
api.PostUpdate(update_message[:135 - len(mention_tag)] + ('%s 1/2 ' % mention_tag))
api.PostUpdate(update_message[135 - len(mention_tag):] + ('%s 2/2 ' % mention_tag))
else:
api.PostUpdate(update_message[:135] + ' 1/2')
api.PostUpdate(update_message[135:] + ' 2/2')
else:
api.PostUpdate(update_message)
14 years ago
except Exception, e:
log.error('Error sending tweet: %s', e)
14 years ago
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)
resp, content = oauth_client.request(self.urls['request'], 'POST', body = tryUrlencode({'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
log.info('Redirecting to "%s"', auth_url)
14 years ago
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':
log.error('The request for an access token did not succeed: %s', resp['status'])
14 years ago
return 'Twitter auth failed'
14 years ago
else:
log.debug('Tokens: %s, %s', (access_token['oauth_token'], access_token['oauth_token_secret']))
14 years ago
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/')