Commit c98aeb50be7be7637f7aa3960913fa590dff149e
Committed by
GitHub
1 parent
f6d4b30b
Add files via upload
Showing
3 changed files
with
503 additions
and
0 deletions
LINETCR/Api/Poll.py
0 → 100644
| 1 | +import os, sys, time | |
| 2 | +path = os.path.join(os.path.dirname(__file__), '../lib/') | |
| 3 | +sys.path.insert(0, path) | |
| 4 | + | |
| 5 | +from thrift.transport import THttpClient | |
| 6 | +from thrift.protocol import TCompactProtocol | |
| 7 | + | |
| 8 | +from curve import LineService | |
| 9 | +from curve.ttypes import * | |
| 10 | + | |
| 11 | +class Poll: | |
| 12 | + | |
| 13 | + client = None | |
| 14 | + | |
| 15 | + auth_query_path = "/api/v4/TalkService.do"; | |
| 16 | + http_query_path = "/S4"; | |
| 17 | + polling_path = "/P4"; | |
| 18 | + host = "gd2.line.naver.jp"; | |
| 19 | + port = 443; | |
| 20 | + | |
| 21 | + UA = "Line/1.4.17" | |
| 22 | +# LA = "IOSIPAD\x097.14.0\x09iPhone_OS\x0910.12.0" | |
| 23 | + LA = "CHROMEOS\t1.4.17\tChrome_OS\t1" | |
| 24 | + | |
| 25 | + rev = 0 | |
| 26 | + | |
| 27 | + def __init__(self, authToken): | |
| 28 | + self.transport = THttpClient.THttpClient('https://gd2.line.naver.jp:443'+ self.http_query_path) | |
| 29 | + self.transport.setCustomHeaders({ | |
| 30 | + "User-Agent" : self.UA, | |
| 31 | + "X-Line-Application" : self.LA, | |
| 32 | + "X-Line-Access": authToken | |
| 33 | + }); | |
| 34 | + self.protocol = TCompactProtocol.TCompactProtocol(self.transport); | |
| 35 | + self.client = LineService.Client(self.protocol) | |
| 36 | + self.rev = self.client.getLastOpRevision() | |
| 37 | + self.transport.path = self.polling_path | |
| 38 | + self.transport.open() | |
| 39 | + | |
| 40 | + def stream(self, sleep=50000): | |
| 41 | + #usleep = lambda x: time.sleep(x/1000000.0) | |
| 42 | + while True: | |
| 43 | + try: | |
| 44 | + Ops = self.client.fetchOps(self.rev, 5) | |
| 45 | + except EOFError: | |
| 46 | + raise Exception("It might be wrong revision\n" + str(self.rev)) | |
| 47 | + | |
| 48 | + for Op in Ops: | |
| 49 | + # print Op.type | |
| 50 | + if (Op.type != OpType.END_OF_OPERATION): | |
| 51 | + self.rev = max(self.rev, Op.revision) | |
| 52 | + return Op | |
| 53 | + | |
| 54 | + #usleep(sleep) | ... | ... |
LINETCR/Api/Talk.py
0 → 100644
| 1 | +# -*- coding: utf-8 -*- | ||||
| 2 | +import os, sys | ||||
| 3 | +path = os.path.join(os.path.dirname(__file__), '../lib/') | ||||
| 4 | +sys.path.insert(0, path) | ||||
| 5 | + | ||||
| 6 | +import requests, rsa | ||||
| 7 | + | ||||
| 8 | +from thrift.transport import THttpClient | ||||
| 9 | +from thrift.protocol import TCompactProtocol | ||||
| 10 | + | ||||
| 11 | +from curve import LineService | ||||
| 12 | +from curve.ttypes import * | ||||
| 13 | + | ||||
| 14 | +class Talk: | ||||
| 15 | + client = None | ||||
| 16 | + | ||||
| 17 | + auth_query_path = "/api/v4/TalkService.do"; | ||||
| 18 | + http_query_path = "/S4"; | ||||
| 19 | + wait_for_mobile_path = "/Q"; | ||||
| 20 | + host = "gd2.line.naver.jp"; | ||||
| 21 | + port = 443; | ||||
| 22 | + | ||||
| 23 | + UA = "Line/1.4.17" | ||||
| 24 | +# LA = "IOSIPAD\x097.14.0\x09iPhone_OS\x0910.12.0" | ||||
| 25 | + LA = "CHROMEOS\t1.4.17\tChrome_OS\t1" | ||||
| 26 | + | ||||
| 27 | + authToken = None | ||||
| 28 | + cert = None | ||||
| 29 | + | ||||
| 30 | + def __init__(self): | ||||
| 31 | + self.transport = THttpClient.THttpClient('https://gd2.line.naver.jp:443'+self.auth_query_path) | ||||
| 32 | + self.transport.setCustomHeaders({ | ||||
| 33 | + "User-Agent" : self.UA, | ||||
| 34 | + "X-Line-Application" : self.LA, | ||||
| 35 | + }) | ||||
| 36 | + self.transport.open() | ||||
| 37 | + self.protocol = TCompactProtocol.TCompactProtocol(self.transport); | ||||
| 38 | + self.client = LineService.Client(self.protocol) | ||||
| 39 | + | ||||
| 40 | + def login(self, mail, passwd, cert=None, callback=None): | ||||
| 41 | + self.transport.path = self.auth_query_path | ||||
| 42 | + rsakey = self.client.getRSAKeyInfo(IdentityProvider.LINE) | ||||
| 43 | + crypt = self.__crypt(mail, passwd, rsakey) | ||||
| 44 | + | ||||
| 45 | + result = self.client.loginWithIdentityCredentialForCertificate( | ||||
| 46 | + IdentityProvider.LINE, | ||||
| 47 | + rsakey.keynm, | ||||
| 48 | + crypt, | ||||
| 49 | + True, | ||||
| 50 | + '127.0.0.1', | ||||
| 51 | + 'http://dg.b9dm.com/KoenoKatachi.mp4', | ||||
| 52 | + cert | ||||
| 53 | + ) | ||||
| 54 | + | ||||
| 55 | + if result.type == 3: | ||||
| 56 | + callback(result.pinCode) | ||||
| 57 | + header = {"X-Line-Access": result.verifier} | ||||
| 58 | + r = requests.get(url="https://" + self.host + self.wait_for_mobile_path, headers=header) | ||||
| 59 | + | ||||
| 60 | + result = self.client.loginWithVerifierForCerificate(r.js"line_holder new" id="89477839651f397d924c00c9ba2a03b2398ffed6_0_61"> | 61 | + self.transport.setCustomHeaders({ | ||
| 62 | + "X-Line-Application" : self.LA, | ||||
| 63 | + "User-Agent" : self.UA, | ||||
| 64 | + "X-Line-Access" : result.authToken | ||||
| 65 | + }) | ||||
| 66 | + | ||||
| 67 | + self.authToken = result.authToken | ||||
| 68 | + self.cert = result.certificate | ||||
| 69 | + self.transport.path = self.http_query_path | ||||
| 70 | + | ||||
| 71 | + elif result.type == 1: | ||||
| 72 | + self.authToken = result.authToken | ||||
| 73 | + self.cert = result.certificate | ||||
| 74 | + self.transport.setCustomHeaders({ | ||||
| 75 | + "X-Line-Application" : self.LA, | ||||
| 76 | + "User-Agent" : self.UA, | ||||
| 77 | + "X-Line-Access" : result.authToken | ||||
| 78 | + }) | ||||
| 79 | + self.transport.path = self.http_query_path | ||||
| 80 | + | ||||
| 81 | + def TokenLogin(self, authToken): | ||||
| 82 | + self.transport.setCustomHeaders({ | ||||
| 83 | + "X-Line-Application" : self.LA, | ||||
| 84 | + "User-Agent" : self.UA, | ||||
| 85 | + "X-Line-Access" : authToken, | ||||
| 86 | + }) | ||||
| 87 | + self.authToken = authToken | ||||
| 88 | + self.transport.path = self.http_query_path | ||||
| 89 | + | ||||
| 90 | + def qrLogin(self, callback): | ||||
| 91 | + self.transport.path = self.auth_query_path | ||||
| 92 | + | ||||
| 93 | + qr = self.client.getAuthQrcode(True, "Bot") | ||||
| 94 | + callback("Copy to Line and Click\nYour LINK QR is: line://au/q/" + qr.verifier) | ||||
| 95 | + | ||||
| 96 | + r = requests.get("https://" + self.host + self.wait_for_mobile_path, headers={ | ||||
| 97 | + "X-Line-Application": self.LA, | ||||
| 98 | + "X-Line-Access": qr.verifier, | ||||
| 99 | + }) | ||||
| 100 | + | ||||
| 101 | + vr = r.js"line_holder new" id="89477839651f397d924c00c9ba2a03b2398ffed6_0_102"> | 102 | + lr = self.client.loginWithVerifierForCerificate(vr) | ||
| 103 | + self.transport.setCustomHeaders({ | ||||
| 104 | + "X-Line-Application" : self.LA, | ||||
| 105 | + "User-Agent" : self.UA, | ||||
| 106 | + "X-Line-Access": lr.authToken | ||||
| 107 | + }) | ||||
| 108 | + self.authToken = lr.authToken | ||||
| 109 | + self.cert = lr.certificate | ||||
| 110 | + self.transport.path = self.http_query_path | ||||
| 111 | + | ||||
| 112 | + | ||||
| 113 | + def __crypt(self, mail, passwd, RSA): | ||||
| 114 | + message = (chr(len(RSA.sessionKey)) + RSA.sessionKey + | ||||
| 115 | + chr(len(mail)) + mail + | ||||
| 116 | + chr(len(passwd)) + passwd).encode('utf-8') | ||||
| 117 | + | ||||
| 118 | + pub_key = rsa.PublicKey(int(RSA.nvalue, 16), int(RSA.evalue, 16)) | ||||
| 119 | + crypto = rsa.encrypt(message, pub_key).encode('hex') | ||||
| 120 | + | ||||
| 121 | + return crypto | ... | ... |
LINETCR/Api/channel.py
0 → 100644
| 1 | +# -*- coding: utf-8 -*- | ||||
| 2 | +import os, sys, json | ||||
| 3 | +path = os.path.join(os.path.dirname(__file__), '../lib/') | ||||
| 4 | +sys.path.insert(0, path) | ||||
| 5 | +import requests | ||||
| 6 | + | ||||
| 7 | +from thrift.transport import THttpClient | ||||
| 8 | +from thrift.protocol import TCompactProtocol | ||||
| 9 | + | ||||
| 10 | +from curve import LineService | ||||
| 11 | +from curve.ttypes import * | ||||
| 12 | +import tempfile | ||||
| 13 | + | ||||
| 14 | +class Channel: | ||||
| 15 | + client = None | ||||
| 16 | + | ||||
| 17 | + host = "gd2.line.naver.jp" | ||||
| 18 | + http_query_path = "/S4" | ||||
| 19 | + channel_query_path = "/CH4" | ||||
| 20 | + | ||||
| 21 | + UA = "Line/1.4.17" | ||||
| 22 | + LA = "CHROMEOS\t1.4.17\tChrome_OS\t1" | ||||
| 23 | + | ||||
| 24 | + | ||||
| 25 | + authToken = None | ||||
| 26 | + mid = None | ||||
| 27 | + channel_access_token = None | ||||
| 28 | + token = None | ||||
| 29 | + obs_token = None | ||||
| 30 | + refresh_token = None | ||||
| 31 | + | ||||
| 32 | + def __init__(self, authToken): | ||||
| 33 | + self.authToken = authToken | ||||
| 34 | + self.transport = THttpClient.THttpClient('https://gd2.line.naver.jp:443'+self.http_query_path) | ||||
| 35 | + self.transport.setCustomHeaders({ "User-Agent" : self.UA, | ||||
| 36 | + "X-Line-Application" : self.LA, | ||||
| 37 | + "X-Line-Access": self.authToken | ||||
| 38 | + }) | ||||
| 39 | + self.transport.open() | ||||
| 40 | + self.protocol = TCompactProtocol.TCompactProtocol(self.transport) | ||||
| 41 | + self.client = LineService.Client(self.protocol) | ||||
| 42 | + self.mid = self.client.getProfile().mid | ||||
| 43 | + self.transport.path = self.channel_query_path | ||||
| 44 | + | ||||
| 45 | + def login(self): | ||||
| 46 | + result = self.client.issueChannelToken("1341209850") | ||||
| 47 | + | ||||
| 48 | + self.channel_access_token = result.channelAccessToken | ||||
| 49 | + self.token = result.token | ||||
| 50 | + self.obs_token = result.obsToken | ||||
| 51 | + self.refresh_token = result.refreshToken | ||||
| 52 | + | ||||
| 53 | + print "channelAccessToken:" + result.channelAccessToken | ||||
| 54 | + print "token:" + result.token | ||||
| 55 | + print "obs_token:" + result.obsToken | ||||
| 56 | + print "refreshToken:" + result.refreshToken | ||||
| 57 | + | ||||
| 58 | + def new_post(self, text): | ||||
| 59 | + | ||||
| 60 | + header = { | ||||
| 61 | + "Content-Type": "application/json", | ||||
| 62 | + "User-Agent" : self.UA, | ||||
| 63 | + "X-Line-Mid" : self.mid, | ||||
| 64 | + "x-lct" : self.channel_access_token, | ||||
| 65 | + } | ||||
| 66 | + | ||||
| 67 | + payload = { | ||||
| 68 | + "postInfo" : { "readPermission" : { "type" : "ALL" } }, | ||||
| 69 | + "sourceType" : "TIMELINE", | ||||
| 70 | + "contents" : { "text" : text } | ||||
| 71 | + } | ||||
| 72 | + | ||||
| 73 | + r = requests.post( | ||||
| 74 | + "http://" + self.host + "/mh/api/v24/post/create.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_75"> | 75 | + headers = header, | ||
| 76 | + data = json.dumps(payload) | ||||
| 77 | + ) | ||||
| 78 | + | ||||
| 79 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_80"> | 80 | + | ||
| 81 | + def postPhoto(self,text,path): | ||||
| 82 | + header = { | ||||
| 83 | + "Content-Type": "application/json", | ||||
| 84 | + "User-Agent" : self.UA, | ||||
| 85 | + "X-Line-Mid" : self.mid, | ||||
| 86 | + "x-lct" : self.channel_access_token, | ||||
| 87 | + } | ||||
| 88 | + | ||||
| 89 | + payload = { | ||||
| 90 | + "postInfo" : { "readPermission" : { "type" : "ALL" } }, | ||||
| 91 | + "sourceType" : "TIMELINE", | ||||
| 92 | + "contents" : { "text" : text ,"media" : [{u'objectId': u'F57144CF9ECC4AD2E162E68554D1A8BD1a1ab0t04ff07f6'}]} | ||||
| 93 | + } | ||||
| 94 | + r = requests.post( | ||||
| 95 | + "http://" + self.host + "/mh/api/v24/post/create.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_96"> | 96 | + headers = header, | ||
| 97 | + data = json.dumps(payload) | ||||
| 98 | + ) | ||||
| 99 | + | ||||
| 100 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_101"> | 101 | + | ||
| 102 | + def like(self, mid, postid, likeType=1001): | ||||
| 103 | + | ||||
| 104 | + header = { | ||||
| 105 | + "Content-Type" : "application/json", | ||||
| 106 | + "X-Line-Mid" : self.mid, | ||||
| 107 | + "x-lct" : self.channel_access_token, | ||||
| 108 | + } | ||||
| 109 | + | ||||
| 110 | + payload = { | ||||
| 111 | + "likeType" : likeType, | ||||
| 112 | + "activityExternalId" : postid, | ||||
| 113 | + "actorId" : mid | ||||
| 114 | + } | ||||
| 115 | + | ||||
| 116 | + r = requests.post( | ||||
| 117 | + "http://" + self.host + "/mh/api/v23/like/create.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_118"> | 118 | + headers = header, | ||
| 119 | + data = json.dumps(payload) | ||||
| 120 | + ) | ||||
| 121 | + | ||||
| 122 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_123"> | 123 | + | ||
| 124 | + def comment(self, mid, postid, text): | ||||
| 125 | + header = { | ||||
| 126 | + "Content-Type" : "application/json", | ||||
| 127 | + "X-Line-Mid" : self.mid, | ||||
| 128 | + "x-lct" : self.channel_access_token, | ||||
| 129 | + } | ||||
| 130 | + | ||||
| 131 | + payload = { | ||||
| 132 | + "commentText" : text, | ||||
| 133 | + "activityExternalId" : postid, | ||||
| 134 | + "actorId" : mid | ||||
| 135 | + } | ||||
| 136 | + | ||||
| 137 | + r = requests.post( | ||||
| 138 | + "http://" + self.host + "/mh/api/v23/comment/create.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_139"> | 139 | + headers = header, | ||
| 140 | + data = json.dumps(payload) | ||||
| 141 | + ) | ||||
| 142 | + | ||||
| 143 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_144"> | 144 | + | ||
| 145 | + def activity(self, limit=20): | ||||
| 146 | + | ||||
| 147 | + header = { | ||||
| 148 | + "Content-Type" : "application/json", | ||||
| 149 | + "X-Line-Mid" : self.mid, | ||||
| 150 | + "x-lct" : self.channel_access_token, | ||||
| 151 | + } | ||||
| 152 | + | ||||
| 153 | + r = requests.get( | ||||
| 154 | + "http://" + self.host + "/tl/mapi/v21/activities?postLimit=" + str(limit), | ||||
| 155 | + headers = header | ||||
| 156 | + ) | ||||
| 157 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_158"> | 158 | + def getAlbum(self, gid): | ||
| 159 | + | ||||
| 160 | + header = { | ||||
| 161 | + "Content-Type" : "application/json", | ||||
| 162 | + "X-Line-Mid" : self.mid, | ||||
| 163 | + "x-lct": self.channel_access_token, | ||||
| 164 | + | ||||
| 165 | + } | ||||
| 166 | + | ||||
| 167 | + r = requests.get( | ||||
| 168 | + "http://" + self.host + "/mh/album/v3/albums?type=g&sourceType=TALKROOM&homeId=" + gid, | ||||
| 169 | + headers = header | ||||
| 170 | + ) | ||||
| 171 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_172"> | 172 | + def changeAlbumName(self,gid,name,albumId): | ||
| 173 | + header = { | ||||
| 174 | + "Content-Type" : "application/json", | ||||
| 175 | + "X-Line-Mid" : self.mid, | ||||
| 176 | + "x-lct": self.channel_access_token, | ||||
| 177 | + | ||||
| 178 | + } | ||||
| 179 | + payload = { | ||||
| 180 | + "title": name | ||||
| 181 | + } | ||||
| 182 | + r = requests.put( | ||||
| 183 | + "http://" + self.host + "/mh/album/v3/album/" + albumId + "?homeId=" + gid, | ||||
| 184 | + headers = header, | ||||
| 185 | + data = json.dumps(payload), | ||||
| 186 | + ) | ||||
| 187 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_188"> | 188 | + def deleteAlbum(self,gid,albumId): | ||
| 189 | + header = { | ||||
| 190 | + "Content-Type" : "application/json", | ||||
| 191 | + "X-Line-Mid" : self.mid, | ||||
| 192 | + "x-lct": self.channel_access_token, | ||||
| 193 | + | ||||
| 194 | + } | ||||
| 195 | + r = requests.delete( | ||||
| 196 | + "http://" + self.host + "/mh/album/v3/album/" + albumId + "?homeId=" + gid, | ||||
| 197 | + headers = header, | ||||
| 198 | + ) | ||||
| 199 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_200"> | 200 | + def getNote(self,gid, commentLimit, likeLimit): | ||
| 201 | + header = { | ||||
| 202 | + "Content-Type" : "application/json", | ||||
| 203 | + "X-Line-Mid" : self.mid, | ||||
| 204 | + "x-lct": self.channel_access_token, | ||||
| 205 | + | ||||
| 206 | + } | ||||
| 207 | + r = requests.get( | ||||
| 208 | + "http://" + self.host + "/mh/api/v27/post/list.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_209"> | 209 | + headers = header | ||
| 210 | + ) | ||||
| 211 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_212"> | 212 | + | ||
| 213 | + def postNote(self, gid, text): | ||||
| 214 | + header = { | ||||
| 215 | + "Content-Type": "application/json", | ||||
| 216 | + "User-Agent" : self.UA, | ||||
| 217 | + "X-Line-Mid" : self.mid, | ||||
| 218 | + "x-lct" : self.channel_access_token, | ||||
| 219 | + } | ||||
| 220 | + payload = {"postInfo":{"readPermission":{"homeId":gid}}, | ||||
| 221 | + "sourceType":"GROUPHOME", | ||||
| 222 | + "contents":{"text":text} | ||||
| 223 | + } | ||||
| 224 | + r = requests.post( | ||||
| 225 | + "http://" + self.host + "/mh/api/v27/post/create.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_226"> | 226 | + headers = header, | ||
| 227 | + data = json.dumps(payload) | ||||
| 228 | + ) | ||||
| 229 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_230"> | 230 | + | ||
| 231 | + def getDetail(self, mid): | ||||
| 232 | + header = { | ||||
| 233 | + "Content-Type": "application/json", | ||||
| 234 | + "User-Agent" : self.UA, | ||||
| 235 | + "X-Line-Mid" : self.mid, | ||||
| 236 | + "x-lct" : self.channel_access_token, | ||||
| 237 | + } | ||||
| 238 | + | ||||
| 239 | + r = requests.get( | ||||
| 240 | + "http://" + self.host + "/ma/api/v1/userpopup/getDetail.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_241"> | 241 | + headers = header | ||
| 242 | + ) | ||||
| 243 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_244"> | 244 | + | ||
| 245 | + def getHome(self,mid): | ||||
| 246 | + header = { | ||||
| 247 | + "Content-Type": "application/json", | ||||
| 248 | + "User-Agent" : self.UA, | ||||
| 249 | + "X-Line-Mid" : self.mid, | ||||
| 250 | + "x-lct" : self.channel_access_token, | ||||
| 251 | + } | ||||
| 252 | + | ||||
| 253 | + r = requests.get( | ||||
| 254 | + "http://" + self.host + "/mh/api/v27/post/list.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_255"> | 255 | + headers = header | ||
| 256 | + ) | ||||
| 257 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_258"> | 258 | + def getCover(self,mid): | ||
| 259 | + h = self.getHome(mid) | ||||
| 260 | + objId = h["result"]["homeInfo"]["objectId"] | ||||
| 261 | + return "http://dl.profile.line-cdn.net/myhome/c/download.nhn?userid=" + mid + "&oid=" + objId | ||||
| 262 | + def createAlbum(self,gid,name): | ||||
| 263 | + header = { | ||||
| 264 | + "Content-Type": "application/json", | ||||
| 265 | + "User-Agent" : self.UA, | ||||
| 266 | + "X-Line-Mid" : self.mid, | ||||
| 267 | + "x-lct" : self.channel_access_token, | ||||
| 268 | + } | ||||
| 269 | + payload = { | ||||
| 270 | + "type" : "image", | ||||
| 271 | + "title" : name | ||||
| 272 | + } | ||||
| 273 | + r = requests.post( | ||||
| 274 | + "http://" + self.host + "/mh/album/v3/album?count=1&auto=0&homeId=" + gid, | ||||
| 275 | + headers = header, | ||||
| 276 | + data = json.dumps(payload) | ||||
| 277 | + ) | ||||
| 278 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_279"> | 279 | + | ||
| 280 | + def createAlbum2(self,gid,name,path,oid): | ||||
| 281 | + header = { | ||||
| 282 | + "Content-Type": "application/json", | ||||
| 283 | + "User-Agent" : self.UA, | ||||
| 284 | + "X-Line-Mid" : self.mid, | ||||
| 285 | + "x-lct" : self.channel_access_token, | ||||
| 286 | + } | ||||
| 287 | + payload = { | ||||
| 288 | + "type" : "image", | ||||
| 289 | + "title" : name | ||||
| 290 | + } | ||||
| 291 | + r = requests.post( | ||||
| 292 | + "http://" + self.host + "/mh/album/v3/album?count=1&auto=0&homeId=" + gid, | ||||
| 293 | + headers = header, | ||||
| 294 | + data = json.dumps(payload) | ||||
| 295 | + ) | ||||
| 296 | + #albumId = r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_297"> | 297 | + | ||
| 298 | + | ||||
| 299 | + #h = { | ||||
| 300 | + # "Content-Type": "application/x-www-form-urlencoded", | ||||
| 301 | + # "User-Agent" : self.UA, | ||||
| 302 | + # "X-Line-Mid" : gid, | ||||
| 303 | + # "X-Line-Album" : albumId, | ||||
| 304 | + # "x-lct" : self.channel_access_token, | ||||
| 305 | + #"x-obs-host" : "obs-jp.line-apps.com:443", | ||||
| 306 | + | ||||
| 307 | + #} | ||||
| 308 | + #print r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_309"> | 309 | + #files = { | ||
| 310 | + # 'file': open(path, 'rb'), | ||||
| 311 | + #} | ||||
| 312 | + #p = { | ||||
| 313 | + # "userid" : gid, | ||||
| 314 | + # "type" : "image", | ||||
| 315 | + # "oid" : oid, | ||||
| 316 | + # "ver" : "1.0" | ||||
| 317 | + #} | ||||
| 318 | + #data = { | ||||
| 319 | + # 'params': json.dumps(p) | ||||
| 320 | + #} | ||||
| 321 | + #r = requests.post( | ||||
| 322 | + #"http://obs-jp.line-apps.com/oa/album/a/object_info.nhn:443", | ||||
| 323 | + #headers = h, | ||||
| 324 | + #data = data, | ||||
| 325 | + #files = files | ||||
| 326 | + #) | ||||
| 327 | + return r.js"line_holder new" id="e9a7ebc16536051232b3b809970f5248475e8fcc_0_328"> | 328 | + #cl.createAlbum("cea9d61ba824e937aaf91637991ac934b","ss3ai","kawamuki.png") | ... | ... |