Пример #1
0
def broadcastTopic(topicTitle):
    try:
        logger.debug(u'Start broadcast topic:%s' % topicTitle)
        topic = djangodb.Topic.objects.get(title=topicTitle)
        if topic.alive():
            topic_news = topic.news_set.all()[0]
        else:
            logger.warn(u'topic:%s is already dead, add unsubscribe task!' % topicTitle)
            djangodb.add_task(topic=topic, type=u'unsubscribe')
            return False
    except:
        logger.exception(u'topic or news may not exist in database')
        return False

    alreadyFetchedWeibos = topic.relevant_weibo.all()

    fetchedWeibos = weibo.getRelevantWeibo(topicTitle=topicTitle, count=50)['statuses']
    logger.info(u'feteched %d weibo about topic:%s' % (len(fetchedWeibos), topicTitle))
    for awb in fetchedWeibos:
        aweibo = djangodb.get_or_create_weibo(awb)
        if aweibo.comments_count < 200 and aweibo in alreadyFetchedWeibos:
            # 这条微薄已经推广过了,由于时间关系,后续的微薄理论上也应该推广过了
            continue
            break
        else:
            topic.relevant_weibo.add(aweibo)

        auser = djangodb.get_or_create_account_from_weibo(awb['user'])
        if aweibo.comments_count < 200 and auser in topic.watcher.all():
            # 该用户已经使用服务,不需要推广
            continue
        if aweibo.comments_count < 200 and len(auser.remind_history.strip()) > 0:
            # 已经推广过至少一次或正在使用服务
            continue

        topic.relevant_user.add(auser)
        # 评论推广
        _shorturl = weibo.getShortUrl(Conf.get_timeline_url(topic.id))
        reqInterval(10)
        msg = u'#%s# %s 『%s』 ^ ^' % (topicTitle, topic_news.title, _shorturl)

        try:
            weibo.postComment(weibo_id=aweibo.weibo_id, content=msg)
        except APIError, err:
            logger.warn(u'comment failed:\t%s' % (err.error))
            if err.error == u'target weibo does not exist!':
                topic.relevant_user.remove(auser)
                topic.relevant_weibo.remove(aweibo)
                aweibo.delete()
                logger.info(u'remove relevant user:%s and delete weibo:%s' % (auser, aweibo))
        except:
Пример #2
0
        logger.info(u"mention:%s" % mention)
        # step 1: 提取并构造微博对象
        mweibo = djangodb.get_or_create_weibo(mention)
        if "retweeted_status" in mention:
            is_retweeted = True
            mweibo_retweeted = djangodb.get_or_create_weibo(mention[u"retweeted_status"])
            # 过滤掉用户转发自己的微薄
            # TODO 如果用户转发自己微薄重新订阅,则需要再设计
            if mweibo_retweeted.user.weiboId == mweibo.user.weiboId:
                continue
        else:
            is_retweeted = False
        logger.info(u"weibo:%s\nis_retweeted:%s" % (mweibo, is_retweeted))

        # step 2: 提取并构造用户对象
        muser = djangodb.get_or_create_account_from_weibo(mention[u"user"])
        if muser.is_robot():
            logger.warn(u"robot user:%s" % muser)
            continue
        else:
            logger.info(u"step3: muser:%s" % muser)

        # step 3: 提取话题相关的信息
        mtopictitle = None
        _search_content = mweibo.text
        if is_retweeted:
            _search_content += " / %s" % mweibo_retweeted.text
        topic_res = re.search(u"#([^#]+)#", _search_content)
        if topic_res:
            # 只能订阅一个话题,第一个井号标识的话题
            mtopictitle = topic_res.group(1)