[파이썬] 유튜브의 노래와 영상을 라인에서 지우고 싶은 2/3.

개요


[파이썬] 유튜브의 노래와 영상을 라인에서 3분의 1을 삭제하고 싶어요.
[파이썬] 유튜브의 노래와 영상을 라인에서 지우고 싶은 2/3.
[파이썬] 유튜브의 노래와 영상을 라인에서 삭제하고 싶은 3/3.
・에 업로드됨Github.
기타
다중 프로세스 + 비차단 처리

LINE에 대한 답변, Google Drive에 업로드하는 부분 제작


저번 유튜브, soundcloud,niconico 애니메이션에 대응하는 다운로드 프로그램을 제작했다.
이번에는 유튜브-dl을 이용해 실제 라인에 답장하거나 Google Drive에 올리는 부분을 제작한다.
먼저 시작하기 전에 Google Drive에 업로드할 수 있는지 확인하십시오.

Google Drive에 올릴 수 있는지 확인하기 (단계는 대략 3개)


① 구글 드라이브로 공유 폴더를 만든다.
GoogleDrive → 새 폴더 → 이름 입력 → 이름 폴더 오른쪽 클릭 →
공유 가능한 링크 가져오기 → '제한 있음' → 링크를 아는 모든 사람으로 바꾸기.
※ 이곳을 바꾸지 않으면 라인에서 직접 음악을 들을 수 없습니다.
(LINE 서버에 데이터가 저장되지 않았기 때문에 Google Drive의 음악을 스트리밍으로 가져올 뿐입니다.)
② 공유 폴더의 폴더 ID를 확인합니다.
폴더가 완료되면 폴더 열기→URL 확인→https://drive.google.com/drive/folders/
다음 임의 문자열은 폴더 ID입니다.
③ GoogleDrive에 업로드되는 일부 테스트 프로그램 제작 및 확인
저번에 만든 유튜브.py와 같은 디렉터리에서 작업합니다.
・clientid 및 client시크릿, GoogleDrive API를 유효하게 만들어야 합니다.참고 자료
ID.PNG
※ [JSON 다운로드]도 실시, 이름을'client secret.json'으로 변경하여 $HOME/LINE에 설치.

우선 세팅스.yaml 파일 만들기


cd $HOME/line
vim settings.yaml
settings.yaml
client_config_backend: settings
client_config:
  client_id: "ここにGoogleClientID"
  client_secret: "ここにSecretID"

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True

oauth_scope:
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

이어서 YouTube-dl로 Google Drive에 올릴 때까지 프로그램을 사용하세요.


vim upload.py
upload.py
#!/bin/env python
import youtube
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

# ダウンロードディレクトリ
dl_dir = "youtube/"
#GoogleFolderID
folder_id = 'フォルダーID'
#GoogleDrive認証設定
gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)

message = "/mp3 GoogleDriveへアップロードしたいyoutubeの曲"
url = message.split()[1]
transaction = message.split()[0]

file_name = youtube.main(transaction,url,dl_dir)

for i in range(len(file_name)):
    f = drive.CreateFile({'title': file_name[i],
        'mimeType': 'audio/mpeg',
        'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
    f.SetContentFile(dl_dir + f['title'])

    #UploadGoogleDrive
    f.Upload()
이 정도면 업로드를 실행할 수 있는지 확인하세요.
$ chmod +x upload.py
$ ./upload.py
순조롭게 업로드한 뒤 라인 봇 앱을 제작한다.

LINE BOT 응용 프로그램 만들기


로그인 환경 변수


//未登録であることを確認
export -p
//登録を実施
echo 'export LINE_CHANNEL_ACCESS_TOKEN="ここにアクセストークン"' >> ~/.bash_profile
echo 'export LINE_CHANNEL_SECRET="ここにチャンネルシークレット"' >> ~/.bash_profile
source ~/.bash_profile
//登録されていることを確認
export -p
애플리케이션 생성
vim app.py
app.py
#!/bin/env python
import os
import re
import youtube
import math
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import (
   MessageEvent, TextMessage, TextSendMessage,
   AudioSendMessage
)
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from mutagen.mp3 import MP3

# アプリケーションフレームワーク
app = Flask(__name__)
#LINE Channel Secret
LINE_CHANNEL_SECRET = os.environ['LINE_CHANNEL_SECRET']
#LINE Access Token
LINE_CHANNEL_ACCESS_TOKEN = os.environ['LINE_CHANNEL_ACCESS_TOKEN']

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

# DownloadDirectory
dl_dir = "youtube/"
os.makedirs(dl_dir, exist_ok=True)

# GoogleDriveAuthSettings
gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)

#GoogleFolderShareID
folder_id = 'GoogleDriveの共有フォルダーIDを記入'

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'

# Message
def messagebox(event,transaction,url):
    transaction_dict = {
        '/mp3':'曲',
        '/mov':'本の動画',
        '/nomov':'本の動画'
    }
    set_transaction = transaction_dict.get(transaction)
    if "&list=" in url:
        line_bot_api.reply_message(event.reply_token,
                TextSendMessage(text="プレイリストの" + set_transaction
                    + "をGoogleDriveにアップロードします。\n"
                    + "処理に時間が掛かる場合があります。"))
    elif "nicovideo" in url:
        line_bot_api.reply_message(event.reply_token,
                TextSendMessage(text="ニコニコ動画は処理に時間が掛かる場合があります。"))
    else:
        line_bot_api.reply_message(event.reply_token,
                TextSendMessage(text="1" + set_transaction  + "をGoogleDriveにアップロードします。"))

# Music
def music(get_id,file_name):
    for i in range(len(file_name)):
        f = drive.CreateFile({'title': file_name[i],
                      'mimeType': 'audio/mpeg',
                      'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
        f.SetContentFile(dl_dir + f['title'])

        #UploadGoogleDrive
        f.Upload()

        file_id = drive.ListFile({'q': 'title =\"' + file_name[i] +  '\"'}).GetList()[0]['id']

        if len(file_name) == 1 :
            file_length = MP3(dl_dir + file_name[i]).info.length
            link = "https://drive.google.com/uc?export=view&id=" + file_id
            dur = math.floor(file_length * 1000)
            line_bot_api.push_message(get_id,messages=(
                        TextSendMessage(text=file_name[i]),
                        AudioSendMessage(original_content_url=link,duration=dur)))

            line_bot_api.push_message(get_id,messages=(TextSendMessage(text=link)))
            os.remove(dl_dir + file_name[i])
            break

        os.remove(dl_dir + file_name[i])

    else:
        line_bot_api.push_message(get_id,messages=(
            TextSendMessage(text=str(len(file_name))
                + "曲をGoogleDriveにアップロードしました。\n"
                + "https://drive.google.com/drive/folders/" + folder_id)))
# Video
def video(get_id,file_name):
    video_ext_dicts = {
        '.mp4':'video/mp4',
        '.webm':'video/webm',
        '.mkv':'video/x-matroska'
    }
    for i in range(len(file_name)):
        root, ext = os.path.splitext(file_name[i])
        mimeType = video_ext_dicts.get(ext)

        f = drive.CreateFile({'title': file_name[i],
                      'mimeType': mimeType,
                      'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
        f.SetContentFile(dl_dir + f['title'])

        #UploadGoogleDrive
        f.Upload()
        os.remove(dl_dir + file_name[i])

    line_bot_api.push_message(get_id,messages=(
        TextSendMessage(text=str(len(file_name))
            + "本をGoogleDriveにアップロードしました。\n"
            + "https://drive.google.com/drive/folders/" + folder_id)))

@handler.add(MessageEvent, message=(TextMessage))
def contents(event):
    #LINE Message
    message = event.message.text
    try:
        get_id = event.source.group_id
    except AttributeError:
        get_id = event.source.user_id

    param = ["/mp3","/mov","/nomov"]
    prm = [l for l in param if message.split()[0] in l]

    try:
        if message.startswith(prm[0]):
            url = message.split()[1]
            messagebox(event,prm[0],url)

            #youtube-dl
            file_name = youtube.main(prm[0],url,dl_dir)
            if str(file_name) in "ERROR" or file_name == []:
                line_bot_api.push_message(get_id,messages=(
                    TextSendMessage(text="ダウンロード処理に失敗しました。")))
            if prm[0] == "/mp3":
                music(get_id,file_name)
            else:
                video(get_id,file_name)
    except IndexError: pass
							
if __name__ == "__main__":
    app.run(host="127.0.0.1", port="9000")
여기까지 하면 거의 완성된다.그리고 조개 스크립트를 써서 행동을 확인하고 끝냅니다.
그럼 다음에 또 뵙겠습니다.

좋은 웹페이지 즐겨찾기