Advertisement
nacika

Google+ 投稿API for Python ver.0.7

Nov 27th, 2011
2,679
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 56.41 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. '''
  3. Google+ API for Python ver.0.6
  4. '''
  5. import re
  6. import urllib
  7. import urllib2
  8. import cookielib
  9. import time
  10. import datetime
  11. import random
  12. import simplejson as json  # Djangoの場合は # from django.utils import simplejson as json
  13. import os
  14.  
  15.  
  16. #JSON修正
  17. def _fixjson(_jsonstr):
  18.     _jsonstr = _jsonstr.replace("\"null\"", "null")
  19.     _jsonstr = _jsonstr.replace("\"false\"", "false")
  20.     _jsonstr = _jsonstr.replace("\"true\"", "true")
  21.     return _jsonstr
  22.    
  23. #JSON
  24. def _jd(*args):
  25.     jsonstr = json.dumps(args, separators=(",",":"))
  26.     jsonstr = _fixjson(jsonstr)
  27.     return jsonstr
  28.  
  29. #JSON
  30. def _jd2(*args):
  31.     jsonstr = json.dumps(args, separators=(",",":"))
  32.     return jsonstr
  33.  
  34. #JSONの読み込み
  35. def _jsonload(_jsonstr):
  36.     #先頭の2行を削除
  37.     try:
  38.         _jsonstr = r""+_jsonstr[_jsonstr.index("\n\n"):len(_jsonstr)]
  39.     except:
  40.         pass
  41.  
  42.     #JSON調整
  43.     strlmode = 0        #文字列リテラルモード
  44.     c = 0
  45.    
  46.     while(1):
  47.        
  48.         #サイズを超えたら抜ける
  49.         if c >= len(_jsonstr):
  50.             break
  51.        
  52.         #文字列リテラルかどうか
  53.         if (_jsonstr[c-1] != "\\" or _jsonstr[c-2:c] == "\\\\") and _jsonstr[c] == "\"":
  54.             strlmode = strlmode^1
  55.             c += 1
  56.             continue
  57.  
  58.         #文字列リテラル以外
  59.         if strlmode == 0:
  60.            
  61.             #null
  62.             flag = 0
  63.            
  64.             #コンマが続く場合
  65.             if _jsonstr[c:c+2] == ",,":
  66.                 flag = 1
  67.            
  68.             #ブロックの始まり
  69.             if _jsonstr[c:c+2] == "[,":
  70.                 flag = 1
  71.  
  72.             #ブロックの終わり
  73.             if _jsonstr[c:c+2] == ",]":
  74.                 flag = 1
  75.            
  76.             #NULLを追加する
  77.             if flag == 1:
  78.                 _jsonstr = _jsonstr[:c+1] + "\"null\"" + _jsonstr[c+1:]
  79.                 c += 2+4
  80.                 c += 1
  81.                 continue
  82.            
  83.             #true
  84.             flag = 0
  85.            
  86.             #コンマが続く場合
  87.             if _jsonstr[c:c+6] == ",true,":
  88.                 flag = 1
  89.            
  90.             #ブロックの始まり
  91.             if _jsonstr[c:c+6] == "[true,":
  92.                 flag = 1
  93.  
  94.             #ブロックの終わり
  95.             if _jsonstr[c:c+6] == ",true]":
  96.                 flag = 1
  97.                
  98.             #両方ブロック
  99.             if _jsonstr[c:c+6] == "[true]":
  100.                 flag = 1
  101.            
  102.             #trueを追加する
  103.             if flag == 1:
  104.                 _jsonstr = _jsonstr[:c+1] + "\"true\"" + _jsonstr[c+1+4:]
  105.                 c += 2+4
  106.                 c += 1
  107.                 continue
  108.  
  109.             #false
  110.             flag = 0
  111.            
  112.             #コンマが続く場合
  113.             if _jsonstr[c:c+7] == ",false,":
  114.                 flag = 1
  115.            
  116.             #ブロックの始まり
  117.             if _jsonstr[c:c+7] == "[false,":
  118.                 flag = 1
  119.  
  120.             #ブロックの終わり
  121.             if _jsonstr[c:c+7] == ",false]":
  122.                 flag = 1
  123.            
  124.             #両方ブロック
  125.             if _jsonstr[c:c+7] == "[false]":
  126.                 flag = 1
  127.            
  128.             #falseを追加する
  129.             if flag == 1:
  130.                 _jsonstr = _jsonstr[:c+1] + "\"false\"" + _jsonstr[c+1+5:]
  131.                 c += 2+5
  132.                 c += 1
  133.                 continue
  134.  
  135.        
  136.         c += 1
  137.     return json.loads(_jsonstr)
  138.  
  139. #RequestID
  140. def _reqid():
  141.     reqid = ""
  142.     for i in range(7):
  143.         reqid = reqid + str(random.randint(0, 9))
  144.     return reqid
  145.  
  146. #funcurl
  147. def _funcurl(_type, _func, _params, _urls, _ispage, _userid):
  148.  
  149.     if _ispage:
  150.         return _urls["page"] % (_userid, _type, _func, _params, _reqid())
  151.     else:
  152.         return _urls["user"] % (_type, _func, _params, _reqid())
  153.  
  154. #gpulsfunc
  155. def _gplusfunc(_type, _func, _params, _isflag, _login, _postdata=""):
  156.    
  157.     if _isflag:
  158.         slash = "/"
  159.     else:
  160.         slash = ""
  161.    
  162.     if _postdata:
  163.         #URLエンコード
  164.         params = urllib.urlencode(_postdata)
  165.    
  166.         params = params.replace("%27", "'")
  167.         #####print params
  168.        
  169.     #URLの設定
  170.     sendurl = _funcurl(_type, _func+slash, _params, _login.urls, _login.ispage, _login.userid)
  171.     #print "SendURL: " + sendurl
  172.  
  173.     #投稿する
  174.     if _postdata:
  175.         return _login.opener.open(sendurl, params).read()
  176.     else:
  177.         return _login.opener.open(sendurl).read()
  178.  
  179.  
  180. #ログインする
  181. class Login(object):
  182.  
  183.     #urls
  184.     urls = {
  185.         "login":        "https://accounts.google.com/login",
  186.         "loginAuth":    "https://accounts.google.com/ServiceLoginAuth",
  187.         "plus":         "https://plus.google.com/",
  188.         "page":         "https://plus.google.com/b/" + "%s" + "/_/" + "%s" + "/" + "%s" + "?" + "%s" + "&_reqid=" + "%s" + "&rt=j",
  189.         "user":         "https://plus.google.com/_/" + "%s" + "/" + "%s" + "?" + "%s" + "&_reqid=" + "%s" + "&rt=j",
  190.         "activity":     "https://plus.google.com/_/stream/getactivities/?sp=%%5B1%%2C2%%2C%%22" + "%s" + "%%22%%2Cnull%%2Cnull%%2C" + "%d" + "%%2Cnull%%2C%%22social%%2Egoogle%%2Ecom%%22%%2C%%5B%%5D%%5D&hl=ja&_reqid=" + "%s" + "&rt=j",
  191.         "activitynode": "https://plus.google.com/_/stream/getactivities/?ct=" + "%s" + "&sp=%%5B1%%2C2%%2C%%22" + "%s" + "%%22%%2Cnull%%2Cnull%%2C" + "%d" + "%%2Cnull%%2C%%22social%%2Egoogle%%2Ecom%%22%%2C%%5B%%5D%%5D&hl=ja&_reqid=" + "%s" + "&rt=j",
  192.         "music":        "https://music.google.com/music/listen?#all_pl",
  193.         "upload1":      "https://plus.google.com/_/upload/photos/resumable?authuser=0",
  194.         "upload2":      "https://plus.google.com/_/upload/photos/resumable?upload_id=" + "%s" + "&file_id=" + "%s",
  195.         "pagenotify":   "https://plus.google.com/b/" + "%s" + "/_/notifications/getnotificationsdata",
  196.         "usernotify":   "https://plus.google.com/_/notifications/getnotificationsdata",
  197.         "hot":          "https://plus.google.com/_/stream/getactivities/?sp=[16,2,null,null,null," + "%s" + ",null,\"social.google.com\",[],null,null,null,null,null,null,[]]&hl=ja&_reqid=" + "%s" + "&rt=j",
  198.         "hotnode":      "https://plus.google.com/_/stream/getactivities/?ct=" + "%s" + "&sp=[16,2,null,null,null," + "%s" + ",null,\"social.google.com\",[],null,null,null,null,null,null,[]]&hl=ja&_reqid=" + "%s" + "&rt=j",
  199.         "comment":      "https://plus.google.com/_/stream/getactivity/?updateId=" + "%s" + "&_reqid=" +"%s"+ "&rt=j",
  200.         "stream":       "https://plus.google.com/_/stream/getactivities/?sp=[1,2,null,null,null," + "%s" + ",null,\"social.google.com\",[],null,null,null,null,null,null,[]]&hl=ja&_reqid="+ "%s" +"&rt=j",
  201.         "streamnode":   "https://plus.google.com/_/stream/getactivities/?ct="+ "%s" +"&sp=[1,2,null,null,null," + "%s" + ",null,\"social.google.com\",[],null,null,null,null,null,null,[]]&hl=ja&_reqid="+ "%s" +"&rt=j",
  202.         "search":       "https://plus.google.com/_/s/query?_reqid=" + "%s"
  203.     }
  204.    
  205.     #パラメータ
  206.     params = {
  207.         "login":        "dsh=" + "%s" + "&GALX=" + "%s" + "&pstMsg=1&dnConn=https%%3A%%2F%%2Faccounts.youtube.com&timeStmp=&secTok=&Email=" + "%s" + "&Passwd=" + "%s" + "&signIn=%%E3%%83%%AD%%E3%%82%%B0%%E3%%82%%A4%%E3%%83%%B3&PersistentCookie=yes&rmShown=1",
  208.         "linkurl":        "c=" + "%s" + "&t=1&slpf=0&ml=1"
  209.         }
  210.    
  211.     #正規表現オブジェクト
  212.     d = datetime.datetime.today()
  213.     reg = {
  214.         "sendid":           re.compile(r"\"(AObGSA.*:[0-9]*)\""),
  215.         "userid":           re.compile(r"key: '2', data:[ ]\[.([0-9]*)"),
  216.         "dsh":              re.compile(r"name=\"dsh\" id=\"dsh\" value=\"([-0-9]+)\""),
  217.         "GALX":             re.compile(r"name=\"GALX\"[ \t\n]+value=\"([-_a-zA-Z0-9]+)\""),
  218.         "postid":           re.compile(r"\"(.*)\",\"\",\"s:updates:esshare\""),
  219.         "domain":           re.compile(r"//(.[^/]*)/?"),
  220.         "urlfix":           re.compile(r"^http:(//.*)"),
  221.         "thumbnailtype":    re.compile(r".*\.(.*)$"),
  222.         "comlen":           re.compile(r"\"\d+-\d+-\d+\",([0-9]+),"),
  223.         "notifyuserid":     re.compile(r"\./(.*)"),
  224.         "jsone15":          re.compile(r"(\d+\.\d+)E\d+")
  225.     }
  226.    
  227.     def __init__(self, _mailaddress, _password):
  228.        
  229.         #Cookie
  230.         self.cj = cookielib.LWPCookieJar()
  231.        
  232.         #OpenDirector
  233.         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
  234.        
  235.         #UserAgent
  236.         self.opener.addheaders = [("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)")]
  237.  
  238.         #HTMLの取得
  239.         html = r""+self.opener.open(Login.urls["login"]).read()
  240.        
  241.         #dsh値の取得
  242.         self.dsh = Login.reg["dsh"].search(html).group(1)
  243.         #####print "dsh: " + self.dsh
  244.        
  245.         #GALX値の取得
  246.         self.GALX = Login.reg["GALX"].search(html).group(1)
  247.         #####print "GALX: " + self.GALX
  248.        
  249.         #ログイン
  250.         self.opener.open(Login.urls["loginAuth"], Login.params["login"] % (self.dsh, self.GALX, _mailaddress, _password)).read()
  251.  
  252.     #Google+を使用できるようにするオブジェクトを返す
  253.     def plus(self, _pageid):
  254.        
  255.         #HTMLの取得
  256.         try:
  257.             html = r""+self.opener.open(Login.urls["plus"]).read()
  258.         except:
  259.             print "Login error"
  260.             return 0
  261.        
  262.         #sendidの取得
  263.         self.sendid = Login.reg["sendid"].search(html).group(1)
  264.         #####print "sendid: " + self.sendid
  265.        
  266.         #ページの場合
  267.         if _pageid:
  268.        
  269.             #useridをpageidにする
  270.             self.userid = _pageid
  271.             self.ispage = 1
  272.            
  273.         else:
  274.        
  275.             #useridの取得
  276.             self.userid = Login.reg["userid"].search(html).group(1)
  277.             self.ispage = 0
  278.            
  279.         #####print "userid: " + self.userid
  280.        
  281.         #plusオブジェクトを返す
  282.         return _Plus(self)
  283.        
  284.     #GoogleMusicオブジェクト
  285.     def music(self):
  286.        
  287.         #HTMLの取得
  288.         html = r""+self.opener.open(Login.urls["music"]).read()
  289.         #####print html
  290.         return _Music(self)
  291.  
  292. #Google+を使えるようにする
  293. class _Plus(object):
  294.    
  295.     def __init__(self, _login):
  296.         self.login = _login
  297.         self.circleid = ""
  298.         self.iscircle = 0
  299.         self.iscomment = "false"
  300.         self.isshare = "false"
  301.    
  302.     #circleidを設定する
  303.     def circle(self, _circleid):
  304.        
  305.         self.iscircleid = _circleid
  306.        
  307.         if _circleid == "":
  308.             self.iscircle = 0
  309.         else:
  310.             self.iscircle = 1
  311.        
  312.     #コメントをロックする
  313.     def comment(self, _islock):
  314.         if _islock:
  315.             self.iscomment = "true"
  316.         else:
  317.             self.iscomment = "false"
  318.    
  319.     #再共有をロックする
  320.     def share(self, _islock):
  321.         if _islock:
  322.             self.isshare = "true"
  323.         else:
  324.             self.isshare = "false"
  325.    
  326.     #Google+に投稿する
  327.     def post(self):
  328.         return _Post(self.login, self)
  329.        
  330.     #最後にポストしたPOSTIDを取得する
  331.     def activepost(self):
  332.         html = r""+self.login.opener.open(self.login.urls["activity"] % (self.login.userid, 1, _reqid())).read()
  333.         return self.login.reg["postid"].search(html).group(1)
  334.        
  335.     #最後にポストしたポストのポスト数を取得する
  336.     def comlen(self):
  337.         html = r""+self.login.opener.open(self.login.urls["activity"] % (self.login.userid, 1, _reqid())).read()
  338.         return int(self.login.reg["comlen"].search(html).group(1))
  339.  
  340.     #現在の通知数を取得する
  341.     def notifycheck(self):
  342.         try:
  343.             html = _gplusfunc("n", "guc", "poll=false&pid=119", False, self.login, "")
  344.             jsonstr = _jsonload(html)
  345.             ###############print json.dumps(jsonstr, sort_keys=True,indent=4)
  346.             for i in jsonstr[0]:
  347.                 if i[0] == "on.uc":
  348.                     num = i[1]
  349.                     break
  350.             return num
  351.         except:
  352.             return 0
  353.  
  354.     #通知を取得する
  355.     def notify(self):
  356.         return _Notify(self.login)
  357.  
  358.     #人気の投稿を取得
  359.     def hot(self, _num=20):
  360.         return _Hot(self.login, _num)
  361.  
  362.     #他の人のポストを取得する
  363.     def activity(self, _userid="", _num=20):
  364.         return _Activity(self.login, _num, "", _userid)
  365.    
  366.     #ストリームを取得する
  367.     def stream(self, _num=20):
  368.         return _Stream(self.login, _num)
  369.    
  370.     #検索結果を取得する
  371.     def search(self, _query, _mode="all", _range="all", _type="new"):
  372.        
  373.         #すべて
  374.         if _mode == "all":
  375.             mode = 1
  376.         #ユーザーとページ
  377.         elif _mode == "peopleandpages":
  378.             mode = 2
  379.         #Google+のポスト
  380.         elif _mode == "posts":
  381.             mode = 3
  382.         #Sparks
  383.         elif _mode == "sparks":
  384.             mode = 4
  385.         #ハングアウト
  386.         elif _mode == "hangouts":
  387.             mode = 5
  388.        
  389.         #全てのユーザー
  390.         if _range == "all":
  391.             ranges = 1
  392.            
  393.         #サークル内
  394.         elif _range == "circles":
  395.             ranges = 2
  396.        
  397.         #自分のみ
  398.         elif _range == "you":
  399.             ranges = 5
  400.        
  401.         #新着順
  402.         if _type == "new":
  403.             types = 2
  404.        
  405.         #関連度順
  406.         elif _type == "best":
  407.             types = 1
  408.  
  409.         return _Search(self.login, 0, "", "", _query, mode, ranges, types)
  410.    
  411. #投稿取得クラス
  412. class _PostData(object):
  413.    
  414.     #使用するパラメータのみ渡す
  415.     def __init__(self, _postjson, _login=0, _num=0, _node="", _userid="", _query="", _mode="", _range="", _type=""):
  416.        
  417.         self.login = _login
  418.         self.postjson = _postjson
  419.         self.node = _node
  420.         self.num = _num
  421.         self.userid = _userid
  422.         self.query = _query
  423.         self.type = _type
  424.         self.range = _range
  425.         self.mode = _mode
  426.    
  427.     #次のアクティビティを取得
  428.     def nextactivity(self):
  429.         try:
  430.             #nodeを使用する場合は派生クラスにこのパラメータを使用すること
  431.             return self.__class__(self.login, self.num, self.node, self.userid, self.query, self.mode, self.range, self.type)
  432.         except:
  433.             return 0
  434.    
  435.     #ポストの数を取得
  436.     def length(self):
  437.         try:
  438.             return len(self.postjson)
  439.         except:
  440.             return 0
  441.  
  442.     #投稿者名
  443.     def postusername(self, _num=0):
  444.         try:
  445.             return self.postjson[_num][3].encode("utf-8")
  446.         except:
  447.             return ""
  448.        
  449.     #本文
  450.     def postbody(self, _num=0):
  451.         try:
  452.             #Sparks時の本文があるか調べる
  453.             body =  self.postjson[_num][47].encode("utf-8")
  454.             if not body == "null":
  455.                 #Sparks
  456.                 return body
  457.             else:
  458.                 #それ以外
  459.                 return self.postjson[_num][4].encode("utf-8")
  460.         except:
  461.             return ""
  462.  
  463.     #ポストID
  464.     def postid(self, _num=0):
  465.         try:
  466.             return self.postjson[_num][8].encode("utf-8")
  467.         except:
  468.             return ""
  469.  
  470.     #投稿者ID
  471.     def postuserid(self, _num=0):
  472.         try:
  473.             return self.postjson[_num][16].encode("utf-8")
  474.         except:
  475.             return ""
  476.  
  477.     #再共有されたポストのIDを取得
  478.     def resharepostid(self, _num=0):
  479.         try:
  480.             postid = self.postjson[_num][39].encode("utf-8")
  481.             if postid != "null" or postid == "":
  482.                 return self.postjson[_num][39].encode("utf-8")
  483.             else:
  484.                 return ""
  485.         except:
  486.             return ""
  487.  
  488.     #ポストのパーマリンクURLの取得
  489.     def permalink(self, _num=0):
  490.         try:
  491.             return "https://plus.google.com/"+self.postjson[_num][21].encode("utf-8")
  492.         except:
  493.             return ""
  494.        
  495.     #全体のポストのコメント数を取得(コメント○○ 件と表示されている数値です)
  496.     def commenttotal(self, _num=0):
  497.         try:
  498.             return self.postjson[_num][93]
  499.         except:
  500.             return ""
  501.        
  502.     #表示されているコメント数を取得
  503.     def commentlength(self, _num=0):
  504.         try:
  505.             return len(self.postjson[_num][7])
  506.         except:
  507.             return 0
  508.  
  509.     #ポストの再共有数を取得
  510.     def sharelength(self, _num=0):
  511.         try:
  512.             return self.postjson[_num][96]
  513.         except:
  514.             return 0
  515.  
  516.     #ポストの+1の数を取得
  517.     def plusonelength(self, _num=0):
  518.         try:
  519.             plusone = self.postjson[_num][73][16]
  520.             if plusone == "null":
  521.                 return 0
  522.             else:
  523.                 return plusone
  524.         except:
  525.             return 0
  526.  
  527.     #通知のコメントの投稿者
  528.     def commentusername(self, _num=0, _comnum=0):
  529.         try:
  530.             return self.postjson[_num][7][_comnum][1].encode("utf-8")
  531.         except:
  532.             return ""
  533.  
  534.     #通知のコメントの投稿者のID
  535.     def commentuserid(self, _num=0, _comnum=0):
  536.         try:
  537.             return self.postjson[_num][7][_comnum][6].encode("utf-8")
  538.         except:
  539.             return ""
  540.        
  541.     #通知のコメントID
  542.     def commentid(self, _num=0, _comnum=0):
  543.         try:
  544.             return self.postjson[_num][7][_comnum][4].encode("utf-8")
  545.         except:
  546.             return ""
  547.  
  548.     #通知のコメントの本文
  549.     def commentbody(self, _num=0, _comnum=0):
  550.         try:
  551.             return self.postjson[_num][7][_comnum][2].encode("utf-8")
  552.         except:
  553.             return ""
  554.        
  555.     #コメントの続きを取得
  556.     def comment(self, _postid):
  557.         return _Comment(self.login, _postid)
  558.    
  559.     #SparksIDを取得
  560.     def sparksid(self, _num=0):
  561.         try:
  562.             sparksid = self.postjson[_num][88].encode("utf-8")
  563.             if sparksid:
  564.                 return sparksid
  565.             else:
  566.                 return ""
  567.         except:
  568.             return ""
  569.    
  570.     #Sparksの見出しを取得
  571.     def sparkstitle(self, _num=0):
  572.         try:
  573.             return self.postjson[_num][11][0][3].encode("utf-8")
  574.         except:
  575.             return ""
  576.  
  577.     #Sparksの記事の投稿者名を取得
  578.     def sparksauther(self, _num=0):
  579.         try:
  580.             return self.postjson[_num][82][2][3][0].encode("utf-8")
  581.         except:
  582.             return ""
  583.  
  584.     #Sparksの説明文を取得
  585.     def sparksdescription(self, _num=0):
  586.         try:
  587.             return self.postjson[_num][11][0][21].encode("utf-8")
  588.         except:
  589.             return ""
  590.  
  591.     #Sparksのリンクを取得
  592.     def sparkslink(self, _num=0):
  593.         try:
  594.             return self.postjson[_num][13].encode("utf-8")
  595.         except:
  596.             return ""
  597.  
  598. #検索
  599. class _Search(_PostData):
  600.    
  601.     #クラスパラメータは_PostDataと一律でなければいけない(デフォルト値は新規インスタンス作成時に使用しないパラメータに付加)
  602.     def __init__(self, _login, _num=0, _node="", _userid="", _query="", _mode=1, _range=1, _type=2):
  603.         self.login = _login
  604.  
  605.         jsonstr = _jd(
  606.                         [
  607.                             _query,
  608.                             _mode,
  609.                             _type,
  610.                             [
  611.                                 _range
  612.                             ]
  613.                         ],
  614.                         "null",
  615.                         (lambda prm:(
  616.                             [
  617.                                 _node
  618.                              ]
  619.                         if prm else
  620.                             []
  621.                         ))(_node)
  622.                     )
  623.  
  624.  
  625.         params = {
  626.                "srchrp":    jsonstr,
  627.                "at":        self.login.sendid
  628.                }
  629.        
  630.        
  631.        
  632.         #URLエンコード
  633.         params = urllib.urlencode(params)
  634.    
  635.         #print params
  636.         #print self.login.urls["search"] % _reqid()
  637.        
  638.         html = r""+self.login.opener.open(self.login.urls["search"] % _reqid(), params).read()
  639.  
  640.         jsonstr = _jsonload(html)
  641.         ##########print json.dumps(jsonstr, sort_keys=True,indent=4)
  642.        
  643.         for i in jsonstr:
  644.             if i[0].encode("utf-8") == "sp.sqr":
  645.                 postjson = i[1][1][0][0]
  646.                 try:
  647.                     node = i[1][1][2]
  648.                 except:
  649.                     node = ""
  650.                 _PostData.__init__(self, postjson, _login, 0, node, "", _query, _mode, _range, _type)
  651.                 break
  652.    
  653.  
  654. #コメントの続きを取得する
  655. class _Comment(_PostData):
  656.    
  657.     def __init__(self, _login, _postid):
  658.         self.login = _login
  659.         html = r""+self.login.opener.open(self.login.urls["comment"] % (_postid, _reqid())).read()
  660.  
  661.         #jsonを調整
  662.         try:
  663.             jsonstr = _jsonload(html)
  664.         except:
  665.             jsonstr = []
  666.        
  667.         ####print json.dumps(jsonstr, sort_keys=True,indent=4)
  668.        
  669.         for i in jsonstr[0]:
  670.             if i[0].encode("utf-8") == "os.u":
  671.                 postjson = [i[1]]
  672.                 _PostData.__init__(self, postjson)
  673.                 break
  674.  
  675. #通知を取得する
  676. class _Notify(_PostData):
  677.    
  678.     #ノードを使用しないためパラメータ制限はない
  679.     def __init__(self, _login):
  680.         self.login = _login
  681.        
  682.         #通知を取得する
  683.         if self.login.ispage:
  684.             html = r""+self.login.opener.open(self.login.urls["pagenotify"] % self.login.userid).read()
  685.         else:
  686.             html = r""+self.login.opener.open(self.login.urls["usernotify"]).read()
  687.            
  688.         #通知を既読完了にする
  689.         postdata = {
  690.                     "time":     str(int(time.time()))+str(datetime.datetime.now().microsecond),
  691.                     "at":       self.login.sendid
  692.                     }
  693.         _gplusfunc("notifications", "updatelastreadtime", "", False, self.login, postdata)
  694.        
  695.         #jsonを調整
  696.         try:
  697.             jsonstr = _jsonload(html)
  698.         except:
  699.             jsonstr = []
  700.            
  701.         for i in jsonstr:
  702.             if i[0].encode("utf-8") == "on.nr":
  703.                 postjson = []
  704.                 self.notifyjson = []
  705.                 self.postidjson = []
  706.                 for ii in i[1][0]:
  707.                     try:
  708.                         self.notifyjson.append(ii[2][0][1][0])
  709.                     except:
  710.                         self.notifyjson.append([])
  711.                        
  712.                     try:
  713.                         self.postidjson.append(ii[10])
  714.                     except:
  715.                         self.postidjson.append("")
  716.                        
  717.                     try:
  718.                         postjson.append(ii[18][0][0])
  719.                     except:
  720.                         postjson.append([])
  721.                        
  722.                 _PostData.__init__(self, postjson)
  723.                 ####print json.dumps(self.postjson, sort_keys=True,indent=4)
  724.                 break
  725.         #print json.dumps(self.notifyjson, sort_keys=True,indent=4)
  726.  
  727.     #通知の種類を取得
  728.     def notifystat(self, _num=0):
  729.         try:
  730.             prm = self.notifyjson[_num][1]
  731.             if prm == 2:
  732.                 return "mycomment"
  733.             elif prm == 16:
  734.                 return "mention"
  735.             elif prm == 20:
  736.                 return "plusone"
  737.             elif prm == 6:
  738.                 return "circlein"
  739.             elif prm == 3:
  740.                 return "othercomment"
  741.             elif prm == 15:
  742.                 return "mention"
  743.             return str(type)
  744.         except:
  745.             return ""
  746.    
  747.     #通知の送信者を取得
  748.     def notifyusername(self, _num=0):
  749.         try:
  750.             return self.notifyjson[_num][2][0].encode("utf-8")
  751.         except:
  752.             return ""
  753.  
  754.     #通知の送信者のIDを取得
  755.     def notifyuserid(self, _num=0):
  756.         try:
  757.             return self.login.reg["notifyuserid"].search(self.notifyjson[_num][2][1].encode("utf-8")).group(1)
  758.         except:
  759.             return ""
  760.  
  761.     #通知のポストIDを取得
  762.     def notifypostid(self, _num=0):
  763.         try:
  764.             postid = self.postidjson[_num].encode("utf-8")
  765.             try:
  766.                 postid.index("g:")
  767.                 return ""
  768.             except:
  769.                 return postid
  770.         except:
  771.             return ""
  772.    
  773.     #通知のアイコンを取得
  774.     def notifyicon(self, _num=0):
  775.         try:
  776.             return "http:"+self.notifyjson[_num][2][2].encode("utf-8")
  777.         except:
  778.             return ""
  779.    
  780.     #性別を取得
  781.     def notifysex(self, _num=0, _male="male", _female="female", _other="other"):
  782.         try:
  783.             sex = self.notifyjson[_num][2][4].encode("utf-8")
  784.             if sex == "male":
  785.                 return _male
  786.             elif sex == "female":
  787.                 return _female
  788.             return _other
  789.         except:
  790.             return ""
  791.  
  792.  
  793. #人気の投稿を取得する
  794. class _Activity(_PostData):
  795.    
  796.     #クラスパラメータは_PostDataと一律でなければいけない(デフォルト値は新規インスタンス作成時に使用しないパラメータに付加)
  797.     def __init__(self, _login, _num, _node, _userid, _query="", _mode="", _range="", _type=""):
  798.         self.login = _login
  799.         if _userid == "":
  800.             userid = self.login.userid
  801.         else:
  802.             userid = _userid
  803.  
  804.         if _node == "":
  805.             html = r""+self.login.opener.open(self.login.urls["activity"] % (userid, _num, _reqid())).read()
  806.         else:
  807.             html = r""+self.login.opener.open(self.login.urls["activitynode"] % (_node, userid, _num, _reqid())).read()
  808.        
  809.         jsonstr = _jsonload(html)
  810.         #######print json.dumps(jsonstr, sort_keys=True,indent=4)
  811.        
  812.         for i in jsonstr[0]:
  813.             if i[0].encode("utf-8") == "os.nu":
  814.                 postjson = i[1][0]
  815.                 try:
  816.                     node = i[1][1]
  817.                 except:
  818.                     node = ""
  819.                 _PostData.__init__(self, postjson, _login, _num, node, _userid)
  820.                 break
  821.  
  822. #人気の投稿を取得する
  823. class _Hot(_PostData):
  824.    
  825.     #クラスパラメータは_PostDataと一律でなければいけない(デフォルト値は新規インスタンス作成時に使用しないパラメータに付加)
  826.     def __init__(self, _login, _num, _node="", _userid="", _query="", _mode="", _range="", _type=""):
  827.         self.login = _login
  828.         if _node == "":
  829.             html = r""+self.login.opener.open(self.login.urls["hot"] % (_num, _reqid())).read()
  830.         else:
  831.             html = r""+self.login.opener.open(self.login.urls["hotnode"] % (_node, _num, _reqid())).read()
  832.        
  833.         jsonstr = _jsonload(html)
  834.         #####print json.dumps(jsonstr, sort_keys=True,indent=4)
  835.        
  836.         for i in jsonstr[0]:
  837.             if i[0].encode("utf-8") == "os.nu":
  838.                 postjson = i[1][0]
  839.                 try:
  840.                     node = i[1][1]
  841.                 except:
  842.                     node = ""
  843.                 _PostData.__init__(self, postjson, _login, _num, node)
  844.                 break
  845.        
  846.        
  847. #ストリームの投稿を取得する
  848. class _Stream(_PostData):
  849.    
  850.     #クラスパラメータは_PostDataと一律でなければいけない(デフォルト値は新規インスタンス作成時に使用しないパラメータに付加)
  851.     def __init__(self, _login, _num, _node="", _userid="", _query="", _mode="", _range="", _type=""):
  852.         self.login = _login
  853.         if _node == "":
  854.             html = r""+self.login.opener.open(self.login.urls["stream"] % (_num, _reqid())).read()
  855.         else:
  856.             html = r""+self.login.opener.open(self.login.urls["streamnode"] % (_node, _num, _reqid())).read()
  857.        
  858.         jsonstr = _jsonload(html)
  859.         #print json.dumps(jsonstr, sort_keys=True,indent=4)
  860.        
  861.         for i in jsonstr[0]:
  862.             if i[0].encode("utf-8") == "os.nu":
  863.                 postjson = i[1][0]
  864.                 try:
  865.                     node = i[1][1]
  866.                 except:
  867.                     node = ""
  868.                 _PostData.__init__(self, postjson, _login, _num, node)
  869.                 break
  870.  
  871.    
  872.  
  873. #Google+に投稿する
  874. class _Post(object):
  875.    
  876.     def __init__(self, _login, _plus):
  877.         self.login = _login
  878.         self.plus = _plus
  879.    
  880.     #通常投稿
  881.     def _post(self, **kwargs):
  882.    
  883.         #キーが無い場合NULLを代入
  884.         kwargs.setdefault("message", "")
  885.         kwargs.setdefault("reshare", "null")
  886.         kwargs.setdefault("linkurl", "")
  887.         kwargs.setdefault("linkdescription", "")
  888.         kwargs.setdefault("linktitle", "")
  889.         kwargs.setdefault("linktype", "text/html")
  890.         kwargs.setdefault("linkthumbnail", "")
  891.         kwargs.setdefault("linktx", 200)
  892.         kwargs.setdefault("linkty", 200)
  893.         kwargs.setdefault("circleid", "")
  894.         kwargs.setdefault("iscomment", "null")
  895.         kwargs.setdefault("isshare", "null")
  896.         kwargs.setdefault("linkthumbnailtype", "")
  897.         kwargs.setdefault("linkimage", "")
  898.         kwargs.setdefault("uploadimage", "")
  899.         kwargs.setdefault("linkfavicon", "")
  900.         kwargs.setdefault("linknofavicon", False)
  901.         kwargs.setdefault("sparksid", "null")
  902.        
  903.         #限定公開かどうか
  904.         if kwargs["circleid"]:
  905.             scopetype = "focusGroup"
  906.             kwargs.setdefault("circlename", "Limited")
  907.             me = "false"
  908.             groupType = "p"
  909.            
  910.             #circleidの先頭にpが含まれていた場合削除
  911.             if kwargs["circleid"][0] == "p":
  912.                 kwargs["circleid"] = kwargs["circleid"][1:len(kwargs["circleid"])]
  913.            
  914.             #circleidにuseridを付加
  915.             kwargs["circleid"] = self.login.userid + "." + kwargs["circleid"]
  916.                
  917.         else:
  918.             #一般公開
  919.             scopetype = "anyone"
  920.             kwargs.setdefault("circlename", "anyone")
  921.             me = "true"
  922.             groupType = "null"
  923.        
  924.         #ファビコン処理
  925.         if not kwargs["linknofavicon"]:
  926.             if kwargs["linkfavicon"]:
  927.                 domain = "?domain=" + self.login.reg["domain"].search(kwargs["linkfavicon"]).group(1)
  928.             else:
  929.                 if kwargs["linktitle"]:
  930.                     try:
  931.                         domain = "?domain=" + self.login.reg["domain"].search(kwargs["linkurl"]).group(1)
  932.                     except:
  933.                         domain = ""
  934.                        
  935.            
  936.         #コメント可否
  937.         if kwargs["iscomment"] != "null":
  938.             if kwargs["iscomment"]:
  939.                 iscomment = "True"
  940.             else:
  941.                 iscomment = "False"
  942.         else:
  943.             iscomment = self.plus.iscomment
  944.                
  945.        
  946.         #再共有の可否
  947.         if kwargs["isshare"] != "null":
  948.             if kwargs["isshare"]:
  949.                 isshare = "True"
  950.             else:
  951.                 isshare = "False"
  952.         else:
  953.             isshare = self.plus.isshare
  954.            
  955.         #サムネイルタイプ
  956.         if kwargs["linktitle"]:
  957.             if kwargs["linkthumbnail"]:
  958.                 if kwargs["linkthumbnailtype"]:
  959.                     imagemime = kwargs["linkthumbnailtype"]
  960.                 else:
  961.                     imagetype = self.login.reg["thumbnailtype"].search(kwargs["linkthumbnail"]).group(1)
  962.                     if imagetype == "jpg":
  963.                         imagemime = "image/jpeg"
  964.                     elif imagetype == "jpeg":
  965.                         imagemime = "image/jpeg"
  966.                     elif imagetype == "png":
  967.                         imagemime = "image/png"
  968.                     elif imagetype == "bmp":
  969.                         imagemime = "image/bmp"
  970.                     elif imagetype == "gif":
  971.                         imagemime = "image/gif"
  972.                     else:
  973.                         imagemime = "image/jpeg"
  974.        
  975.         #画像の投稿
  976.         if kwargs["uploadimage"]:
  977.             #####print kwargs["uploadimage"][0]
  978.            
  979.             #json
  980.             uploaddata = _jd2({
  981.                 "createSessionRequest": {
  982.                     "fields": [
  983.                         {
  984.                             "external": {
  985.                                 "filename": os.path.basename(kwargs["uploadimage"][0]),
  986.                                 "formPost": {},
  987.                                 "name": "file",
  988.                                 "size": os.path.getsize(kwargs["uploadimage"][0])
  989.                             }
  990.                         },
  991.                         {
  992.                             "inlined": {
  993.                                 "content": str(int(time.time())) + str(datetime.datetime.now().microsecond / 1000),
  994.                                 "contentType": "text/plain",
  995.                                 "name": "batchid"
  996.                             }
  997.                         },
  998.                         {
  999.                             "inlined": {
  1000.                                 "content": "sharebox",
  1001.                                 "contentType": "text/plain",
  1002.                                 "name": "client"
  1003.                             }
  1004.                         },
  1005.                         {
  1006.                             "inlined": {
  1007.                                 "content": "true",
  1008.                                 "contentType": "text/plain",
  1009.                                 "name": "disable_asbe_notification"
  1010.                             }
  1011.                         },
  1012.                         {
  1013.                             "inlined": {
  1014.                                 "content": "updates",
  1015.                                 "contentType": "text/plain",
  1016.                                 "name": "streamid"
  1017.                             }
  1018.                         },
  1019.                         {
  1020.                             "inlined": {
  1021.                                 "content": "true",
  1022.                                 "contentType": "text/plain",
  1023.                                 "name": "use_upload_size_pref"
  1024.                             }
  1025.                         },
  1026.                         {
  1027.                             "inlined": {
  1028.                                 "content": self.login.userid,
  1029.                                 "contentType": "text/plain",
  1030.                                 "name": "effective_id"
  1031.                             }
  1032.                         },
  1033.                         {
  1034.                             "inlined": {
  1035.                                 "content": self.login.userid,
  1036.                                 "contentType": "text/plain",
  1037.                                 "name": "owner_name"
  1038.                             }
  1039.                         }
  1040.                     ]
  1041.                 },
  1042.                 "protocolVersion": "0.8"
  1043.             })[1:-1]
  1044.            
  1045.             #####print "---"
  1046.             #####print uploaddata
  1047.             #####print "---"
  1048.            
  1049.             #HTMLの取得
  1050.             uploaddata = self.login.opener.open(self.login.urls["upload1"], uploaddata).read()
  1051.             #####print uploaddata
  1052.             #####print "---"
  1053.            
  1054.             #JSONを読み込む
  1055.             uploaddata = json.loads(uploaddata)
  1056.            
  1057.             #JSON一覧
  1058.             ######print json.dumps(uploaddata, sort_keys=True, indent=4)
  1059.            
  1060.             #アップロードURLの取得
  1061.             uploadurl = uploaddata["sessionStatus"]["externalFieldTransfers"][0]["formPostInfo"]["url"]
  1062.             #####print "uploadurl: "+uploadurl
  1063.             #####print "---"
  1064.            
  1065.             #アップロード開始
  1066.             filedata = open(kwargs["uploadimage"][0], "rb")
  1067.             request = urllib.Request(uploadurl, filedata.read())
  1068.             request.add_header("Content-Type", "application/octet-stream")
  1069.             request.add_header("X-HTTP-Method-Override", "PUT")
  1070.             #####print urllib.urlopen(request)
  1071.  
  1072.             #postdata = open(kwargs["uploadimage"][0], "rb")
  1073.             #uploaddata = self.login.opener.open(uploadurl, postdata)
  1074.  
  1075.            
  1076.             ######print uploaddata
  1077.             ######print "---end---"
  1078.            
  1079.         #投稿する範囲
  1080.         scopedata = _jd(
  1081.             {
  1082.                 "aclEntries": [
  1083.                     {
  1084.                         "scope": {
  1085.                             "scopeType":    scopetype,                #focusGroup
  1086.                             "name":            kwargs["circlename"],
  1087.                             "id":            kwargs["circleid"],
  1088.                             "me":            me,
  1089.                             "requiresKey":    "false",
  1090.                             "groupType":    groupType
  1091.                         },
  1092.                         "role":20
  1093.                     },
  1094.                     {
  1095.                         "scope":{
  1096.                             "scopeType":    scopetype,
  1097.                             "name":            kwargs["circlename"],
  1098.                             "id":            kwargs["circleid"],
  1099.                             "me":            me,
  1100.                             "requiresKey":    "false",
  1101.                             "groupType":    groupType
  1102.                         },
  1103.                         "role":60
  1104.                        
  1105.                     }
  1106.                 ]                                    
  1107.             }
  1108.             )[1:-1]
  1109.        
  1110.         #リンク
  1111.         if kwargs["linkurl"]:
  1112.             linkdata = _jd(_jd(
  1113.                 "null","null","null",kwargs["linktitle"],"null",
  1114.                 #通常の画像リンク
  1115.                 (lambda prm:(
  1116.                     (
  1117.                         (
  1118.                             [
  1119.                                 "null",kwargs["linkimage"],kwargs["linktx"],kwargs["linkty"]
  1120.                             ]
  1121.                         )
  1122.                     if prm else
  1123.                         (
  1124.                             "null"
  1125.                         )
  1126.                     )
  1127.                 ))(kwargs["linkimage"]),
  1128.                 "null","null","null",
  1129.                 [],
  1130.                 "null","null","null","null","null","null","null","null","null","null","null",kwargs["linkdescription"],"null","null",
  1131.                 [
  1132.                     "null",kwargs["linkurl"],"null",kwargs["linktype"],"document"
  1133.                 ],
  1134.                 "null","null","null","null","null","null","null","null","null","null","null","null","null","null","null","null",
  1135.                 (lambda prm:(
  1136.                     (
  1137.                         (
  1138.                             [
  1139.                                 [
  1140.                                     "null",kwargs["linkimage"],120,96.14035087719297
  1141.                                 ],
  1142.                                 [
  1143.                                     "null",kwargs["linkimage"],120,96.14035087719297
  1144.                                 ]
  1145.                             ]
  1146.  
  1147.                         )
  1148.                     if prm else
  1149.                         (
  1150.                             #ファビコン
  1151.                             (lambda prm:(
  1152.                                 (
  1153.                                     (
  1154.                                         "null"
  1155.                                     )
  1156.                                 if prm else
  1157.                                     (
  1158.                                         (lambda prm:(
  1159.                                             (
  1160.                                                 (
  1161.                                                     [
  1162.                                                         [
  1163.                                                             "null","//s2.googleusercontent.com/s2/favicons" + domain,"null","null"
  1164.                                                         ],
  1165.                                                         [
  1166.                                                             "null","//s2.googleusercontent.com/s2/favicons" + domain,"null","null"
  1167.                                                         ]
  1168.                                                     ]
  1169.                                                 )
  1170.                                             if prm else
  1171.                                                 (
  1172.                                                     "null"
  1173.                                                 )
  1174.                                             )
  1175.                                         ))(kwargs["linktitle"])
  1176.                                     )
  1177.                                 )
  1178.                             ))(kwargs["linknofavicon"])
  1179.                         )
  1180.                     )
  1181.                 ))(kwargs["linkimage"]),
  1182.                 "null","null","null","null","null",
  1183.                 [
  1184.                     [
  1185.                         "null","","http://google.com/profiles/media/provider",""
  1186.                     ]
  1187.                 ]
  1188.  
  1189.                 ),
  1190.                 _jd(
  1191.    
  1192.                 "null","null","null","null","null",
  1193.                 #サムネイル
  1194.                 (lambda prm:(
  1195.                     (
  1196.                         (
  1197.                             [
  1198.                                 "null",kwargs["linkthumbnail"]
  1199.                             ]
  1200.                         )
  1201.                     if prm else
  1202.                         (
  1203.                             "null"
  1204.                         )
  1205.                     )
  1206.                 ))(kwargs["linkthumbnail"]),
  1207.                 "null","null","null",
  1208.                 [],
  1209.                 "null","null","null","null","null","null","null","null","null","null","null","null","null","null",
  1210.                 (lambda prm:(
  1211.                     (
  1212.                         (
  1213.                             [
  1214.                                 "null",kwargs["linkurl"],"null",imagemime,"photo","null","null","null","null","null","null","null",kwargs["linktx"],kwargs["linkty"]
  1215.                             ]
  1216.                         )
  1217.                     if prm else
  1218.                         (
  1219.                             "null"
  1220.                         )
  1221.                     )
  1222.                 ))(kwargs["linkthumbnail"]),
  1223.                 "null","null","null","null","null","null","null","null","null","null","null","null","null","null","null","null",
  1224.                 (lambda prm:(
  1225.                     (
  1226.                         (
  1227.                             [
  1228.                                 [
  1229.                                     "null",kwargs["linkthumbnail"],"null","null"
  1230.                                 ],
  1231.                                 [
  1232.                                     "null",kwargs["linkthumbnail"],"null","null"
  1233.                                 ]
  1234.                             ]
  1235.                         )
  1236.                     if prm else
  1237.                         (
  1238.                             "null"
  1239.                         )
  1240.                     )
  1241.                 ))(kwargs["linkthumbnail"]),
  1242.                 "null","null","null","null","null",
  1243.                 [
  1244.                     [
  1245.                         "null","images","http://google.com/profiles/media/provider",""
  1246.                     ]
  1247.                 ]
  1248.             ))
  1249.         else:
  1250.             linkdata = "null"
  1251.  
  1252.         #spar
  1253.         spar =  _jd(
  1254.                 kwargs["message"],
  1255.                 "oz:" + self.login.userid + "." + str("%x" % int(time.time())) + ".0",
  1256.                 kwargs["reshare"],
  1257.                 "null",
  1258.                 "null",
  1259.                 "null",
  1260.                 linkdata,
  1261.                 "null",
  1262.                 scopedata,
  1263.                 "true",
  1264.                 [],
  1265.                 "false",
  1266.                 "false",
  1267.                 "null",
  1268.                 [],
  1269.                 "false",
  1270.                 "false",
  1271.                 "null",
  1272.                 kwargs["sparksid"],
  1273.                 "null",
  1274.                 "null",
  1275.                 "null",
  1276.                 "null",
  1277.                 "null",
  1278.                 "null",
  1279.                 "null",
  1280.                 "null",
  1281.                 iscomment,
  1282.                 isshare,
  1283.                 "false"
  1284.             )
  1285.            
  1286.  
  1287.         #pastdataを設定
  1288.         postdata = {
  1289.             "spar":        spar,
  1290.             "at":        self.login.sendid
  1291.         }
  1292.  
  1293.        
  1294.         #送信
  1295.         _gplusfunc("sharebox", "post", "spam=20", True, self.login, postdata)
  1296.        
  1297.     #ポストを編集する
  1298.     def edit(self, _postid, _message):
  1299.    
  1300.         #pastdataを設定
  1301.         postdata = {
  1302.             "spt":        _message,
  1303.             "sei":        _postid,
  1304.             "sml":        "[]",
  1305.             "madl":        "true",
  1306.             "at":        self.login.sendid
  1307.         }
  1308.        
  1309.         #送信
  1310.         _gplusfunc("stream", "edit", "spam=20", True, self.login, postdata)
  1311.  
  1312.     #コメントする
  1313.     def comment(self, _postid, _message):
  1314.    
  1315.         #pastdataを設定
  1316.         postdata = {
  1317.             "itemId":                _postid,
  1318.             "clientId":                "os:" + _postid + ":" + str(int(time.time()))+str(datetime.datetime.now().microsecond / 1000),
  1319.             "text":                    _message,
  1320.             "timestamp_msec":        str(int(time.time()))+str(datetime.datetime.now().microsecond / 1000),
  1321.             "at":                    self.login.sendid
  1322.         }
  1323.  
  1324.         #送信
  1325.         _gplusfunc("stream", "comment", "spam=20", True, self.login, postdata)
  1326.        
  1327.     #再共有
  1328.     def reshare(self, _message = "", _postid = "", _circleid = ""):
  1329.         self._post(message = _message, reshare = _postid, circleid = _circleid)
  1330.    
  1331.     #カスタムリンク
  1332.     def customlink(self, _message = "", _linkurl = "//plus.google.com", _linktitle = "", _linkdescription = "", _linkthumbnail = "", _linkthumbnailtype = "", _imagesizex = 200, _imagesizey = 200):
  1333.         self._post(message = _message, linkurl = _linkurl, linktitle = _linktitle, linkdescription = _linkdescription, linkthumbnail = _linkthumbnail, linkthumbnailtype = _linkthumbnailtype, linktx = _imagesizex, linkty = _imagesizey)
  1334.        
  1335.     #リンク
  1336.     def link(self, _message = "", _linkurl = "", _thumbnailnumber = 0):
  1337.        
  1338.         #URLの設定
  1339.         sendurl = _funcurl("sharebox", "linkpreview/", self.login.params["linkurl"] % (_linkurl), self.login.urls, self.login.ispage, self.login.userid)
  1340.        
  1341.         #パラメータの設定
  1342.         params = {
  1343.             "susp":        "false",
  1344.             "at":        self.login.sendid
  1345.         }
  1346.        
  1347.         #URLエンコード
  1348.         params = urllib.urlencode(params)
  1349.        
  1350.         #HTMLの取得
  1351.         html = r""+self.login.opener.open(sendurl, params).read()
  1352.        
  1353.        
  1354.         try:
  1355.             js = _jsonload(html)
  1356.         except:
  1357.             js = []
  1358.        
  1359.         #lpdリストを取得
  1360.         size = len(js[0])
  1361.         for i in range(size):
  1362.             if js[0][i][0] == "lpd":
  1363.                 js = js[0][i]
  1364.                 break
  1365.  
  1366.         #JSON一覧
  1367.         ####print json.dumps(js, sort_keys=True, indent=4)
  1368.        
  1369.         #サムネイルURL一覧を取得
  1370.         size = len(js[2])
  1371.         linkthumbnaillist = []
  1372.         for i in range(size):
  1373.             try:
  1374.                 linkthumbnailurl = js[2][i][5][1].encode("utf-8")
  1375.                 linkthumbnailtype = js[2][i][24][3].encode("utf-8")
  1376.                 linkthumbnailsizex = int(js[2][i][24][12])
  1377.                 linkthumbnailsizey = int(js[2][i][24][13])
  1378.             except:
  1379.                 linkthumbnailurl = ""
  1380.                 linkthumbnailtype = ""
  1381.                 linkthumbnailsizex = ""
  1382.                 linkthumbnailsizey = ""
  1383.  
  1384.             linkthumbnaillist.append([linkthumbnailurl, linkthumbnailtype, linkthumbnailsizex, linkthumbnailsizey])
  1385.        
  1386.         #タイトルを取得        
  1387.         try:
  1388.             linktitle = js[4][0][3].encode("utf-8")
  1389.         except:
  1390.             return 0
  1391.        
  1392.         #descriptionを取得
  1393.         try:
  1394.             linkdescription = js[4][0][7].encode("utf-8")
  1395.         except:
  1396.             linkdescription = ""
  1397.        
  1398.         #Link投稿
  1399.         self.customlink(_message, _linkurl, linktitle, linkdescription, linkthumbnaillist[_thumbnailnumber][0], linkthumbnaillist[_thumbnailnumber][1], linkthumbnaillist[_thumbnailnumber][2], linkthumbnaillist[_thumbnailnumber][3])
  1400.         return 1
  1401.  
  1402.  
  1403.     #通常投稿
  1404.     def message(self, _message = "", _circleid = ""):
  1405.         self._post(message = _message, circleid = _circleid)
  1406.    
  1407.     #画像投稿
  1408.     def image(self, _message, *args):
  1409.         self._post(message = _message, uploadimage = args)
  1410.    
  1411.     #ポストのコメントをロックする
  1412.     def commentlock(self, _postid):
  1413.    
  1414.         #pastdataを設定
  1415.         postdata = {
  1416.             "itemId":        _postid,
  1417.             "disable":        "true",
  1418.             "at":            self.login.sendid
  1419.         }
  1420.        
  1421.         #送信
  1422.         _gplusfunc("stream", "disablecomments", "", True, self.login, postdata)
  1423.        
  1424.     #ポストのコメントをロックを解除する
  1425.     def commentunlock(self, _postid):
  1426.    
  1427.         #pastdataを設定
  1428.         postdata = {
  1429.             "itemId":        _postid,
  1430.             "disable":        "false",
  1431.             "at":            self.login.sendid
  1432.         }
  1433.         #送信
  1434.         _gplusfunc("stream", "disablecomments", "", True, self.login, postdata)
  1435.  
  1436.     #sparksを共有する
  1437.     def sparks(self, _message, _sparksid):
  1438.         self._post(message = _message, sparksid = _sparksid)
  1439.  
  1440. #GoogleMusicを使えるようにする
  1441. class _Music(object):
  1442.    
  1443.     def __init__(self, _login):
  1444.         self.login = _login
  1445.        
  1446.  
  1447. #main
  1448. #if __name__ == '__main__':
  1449.  
  1450.    
  1451.     #Googleアカウントにログインする
  1452.     #print "ログインしています"
  1453.     #g = Login("メールアドレス", "パスワード")
  1454.    
  1455.     #Google+を使えるようにする
  1456.     #print "Google+を使えるようにしています"
  1457.     #plus = g.plus("ページIDまたは空白指定でメインID")
  1458.  
  1459.    
  1460.  
  1461.     '''
  1462.    #人気の投稿を取得する
  1463.    print "検索しています"
  1464.    search = plus.search("あ", "sparks", "all", "new")
  1465.    #search = plus.activity("", 20)
  1466.    count = 0
  1467.    
  1468.    
  1469.    l = search.length()
  1470.    
  1471.    for i in range(l):
  1472.        count += 1
  1473.        print "ユーザー名: "+search.postusername(i)
  1474.        print "ユーザーID: "+search.postuserid(i)
  1475.        print "本文: "+search.postbody(i)
  1476.        print "コメント数: "+str(search.commentlength(i))
  1477.        print "再共有数: "+str(search.sharelength(i))
  1478.        print "+1数: "+str(search.plusonelength(i))
  1479.        print "ポストID: "+search.postid(i)
  1480.        print "再共有ポストID: "+search.resharepostid(i)
  1481.        print "SparksID: "+search.sparksid(i)
  1482.        print "SparksTitle: "+search.sparkstitle(i)
  1483.        print "SparksDesc: "+search.sparksdescription(i)
  1484.        print "SparksAuther: "+search.sparksauther(i)
  1485.        print "SparksLink: "+search.sparkslink(i)
  1486.        print "カウント: "+str(count)
  1487.        print "----------------------------------------"
  1488.    '''
  1489.  
  1490.     #投稿できるようにする
  1491.     #post = plus.post()
  1492.  
  1493.  
  1494.     #Google Musicを使えるようにする(まだ動かない)
  1495.     #music = g.music()
  1496.  
  1497.     #コメント禁止
  1498.     #plus.comment(True)
  1499.    
  1500.     #共有禁止
  1501.     #plus.share(True)
  1502.    
  1503.     #投稿オブジェクト
  1504.     #post = plus.post()
  1505.    
  1506.     #Sparksを共有
  1507.     #post.sparks("hoge", "ChQxNDcxMDE0ODY5NTY5MDQ4NjI2MxI0WjJodHRwOi8vZ3JlZS5qcC9zaGliYWhhcmFfcmlzYS9ibG9nL2VudHJ5LzYxOTUzNjM2NyIyaHR0cDovL2dyZWUuanAvc2hpYmFoYXJhX3Jpc2EvYmxvZy9lbnRyeS82MTk1MzYzNjc4gPmvutDJrQJqInBlcmZlY3RzdHJlYW06MTQ3MTAxNDg2OTU2OTA0ODYyNjNyTwpC5p+05Y6fIOmHjOe0lyDlhazlvI/jg5bjg63jgrAv5YmN6auq44GC44G/44GT44G/KCrCtNCU772AKikgLSBHUkVFEgl0ZXh0L2h0bWyrAbIBzQIaQuaftOWOnyDph4zntJcg5YWs5byP44OW44Ot44KwL+WJjemrquOBguOBv+OBk+OBvygqwrTQlO+9gCopIC0gR1JFRaoBtQHmn7Tljp8g6YeM57SXIOWFrOW8j+ODluODreOCsC/liY3pq6rjgYLjgb/jgZPjgb8oKsK00JTvvYAqKTog5YmN6auq44GC44G/44GT44G/44GX44Gm44KC44KJ44Gj44Gf4piG5b2hKCrCtNCU772AKikg44Gq44KT44GLIOWkieOBquODneODvOOCuuOBqOOCieOCjOOBnyjnrJEpIOaYvOS8keOBv+alveOBl+OBhCjnrJEpwwHKATJodHRwOi8vZ3JlZS5qcC9zaGliYWhhcmFfcmlzYS9ibG9nL2VudHJ5LzYxOTUzNjM2N9oBCXRleHQvaHRtbOIBCGRvY3VtZW50xAGsAasBsgHWAcMBygEyaHR0cDovL2dyZWUuanAvc2hpYmFoYXJhX3Jpc2EvYmxvZy9lbnRyeS82MTk1MzYzNjfaAQppbWFnZS9qcGVn4gEFcGhvdG/EAcsC0gJCaHR0cDovL3N0MTEyLnN0b3JhZ2UuZ3JlZS5qcC9hbGJ1bS8zNS81OS80NDA0MzU1OS9hNzQzN2Y3MF82NDAuanBn2AJk4AJLzAL7AoIDBmltYWdlc4oDKWh0dHA6Ly9nb29nbGUuY29tL3Byb2ZpbGVzL21lZGlhL3Byb3ZpZGVy/AKsAcoDMmh0dHA6Ly9ncmVlLmpwL3NoaWJhaGFyYV9yaXNhL2Jsb2cvZW50cnkvNjE5NTM2MzY30gUrMAWyASYLEMHbuwkaHQgDGhkiFwoER1JFRRIPaHR0cDovL2dyZWUuanAvDIgGBQ==")
  1508.    
  1509.     #投稿
  1510.     #post._post(message = "", linkurl = "https://lh6.googleusercontent.com/-koN3zNVjPmQ/TtLd--zETTI/AAAAAAAAAAo/sLFReYW56_c/w288-h288/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-11-24%2B9.22.56%25EF%25BC%2589.png", linkimage = "https://lh6.googleusercontent.com/-koN3zNVjPmQ/TtLd--zETTI/AAAAAAAAAAo/sLFReYW56_c/w288-h288/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25EF%25BC%25882011-11-24%2B9.22.56%25EF%25BC%2589.png")
  1511.  
  1512.     #最後にポストした投稿を取得する
  1513.     #postid =  post.activepost()
  1514.    
  1515.     #編集
  1516.     #post.edit(postid, "テスト")
  1517.    
  1518.     #コメントする
  1519.     #post.comment("z12kwlrw3ra5d5lwy04ch3vrimayyveqojs", "こんにちは!こんにちは!")
  1520.  
  1521.     #再共有
  1522.     #post.reshare("test", postid)
  1523.    
  1524.     #カスタムリンク共有
  1525.     #post.customlink("test", "http://yahoo.com", "Yahoo!", "というお話だったのです。", "http://screenshot.hatena.ne.jp/images/200x150/d/3/1/9/5/8e85b65eaa743603a57a22069fa86322ef5.jpg", "", 100, 100)
  1526.    
  1527.     #リンク共有
  1528.     #if not post.link("テスト", "http://sample.com/"):
  1529.     #    print "ポストに失敗しました"
  1530.  
  1531.    
  1532.     #画像投稿 (まだ動かない)
  1533.     #post.image("test", "/Volumes/Users/Dropbox/nacika/Desktop/d.png")
  1534.    
  1535.     #通常投稿
  1536.     #post.message("null")
  1537.     #print "投稿しました"
  1538.    
  1539.    
  1540.     ##post._post(message = "ぬ", linktitle = "る", linkurl = "https://plus.google.com/103944597090770978886/posts/Zjkgg8k2nYV", linkdescription ="ぽ", linknofavicon = True)
  1541.  
  1542.     #通知取得
  1543.     '''
  1544.    print "notifycheck: " + str(plus.notifycheck())
  1545.    notify = plus.notify()
  1546.    size = notify.length()
  1547.    for i in range(size):
  1548.        print "username: " + notify.notifyusername(i)
  1549.        print "postid: " + notify.notifypostid(i)
  1550.        print "status: " + notify.notifystat(i)
  1551.        print "icon: " + notify.notifyicon(i)
  1552.        print "sex: " + notify.notifysex(i, "男", "女", "その他")
  1553.        print "postusername: "+notify.postusername(i)
  1554.        print "postuserid: "+notify.postuserid(i)
  1555.        print "postbody: "+notify.postbody(i)
  1556.        print "commenttotal: "+str(notify.commenttotal(i))
  1557.        print "commentlength: "+str(notify.commentlength(i))
  1558.        print "    ---------------------------------------"
  1559.        for ii in range(notify.commentlength(i)):
  1560.            print "    commentusername: "+notify.commentusername(i, ii)
  1561.            print "    commentuserid: "+notify.commentuserid(i, ii)
  1562.            print "    commentbody: "+notify.commentbody(i, ii)
  1563.            print "    commentid: "+notify.commentid(i, ii)
  1564.            print "    ---------------------------------------"
  1565.        #コメント欄を全取得する    
  1566.        ####if notify.postid(i) != "":
  1567.            ####comment = notify.comment(notify.postid(i))
  1568.            ####for ii in range(comment.commentlength()):
  1569.                ####print "    commentusername: "+comment.commentusername(0, ii)
  1570.                ####print "    commentuserid: "+comment.commentuserid(0, ii)
  1571.                ####print "    commentbody: "+comment.commentbody(0, ii)
  1572.                ####print "    ---------------------------------------"
  1573.            
  1574.        print "-----------------------------------"
  1575.    '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement