[파이썬] 유튜브의 노래와 영상을 라인에서 지우고 싶은 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를 유효하게 만들어야 합니다.참고 자료
※ [JSON 다운로드]도 실시, 이름을'client secret.json'으로 변경하여 $HOME/LINE에 설치.
우선 세팅스.yaml 파일 만들기
cd $HOME/line
vim settings.yaml
settings.yamlclient_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")
여기까지 하면 거의 완성된다.그리고 조개 스크립트를 써서 행동을 확인하고 끝냅니다.그럼 다음에 또 뵙겠습니다.
Reference
이 문제에 관하여([파이썬] 유튜브의 노래와 영상을 라인에서 지우고 싶은 2/3.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/trusted_dream/articles/257029ce77ca09텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)