Skip to content
taizan-hokuto edited this page May 4, 2020 · 82 revisions

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のコンストラクタ

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を設定してください。

Watcherのメンバ関数

start()

チャットの取得を開始します。
チャットデータはバックグラウンドで自動的に取得され、bufferに蓄積されます。

loop() : bool

チャットストリームが生きている場合、True
ストリームが終了した場合False。

get_chats()

チャットのリストをbufferから取り出します。

    w = Watcher(video_id)
    chats = w.get_chats()    #チャットリストの取得
    for chat in chats:       #チャットリスト(chats)から各チャット(chat)を列挙
        print(chat.message)  #chat のメンバにアクセス

block(author_id)

指定されたauthor_id のリスナーをブロックします。
戻り値:True:ブロック成功、False:ブロック失敗
※ブロックできるのは、監視中かつ、監視開始以降にその配信内でチャットを投稿したリスナーに限ります。

unblock(author_id)

指定されたauthor_idのリスナーのブロックを解除します。

詳細
実行中(配信中)の同一セッション内でブロックしたリスナーのみ解除可能です。
YouTubeアカウントの変更/ページリロード/pytblocklibの実行停止等によりセッションが途切れた場合、
unblock()関数でのブロック解除ができない場合があります。
戻り値:True:ブロック解除成功、False:ブロック解除失敗

手動解除の方法は、こちらを参照してください。

get_session()

戻り値の型:requests.Session
Watcherが現在使用しているSessionオブジェクトを取得します。

stop()

チャットの取得を停止します。

raise_for_status()

チャット取得時に発生した例外を発生させます。 以下の例外が状況に応じて発生します。

  • 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に従う限り、商用・非商用問わず利用可能です。
このライブラリを利用したプログラムの公開・配布にあたっては、 このライブラリの著作権表示、及び免責表示を含むライセンス表示を行う必要はありますが、
このライブラリを改変せずインポートする限り、このライブラリをインポートしているプログラムのソース自体を公開する必要はありません。