ããã«ã¡ã¯ã 空ãæéã«ã¯ããœãŒã·ã£ã«ãããžã§ã¯ããè¡ããŸãã ç§ã®å人ãšç§ã¯ãããŸããŸãªãœãŒã·ã£ã«ãããã¯ãŒã¯ã«ååãªæ°ã®ããããªãã¯ããæã£ãŠãããããããŸããŸãªå®éšãè¡ãããšãã§ããŸãã æžã蟌ã¿ã®åé¡ã¯ãå ¬éã§ããé¢é£ã³ã³ãã³ããšãã¥ãŒã¹ãèŠã€ããããšã§ãã ãã®ç¹ã§ãæã人æ°ã®ããããŒãžããæçš¿ãåéããæå®ããããã£ã«ã¿ãŒã«åŸã£ãŠããããçºè¡ãããµãŒãã¹ãäœæãããšããã¢ã€ãã¢ãçãŸããŸããã æåã®ãã¹ãã§ã¯ããœãŒã·ã£ã«ãããã¯ãŒã¯VKontakteãšTwitterãéžæããŸããã
ãã¯ãããžãŒ
ãŸããããŒã¿ãŠã§ã¢ããŠã¹ã決å®ããå¿ èŠããããŸããïŒãšããã§ãä¿åãããã¬ã³ãŒãã®æ°ã¯200äžãè¶ ããŠããŸãïŒããã®æ°å€ã¯æ¯æ¥è§£æ¶ãããŸãã èŠä»¶ã¯æ¬¡ã®ãšããã§ãã倧éã®ããŒã¿ãéåžžã«é »ç¹ã«æ¿å ¥ãããããããã°ããéžæããŸãã
ãã®åã«ãç§ã¯ãã§ã«nosqlããŒã¿ããŒã¹ã«ã€ããŠèããŠããã®ã§ãè©ŠããŠã¿ãããšæããŸããã ç§ãè¡ã£ãããŒã¿ããŒã¹ã®æ¯èŒã«ã€ããŠã¯èª¬æããŸããïŒmysql vs sqlite vs mongodbïŒã
ãã£ãã·ã³ã°ãšããŠmemcachedãéžæããŸãããåŸã§ããã®çç±ãšã±ãŒã¹ã説æããŸãã
PythonããŒã¢ã³ã¯ãããŒã¿ããŒã¹ãããã¹ãŠã®ã°ã«ãŒããåæã«æŽæ°ããããŒã¿ã³ã¬ã¯ã¿ãŒãšããŠäœæãããŸããã
MongoDBãšããŒã¢ã³
ãŸããã°ã«ãŒãããã®åºçç©ã®ã³ã¬ã¯ã¿ãŒã®ãããã¿ã€ããäœæããŸããã ç§ã¯ããã€ãã®åé¡ãèŠãŸããïŒ
- ã¹ãã¬ãŒãžå®¹é
- APIã®å¶é
ãã¹ãŠã®ã¡ã¿ããŒã¿ãå«ã1ã€ã®ãããªã±ãŒã·ã§ã³ã«ã¯çŽ5ã6KBã®ããŒã¿ãå¿ èŠã§ããäžéã°ã«ãŒãã§ã¯ãçŽ20,000ã30,000ã¬ã³ãŒããã°ã«ãŒãããšã«çŽ175MBã®ããŒã¿ãååŸããããããã®ã°ã«ãŒããå€æ°ãããŸãã ãã®ãããèå³ã®ãªãåºçç©ããã£ã«ã¿ãªã³ã°ããã¿ã¹ã¯ãèšå®ããå¿ èŠããããŸããã
ããŸãçºæããå¿ èŠã¯ãããŸããã§ããããããŒãã«ãã¯2ã€ã ãã§ãã1ã€ç®ã¯è§£æãšæŽæ°ãå¿ èŠãªã°ã«ãŒãã®ã¬ã³ãŒããä¿åãã2ã€ç®ã¯ãã¹ãŠã®ã°ã«ãŒãã®ãã¹ãŠã®åºçç©ã®ç¯å²ã§ãã ä»ãç§ã«ã¯äžå¿ èŠã§æªãå€æããããŠããããã§ãã ã°ã«ãŒãããšã«ããŒãã«ãäœæããã®ãæåã§ãããããã¬ã³ãŒãã®éžæãšãœãŒããç°¡åã«ãªããŸããã200äžã§ãã£ãŠãé床ã¯å€±ãããŸããã ãã ãããã®ã¢ãããŒãã«ããããã¹ãŠã®ã°ã«ãŒãã®ãµã³ãã«å šäœãç°¡çŽ åãããŸãã
API
VKontakteãœãŒã·ã£ã«ãããã¯ãŒã¯ããã®ããŒã¿ã®ãµãŒããŒåŠçãå¿ èŠãªå Žåã¯ãä»»æã®ã¢ã¯ã·ã§ã³ã«å¯ŸããŠããŒã¯ã³ãçºè¡ã§ããã¹ã¿ã³ãã¢ãã³ã¢ããªã±ãŒã·ã§ã³ãäœæãããŸãã ãã®ãããªå Žåã®ããã«ã次ã®ã¢ãã¬ã¹ã§ã¡ã¢ãä¿åããŸããã
http://oauth.vk.com/authorize?client_id=APP_ID&redirect_uri=https://oauth.vk.com/blank.html&response_type=token&scope=groups,offline,photos,friends,wall
APP_IDã®ä»£ããã«ãã¹ã¿ã³ãã¢ãã³ã¢ããªã±ãŒã·ã§ã³ã®èå¥åãæ¿å ¥ããŸãã çæãããããŒã¯ã³ã«ãããæå®ãããã¢ã¯ã·ã§ã³ã«ãã€ã§ãã¢ã¯ã»ã¹ã§ããŸãã
ããŒãµãŒã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
ã°ã«ãŒãIDãååŸããã«ãŒãã§ãã¹ãŠã®ãããªã±ãŒã·ã§ã³ãååŸããåå埩ã§ãæªããæçš¿ããã£ã«ã¿ãŒåŠçããŠããŒã¿ããŒã¹ã«ä¿åããŸãã
äž»ãªåé¡ã¯é床ã§ãã vkontakte APIã䜿çšãããšã1ç§éã«3ã€ã®ãªã¯ãšã¹ããå®è¡ã§ããŸãã 1åã®ãªã¯ãšã¹ãã§ãåèš100ã®åºçç©ïŒ1ç§ããã300ã®åºçç©ïŒãååŸã§ããŸãã
ããŒãµãŒã®å Žåãããã¯ããã»ã©æªããããŸããã1åã§ã°ã«ãŒããããŒãžã§ããŸãããæŽæ°ã«ã¯ãã§ã«åé¡ããããŸãã ã°ã«ãŒããå€ãã»ã©ãæŽæ°ãé·ããªããããã«å¿ããŠãåé¡ã¯ããã»ã©éãæŽæ°ãããŸããã
解決çã¯ãããŒããžã®APIãžã®ãªã¯ãšã¹ããåéããäžåºŠã«å®è¡ã§ããexecuteã¡ãœããã䜿çšããããšã§ããã ãããã£ãŠã1åã®ãªã¯ãšã¹ãã§ã5åã®å埩ãè¡ãã500ã®ãããªã±ãŒã·ã§ã³ïŒ1ç§ããã1,500ïŒãååŸããŸããããã«ãããã°ã«ãŒãã¯çŽ13ç§ã§ããã¬ã€ã³ããããŸãã
å®è¡ã«æž¡ãããã³ãŒããå«ããã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
var groupId = -|replace_group_id|; var startOffset = |replace_start_offset|; var it = 0; var offset = 0; var walls = []; while(it < 5) { var count = 100; offset = startOffset + it * count; walls = walls + [API.wall.get({"owner_id": groupId, "count" : count, "offset" : offset})]; it = it + 1; } return { "offset" : offset, "walls" : walls };
ã³ãŒããã¡ã¢ãªã«èªã¿èŸŒãŸãã replace_group_idããã³replace_start_offsetããŒã¯ã³ã 眮ãæããããŸãã ãã®çµæãå ¬åŒã®VK APIããŒãžvk.com/dev/wall.getã§èŠãããšãã§ããåºçç©ã®é åãååŸããŸã
次ã®ã¹ãããã¯ãã£ã«ã¿ãŒã§ãã ç§ã¯ããŸããŸãªã°ã«ãŒããåããåºçç©ã調ã¹ãŠãå¯èœãªã¹ã¯ãªãŒãã³ã°ãªãã·ã§ã³ãèãåºããŸããã ãŸããå€éšããŒãžãžã®ãªã³ã¯ãæã€ãã¹ãŠã®åºçç©ãåé€ããããšã«ããŸããã ããã¯ã»ãšãã©åžžã«åºåã§ãã
urls1 = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', text) urls2 = re.findall(ur"[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[az]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)", text) if urls1 or urls2: #
ãã®åŸãåæçš¿ãå®å šã«é€å€ããããšã«ããŸãã-ããã¯99ïŒ ã®åºåã§ãã 誰ãä»ã®äººã®ããŒãžãåæçš¿ãã人ã¯ã»ãšãã©ããŸããã åæçš¿ã®ç¢ºèªã¯éåžžã«ç°¡åã§ãã
if item['post_type'] == 'copy': return False
item-executeã¡ãœããã«ãã£ãŠè¿ãããå£ã³ã¬ã¯ã·ã§ã³ã®æ¬¡ã®èŠçŽ ã
ãŸããå€ä»£ã®åºçç©ã®å€ãã¯ç©ºã§ãããæ·»ä»ãã¡ã€ã«ããªããããã¹ãã¯ç©ºã§ããããšã«æ°ä»ããŸããã ãã£ã«ã¿ãŒã®å Žåãã¢ã€ãã ['attachments']ããã³ã¢ã€ãã ['text']ã空ã§ããããšã確èªããã ãã§ååã§ãã
ãããŠãæéã®çµéãšãšãã«æšæž¬ããæåŸã®ãã£ã«ã¿ãŒïŒ
yearAgo = datetime.datetime.now() - datetime.timedelta(days=200) createTime = datetime.datetime.fromtimestamp(int(item['date'])) if createTime <= yearAgo and not attachments and len(text) < 75: #
åã®æ®µèœãšåæ§ã«ãå€ãã®å€ãåºçç©ã«ã¯ããã¹ãïŒæ·»ä»ãã¡ã€ã«å ã®ç»åã®èª¬æïŒãå«ãŸããŠããŸããããç»åèªäœã¯ä¿åãããŠããŸããã
次ã®ã¹ãããã¯ããè¡ããªãã£ãããšãã倱æããæçš¿ãã¯ãªã¢ããããšã§ããã
db.posts.aggregate( { $match : { gid : GROUP_ID } }, { $group : { _id : "$gid", average : {$avg : "$likes"} } } )
ãã®ã¡ãœããã¯ãlikesãã£ãŒã«ãïŒãããªã±ãŒã·ã§ã³ã®ãããã®æ°ïŒãæã€postsããŒãã«ã§å®è¡ãããŸãã ãã®ã°ã«ãŒãã®ãããã®ç®è¡å¹³åãè¿ããŸãã
ããã§ãå¹³å以äžã®ãããã3æ¥ä»¥äžçµéãããã¹ãŠã®ãããªã±ãŒã·ã§ã³ãç°¡åã«åé€ã§ããŸãã
db.posts.remove( { 'gid' : groupId, 'created' : { '$lt' : removeTime }, 'likes': { '$lt' : avg } } )
removeTime = datetime.datetime.now() - datetime.timedelta(days=3) avg = , ( ).
çµæãšããŠãã£ã«ã¿ãªã³ã°ããããããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ã«è¿œå ãããšããã®è§£æã¯çµäºããŸãã ã°ã«ãŒãã®è§£æãšæŽæ°ã®éãã¯ã1ã€ã®ç¹ã®ã¿ã§ãããæŽæ°ã¯ãã°ã«ãŒãã«å¯ŸããŠ1åã ãåŒã³åºãããŸãã æåŸã®500ãšã³ããªã®ã¿ãååŸããŸãïŒ5ã100å®è¡ïŒã VKontakteãåºçç©ã®æ°ã«å¶éãèšããŠããããšãèãããšãããã§ååã§ãïŒ1æ¥ããã200ã
ããã³ããšã³ã
javascript + jquery + isotope + inview + moustacheã«ã€ããŠã¯ããŸã詳ãã説æããŸããã
- åäœäœã¯ãã¿ã€ã«åœ¢åŒã®åºçç©ã®ææ°ã®åºåã«äœ¿çšãããŸãã
- Inviewã䜿çšãããšãç¹å®ã®èŠçŽ ã®ãã¥ãŒããŒãã«ãããããã€ãã³ãã«ç°¡åã«å¿çã§ããŸãã ïŒç§ã®å ŽåãèŠãåºçç©ãèŠããŠãããæ°ããåºçç©ãç¹å¥ãªè²ã§åŒ·èª¿è¡šç€ºããŠããŸãïŒã
- Moustacheã䜿çšãããšããã³ãã¬ãŒãã§domãªããžã§ã¯ããæ§ç¯ã§ããŸãã
ã°ã«ãŒãæçš¿ãã£ã«ã¿ãŒ
ã°ã«ãŒãããšã«ããŒã¿ãåºåããããã«ãç°¡åãªphpã¹ã¯ãªãããäœæãããŸããã
ããã¯ãæéãã£ã«ã¿ãŒã®çš®é¡ã«ãã£ãŠããªã¯ãšã¹ãã§çŽæ¥äœ¿çšã§ãããªããžã§ã¯ããäœæãããã«ããŒé¢æ°ã§ãã
function filterToTime($timeFilter) { $mongotime = null; if ($timeFilter == 'year') $mongotime = new Mongodate(strtotime("-1 year", time())); else if ($timeFilter == 'month') $mongotime = new Mongodate(strtotime("-1 month", time())); else if ($timeFilter == 'week') $mongotime = new Mongodate(strtotime("-1 week", time())); else if ($timeFilter == 'day') $mongotime = new Mongodate(strtotime("midnight")); else if ($timeFilter == 'hour') $mongotime = new Mongodate(strtotime("-1 hour")); return $mongotime; }
ãããŠã次ã®ã³ãŒãã¯ãä»æã®ãã¹ã15ã®æçš¿ãæ¢ã«åãåããŸãã
$groupId = 42; // - id $mongotime = filterToTime('week'); $offset = 1; // $findCondition = array('gid' => $groupId, 'created' => array('$gt' => $mongotime)); $mongoHandle->posts->find($findCondition)->limit(15)->skip($offset * $numPosts);
ããžãã¯ã€ã³ããã¯ã¹ããŒãž
ã°ã«ãŒãã®çµ±èšãèŠãã®ã¯é¢çœãã§ããã絶察ã«ãã¹ãŠã®ã°ã«ãŒããšãã®åºçç©ã®äžè¬çãªè©äŸ¡ãäœæããæ¹ãã¯ããã«èå³æ·±ãã§ãã ããªããããã«ã€ããŠèãããªãã°ãã¿ã¹ã¯ã¯éåžžã«é£ããã§ãïŒ
è©äŸ¡ã¯ã3ã€ã®èŠå ïŒãããïŒãåæçš¿ããµãã¹ã¯ã©ã€ããŒã®æ°ïŒã«ãã£ãŠã®ã¿äœæã§ããŸãã ãã£ã³ãã«ç»é²è ãå€ãã»ã©ããããïŒãšåæçš¿ãå¢ããŸãããããã¯ã³ã³ãã³ãã®å質ãä¿èšŒãããã®ã§ã¯ãããŸããã
ã»ãšãã©ã®åäžé·è ã°ã«ãŒãã¯å€ãã®å Žåãã€ã³ã¿ãŒããããæ°å¹ŽéãµãŒãã£ã³ããŠãããã¹ãŠã®ãŽããçºè¡ããŸãã
裞ã®æ°åã«åºã¥ããŠè©äŸ¡ãäœæããã®ã¯ç°¡åã§ããã決ããŠåŸãããçµæã¯ãåºçç©ã®å質ãšç¬èªæ§ã«ããè©äŸ¡ãšã¯èšããŸããã
åã°ã«ãŒãã®å質ä¿æ°ãå°ãåºãããã®ã¢ã€ãã¢ããããŸããïŒæéã¹ã±ãŒã«ãæ§ç¯ããåæéã®ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ãç£èŠããŸãã
æ®å¿µãªãããç§ã¯é©åãªè§£æ±ºçãæãã€ããŸããã§ããã äœãã¢ã€ãã¢ãããã°ãåãã§èããŸãã
ç§ãæåã«æ°ã¥ããã®ã¯ãã€ã³ããã¯ã¹ããŒãžã®ã³ã³ãã³ããèšç®ãããã¹ãŠã®ãŠãŒã¶ãŒã«å¯ŸããŠãã£ãã·ã¥ããå¿ èŠããããšããèªèã§ãããéåžžã«é ãæäœã ã£ãããã§ãã ãããmemcachedã®å©ããšãªããŸãã æãåçŽãªããžãã¯ã§ã¯ã次ã®ã¢ã«ãŽãªãºã ãéžæãããŸããã
- ãã¹ãŠã®ã°ã«ãŒãã埪ç°ããŸã
- içªç®ã®ã°ã«ãŒãã®ãã¹ãŠã®åºçç©ãååŸããæå®ãããæéã«æé©ãªãã®ã2ã€éžæããŸã
ãã®çµæã1ã€ã®ã°ã«ãŒãããã®åºçç©ã¯2ã€ãŸã§ã«ãªããŸãã ãã¡ãããããã¯æãæ£ç¢ºãªçµæã§ã¯ãããŸããããå®éã«ã¯ãè¯å¥œãªçµ±èšãšã³ã³ãã³ãã®é¢é£æ§ã瀺ããŠããŸãã
ã¹ããªãŒã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã15åããšã«ã€ã³ããã¯ã¹ããŒãžãçæãããŸãã
# timeDelta - (hour, day, week, year, alltime) # filterType - likes, reposts, comments # deep - 0, 1, ... () def _get(self, timeDelta, filterTime, filterType='likes', deep = 0): groupList = groups.find({}, {'_id' : 0}) allPosts = [] allGroups = [] for group in groupList: allGroups.append(group) postList = db['posts'].find({'gid' : group['id'], 'created' : {'$gt' : timeDelta}}) \ .sort(filterType, -1).skip(deep * 2).limit(2) for post in postList: allPosts.append(post) result = { 'posts' : allPosts[:50], 'groups' : allGroups } # timestamp mongotime, json dthandler = lambda obj: (time.mktime(obj.timetuple()) if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) else None) jsonResult = json.dumps(result, default=dthandler) key = 'index_' +filterTime+ '_' +filterType+ '_' + str(deep) print 'Setting key: ', print key self.memcacheHandle.set(key, jsonResult)
çºè¡ã«åœ±é¿ãããã£ã«ã¿ãŒã«ã€ããŠèª¬æããŸãã
æéïŒæéãæ¥ãé±ãæã幎ãåžžæ
ã¿ã€ãïŒããããåæçš¿ãã³ã¡ã³ã
ãã¹ãŠã®æç¹ã§ãªããžã§ã¯ããçæãããŸããã
hourAgo = datetime.datetime.now() - datetime.timedelta(hours=3) midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) weekAgo = datetime.datetime.now() - datetime.timedelta(weeks=1) monthAgo = datetime.datetime.now() + dateutil.relativedelta.relativedelta(months=-1) yearAgo = datetime.datetime.now() + dateutil.relativedelta.relativedelta(years=-1) alltimeAgo = datetime.datetime.now() + dateutil.relativedelta.relativedelta(years=-10)
ãããã¯ãã¹ãŠãã¿ã€ãïŒlikesãrepostsãcommentsïŒã«ããããŸããŸãªãã£ã«ã¿ãŒããªãšãŒã·ã§ã³ãšãšãã«_geté¢æ°ã«é çªã«æž¡ãããŸãã ããããã¹ãŠã«å ããŠããã£ã«ã¿ãŒããªãšãŒã·ã§ã³ããšã«5ããŒãžãçæããå¿ èŠããããŸãã ãã®çµæã次ã®ããŒãmemcachedã«ä»å ãããŸãã
èšå®ããŒïŒindex_hour_likes_0
èšå®ããŒïŒindex_hour_reposts_0
èšå®ããŒïŒindex_hour_comments_0
èšå®ããŒïŒindex_hour_common_0
èšå®ããŒïŒindex_hour_likes_1
èšå®ããŒïŒindex_hour_reposts_1
èšå®ããŒïŒindex_hour_comments_1
èšå®ããŒïŒindex_hour_common_1
èšå®ããŒïŒindex_hour_likes_2
èšå®ããŒïŒindex_hour_reposts_2
èšå®ããŒïŒindex_hour_comments_2
èšå®ããŒïŒindex_hour_common_2
èšå®ããŒïŒindex_hour_likes_3
èšå®ããŒïŒindex_hour_reposts_3
èšå®ããŒïŒindex_hour_comments_3
èšå®ããŒïŒindex_hour_common_3
èšå®ããŒïŒindex_hour_likes_4
èšå®ããŒïŒindex_hour_reposts_4
èšå®ããŒïŒindex_hour_comments_4
èšå®ããŒïŒindex_hour_common_4
èšå®ããŒïŒindex_day_likes_0
èšå®ããŒïŒindex_day_reposts_0
èšå®ããŒïŒindex_day_comments_0
èšå®ããŒïŒindex_day_common_0
èšå®ããŒïŒindex_day_likes_1
èšå®ããŒïŒindex_day_reposts_1
èšå®ããŒïŒindex_day_comments_1
èšå®ããŒïŒindex_day_common_1
èšå®ããŒïŒindex_day_likes_2
èšå®ããŒïŒindex_day_reposts_2
èšå®ããŒïŒindex_day_comments_2
èšå®ããŒïŒindex_day_common_2
èšå®ããŒïŒindex_day_likes_3
èšå®ããŒïŒindex_day_reposts_3
...
ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãç®çã®ããŒã®ã¿ãçæãããjsonæååãmemcachedããåãåºãããŸãã
次ã®èå³æ·±ãã¿ã¹ã¯ã¯ãCISè«žåœã§äººæ°ã®ãããã€ãŒããçæããããšã§ããã ãŸãããã®ã¿ã¹ã¯ã¯ç°¡åã§ã¯ãããŸãããé¢é£æ å ±ãåãåããããŽããã®æ å ±ã¯åãåããŸããã Twitterã®å¶éã«éåžžã«é©ããŸãããç¹å®ã®ãŠãŒã¶ãŒã®ãã¹ãŠã®ãã€ãŒããåã蟌ãã§ããŒãžããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã APIã¯ãªã¯ãšã¹ãã®æ°ãéåžžã«å¶éãããããVCã®ããã«ã¯ã§ããŸããã人æ°ã®ããã¢ã«ãŠã³ãã®ãªã¹ããäœæãããã€ãŒããåžžã«è§£æããŸãã
1æ¥åŸãTwitterã§ã¢ã«ãŠã³ããäœæããåºçãããã¯ãé¢å¿ã®ãããã¹ãŠã®éèŠãªäººã ã賌èªããŸãã ç§Theã¯ãã±ãŒã¹ã®ã»ãŒ80ïŒ ã§ããããã®äººã ã®1人ã人æ°ã®ãããã€ãŒãããªãã€ãŒãããããšã§ãã ã€ãŸã ããŒã¿ããŒã¹ã«ãã¹ãŠã®ã¢ã«ãŠã³ãã®ãªã¹ããä¿æããå¿ èŠã¯ãããŸãããåžžã«æµè¡ããŠãã500ã600人ã®ã¢ã¯ãã£ããªäººã ã®ããŒã¿ããŒã¹ãåéããæ¬åœã«èå³æ·±ã人æ°ã®ãããã€ãŒãããªãã€ãŒãããã°ååã§ãã
Twitter APIã«ã¯ããã©ããŒããŠãããŠãŒã¶ãŒã®ãã€ãŒããšãã®åæçš¿ãå«ããŠãŒã¶ãŒãã£ãŒããååŸã§ããã¡ãœããããããŸãã ä»å¿ èŠãªã®ã¯ãVKontakteã§è¡ãããã«ãããŒãã10åããšã«æ倧ãŸã§èªã¿åãããã€ãŒãããã£ã«ã¿ãŒããã®ä»ãã¹ãŠãä¿åããããšã§ãã
ãã®ãããå¥ã®ã¹ã¬ãããããŒã¢ã³å ã«æžã蟌ãŸãã10åã«1åãã®ãããªã³ãŒããå®è¡ãããŸããã
def __init__(self): self.twitter = Twython(APP_KEY, APP_SECRET, TOKEN, TOKEN_SECRET) def logic(self): lastTweetId = 0 for i in xrange(15): # self.getLimits() tweetList = [] if i == 0: tweetList = self.twitter.get_home_timeline(count=200) else: tweetList = self.twitter.get_home_timeline(count=200, max_id=lastTweetId) if len(tweetList) <= 1: print '1 tweet, breaking' # , API break # ... lastTweetId = tweetList[len(tweetList)-1]['id']
ããŠãéåžžã®éå±ãªã³ãŒãïŒtweetListããããåãã€ãŒããã«ãŒãããŠåŠçããŸãã å ¬åŒããã¥ã¡ã³ãã®ãã£ãŒã«ãã®ãªã¹ãã ç§ãéäžãããå¯äžã®ãã®ïŒ
for tweet in tweetList: localData = None if 'retweeted_status' in tweet: localData = tweet['retweeted_status'] else: localData = tweet
ãªãã€ãŒãã®å Žåã賌èªè ã®ãã€ãŒãã§ã¯ãªããå ã®ãã€ãŒããä¿åããå¿ èŠããããŸãã çŸåšã®ã¬ã³ãŒãããªãã€ãŒãã§ããå Žåãã㌠'retweeted_status'å ã«ã¯ãŸã£ããåããã€ãŒããªããžã§ã¯ããå«ãŸããå ã®ã¬ã³ãŒãã®ã¿ãå«ãŸããŸãã
ãã¡ã€ãã«
ãµã€ãã®èšèšãšã¬ã€ã¢ãŠãã«ã¯åé¡ããããŸãïŒç§èªèº«ã¯Webããã°ã©ããŒã§ã¯ãããŸããïŒãã誰ãã説æããæçãªæ å ±ãæã£ãŠããããšãé¡ã£ãŠããŸãã ç§èªèº«ã¯ã瀟äŒãµãŒãã¹ãšé·ãéä»äºãããŠããŸãã ãããã¯ãŒã¯ãšãã®APIããããŠç§ã¯å€ãã®ããªãã¯ãç¥ã£ãŠããŸãã 誰ã質åãããã°ãåãã§ãæäŒãããŸãã
ããŠãããã€ãã®åçïŒ
ã€ã³ããã¯ã¹ããŒãžïŒ
ç§ãåžžã«ç£èŠããŠããã°ã«ãŒãã®1ã€ã®ããŒãžïŒ
1æ¥ãããã®TwitterïŒ
ãæž èŽããããšãããããŸããã
-88.198.106.150