def reposts2tree(source_weibo, reposts, per_page, page_count): # root tree_nodes = [] tree_stats = {} node = source_weibo['user']['name'] extra_infos = { 'location': source_weibo['user']['location'], 'datetime': source_weibo['created_at'], 'wid': source_weibo['id'], 'img_url': source_weibo['user']['profile_image_url'], 'weibo_url': base62.weiboinfo2url(source_weibo['user']['id'], source_weibo['mid']) } tree_nodes.append(Tree(node, extra_infos)) created_at = source_weibo['created_at'] created_at = datetime.datetime.strptime(created_at, '%a %b %d %H:%M:%S +0800 %Y') tree_stats['spread_begin'] = created_at tree_stats['spread_end'] = created_at tree_stats['reposts_count'] = source_weibo['reposts_count'] tree_stats['repost_peoples'] = set([source_weibo['user']['id']]) # sort reposts reposts = sorted(reposts, key=lambda x: x['id']) reposts = reposts[: per_page * page_count] # genarate tree for repost in reposts: node = repost['user']['name'] extra_infos = { 'location': repost['user']['location'], 'datetime': repost['created_at'], 'wid': repost['id'], 'img_url': repost['user']['profile_image_url'], 'weibo_url': base62.weiboinfo2url(repost['user']['id'], repost['mid']) } tree_nodes.append(Tree(node, extra_infos)) repost_users = re.findall(u'/@([a-zA-Z-_\u0391-\uFFE5]+)', repost['text']) parent_idx = 0 while parent_idx < len(repost_users): flag = False for node in tree_nodes[-2::-1]: if node.node == repost_users[parent_idx]: node.append_child(tree_nodes[-1]) flag = True break if flag: break parent_idx += 1 else: tree_nodes[0].append_child(tree_nodes[-1]) created_at = repost['created_at'] created_at = datetime.datetime.strptime(created_at, '%a %b %d %H:%M:%S +0800 %Y') if created_at > tree_stats['spread_end']: tree_stats['spread_end'] = created_at tree_stats['repost_peoples'].add(repost['user']['id']) tree_stats['repost_people_count'] = len(tree_stats['repost_peoples']) del tree_stats['repost_peoples'] return tree_nodes, tree_stats
def weibos_by_uid_and_page(uid, page=1): user = login_user(session) q = request.args.get('q', '') q = q.strip('@ \r\n\t') auto_redirect = request.args.get('auto_redirect') if auto_redirect: auto_redirect = int(auto_redirect) target_user = mongo.db.all_visited_users.find_one({'id': uid}) tar_screen_name = target_user['screen_name'] tar_profile_image_url = target_user['profile_image_url'] tar_location = target_user['location'] if q and auto_redirect and auto_redirect > 3: statuses = [] else: try: client = get_client(user['access_token'], user['expires_in']) statuses = client.get('statuses/user_timeline', uid=uid, count=50, page=page)['statuses'] items = [] for status in statuses: items.extend(resp2item_v2(status)) items2mongo(items) if q: temp_statuses = [] for status in statuses: if ('text' in status and q in status['text']) or ('retweeted_status' in status and q in status['retweeted_status']['text']): temp_statuses.append(status) statuses = temp_statuses if statuses == []: page += 1 if auto_redirect: auto_redirect += 1 else: auto_redirect = 1 return redirect(url_for('search.weibos_by_uid_and_page', uid=uid, page=page) + '?q=%s&auto_redirect=%s' % (q, auto_redirect)) except RuntimeError: flash(u'获取微博信息失败,请刷新') statuses = [] if statuses == []: flash(u'没有搜索到相关微博,请尝试下一页或者采用其他关键词') for i in xrange(len(statuses)): weibo_url = base62.weiboinfo2url(statuses[i]['user']['id'], statuses[i]['mid']) statuses[i]['weibo_url'] = weibo_url screen_name = session['screen_name'] profile_image_url = session['profile_image_url'] has_prev = True if page > 1 else False has_next = True # 默认始终有下一页 page_url = lambda page: url_for('search.weibos_by_uid_and_page', uid=uid, page=page) return render_template('weibolist.html', btnuserpicvisible='inline', btnloginvisible='none', screen_name=screen_name, profile_image_url=profile_image_url, tar_screen_name=tar_screen_name, tar_profile_image_url=tar_profile_image_url, tar_location=tar_location, statuses=statuses, page=page, has_prev=has_prev, has_next=has_next, page_url=page_url )