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.

124 lines
4.9 KiB

11 years ago
from urlparse import parse_qsl
14 years ago
from couchpotato.api import addApiView
from couchpotato.core.helpers.encoding import tryUrlencode
14 years ago
from couchpotato.core.helpers.variable import cleanHost
14 years ago
from couchpotato.core.logger import CPLog
from couchpotato.core.notifications.base import Notification
from couchpotato.environment import Env
12 years ago
from pytwitter import Api
14 years ago
import oauth2
11 years ago
14 years ago
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 = None, listener = None):
if not data: data = {}
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('[%s] %s' % (self.default_title, message), screen_name = user)
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)
11 years ago
except Exception as e:
log.error('Error sending tweet: %s', e)
14 years ago
return False
return True
def getAuthorizationUrl(self, host = None, **kwargs):
14 years ago
callback_url = cleanHost(host) + '%snotify.%s.credentials/' % (Env.get('api_base').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'])
return {
14 years ago
'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)
return {
14 years ago
'success': True,
'url': auth_url,
}
14 years ago
def getCredentials(self, oauth_verifier, **kwargs):
14 years ago
14 years ago
token = oauth2.Token(self.request_token['oauth_token'], self.request_token['oauth_token_secret'])
token.set_verifier(oauth_verifier)
14 years ago
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.urls['access'], method = 'POST', body = 'oauth_verifier=%s' % oauth_verifier)
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
return 'redirect', Env.get('web_base') + 'settings/notifications/'