pytchat ======= pytchat is a python library for fetching youtube live chat. ## Description pytchat is a python library for fetching youtube live chat without using youtube api, Selenium or BeautifulSoup. Other features: + Customizable chat data processors including youtube api compatible one. + Available on asyncio context. + Quick fetching of initial chat data by generating continuation params instead of web scraping. For more detailed information, see [wiki](https://github.com/taizan-hokuto/pytchat/wiki). ## Install ```python pip install pytchat ``` ## Demo ![demo](https://taizan-hokuto.github.io/statics/demo.gif "demo") ## Examples ### on-demand mode ```python from pytchat import LiveChat chat = LiveChat("rsHWP7IjMiw") while chat.is_alive(): data = chat.get() for c in data.items: print(f"{c.datetime} [{c.author.name}]-{c.message} {c.amountString}") data.tick() ``` ### callback mode ```python from pytchat import LiveChat import time #callback function is automatically called. def display(data): for c in data.items: print(f"{c.datetime} [{c.author.name}]-{c.message} {c.amountString}") data.tick() #entry point chat = LiveChat("rsHWP7IjMiw", callback = display) while chat.is_alive(): time.sleep(3) #other background operation. ``` ### asyncio context: ```python from pytchat import LiveChatAsync from concurrent.futures import CancelledError import asyncio async def main(): chat = LiveChatAsync("rsHWP7IjMiw", callback = func) while chat.is_alive(): await asyncio.sleep(3) #other background operation. #callback function is automatically called. async def func(data): for c in data.items: print(f"{c.datetime} [{c.author.name}]-{c.message} {c.amountString}") await data.tick_async() try: loop = asyncio.get_event_loop() loop.run_until_complete(main()) except CancelledError: pass ``` ### youtube api compatible processor: ```python from pytchat import LiveChat, CompatibleProcessor import time chat = LiveChat("rsHWP7IjMiw", processor = CompatibleProcessor() ) while chat.is_alive(): data = chat.get() polling = data['pollingIntervalMillis']/1000 for c in data['items']: if c.get('snippet'): print(f"[{c['authorDetails']['displayName']}]" f"-{c['snippet']['displayMessage']}") time.sleep(polling/len(data['items'])) ``` ### replay: ```python from pytchat import ReplayChat def main(): #seektime (seconds): start position of chat. chat = ReplayChat("ojes5ULOqhc", seektime = 60*30) while chat.is_alive(): data = chat.get() for c in data.items: print(f"{c.elapsedTime} [{c.author.name}]-{c.message} {c.amountString}") data.tick() main() ``` ## Structure of Default Processor Each item can be got with items() function.
name type remarks
type str "superChat","textMessage","superSticker","newSponsor"
id str
message str emojis are represented by ":(shortcut text):"
messageEx str list of message texts and emoji URLs.
timestamp int unixtime milliseconds
datetime str e.g. "2019-10-10 12:34:56"
elapsedTime str elapsed time. (e.g. "1:02:27") *Replay Only.
amountValue float e.g. 1,234.0
amountString str e.g. "$ 1,234"
currency str ISO 4217 currency codes (e.g. "USD")
bgColor int RGB Int
author object see below
Structure of author object.
name type remarks
name str
channelId str *chatter's channel ID.
channelUrl str
imageUrl str
badgeUrl str
isVerified bool
isChatOwner bool
isChatSponsor bool
isChatModerator bool
## Licence [![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE) ## Author [taizan-hokuto](https://github.com/taizan-hokuto) [twitter:@taizan205](https://twitter.com/taizan205)