Xanthias
Опытный user
- Регистрация
- 3 Апр 2021
- Сообщения
- 770
- Реакции
- 61
Всем привет,
Недавно делал чекер YouTube по кукам и решил поделится с вами.
Возможно смогу сэкономить ваше время.
Может есть способы делать это лучше, я этого не выяснял.
-----------------------------------------------------------------------------------------------
Для свободного хождения по запросам нам понадобится:
__Secure-1PSID
__Secure-1PAPISID
CHANNEL_ID
API_KEY
SAPISIDHASH
-----------------------------------------------------------------------------------------------
Приступим
Ещё одна вариация кода, более простой способ
Код Python:
class ChannelInformation():
def __init__(self, title: str, channel_id: str, subscriberCount: int, videoCount: int,
totalVideoViewCount: int, country: str, joinedDateText: str, joinedDateYear: int, isMonetized: bool,
cookies: dict):
self.title = title
self.channel_id = channel_id
self.subscriberCount = subscriberCount
self.videoCount = videoCount
self.totalVideoViewCount = totalVideoViewCount
self.country = country
self.joinedDateText = joinedDateText
self.joinedDateYear = joinedDateYear
self.isMonetized = isMonetized
self.cookies = cookies
self.path = None
self.password = 0
def __repr__(self):
return f"{self.title} - {self.subscriberCount}"
def SetPath(self, path: str) -> str:
self.path = path
return self.path
def SetPassword(self):
self.password = 1
async def YouTubeChecker(COOKIES: dict) -> tuple:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
async with aiohttp.ClientSession() as session:
response = await session.get("https://studio.youtube.com/", headers=headers, cookies=COOKIES)
if response.status != 200:
return (False,)
response_text = await response.text()
if "CHANNEL_ID" in response_text:
channel_title = re.findall(r"title\":\"(.*?)\"", response_text)[0].strip()
channel_id = re.findall(r"CHANNEL_ID\":\"(.*?)\"", response_text)[0].strip()
channel_subscriberCount = int(re.findall(r"subscriberCount\":\"(.*?)\"", response_text)[0].strip())
channel_videoCount = int(re.findall(r"videoCount\":\"(.*?)\"", response_text)[0].strip())
channel_isMonetized = re.findall(r"isMonetized\"
.*?),", response_text)[1].strip()
channel_totalVideoViewCount = int(re.findall(r"totalVideoViewCount\":\"(.*?)\"", response_text)[0].strip())
channel_country = re.findall(r"featureCountry\":\"(.*?)\"", response_text)[0].strip()
response = await session.get(f"https://www.youtube.com/channel/{channel_id}/about", headers=headers,
cookies=COOKIES)
response_text = await response.text()
response_text = response_text[response_text.index("joinedDateText")::]
channel_joinedDateText = re.findall(r"text\":\"(.*?)\"", response_text)[1].strip()
channel_joinedDateYear = int(re.findall("\d\d\d\d", channel_joinedDateText)[0].strip())
return (True, ChannelInformation(channel_title, channel_id, channel_subscriberCount,
channel_videoCount, channel_totalVideoViewCount, channel_country,
channel_joinedDateText, channel_joinedDateYear, channel_isMonetized,
COOKIES))
return (False,)
__Secure-1PSID, __Secure-1PAPISID - Сами печеньки, достаются специальным расширением в браузере по типу EditThisCookie, или же они валяются у вас влогах =)
Хорошокуки у нас есть теперь приступим к коду.
Код Python:
import requests
class YouTube(object):
base_headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
def __init__(self, cookies: dict):
self.__CHANNEL_ID = None
self.__API_KEY = None
self.__SAPISIDHASH = None
self.cookies = cookies
self.session = requests.Session()
self.session.headers.update(self.base_headers)
self.load_cookies()
def load_cookies(self) -> None:
for key, value in self.cookies.items():
self.session.cookies.set(key, value)
Создаем класс, далее в конструкторе производим базовую настройку сессии с помощью которой будем отправлять запросы.
Метод load_cookies просто подгружаеткуки в сессию
Начинаем доставать нужны нам атрибуты, напишем ещё парочку методов.
Код Python:
import requests
import hashlib
import re
import time
class YouTube(object):
base_headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
origin = 'https://studio.youtube.com'
referer = f'{origin}/channel/0/monetization'
def __init__(self, cookies: dict):
self.__CHANNEL_ID = None
self.__API_KEY = None
self.__SAPISIDHASH = None
self.cookies = cookies
self.session = requests.Session()
self.session.headers.update(self.base_headers)
self.load_cookies()
def load_cookies(self) -> None:
for key, value in self.cookies.items():
self.session.cookies.set(key, value)
def set_data(self) -> None:
response = self.session.get(self.referer)
self.__CHANNEL_ID = re.findall(r"channelId\":\"(.*?)\"", response.text)[0].strip()
self.__API_KEY = re.findall(r"innertubeApiKey\":\"(.*?)\"", response.text)[0].strip()
hash_authorization = hashlib.sha1(' '.join([str(int(time.time())), self.cookies['__Secure-1PAPISID'], self.origin]).encode()).hexdigest()
self.__SAPISIDHASH = str(int(time.time())) + '_' + hash_authorization
@property
def get_channel_id(self) -> str:
return self.__CHANNEL_ID
@property
def get_api_key(self) -> str:
return self.__API_KEY
@property
def get_sapisidhash(self) -> str:
return self.__SAPISIDHASH
Метод set_data - Отправляет запрос, поскольку мы не знаем id канала, мы отправляем запрос на 0 id, что перенаправит нас на наш айди.
Тут мы уже сможем получить айди нашего канала, и апи ключ.
Для получения айди канала и апи ключа, используются регулярки для поиска данных.
С SAPISIDHASH немного сложнее, данная строка состоит из текущей временной метки, нашего кука __Secure-1PAPISID, и ссылки куда идет запрос, далее все это кодируется в SHA1, данный шифр служит для передачи данных авторизации при запросе.
get_channel_id, get_api_key, get_sapisidhash обычные геттеры, которые возвращают информацию.
-----------------------------------------------------------------------------------------------
Теперь мы собрали все необходимые данные для отправки POST запросов.
Для примера я возьму запрос на получение информации о монетизации.
Подготовим наши хедеры и параметры запроса. В параметрах указывается какую информацию мы хотим получить от сервера
Код Python:
headers = {
'authorization': f'SAPISIDHASH {self.__SAPISIDHASH}',
'origin': self.origin,
'referer': self.origin + f'/channel/{self.__CHANNEL_ID}/monetization',
}
params = {"context": {
"client": {"clientName": 62, "clientVersion": "1.20220518.02.00", "hl": "ru", "gl": "BY",
"experimentsToken": "",
"utcOffsetMinutes": 180, "screenWidthPoints": 1880, "screenHeightPoints": 374,
"screenPixelDensity": 1,
"screenDensityFloat": 1, "userInterfaceTheme": "USER_INTERFACE_THEME_DARK"}}, "channelIds": [self.__CHANNEL_ID],
"mask": {"features": {"all": False},
"channelUiCustomization": {"all": False},
"permissions": {"overallPermissions": False},
"channelId": True,
"monetizationStatus": True,
"monetizationDetails": {"all": True},
"contentOwnerAssociation": {"all": False},
"settings": {"coreSettings": {"featureCountry": False, "country": True},
"copyright": {"copyrightAgreementStatus": False}, "studio": {"all": True}},
"contracts": {"all": False},
"title": True,
"thumbnailDetails": {"all": False},
"isPartner": True,
"metric": {"all": False},
"timeCreatedSeconds": False,
"isMonetized": True,
"isOfficialArtistChannel": True,
"isNameVerified": True,
"sponsorships": {"all": False},
"selfCertification": {"all": False},
"channelVisibility": False,
"interstitials": {"all": False},
"monetizationStatusData": {"all": True}}}
После подготовки можем смело отправлять POST запрос.
По итогу вы получите JSON с всем данными, по примеру информации о монетизации, вы сможете получить любую информацию с творческой студии ютуба.
Итоговый код
Код Python:
import requests
import hashlib
import re
import time
class YouTube(object):
base_headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
origin = 'https://studio.youtube.com'
referer = f'{origin}/channel/0/monetization'
def __init__(self, cookies: dict):
self.__CHANNEL_ID = None
self.__API_KEY = None
self.__SAPISIDHASH = None
self.cookies = cookies
self.session = requests.Session()
self.session.headers.update(self.base_headers)
self.load_cookies()
def load_cookies(self) -> None:
for key, value in self.cookies.items():
self.session.cookies.set(key, value)
def set_data(self) -> None:
response = self.session.get(self.referer)
self.__CHANNEL_ID = re.findall(r"channelId\":\"(.*?)\"", response.text)[0].strip()
self.__API_KEY = re.findall(r"innertubeApiKey\":\"(.*?)\"", response.text)[0].strip()
hash_authorization = hashlib.sha1(
' '.join([str(int(time.time())), self.cookies['__Secure-1PAPISID'], self.origin]).encode()).hexdigest()
self.__SAPISIDHASH = str(int(time.time())) + '_' + hash_authorization
def get_data_of_monetization(self) -> dict:
headers = {
'authorization': f'SAPISIDHASH {self.__SAPISIDHASH}',
'origin': self.origin,
'referer': self.origin + f'/channel/{self.__CHANNEL_ID}/monetization',
}
params = {"context": {
"client": {"clientName": 62, "clientVersion": "1.20220518.02.00", "hl": "ru", "gl": "BY",
"experimentsToken": "",
"utcOffsetMinutes": 180, "screenWidthPoints": 1880, "screenHeightPoints": 374,
"screenPixelDensity": 1,
"screenDensityFloat": 1, "userInterfaceTheme": "USER_INTERFACE_THEME_DARK"}},
"channelIds": [self.__CHANNEL_ID],
"mask": {"features": {"all": False},
"channelUiCustomization": {"all": False},
"permissions": {"overallPermissions": False},
"channelId": True,
"monetizationStatus": True,
"monetizationDetails": {"all": True},
"contentOwnerAssociation": {"all": False},
"settings": {"coreSettings": {"featureCountry": False, "country": True},
"copyright": {"copyrightAgreementStatus": False}, "studio": {"all": True}},
"contracts": {"all": False},
"title": True,
"thumbnailDetails": {"all": False},
"isPartner": True,
"metric": {"all": False},
"timeCreatedSeconds": False,
"isMonetized": True,
"isOfficialArtistChannel": True,
"isNameVerified": True,
"sponsorships": {"all": False},
"selfCertification": {"all": False},
"channelVisibility": False,
"interstitials": {"all": False},
"monetizationStatusData": {"all": True}}}
response = self.session.post(
f'https://studio.youtube.com/youtubei/v1/creator/get_creator_channels?alt=json&key={self.__API_KEY}'
json=params, headers=headers)
return response.json()
@property
def get_channel_id(self) -> str:
return self.__CHANNEL_ID
@property
def get_api_key(self) -> str:
return self.__API_KEY
@property
def get_sapisidhash(self) -> str:
return self.__SAPISIDHASH
if __name__ == '__main__':
cookie = {'__Secure-1PSID': 'YOUR COOKIE',
'__Secure-1PAPISID': 'YOUR COOKIE'
}
client = YouTube(cookie)
client.set_data()
response = client.get_data_of_monetization()[/B]
-----------------------------------------------------------------------------------------------
На этом все, повторюсь что возможно есть способ легче или лучше, не берусь спорить.
Недавно делал чекер YouTube по кукам и решил поделится с вами.
Возможно смогу сэкономить ваше время.
Может есть способы делать это лучше, я этого не выяснял.
-----------------------------------------------------------------------------------------------
Для свободного хождения по запросам нам понадобится:
__Secure-1PSID
__Secure-1PAPISID
CHANNEL_ID
API_KEY
SAPISIDHASH
-----------------------------------------------------------------------------------------------
Приступим
Ещё одна вариация кода, более простой способ
Код Python:
class ChannelInformation():
def __init__(self, title: str, channel_id: str, subscriberCount: int, videoCount: int,
totalVideoViewCount: int, country: str, joinedDateText: str, joinedDateYear: int, isMonetized: bool,
cookies: dict):
self.title = title
self.channel_id = channel_id
self.subscriberCount = subscriberCount
self.videoCount = videoCount
self.totalVideoViewCount = totalVideoViewCount
self.country = country
self.joinedDateText = joinedDateText
self.joinedDateYear = joinedDateYear
self.isMonetized = isMonetized
self.cookies = cookies
self.path = None
self.password = 0
def __repr__(self):
return f"{self.title} - {self.subscriberCount}"
def SetPath(self, path: str) -> str:
self.path = path
return self.path
def SetPassword(self):
self.password = 1
async def YouTubeChecker(COOKIES: dict) -> tuple:
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
async with aiohttp.ClientSession() as session:
response = await session.get("https://studio.youtube.com/", headers=headers, cookies=COOKIES)
if response.status != 200:
return (False,)
response_text = await response.text()
if "CHANNEL_ID" in response_text:
channel_title = re.findall(r"title\":\"(.*?)\"", response_text)[0].strip()
channel_id = re.findall(r"CHANNEL_ID\":\"(.*?)\"", response_text)[0].strip()
channel_subscriberCount = int(re.findall(r"subscriberCount\":\"(.*?)\"", response_text)[0].strip())
channel_videoCount = int(re.findall(r"videoCount\":\"(.*?)\"", response_text)[0].strip())
channel_isMonetized = re.findall(r"isMonetized\"
channel_totalVideoViewCount = int(re.findall(r"totalVideoViewCount\":\"(.*?)\"", response_text)[0].strip())
channel_country = re.findall(r"featureCountry\":\"(.*?)\"", response_text)[0].strip()
response = await session.get(f"https://www.youtube.com/channel/{channel_id}/about", headers=headers,
cookies=COOKIES)
response_text = await response.text()
response_text = response_text[response_text.index("joinedDateText")::]
channel_joinedDateText = re.findall(r"text\":\"(.*?)\"", response_text)[1].strip()
channel_joinedDateYear = int(re.findall("\d\d\d\d", channel_joinedDateText)[0].strip())
return (True, ChannelInformation(channel_title, channel_id, channel_subscriberCount,
channel_videoCount, channel_totalVideoViewCount, channel_country,
channel_joinedDateText, channel_joinedDateYear, channel_isMonetized,
COOKIES))
return (False,)
__Secure-1PSID, __Secure-1PAPISID - Сами печеньки, достаются специальным расширением в браузере по типу EditThisCookie, или же они валяются у вас влогах =)
Хорошокуки у нас есть теперь приступим к коду.
Код Python:
import requests
class YouTube(object):
base_headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
def __init__(self, cookies: dict):
self.__CHANNEL_ID = None
self.__API_KEY = None
self.__SAPISIDHASH = None
self.cookies = cookies
self.session = requests.Session()
self.session.headers.update(self.base_headers)
self.load_cookies()
def load_cookies(self) -> None:
for key, value in self.cookies.items():
self.session.cookies.set(key, value)
Создаем класс, далее в конструкторе производим базовую настройку сессии с помощью которой будем отправлять запросы.
Метод load_cookies просто подгружаеткуки в сессию
Начинаем доставать нужны нам атрибуты, напишем ещё парочку методов.
Код Python:
import requests
import hashlib
import re
import time
class YouTube(object):
base_headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
origin = 'https://studio.youtube.com'
referer = f'{origin}/channel/0/monetization'
def __init__(self, cookies: dict):
self.__CHANNEL_ID = None
self.__API_KEY = None
self.__SAPISIDHASH = None
self.cookies = cookies
self.session = requests.Session()
self.session.headers.update(self.base_headers)
self.load_cookies()
def load_cookies(self) -> None:
for key, value in self.cookies.items():
self.session.cookies.set(key, value)
def set_data(self) -> None:
response = self.session.get(self.referer)
self.__CHANNEL_ID = re.findall(r"channelId\":\"(.*?)\"", response.text)[0].strip()
self.__API_KEY = re.findall(r"innertubeApiKey\":\"(.*?)\"", response.text)[0].strip()
hash_authorization = hashlib.sha1(' '.join([str(int(time.time())), self.cookies['__Secure-1PAPISID'], self.origin]).encode()).hexdigest()
self.__SAPISIDHASH = str(int(time.time())) + '_' + hash_authorization
@property
def get_channel_id(self) -> str:
return self.__CHANNEL_ID
@property
def get_api_key(self) -> str:
return self.__API_KEY
@property
def get_sapisidhash(self) -> str:
return self.__SAPISIDHASH
Метод set_data - Отправляет запрос, поскольку мы не знаем id канала, мы отправляем запрос на 0 id, что перенаправит нас на наш айди.
Тут мы уже сможем получить айди нашего канала, и апи ключ.
Для получения айди канала и апи ключа, используются регулярки для поиска данных.
С SAPISIDHASH немного сложнее, данная строка состоит из текущей временной метки, нашего кука __Secure-1PAPISID, и ссылки куда идет запрос, далее все это кодируется в SHA1, данный шифр служит для передачи данных авторизации при запросе.
get_channel_id, get_api_key, get_sapisidhash обычные геттеры, которые возвращают информацию.
-----------------------------------------------------------------------------------------------
Теперь мы собрали все необходимые данные для отправки POST запросов.
Для примера я возьму запрос на получение информации о монетизации.
Подготовим наши хедеры и параметры запроса. В параметрах указывается какую информацию мы хотим получить от сервера
Код Python:
headers = {
'authorization': f'SAPISIDHASH {self.__SAPISIDHASH}',
'origin': self.origin,
'referer': self.origin + f'/channel/{self.__CHANNEL_ID}/monetization',
}
params = {"context": {
"client": {"clientName": 62, "clientVersion": "1.20220518.02.00", "hl": "ru", "gl": "BY",
"experimentsToken": "",
"utcOffsetMinutes": 180, "screenWidthPoints": 1880, "screenHeightPoints": 374,
"screenPixelDensity": 1,
"screenDensityFloat": 1, "userInterfaceTheme": "USER_INTERFACE_THEME_DARK"}}, "channelIds": [self.__CHANNEL_ID],
"mask": {"features": {"all": False},
"channelUiCustomization": {"all": False},
"permissions": {"overallPermissions": False},
"channelId": True,
"monetizationStatus": True,
"monetizationDetails": {"all": True},
"contentOwnerAssociation": {"all": False},
"settings": {"coreSettings": {"featureCountry": False, "country": True},
"copyright": {"copyrightAgreementStatus": False}, "studio": {"all": True}},
"contracts": {"all": False},
"title": True,
"thumbnailDetails": {"all": False},
"isPartner": True,
"metric": {"all": False},
"timeCreatedSeconds": False,
"isMonetized": True,
"isOfficialArtistChannel": True,
"isNameVerified": True,
"sponsorships": {"all": False},
"selfCertification": {"all": False},
"channelVisibility": False,
"interstitials": {"all": False},
"monetizationStatusData": {"all": True}}}
После подготовки можем смело отправлять POST запрос.
По итогу вы получите JSON с всем данными, по примеру информации о монетизации, вы сможете получить любую информацию с творческой студии ютуба.
Итоговый код
Код Python:
import requests
import hashlib
import re
import time
class YouTube(object):
base_headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36',
}
origin = 'https://studio.youtube.com'
referer = f'{origin}/channel/0/monetization'
def __init__(self, cookies: dict):
self.__CHANNEL_ID = None
self.__API_KEY = None
self.__SAPISIDHASH = None
self.cookies = cookies
self.session = requests.Session()
self.session.headers.update(self.base_headers)
self.load_cookies()
def load_cookies(self) -> None:
for key, value in self.cookies.items():
self.session.cookies.set(key, value)
def set_data(self) -> None:
response = self.session.get(self.referer)
self.__CHANNEL_ID = re.findall(r"channelId\":\"(.*?)\"", response.text)[0].strip()
self.__API_KEY = re.findall(r"innertubeApiKey\":\"(.*?)\"", response.text)[0].strip()
hash_authorization = hashlib.sha1(
' '.join([str(int(time.time())), self.cookies['__Secure-1PAPISID'], self.origin]).encode()).hexdigest()
self.__SAPISIDHASH = str(int(time.time())) + '_' + hash_authorization
def get_data_of_monetization(self) -> dict:
headers = {
'authorization': f'SAPISIDHASH {self.__SAPISIDHASH}',
'origin': self.origin,
'referer': self.origin + f'/channel/{self.__CHANNEL_ID}/monetization',
}
params = {"context": {
"client": {"clientName": 62, "clientVersion": "1.20220518.02.00", "hl": "ru", "gl": "BY",
"experimentsToken": "",
"utcOffsetMinutes": 180, "screenWidthPoints": 1880, "screenHeightPoints": 374,
"screenPixelDensity": 1,
"screenDensityFloat": 1, "userInterfaceTheme": "USER_INTERFACE_THEME_DARK"}},
"channelIds": [self.__CHANNEL_ID],
"mask": {"features": {"all": False},
"channelUiCustomization": {"all": False},
"permissions": {"overallPermissions": False},
"channelId": True,
"monetizationStatus": True,
"monetizationDetails": {"all": True},
"contentOwnerAssociation": {"all": False},
"settings": {"coreSettings": {"featureCountry": False, "country": True},
"copyright": {"copyrightAgreementStatus": False}, "studio": {"all": True}},
"contracts": {"all": False},
"title": True,
"thumbnailDetails": {"all": False},
"isPartner": True,
"metric": {"all": False},
"timeCreatedSeconds": False,
"isMonetized": True,
"isOfficialArtistChannel": True,
"isNameVerified": True,
"sponsorships": {"all": False},
"selfCertification": {"all": False},
"channelVisibility": False,
"interstitials": {"all": False},
"monetizationStatusData": {"all": True}}}
response = self.session.post(
f'https://studio.youtube.com/youtubei/v1/creator/get_creator_channels?alt=json&key={self.__API_KEY}'
json=params, headers=headers)
return response.json()
@property
def get_channel_id(self) -> str:
return self.__CHANNEL_ID
@property
def get_api_key(self) -> str:
return self.__API_KEY
@property
def get_sapisidhash(self) -> str:
return self.__SAPISIDHASH
if __name__ == '__main__':
cookie = {'__Secure-1PSID': 'YOUR COOKIE',
'__Secure-1PAPISID': 'YOUR COOKIE'
}
client = YouTube(cookie)
client.set_data()
response = client.get_data_of_monetization()[/B]
-----------------------------------------------------------------------------------------------
На этом все, повторюсь что возможно есть способ легче или лучше, не берусь спорить.