Ubuntuのデスクトップをニコニコ生放送で9割全自動配信してみるよ
この前の記事では、Viqoというソフトウェアを使って半自動のニコ生配信BOTを作成しましたが、今回は9割自動のニコ生配信BOTをPythonで書いてみたので、載せておこうと思います。主な使用技術はSeleniumです。
今回掲載するコードは限りなく最低限の機能だけを実装したものなので、まだ実用に耐えられる代物ではありません。そのため、ご利用時はご自身で適宜書き換えてください。書き換え、再配布は限りなく自由です。ですが、どのように書き換えたかを教えていただくと喜びます。
一応書いておきますが、こちらに掲載されている内容でどのような不利益を被っても責任は負い兼ねますので、ご了承ください。一応目を通して大丈夫そうでしたが、もしかしたらニコ生の利用規約とかに違反しているかもしれないです。
OS : Lubuntu16.04, MacOS Sierra
端末 : Compute Stick(Ubuntu版→Lubuntuに換装), MacBookAir
Python : 3.x系
Contents
1. 下準備
まずは前回と同じようにffmpegの準備を行います。基本的に以前のものと全く同じです。というわけで、以下のコマンドでちゃっちゃっとやっていきます。
1 |
$sudo apt-get install ffmpeg |
今回はChromeを操作することで、放送を行います。そのため、Chromeをインストールしておいてください。現在Headless機能が使えるディベロッパ版があるらしですが、今回は通常のChromeを使っていきます。こちらの公式ページから適宜ダウンロードとインストールをしておいてください。
次に、Python3(& pip)が動く環境(インストールできればなんでもいいですが)で、Seleniumをインストールしてください。インストールは以下のコマンドで行えます。 インストールが完了したら、こちらの配布ページからChrome用のドライバをダウンロードし、実行するコードと同じディレクトリ内に移動しておいてください。このドライバを入れるという作業はChromeを使う場合に限るようで、Firefoxを使う場合は必要ないらしいです(未検証)。
1 |
$sudo pip install selenium |
あとは、ニコニコ生放送が可能なプレミアアカウントとコミュニティを取得しておいてください。
2. 今回書いたコード
では本記事のメインである、コードを掲載します。本来ならGitHubなんかに載せるべきなのでしょうが、あまり好じゃないので個人的には使いません。というわけで、こちらにベタ書きしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
#coding : utf-8 import time import subprocess from datetime import datetime from selenium import webdriver MAILADRESS = 'メールアドレス' PASSWORD = 'パスワード' STREAM_TITLE = '放送タイトル' STREAM_DESCRIPTION = '放送説明文' STREAM_COMMUNITY = 'coXXXXXXX(放送コミュニティID)' STREAM_CATEOGRY = '一般(その他)' STREAM_TAGS = ['タグ1', 'タグ2', 'タグ3', 'タグ4'] def l(str): print("%s : %s"%(datetime.now().strftime("%Y/%m/%d %H:%M:%S"),str)) # ニコニコ動画へログイン def login_nicovideo(): try: b.find_elements_by_css_selector('li.siteHeaderLogin a')[0].click() l('login nicovideo') i = b.find_element_by_id('input__mailtel') i.send_keys(MAILADRESS) i = b.find_element_by_id('input__password') i.send_keys(PASSWORD) i.submit() except: l('logined nicovideo') # 放送情報の入力 def edit_stream(): l('edit stream infomation') b.find_elements_by_css_selector('a.recycle')[0].click() b.find_element_by_id('high-quality-enabled-selectable').click() b.find_element_by_name('title').send_keys(STREAM_TITLE) b.find_element_by_name('description').send_keys(STREAM_DESCRIPTION) b.find_elements_by_css_selector('option[value="%s"]'%STREAM_COMMUNITY)[0].click() b.find_elements_by_css_selector('option[value="%s"]'%STREAM_CATEOGRY)[0].click() for i, tag in enumerate(STREAM_TAGS): if i > 2: b.find_element_by_id('addlivetag').click() b.find_element_by_name('livetags%d'%(i+1)).send_keys(tag) b.find_element_by_id('option_close').click() b.find_element_by_id('community_only').click() b.find_element_by_id('timeshift_disabled').click() b.find_element_by_id('community_only').click() b.find_element_by_name('submit_ok').click() if __name__ == '__main__': try: # ブラウザの起動 b = webdriver.Chrome('./chromedriver') b.get('http://www.nicovideo.jp/') # ログイン処理 login_nicovideo() while True: # ニコ生ページの表示 b.get('http://live.nicovideo.jp/editstream') edit_stream() # 確認画面のパス time.sleep(5) b.find_element_by_name('kiyaku').click() b.find_element_by_id('submit_ok').click() # 放送画面 time.sleep(10) try: b.find_elements_by_css_selector('span.btn-dialog-close')[0].click() except: pass time.sleep(3) b.find_elements_by_css_selector('button.btn-tool-action')[0].click() time.sleep(3) try: b.find_elements_by_css_selector('button.btn-dialog.advance')[0].click() except: pass time.sleep(3) url = b.find_element_by_name('URL').getAttribute("value") stream = b.find_element_by_name('stream').getAttribute("value") b.find_elements_by_css_selector('button.btn-broadcast-start')[0].click() l('streamming start') cmd = 'ffmpeg -y -f x11grab -video_size 1280x720 -i :0.0+0,0 -framerate 25 -f flv "%s/%s"'%(url,stream) subprocess.call(cmd, shell=True) l('streamming finish') except: l('unknown error happened!!!!!!!!!!') b.quit() exit() finally: l('END') b.quit() |
コピペしたら、コード上部にあるconfig的な変数群にご自身の環境を入力してください。我ながらクソみたいな仕様ですが、気にしません。次の自動ニコ生記事である「Ubuntuのデスクトップをニコニコ生放送で全自動配信してみるよ(仮題)」ではちゃんと書き換えておきます。
おわりに
さて今回は、久しぶりにがっつりコードを載せる記事になりました。振り返ると、掲載するにはとてつもなく恥ずかしいコードでしたね。仕様はクソだし、例外処理を満足にできていない……。しかし、今回は、ニコ生自動化のテスト的な側面もあるので、目を背けます。
そもそも、なぜSleniumで画面を操作してニコ生するのかという話になるかと思います。……それはもちろん、自動的に画面が移り変わっていく様・フォームに文字が入力されていく様にロマンがあるからです。
以上。