~pablo-a-saavedra/gwibber/yammer-integration

« back to all changes in this revision

Viewing changes to gwibber/microblog/twitter.py

  • Committer: Ken VanDine
  • Date: 2010-09-01 01:56:24 UTC
  • mfrom: (738.1.4 gwibber-2.30-oauth)
  • Revision ID: ken.vandine@canonical.com-20100901015624-kjxjz78ozdd3dt42
Tags: 2.30.2
Merged twitter/oauth branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import network, util, htmllib
2
 
from util import log
3
 
from util import exceptions
 
1
import network, util, htmllib, re
 
2
import gnomekeyring
 
3
from oauth import oauth
 
4
from util import log, exceptions
4
5
from gettext import lgettext as _
5
6
log.logger.name = "Twitter"
6
7
 
9
10
  "version": "1.0",
10
11
  
11
12
  "config": [
12
 
    "private:password",
 
13
    "private:secret_token",
 
14
    "access_token",
13
15
    "username",
14
16
    "color",
15
17
    "receive_enabled",
16
18
    "send_enabled",
17
19
  ],
18
20
 
19
 
  "authtype": "login",
 
21
  "authtype": "oauth1a",
20
22
  "color": "#729FCF",
21
23
 
22
24
  "features": [
44
46
}
45
47
 
46
48
URL_PREFIX = "https://twitter.com"
 
49
API_PREFIX = "https://api.twitter.com/1"
47
50
 
48
51
def unescape(s):
49
52
  p = htmllib.HTMLParser(None)
53
56
 
54
57
class Client:
55
58
  def __init__(self, acct):
 
59
    if not acct.has_key("access_token") and not acct.has_key("secret_token"):
 
60
      raise exceptions.GwibberProtocolError("keyring")
 
61
    if acct.has_key("secret_token") and acct.has_key("password"): acct.pop("password")
56
62
    self.account = acct
 
63
    self.sigmethod = oauth.OAuthSignatureMethod_HMAC_SHA1()
 
64
    self.consumer = oauth.OAuthConsumer(*util.resources.get_twitter_keys())
 
65
    self.token = oauth.OAuthToken(acct["access_token"], acct["secret_token"])
57
66
 
58
67
  def _common(self, data):
59
68
    m = {}; 
72
81
      m["content"] = util.linkify(data["text"],
73
82
        ((util.PARSE_HASH, '#<a class="hash" href="gwibber:/tag?acct=%s&query=\\1">\\1</a>' % m["account"]),
74
83
        (util.PARSE_NICK, '@<a class="nick" href="gwibber:/user?acct=%s&name=\\1">\\1</a>' % m["account"])), escape=False)
75
 
    except:
 
84
    except: 
76
85
      log.logger.error("%s failure - %s", PROTOCOL_INFO["name"], data)
77
 
 
 
86
 
78
87
    return m
79
88
 
80
89
  def _message(self, data):
 
90
    if type(data) == type(None):
 
91
      return []
 
92
 
81
93
    m = self._common(data)
82
94
    m["source"] = data.get("source", False)
83
95
    
125
137
    return m
126
138
 
127
139
  def _get(self, path, parse="message", post=False, single=False, **args):
128
 
    url = "/".join((URL_PREFIX, path))
 
140
    url = "/".join((API_PREFIX, path))
 
141
 
 
142
    request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, self.token,
 
143
        http_method=post and "POST" or "GET", http_url=url, parameters=util.compact(args))
 
144
    request.sign_request(self.sigmethod, self.consumer, self.token)
129
145
    
130
 
    data = network.Download(url, util.compact(args) or None, post,
131
 
        self.account["username"], self.account["password"]).get_json()
 
146
    if post:
 
147
      data = network.Download(request.to_url(), util.compact(args), post).get_json()
 
148
    else:
 
149
      data = network.Download(request.to_url(), None, post).get_json()
132
150
 
133
151
    if isinstance(data, dict) and data.get("errors", 0):
134
152
      if "authenticate" in data["errors"][0]["message"]:
144
162
    elif isinstance(data, str):
145
163
      log.logger.error("%s unexpected result - %s", PROTOCOL_INFO["name"], data)
146
164
      return []
147
 
 
 
165
    
148
166
    if single: return [getattr(self, "_%s" % parse)(data)]
149
167
    if parse: return [getattr(self, "_%s" % parse)(m) for m in data]
150
168
    else: return []
186
204
 
187
205
  def send(self, message):
188
206
    return self._get("statuses/update.json", post=True, single=True,
189
 
        status=message, source="gwibbernet")
190
 
 
 
207
        status=message)
 
208
  
191
209
  def send_thread(self, message, target):
192
210
    return self._get("statuses/update.json", post=True, single=True,
193
 
        status=message, source="gwibbernet", in_reply_to_status_id=target["id"])
194
 
 
 
211
        status=message, in_reply_to_status_id=target["id"])