~khurshid-alam/gwibber/gwibber-hack

« back to all changes in this revision

Viewing changes to gwibber/microblog/greader.py

  • Committer: Khurshid Alam
  • Date: 2012-04-06 14:38:38 UTC
  • Revision ID: khurshid.alam@linuxmail.org-20120406143838-nz7hjg8vtzi2wl7i
initial revision

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
"""
 
3
 
 
4
Google Reader interface for Gwibber
 
5
Grillo (Diego Herrera) - 7/02/2009
 
6
 
 
7
bassed on RSS interface:
 
8
SegPhault (Ryan Paul) - 11/08/2008
 
9
 
 
10
"""
 
11
 
 
12
from . import support
 
13
import urlparse, feedparser
 
14
import urllib, urllib2, re
 
15
import webbrowser
 
16
 
 
17
PROTOCOL_INFO = {
 
18
  "name": "Google Reader",
 
19
  "version": 0.1,
 
20
 
 
21
  "config": [
 
22
    "private:password",
 
23
    "username",
 
24
    "message_color",
 
25
    "receive_enabled",
 
26
  ],
 
27
 
 
28
  "features": [
 
29
    can.RECEIVE,
 
30
    can.READ,
 
31
  ],
 
32
}
 
33
 
 
34
feedparser._HTMLSanitizer.acceptable_elements = []
 
35
 
 
36
class Message:
 
37
  def __init__(self, client, data):
 
38
    self.client = client
 
39
    self.account = client.account
 
40
    self.service = client.account["service"]
 
41
    self.username = client.account["username"]
 
42
 
 
43
    self.source = ""
 
44
    self.sender = data.get("author", "")
 
45
 
 
46
    if hasattr(data, "source"):
 
47
        self.source = data.source.get("title", "")
 
48
        self.sender = data.source.get("title", "")
 
49
        self.profile_url = data.source.link
 
50
 
 
51
    self.gr_id = data.get("id", "")
 
52
 
 
53
    self.image = "http://www.google.com/reader/ui/2296270177-logo-graphic.gif";
 
54
    self.sender_nick = data.get("author", "")
 
55
    self.sender_id = self.sender
 
56
 
 
57
    self.time = support.parse_time(data.updated)
 
58
    self.bgcolor = "message_color"
 
59
    self.url = data.get("link", "")
 
60
 
 
61
    if(self.source == ""):
 
62
        self.title = self.sender
 
63
    else:
 
64
        self.title = "%s <small>By %s</small>" % (self.source, self.sender)
 
65
 
 
66
    self.is_unread = True
 
67
    self.categories = []
 
68
 
 
69
    for category in data.tags:
 
70
      if( (category.term.find("user/")>=0) and (category.term.find("/state/")>=0) and (category.label=='read') ):
 
71
        self.is_unread = False
 
72
      elif((category.term.find("user/")>=0) and (category.term.find("/label/")>=0)):
 
73
        self.categories.append(category.label)
 
74
 
 
75
    self.summary = data.get("summary", "")
 
76
    self.html_string = data.title
 
77
 
 
78
    if(len(self.summary) > 0):
 
79
      self.text = self.summary
 
80
    else:
 
81
      self.text = data.source.get("title", "")
 
82
 
 
83
class Client:
 
84
    def __init__(self, acct):
 
85
        self.account = acct
 
86
        if(self.account["session"]!= None):
 
87
            self.sid = self.account["session"]
 
88
        else:
 
89
            self.get_auth()
 
90
 
 
91
 
 
92
    def get_auth(self):
 
93
        header = {'User-agent' : 'Gwibber'}
 
94
        post_data = urllib.urlencode({ 'Email': self.account["username"],
 
95
                                       'Passwd': self.account["private:password"],
 
96
                                       'service': 'reader',
 
97
                                       'source': 'Gwibber',
 
98
                                       'continue': 'http://www.google.com', })
 
99
 
 
100
        request = urllib2.Request('https://www.google.com/accounts/ClientLogin',
 
101
                                  post_data,
 
102
                                  header)
 
103
        try :
 
104
            f = urllib2.urlopen( request )
 
105
            res = f.read()
 
106
        except:
 
107
            raise
 
108
        self.sid = re.search('SID=(\S*)', res).group(1)
 
109
        self.account["session"] = self.sid
 
110
 
 
111
    def get_results(self,url, data = None,  count = 0):
 
112
        header ={'User-agent' : 'Gwibber',
 
113
                 'Cookie': 'Name=SID;SID=%s;Domain=.google.com;Path=/;Expires=160000000000' % self.sid}
 
114
        request = urllib2.Request(url, data, header)
 
115
        try :
 
116
            f = urllib2.urlopen( request )
 
117
            if(f.url != url):
 
118
                self.get_auth()
 
119
                if(count < 3):
 
120
                    res = self.get_results(url, data, count+1)
 
121
                else:
 
122
                    res = None
 
123
            else:
 
124
                res = f.read()
 
125
        except:
 
126
            res = None
 
127
        return res
 
128
 
 
129
    def read_message(self, message):
 
130
        webbrowser.open (message.url)
 
131
        if message.is_unread:
 
132
            token = self.get_results('http://www.google.com/reader/api/0/token')
 
133
            post_data = urllib.urlencode ({ 'i' : message.gr_id,
 
134
                                            'T' : token,
 
135
                                            'ac' : 'edit-tags' ,
 
136
                                            'a' : 'user/-/state/com.google/read' })
 
137
 
 
138
            url = 'http://www.google.com/reader/api/0/edit-tag'
 
139
            self.get_results(url, post_data)
 
140
            message.is_unread = False
 
141
            return True
 
142
        return False
 
143
 
 
144
    def get_messages(self):
 
145
        return feedparser.parse(
 
146
            self.get_results(
 
147
            'http://www.google.com/reader/atom/user/-/state/com.google/reading-list?n=%s' % '20' if (self.account["receive_count"] == None) else self.account["receive_count"])).entries
 
148
 
 
149
    def receive(self):
 
150
        for data in self.get_messages():
 
151
            yield Message(self, data)