-
Notifications
You must be signed in to change notification settings - Fork 2
Home
pytblocklibはYouTubeのチャットにおけるブロック機能を提供するライブラリです。
(ブロック対象判定機能自体はpytblocklibには実装されておらず、各開発者の実装に委ねられます。)
- 指定した動画のチャットデータのリアルタイムバックグラウンド取得
- 特定ユーザのブロック及びブロック解除 (配信者/モデレータ権限でのブロック&リスナー側ブロック)
pip install --upgrade pytblocklib
- python 3.7.4以上
- macOS : Chrome v80以降, Firefox 75.0以降
- Windows 10 : Chrome v80以降, Firefox 75.0以降
- Linux : Ubuntu 18.02.4 LTS : Chrome v81, Firefox 66.03
- Chrome または FirefoxでYouTubeにチャットを投稿できる状態であること。
環境によっては、チャットの取得はできてもブロックできない場合があります。
Chromeの場合はconfig.iniのbrowserを「1」に、Firefoxの場合は「2」に書き換えてください。
あらかじめChromeかFirefoxブラウザから、チャットが投稿できるアカウントでYouTubeにログイン済みの状態である必要があります。
(任意のYouTubeアカウントでログイン済みで、cookieが作成されていれば、
ブラウザを立ち上げる必要はありません)
pytblocklibは、ログインしたユーザーの権限でブロックを行います。
コード中でWatcherオブジェクトをインポートします。
from pytblocklib import Watcher
Watcherオブジェクトは、チャットの取得、およびブロック設定・ブロック解除機能を提供します。
Watcher(video_id: str, seektime: int, interruptable: bool)
video_id : YouTubeの動画IDを指定します。
指定された動画がライブ動画の場合、リアルタイムでチャットを取得します。
指定された動画がアーカイブ動画の場合、アーカイブ済みのチャットデータを実時間で取得します。
その他のパラメータ
-
seektime(省略可) :
アーカイブ動画の取得開始時間[秒](指定されたvideo_idがライブ状態の場合、seektimeは無視されます) -
interruptable (省略可、既定値=True):
Trueの場合、Ctrl+C を押したときにチャット取得を停止し、loop()をFalseにします。
Falseの場合、何もしません。
内部的にはSIGINTを検知してチャット取得を停止します。
GUI等で別スレッドからWatcherを呼び出して操作する際に不具合が出る場合は、interruptable=Falseを設定してください。
チャットの取得を開始します。
チャットデータはバックグラウンドで自動的に取得され、bufferに蓄積されます。
チャットストリームが生きている場合、True
ストリームが終了した場合False。
チャットのリストをbufferから取り出します。
例
w = Watcher(video_id)
chats = w.get_chats() #チャットリストの取得
for chat in chats: #チャットリスト(chats)から各チャット(chat)を列挙
print(chat.message) #chat のメンバにアクセス
指定されたauthor_id のリスナーをブロックします。
戻り値:True:ブロック成功、False:ブロック失敗
※ブロックできるのは、監視中かつ、監視開始以降にその配信内でチャットを投稿したリスナーに限ります。
指定されたauthor_idのリスナーのブロックを解除します。
詳細
YouTubeアカウントの変更/ページリロード/pytblocklibの実行停止等によりセッションが途切れた場合、
unblock()関数でのブロック解除ができない場合があります。
戻り値:True:ブロック解除成功、False:ブロック解除失敗
手動解除の方法は、こちらを参照してください。
戻り値の型:requests.Session
Watcherが現在使用しているSessionオブジェクトを取得します。
チャットの取得を停止します。
チャット取得時に発生した例外を発生させます。 以下の例外が状況に応じて発生します。
- exceptions.ChatFinished
- exceptions.ChatNotFound
- exceptions.InvalidVideoID
- exceptions.OtherError
get_chatsによって得られたチャットリストの各要素は、下記の属性を参照可能です。
名前 | 型 | 内容 |
id | str | チャットの個別ID |
type | str | チャットの種類('text_message', 'super_chat', 'new_member') ※スーパーステッカーのtypeも'super_chat'になります。 |
message | str | チャットメッセージ。カスタム絵文字は ":(テキスト):"のように表示されます。 |
timestamp | int | チャット投稿時刻(unixタイムスタンプ、ミリ秒) |
datetime | str | チャット投稿日時 (例:"2019-10-10 12:34:56") |
elapsed | str | 経過時間 (例 "1:02:27") *リプレイモードのみ対応 |
author_id | str | チャット投稿者のチャンネルID |
author_name | str | チャット投稿者の名前 |
author_channel | str | 投稿者のユーザーチャンネルページのURL |
author_image | str | 投稿者のプロフィール画像URL |
author_badge | str | メンバーのバッジ画像URL |
is_verified | bool | 認証済みアカウント |
is_owner | bool | 動画の属するチャンネルの所有者(大抵の場合配信者) |
is_member | bool | メンバーシップ加入者(※type=='super_chat'の場合、メンバーか否かにかかわらずis_memberは常にFalseになります) |
is_moderator | bool | モデレータ |
message_ex | List[str] | メッセージおよびカスタム絵文字のリスト。カスタム絵文字は画像URLとして表示されます。 |
amount_string | str | スパチャ金額 |
bg_color | int | スパチャの背景色(ARGB) |
txt_color | int | スパチャのテキスト色(ARGB) |
'''
video_idに指定された動画のチャットを読み取り、
NGWORDSリスト内の語が含まれるチャット投稿を行ったリスナーをブロックする。
'''
from pytblocker import Watcher
import time
#Watcherインスタンスの生成
#http://www.youtube.com/watch?v=xxxxxx のv以降の11文字のIDを指定。
w = Watcher("xxxxxxxxx")
NG_WORDS = ['NG_WORD1','NG_WORD2']
blocklist = []
#チャット取得の開始
w.start()
#ライブ終了までループ
while w.loop():
#チャットデータのリストをバッファから取り出す。
chats = w.get_chats()
#チャットデータをスキャン
for chat in chats:
for ng_word in NG_WORDS:
if ng_word in chat.message:
print("Found :message-`{}` by {} ".format(chat.message, chat.author_name))
#ユーザーをブロックする。ブロックに成功した場合はTrue。
if w.block(chat.author_id)
blocklist.append(chat.author_id)
time.sleep(3)
#ライブ終了。
# チャット終了もしくは何らかのエラーでwhile ループを抜けた場合
try:
w.raise_for_status() #<-- whileループを抜けた後でこれを実行する。
except exceptions.ChatFinished: #ライブ終了等によりチャットデータが終わった場合
print("チャットが終了しました")
except exceptions.ChatNotFound: #チャットデータのない動画を指定した場合
print("チャットデータが見つかりません")
except exceptions.InvalidVideoID:
print("動画IDが不存在、または動画が非公開/削除されています")
except exceptions.OtherError:
print("エラー")
#ブロックしたユーザーのブロックを解除する例。
#ブロック解除可能なのは原則として「実行中に自動ブロックしたユーザー」だけです。
#セッションが途切れた場合、ブロック解除できない場合があります。
for author_id in blocklist:
w.unblock(author_id)
w.stop()
このライブラリは、LGPL-3.0ライセンスに準じます。
LGPL-3.0に従う限り、商用・非商用問わず利用可能です。
このライブラリを利用したプログラムの公開・配布にあたっては、 このライブラリの著作権表示、及び免責表示を含むライセンス表示を行う必要はありますが、
このライブラリを改変せずインポートする限り、このライブラリをインポートしているプログラムのソース自体を公開する必要はありません。