# coding:utf-8

from easy_spider_tool import cookie_to_dic, format_json
from easy_twitter_crawler import set_proxy, set_cookie, search_crawler, TwitterFilter

class TwitterKeywordCrawler:
    """Twitter关键词爬虫类，用于获取特定关键词的Twitter数据"""
    
    def __init__(self, proxy_host="127.0.0.1", proxy_port="10808"):
        """
        初始化Twitter爬虫

        Parameters:
        -----------
        proxy_host : str
            代理服务器地址
        proxy_port : str
            代理服务器端口
        """
        self.proxy = {
            'http': f'http://{proxy_host}:{proxy_port}',
            'https': f'http://{proxy_host}:{proxy_port}'
        }
        self.cookie = None
        self.twitter_filter = None

    def set_authentication(self, cookie):
        """
        设置Twitter认证信息

        Parameters:
        -----------
        cookie : str
            Twitter的cookie字符串
        """
        self.cookie = cookie
        set_proxy(self.proxy)
        set_cookie(cookie_to_dic(cookie))

    def configure_filter(self, key_word, lang='zh', from_user='', to_user='', at_user='',
                        only_replies=None, only_links=None, exclude_replies=None, 
                        exclude_links=None, min_replies='', min_faves='', 
                        min_retweets='', since='', until=''):
        """
        配置Twitter搜索过滤器

        Parameters:
        -----------
        key_word : str
            搜索关键词
        lang : str
            语言设置
        from_user : str
            来源用户
        to_user : str
            发送给指定用户
        at_user : str
            提及用户
        only_replies : bool
            是否只包含回复
        only_links : bool
            是否只包含链接
        exclude_replies : bool
            是否排除回复
        exclude_links : bool
            是否排除链接
        min_replies : str
            最小回复数
        min_faves : str
            最小点赞数
        min_retweets : str
            最小转发数
        since : str
            开始日期
        until : str
            结束日期
        """
        self.twitter_filter = TwitterFilter(key_word)
        self.twitter_filter.word_category(lang=lang)
        self.twitter_filter.account_category(filter_from=from_user, to=to_user, at=at_user)
        self.twitter_filter.filter_category(
            only_replies=only_replies,
            only_links=only_links,
            exclude_replies=exclude_replies,
            exclude_links=exclude_links
        )
        self.twitter_filter.interact_category(
            min_replies=min_replies,
            min_faves=min_faves,
            min_retweets=min_retweets
        )
        self.twitter_filter.date_category(since=since, until=until)

    def crawl(self, data_type='Latest', count=20):
        """
        执行爬取操作

        Parameters:
        -----------
        data_type : str
            数据类型，默认为'Latest'
        count : int
            爬取数量

        Returns:
        --------
        list
            爬取到的数据列表
        """
        if not self.twitter_filter or not self.cookie:
            raise ValueError("请先设置认证信息和过滤器")

        key_word = self.twitter_filter.filter_join()
        results = []

        for info in search_crawler(key_word, data_type=data_type, count=count):
            # 每次请求前重新设置代理和cookie
            set_proxy(self.proxy)
            set_cookie(cookie_to_dic(self.cookie))
            results.append(format_json(info))

        return results

def get_bloomberg_news(count=20):
    """
    获取彭博社新闻数据的快速方法

    Parameters:
    -----------
    count : int
        获取的新闻数量

    Returns:
    --------
    list
        彭博社新闻数据列表
    """
    # Twitter认证信息
    cookie = 'auth_token=ca95aaf4a95bdc3514d9ba26d7941089e5368ab7; ct0=d5f1bb1b10435f8b5e700c679fae30b40945952649f92bd0bd201fee750e6ca0828aad6ef01094beb22c6cc5363284c993ed7c660bab327f12f483b1ecb3627ff1194f5f0bf3b01fe51548075ab986ae'
    
    # 创建爬虫实例
    crawler = TwitterKeywordCrawler()
    
    # 设置认证信息
    crawler.set_authentication(cookie)
    
    # 配置过滤器
    crawler.configure_filter(key_word='彭博社', lang='zh')
    
    # 执行爬取
    return crawler.crawl(count=count)

if __name__ == "__main__":
    # 示例：获取彭博社新闻
    news_list = get_bloomberg_news(20)
    for news in news_list:
        print(news) 