| 1 | # -*- coding: utf-8 -*- |
|---|
| 2 | import urllib2,urllib,json |
|---|
| 3 | |
|---|
| 4 | class Twitter: |
|---|
| 5 | def __init__(self, userdata): |
|---|
| 6 | self.user = userdata |
|---|
| 7 | |
|---|
| 8 | def setUser(self,userdata): |
|---|
| 9 | self.user = userdata |
|---|
| 10 | |
|---|
| 11 | def setAuthHandler(self): |
|---|
| 12 | #ユーザ名等設定する |
|---|
| 13 | #初回時のみで充分かなぁ |
|---|
| 14 | auth_handler = urllib2.HTTPBasicAuthHandler() |
|---|
| 15 | auth_handler.add_password('Twitter API','twitter.com',self.user['user'],self.user['pass']) |
|---|
| 16 | opener = urllib2.build_opener(auth_handler) |
|---|
| 17 | urllib2.install_opener(opener) |
|---|
| 18 | return opener |
|---|
| 19 | |
|---|
| 20 | def get(self,username): |
|---|
| 21 | self.setAuthHandler() |
|---|
| 22 | data = urllib2.urlopen("http://twitter.com/statuses/friends_timeline.json") |
|---|
| 23 | urlstring = data.read() |
|---|
| 24 | a = json.read(urlstring) |
|---|
| 25 | return self.parseTwitJSON(a) |
|---|
| 26 | |
|---|
| 27 | def getPublicTimeline(self): |
|---|
| 28 | data = urllib2.urlopen("http://twitter.com/statuses/public_timeline.json") |
|---|
| 29 | urlstring = data.read() |
|---|
| 30 | a = json.read(urlstring) |
|---|
| 31 | return self.parseTwitJSON(a) |
|---|
| 32 | |
|---|
| 33 | def getReplies(self,username): |
|---|
| 34 | self.setAuthHandler() |
|---|
| 35 | data = urllib2.urlopen("http://twitter.com/statuses/replies.json") |
|---|
| 36 | urlstring = data.read() |
|---|
| 37 | a = json.read(urlstring) |
|---|
| 38 | return self.parseTwitJSON(a) |
|---|
| 39 | |
|---|
| 40 | def getDM(self,username): |
|---|
| 41 | self.setAuthHandler() |
|---|
| 42 | s = "http://twitter.com/direct_messages.json" |
|---|
| 43 | print "url+" +s |
|---|
| 44 | data = urllib2.urlopen(s) |
|---|
| 45 | urlstring = data.read() |
|---|
| 46 | a = json.read(urlstring) |
|---|
| 47 | print a |
|---|
| 48 | return self.parseTwitJSONDM(a) |
|---|
| 49 | |
|---|
| 50 | def getWithPage(self,username,num): |
|---|
| 51 | # page番号つきget |
|---|
| 52 | self.setAuthHandler() |
|---|
| 53 | s = "http://twitter.com/statuses/friends_timeline.json?page="+str(num) |
|---|
| 54 | print "url+" +s |
|---|
| 55 | data = urllib2.urlopen(s) |
|---|
| 56 | urlstring = data.read() |
|---|
| 57 | a = json.read(urlstring) |
|---|
| 58 | return self.parseTwitJSON(a) |
|---|
| 59 | |
|---|
| 60 | def getWithUser(self,user): |
|---|
| 61 | # page番号つきget |
|---|
| 62 | self.setAuthHandler() |
|---|
| 63 | s = "http://twitter.com/statuses/user_timeline/"+user+".json" |
|---|
| 64 | print "url+" +s |
|---|
| 65 | data = urllib2.urlopen(s) |
|---|
| 66 | urlstring = data.read() |
|---|
| 67 | a = json.read(urlstring) |
|---|
| 68 | return self.parseTwitJSON(a) |
|---|
| 69 | |
|---|
| 70 | def getWithUserPage(self,username,num): |
|---|
| 71 | # page番号つきget |
|---|
| 72 | self.setAuthHandler() |
|---|
| 73 | s = "http://twitter.com/statuses/user_timeline/"+username+".json?page="+str(num) |
|---|
| 74 | print "url+" +s |
|---|
| 75 | data = urllib2.urlopen(s) |
|---|
| 76 | urlstring = data.read() |
|---|
| 77 | a = json.read(urlstring) |
|---|
| 78 | return self.parseTwitJSON(a) |
|---|
| 79 | |
|---|
| 80 | def getFollowersLite(self,username): |
|---|
| 81 | # followerを取得 |
|---|
| 82 | |
|---|
| 83 | self.setAuthHandler() |
|---|
| 84 | # ここ変える |
|---|
| 85 | s = "http://twitter.com/statuses/followers.json?lite=true" |
|---|
| 86 | print "url+" +s |
|---|
| 87 | data = urllib2.urlopen(s) |
|---|
| 88 | urlstring = data.read() |
|---|
| 89 | a = json.read(urlstring) |
|---|
| 90 | return self.parseTwitJSONFollowers(a) |
|---|
| 91 | def parseTwitJSON(self,a): |
|---|
| 92 | result = [] |
|---|
| 93 | for x in a: |
|---|
| 94 | resultSub = [] |
|---|
| 95 | #resultSub.append(x['created_at']) |
|---|
| 96 | y = x['user'] |
|---|
| 97 | resultSub.append(y['screen_name']) |
|---|
| 98 | resultSub.append(x['text']) |
|---|
| 99 | resultSub.append(x['created_at']) |
|---|
| 100 | result.append(resultSub) |
|---|
| 101 | #print resultSub[0]+resultSub[1] |
|---|
| 102 | return result |
|---|
| 103 | |
|---|
| 104 | def parseTwitJSONDM(self,a): |
|---|
| 105 | result = [] |
|---|
| 106 | for x in a: |
|---|
| 107 | resultSub = [] |
|---|
| 108 | #resultSub.append(x['created_at']) |
|---|
| 109 | y = x['sender'] |
|---|
| 110 | resultSub.append(y['screen_name']) |
|---|
| 111 | resultSub.append(x['text']) |
|---|
| 112 | resultSub.append(x['created_at']) |
|---|
| 113 | result.append(resultSub) |
|---|
| 114 | #print resultSub[0]+resultSub[1] |
|---|
| 115 | return result |
|---|
| 116 | |
|---|
| 117 | def parseTwitJSONFollowers(self,a): |
|---|
| 118 | result = [] |
|---|
| 119 | for x in a: |
|---|
| 120 | resultSub = [] |
|---|
| 121 | #resultSub.append(x['created_at']) |
|---|
| 122 | #y = x['sender'] |
|---|
| 123 | resultSub.append(x['screen_name']) |
|---|
| 124 | #resultSub.append(x['text']) |
|---|
| 125 | #resultSub.append(x['created_at']) |
|---|
| 126 | result.append(resultSub) |
|---|
| 127 | #print resultSub[0]+resultSub[1] |
|---|
| 128 | return result |
|---|
| 129 | |
|---|
| 130 | def put(self,s): |
|---|
| 131 | self.setAuthHandler() |
|---|
| 132 | postdata = {} |
|---|
| 133 | postdata['status'] = s.encode('utf-8') |
|---|
| 134 | #postdata['source'] = s |
|---|
| 135 | param = urllib.urlencode(postdata) |
|---|
| 136 | data = urllib2.urlopen("http://twitter.com/statuses/update.json",param) |
|---|
| 137 | print data.read() |
|---|
| 138 | |
|---|
| 139 | def getUserPageWithScraping(self,user,num): |
|---|
| 140 | self.setAuthHandler() |
|---|
| 141 | s = "http://twitter.com/"+user+"?page="+str(num) |
|---|
| 142 | print "url+" +s |
|---|
| 143 | data = urllib2.urlopen(s) |
|---|
| 144 | urlstring = data.read() |
|---|
| 145 | if num == 1: |
|---|
| 146 | return self.scrapeTwit(urlstring,True) |
|---|
| 147 | else: |
|---|
| 148 | return self.scrapeTwit(urlstring,False) |
|---|
| 149 | |
|---|
| 150 | # HTMLをスクレイプします。 |
|---|
| 151 | def scrapeTwit(self,a,isFirst): |
|---|
| 152 | import re |
|---|
| 153 | # <span class="entry-title entry-content">~</span>(最短) |
|---|
| 154 | #reg = re.compile(r'<(.*?)>') |
|---|
| 155 | retList = [] |
|---|
| 156 | |
|---|
| 157 | reg = re.compile("<span class=\"entry-title entry-content\">([\w\W]*?)</span>[\w\W]*?<abbr class=\"published\" title=\"([\w\W]*?)\">.*?</abbr>",re.MULTILINE) |
|---|
| 158 | reg2 = re.compile("<span class=\"entry_content\">([\w\W]*?)</span>[\w\W]*?<abbr class=\"published\" title=\"([\w\W]*?)\">.*?</abbr>",re.MULTILINE) |
|---|
| 159 | # もし1ページ目なら、最新の発言も取ってくる |
|---|
| 160 | #if isFirst : |
|---|
| 161 | # a3 = reg.findall(a) |
|---|
| 162 | # retList.append( a3[0] ) |
|---|
| 163 | |
|---|
| 164 | a2 = reg2.findall(a) |
|---|
| 165 | for aa in a2: |
|---|
| 166 | retList.append( (aa[0].strip(),aa[1]) ) |
|---|
| 167 | |
|---|
| 168 | return retList |
|---|