PornHubの動画を自動配信するLINE BOT作ってみた

プログラミング

どうも、なおです。

今回は某動画サイト(P○rnHub)から自動でおすすめ動画を取得して、それを自分のLINEに送信するBOTを作ってみたの紹介&解説します。

おすすめ動画を取得する

まずはサイトからおすすめ動画を取得します。

①「おすすめ動画」というページがあるので、そこのURLにSeleniumでアクセスします。

from selenium import webdriver
from driver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://jp.pornhub.com/recommended')

②動画の構造を把握するためにchromeで[F12]を押して、HTML情報を確認します。

各動画のXPATH(HTMLファイルにおける場所を表すもの)はこのようになっています。

  1. /html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul/li[2]/div/div[5]/span/a
  2. /html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul/li[3]/div/div[5]/span/a
  3. /html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul/li[4]/div/div[5]/span/a

それぞれの違いは赤字の部分のみなので、for文を使えば順番にすべての動画を取得できますね。

for n in range(20):
 n += 2
 xpath = f"/html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul/li[{ n }]/div/div[5]/span/a"

③動画のタイトルとURLを取得します。

video_title = []
video_url = []

for n in range(20):
 n += 2
 #xpath作成
 xpath = f"/html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul/li[{ n }]/div/div[5]/span/a"
 video = driver.find_element_by_xpath(xpath)
 #動画タイトルをリストに追加
 video_title.append(video.txt)
 #動画URLをリストに追加
 video_url.append(video.get_attribute('href'))

これでvideo_titleとvideo_urlに各動画のタイトルとURLが順番に格納されました。

ランダムに動画を選ぶ

おすすめの動画を20本取得することができたので、次はこの中からランダムに1本選びましょう。

もし上位の動画を選んでしまうと、毎日同じ動画になってしまう可能性があります。

①動画のタイトルとURLを辞書形式に変換する

後のために先程取得した各動画のタイトルとURLのリストをつなぎ合わせて辞書形式にします。

video_dict = dict(zip(video_title, video_url))

②標準ライブラリのランダムを使って、ランダムに動画のタイトルとURLを選びます。(標準ライブラリはインストールする必要がありません)

import random

random_title = random.choice(video_title)
random_url = video_dict[random_title]

動画のタイトルはリストから選び、それに対応するURLを先程作成した辞書から取得します。これでランダムに選ばれた動画のタイトル(random_title)とURL(random_url)を準備できました。

タイトルを日本語訳する

おすすめ動画のタイトルは外国語がほとんどなので、素の動画タイトルを取得しても読めない可能性が高いです。

なので動画タイトルを日本語訳します。

日本語訳にはDeepLという翻訳ツールを使います。DeepLは有名なGoogle翻訳よりも正確な翻訳ができる優れものです。このDeepLはAPIもありますが、今回はスクレイピングで翻訳作業を自動化します。

from time import sleep

driver.get('https://www.deepl.com/ja/translator')
#翻訳する文章を入力
driver.find_element_by_xpath('/html/body/div[3]/main/div[3]/div[3]/section[1]/div[3]/div[2]/textarea').send_keys(random_title)
#変換に少し時間がかかるので待機
sleep(10)
#変換された文章を取得
output_word = driver.find_element_by_xpath('/html/body/div[3]/main/div[3]/div[3]/section[2]/div[3]/div[1]/textarea').get_attribute('value')

変換された文章はtextareaの初期値として表示されるため、タグのvalueから取得する必要があります

  • <textarea>入力部分(翻訳したい文章)</textarea>
  • <textarea value=”初期値(翻訳後の文章)”> </textarea>

ちなみにinputとtextareaの違いは文章の長さ、inputは短文(1行)・textareaは長文(複数行)。

LINE Notifyに登録する

次にLINE Notifyに登録して自分のLINEにPythonからメッセージを送信できるようにします。

公式サイトを見る

LINE Notifyの登録・トークンの発行は次の通り進めてください。

①[ログイン]を押す
②LINEに登録しているメールアドレス・パスワードを入力してログイン
③スマホでLINEを開いて表示されている数字を入力
④[マイページ]に押す
⑤[トークンを発行する]を押して、トークン名を入力。[1:1でLINE Notifyから通知を受け取る]を選択して、[発行する]を押す
発行されたトークンをメモしておき[閉じる]を押す
⑦[LINE Notify API Document]を押す
⑧[通知系]のURLをメモしておく

トークンとはLINE Notifyを使うための認証コードのようなもので、LINE Notify以外のサービス(API)などにもトークンはあります。

LINEに動画を送信する

最後にランダムで取得した動画のタイトル・日本語訳したタイトル・URLをLINEに送信するコードを書きます。

import requests

send_contents = f"【--今日のおすすめ動画--】\r\n\r\n 「{output_word}」\r\n\r\n({random_title})\r\n\r\n {random_url}"
TOKEN = '発行したトークン'
API_URL = 'https://notify-api.line.me/api/notify'

TOKEN_DICT = {'Authorization':'Bearer'+''+TOKEN}
send_dict = {'message':send_contents}

requests.post(API_URL, headers=TOKEN_DICT, data=send_dict)

送りたいメッセージをsend_contentsに代入します。空白を空ける場合Windowsは「\r\n」、Macは「\r」と入力します。

TOKENには先程発行したトークンを代入します。API_URLは固定なのでコピペでOKです。

TOKEN_DICTとsend_dictにはLINE Notifyに必要な情報を入れます。

最後にrequestsでデータを送信します。

成功すれば自分のLINEにLINE Notifyというアカウントからメッセージが届きます。失敗した場合エラー文を読み誤字脱字などを確認しましょう。

最後に

今回は某動画サイトのおすすめ動画を自動で取得し、LINE Notifyで取得したデータを送信するプログラムを作成してみました。

こちらがコード全体です。

#ライブラリのインポート
from seleniu import webdriver
import random
from time import sleep
from driver_manager.chrome import ChromeDriverManager

#webdriverの設定
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://jp.pornhub.com/recommended")

#動画タイトルとURLのリスト
videos_title = []
videos_url = []

#20個の動画データを取得する
for n in range(20):
 n+=2
 xpath = f"/html/body/div[3]/div[2]/div[3]/div[1]/div[3]/ul/li[{n}]/div/div[5]/span/a"
 video = driver.find_element_by_xpath(value=xpath)
 #動画タイトルをリストに追加
 videos_title.append(video.text)
 #動画URLをリストに追加
 videos_url.append(video.get_attribute("href"))

#動画タイトルとURLのリストを辞書に変換
video_dict = dict(zip(videos_title,videos_url))
random_title = random.choice(videos_title)
random_url = video_dict[random_title]
driver.quit()

#タイトルの翻訳処理
driver.get('https://www.deepl.com/ja/translator')
driver.find_element_by_xpath("/html/body/div[3]/main/div[3]/div[3]/section[1]/div[3]/div[2]/textarea").send_keys(random_title)
sleep(10)
output_word = driver.find_element_by_xpath("/html/body/div[3]/main/div[3]/div[3]/section[2]/div[3]/div[1]/textarea").get_attribute("value")

#送信するメッセージの作成
send_contents = f"【--今日のおすすめ動画--】\r\n\r\n 「{output_word}」\r\n\r\n({random_title})\r\n\r\n {random_url}"
TOKEN = '発行したトークン'
API_URL = 'https://notify-api.line.me/api/notify'

TOKEN_DICT = {'Authorization':'Bearer'+''+TOKEN}
send_dict = {'message':send_contents}

requests.post(API_URL, headers=TOKEN_DICT, data=send_dict)

このままだと毎回自分が実行しないといけないので、次はサーバにデプロイして毎日指定された時間にコードが実行されるようにします。

続きはこちら

それでは、また!

【なおくんのSNS】

【note】

noteでもスマホやパソコンなどの記事を書いていますので、ぜひご覧ください。あとフォローもお願いします。

【案件の依頼やお問い合わせはこちら】

    プログラミング
    naokunをフォローする
    なおコンサルティング
    タイトルとURLをコピーしました