import requests
import json
from urllib import parse
import time


# 要修改的房间数量eg:24,48,72
limit = '36'

now = str(int(time.time()))

#代理服务器
sock = 'http://127.0.0.1:7897'

proxy = {
    'http': sock,
    'https': sock,
}

# address的变量
a_url = 'https://api.pandalive.co.kr/v1/live/play'
#-------a24的账号---------
a_cookie = 'sessKey=c7403698-296d-477c-99bf-fcb61b1c140b; _gcl_au=1.1.1653065539.1783170076; _tt_enable_cookie=1; _ttp=01KWPKG4N71TWMRV8ABEREPYV6_.tt.2; userLoginYN=Y; userLoginSaveYN=Y; partner=winktv; cto_bundle=I0TNj19FVTR3b05Tb00zczRMTlBOVDVhVnpUaSUyRnpSZHVQUnB3bnlkbm9kYTRwU3NrZUZ2ZXNhUUJRZjBsckRya3laVW5ickNGWWpudHViRjUwbUtqOGR0cnlvUUNOSllTMHpBSkJSbmJjVDNtRTlVY0hvMGclMkIlMkJVRUh0bllwc21FQyUyQiUyRjQ; _ga_DB0PV23GCC=GS2.1.s1785914365$o26$g0$t1785914373$j52$l0$h0; userLoginIdx=10961682; userLoginSaveID=WVRJME5qQXlNell3TWpRPQ%3D%3D; cpSignature_79b0c6d4081955eb1c9b2417b9015e73b776b816f05c1f6e3cbf8c71c57259ee=FE55C80E0527511FA793A06C5F73558EA9DCA3C149D3711B52254794C09513BBAD54FCC8FF9505A76AA84133DFA2689A91916D52F2B39239809749FA29C2547F3B87C61A42C5EDA0445F5790F9D62072FC29258A0A13B9ECDCD80602392B763216DA6B660841B4876A52E69CAB6280567E552A8A00AD00403E70FE6AD9B5109B638A6523EAD80AC1FA9AF835F35823803D77E3D1DF23F66690A44D085B3AAF7714651B4B83D043F91ED894B7FFD15B51DC1F31BA289181477684A678AB23AB193319811208CDD084751C588824ADC98A6605D6B9BA356D560E2699742C188D6E; cpSignature_userLoginSaveID=1329D38D63736B079C2B7066DD810C7E7AC2B758A9CFC4404A1AEC66DD5B2CC4BBE030754E51267FEABA0AB8C82AB95EB170B4301A490D2BAE6CBC0529367838; cpSignature_userLoginSaveYN=1329D38D63736B079C2B7066DD810C7EAA172D86A51B9B774A584DDA088F34669FD1C39DCCD21B708F9D9EA280409C06; cpSignature_userLoginYN=1329D38D63736B079C2B7066DD810C7E25B9BA7233BF9DE7B74818ABD72DC0F5; 79b0c6d4081955eb1c9b2417b9015e73b776b816f05c1f6e3cbf8c71c57259ee=S%2BglPJ9Xf7Y2xRjZEaXOJQnSsBGcAeLh449noYivt5OnkuEufSljnThiwLE8CotgRuwgVPZSrFH7H1ITjs1UAn7%2F%2BLyTz7ScQ4K2IxTu6uXx4M4V%2Fxe4VfS08DkQLBco; _ga=GA1.1.49150585.1783170075; _ga_0J8HGTPY46=GS2.1.s1787215209$o49$g0$t1787215209$j60$l0$h0; _ga_ZJ51R4C39H=GS2.3.s1787215209$o50$g0$t1787215209$j60$l0$h0; _ga_W91XDLC3YE=GS2.1.s1787332887$o137$g1$t1787332888$j59$l0$h634796716; _ga_NGSHFJTQS1=GS2.1.s1787332887$o114$g1$t1787332888$j59$l0$h0; ttcsid=1787374167269::nPrXNgorXGD8_et7sHPq.193.1787374172072.0::1.14389.27685::4800.150.1586.125::486426.132.0; ttcsid_CPNT7B3C77U5K3OPINOG=1787374167272::UlWMvgyTG44DHzePhBj5.169.1787374172072.0; _ga_Z58JX68TPR=GS2.1.s1787374167$o167$g0$t1787374172$j55$l0$h1184109754'
a_headers = {
            "Accept": "application/json, text/plain, */*",
            "Accept-Encoding": "gzip, deflate, br, zstd",
            "Accept-Language": "en-US,en;q=0.9",
            "Content-Type": "application/x-www-form-urlencoded",
            "Cookie": a_cookie,
            "Origin": "https://www.pandalive.co.kr",
            "Referer": "https://www.pandalive.co.kr/",
            "sec-ch-ua": '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": '"macOS"',
            "sec-fetch-dest": "empty",
            "sec-fetch-mode": "cors",
            "sec-fetch-site": "same-site",
            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
            "x-device-info": '{"t":"webPc","v":"1.0","ui":17217562}',
}


def writeList(file_path, bj_list):
    with open(file_path, 'w') as f:
        json.dump(bj_list, f, indent=4)



#从bookmark获取正在直播bj
def getLiveList(now, proxy, limit):
    url = 'https://api.pandalive.co.kr/v1/live/bookmark'
    live_url = 'https://api.pandalive.co.kr/v1/live'
    # Bookmark需要传输的参数
    cookie = 'sessKey=c7403698-296d-477c-99bf-fcb61b1c140b; _gcl_au=1.1.1653065539.1783170076; _tt_enable_cookie=1; _ttp=01KWPKG4N71TWMRV8ABEREPYV6_.tt.2; userLoginYN=Y; userLoginSaveYN=Y; partner=winktv; cto_bundle=I0TNj19FVTR3b05Tb00zczRMTlBOVDVhVnpUaSUyRnpSZHVQUnB3bnlkbm9kYTRwU3NrZUZ2ZXNhUUJRZjBsckRya3laVW5ickNGWWpudHViRjUwbUtqOGR0cnlvUUNOSllTMHpBSkJSbmJjVDNtRTlVY0hvMGclMkIlMkJVRUh0bllwc21FQyUyQiUyRjQ; _ga_DB0PV23GCC=GS2.1.s1785914365$o26$g0$t1785914373$j52$l0$h0; userLoginIdx=10961682; userLoginSaveID=WVRJME5qQXlNell3TWpRPQ%3D%3D; cpSignature_79b0c6d4081955eb1c9b2417b9015e73b776b816f05c1f6e3cbf8c71c57259ee=FE55C80E0527511FA793A06C5F73558EA9DCA3C149D3711B52254794C09513BBAD54FCC8FF9505A76AA84133DFA2689A91916D52F2B39239809749FA29C2547F3B87C61A42C5EDA0445F5790F9D62072FC29258A0A13B9ECDCD80602392B763216DA6B660841B4876A52E69CAB6280567E552A8A00AD00403E70FE6AD9B5109B638A6523EAD80AC1FA9AF835F35823803D77E3D1DF23F66690A44D085B3AAF7714651B4B83D043F91ED894B7FFD15B51DC1F31BA289181477684A678AB23AB193319811208CDD084751C588824ADC98A6605D6B9BA356D560E2699742C188D6E; cpSignature_userLoginSaveID=1329D38D63736B079C2B7066DD810C7E7AC2B758A9CFC4404A1AEC66DD5B2CC4BBE030754E51267FEABA0AB8C82AB95EB170B4301A490D2BAE6CBC0529367838; cpSignature_userLoginSaveYN=1329D38D63736B079C2B7066DD810C7EAA172D86A51B9B774A584DDA088F34669FD1C39DCCD21B708F9D9EA280409C06; cpSignature_userLoginYN=1329D38D63736B079C2B7066DD810C7E25B9BA7233BF9DE7B74818ABD72DC0F5; 79b0c6d4081955eb1c9b2417b9015e73b776b816f05c1f6e3cbf8c71c57259ee=S%2BglPJ9Xf7Y2xRjZEaXOJQnSsBGcAeLh449noYivt5OnkuEufSljnThiwLE8CotgRuwgVPZSrFH7H1ITjs1UAn7%2F%2BLyTz7ScQ4K2IxTu6uXx4M4V%2Fxe4VfS08DkQLBco; _ga=GA1.1.49150585.1783170075; _ga_0J8HGTPY46=GS2.1.s1787215209$o49$g0$t1787215209$j60$l0$h0; _ga_ZJ51R4C39H=GS2.3.s1787215209$o50$g0$t1787215209$j60$l0$h0; _ga_W91XDLC3YE=GS2.1.s1787332887$o137$g1$t1787332888$j59$l0$h634796716; _ga_NGSHFJTQS1=GS2.1.s1787332887$o114$g1$t1787332888$j59$l0$h0; ttcsid=1787374167269::nPrXNgorXGD8_et7sHPq.193.1787374172072.0::1.14389.27685::4800.150.1586.125::486426.132.0; ttcsid_CPNT7B3C77U5K3OPINOG=1787374167272::UlWMvgyTG44DHzePhBj5.169.1787374172072.0; _ga_Z58JX68TPR=GS2.1.s1787374167$o167$g0$t1787374172$j55$l0$h1184109754'
    data = 'offset=0&limit=60&isLive=Y&width=280&height=158&imageResize=crop'
    data = parse.parse_qs(data)
    # Live需要传输的参数
    live_data = f'offset=0&limit={limit}&orderBy=user&onlyNewBj=N'
    live_data = parse.parse_qs(live_data)
    headers = {
        "accept": "application/json, text/plain, */*",
        "accept-language": "en-US,en;q=0.9",
        "content-type": "application/x-www-form-urlencoded",
        # "sec-ch-ua": "\"Chromium\";v=\"104\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"104\"",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-site",
        "x-device-info": "{\"t\":\"webPc\",\"v\":\"1.0\",\"ui\":17217562}",
        "cookie": cookie,
        "Referer": "https://www.pandalive.co.kr/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
        "Referrer-Policy": "strict-origin-when-cross-origin"
    }
    ###  -------返回的3个参数--------
    bj_set = set() #在线bjId
    fan_set = set() #粉丝房bjId
    live_set = set() #正在直播bjId
    try:
        # 先获取书签中正在直播的bj
        response = requests.post(url=url, headers=headers, data=data, proxies=proxy)
        if response.status_code == 200:
            content = response.json()
            for bookmark in content['list']:
                media = bookmark['media']
                #判断是否是直播
                if media['liveType'] == 'live':
                    #将正在直播的bjId添加到集合中
                    bj_set.add(media['userId'])
                    if 'fanLevel' in media:
                        fan_set.add(media['userId']) #将粉丝房bjId添加到集合中
                        bj_set = bj_set - fan_set
        else:
            print(response.status, 'Request Bookmark Error')
        # 再获取所有直播中靠前的bj
        live_response = requests.post(url=live_url, headers=headers, data=live_data, proxies=proxy)
        if live_response.status_code == 200:
            live_content = live_response.json()
            for media in live_content['list']:
                live_set.add(media['userId'])
        else:
            print('Request Live Error')
        # 求交集
        bj_set = bj_set & live_set
        return bj_set
    except:
        print('Unkonwn Error')
        return bj_set



def getAddress(name, url, headers, proxy):
    data = f'action=watch&userId={name}&password=&shareLinkType='
    data = parse.parse_qs(data)
    try:
        response = requests.post(url=url, headers=headers, data=data, proxies=proxy)
        if response.status_code == 200:
            content = response.json()
            address = content['PlayList']['hls'][0]['url']
            return address
        else:
            return ''
    except:
        return ''


def main():
    bj_list = {}
    bj_set = getLiveList(now, proxy, limit)
    for bj in bj_set:
        bj_list[bj] = {
                'address':  getAddress(bj, a_url, a_headers, proxy),
                'time':     time.strftime("%H:%M:%S", time.localtime())
            }
        time.sleep(0.5)
    writeList('/home/uftp/lazy_list.json', bj_list)


if __name__ == '__main__':
    main()
