PythonとVk APIを使用してVKプレイリスト(最大6000)からオーディオをバックアップします

こんにちは。



以前は、Vkontakte(以降VK)を使用して音楽をよく聴きました。 Ubuntu 14.10への移行後、Linuxシステム用のGoogle Chromeブラウザーを介してオーディオ録音を聴いているときにコンピューターが完全にフリーズするという形で問題が発生しました。 この点で、オフラインで音楽を聴くにはプレイリストをバックアップする必要がありました。 これらの目的のために、私はPythonで小さなスクリプトを書くことにしました。これは音楽をゼロからダウンロードできるだけでなく、既存のライブラリを更新することもできます。



次のモジュールを使用しました。



始めましょう。



最初にモジュールを接続します:



import os import requests from selenium import webdriver import json
      
      





次に、access_tokenを取得してAPIにリクエストを行い、必要なアクセス権を取得する必要があります。

その前に、スタンドアロン/デスクトップアプリケーションを作成してアクティブ化する必要があります。IDはリクエストで指定します。



スキームは非常に単純です:ブラウザーウィンドウを開き、リンクをたどり、アカウントからデータを入力し、アクセスを許可します。出力で、必要なデータをURLからコピーします(これらはaccess_tokenとexpires_in-トークンの有効期限です)。



アプリケーションの作成と承認の詳細については、 こちらをご覧ください



私は自分の怠inessのためにセレンを使用しました。 このモジュールには、上記のすべてのアクションを自動化するのに十分な機能があります。 好きな他の仮想ブラウザを使用できます。



実際にコメント付きのコード:



 #    driver = webdriver.Firefox() #   . # client_id -     # scope -   driver.get("http://api.vkontakte.ru/oauth/authorize?" "client_id=4591034&scope=audio" "&redirect_uri=http://api.vk.com/blank.html" "&display=page&response_type=token") user = "email/phone" password = "password" #         user_input = driver.find_element_by_name("email") user_input.send_keys(user) password_input = driver.find_element_by_name("pass") password_input.send_keys(password) #    submit = driver.find_element_by_id("install_allow") submit.click() #        api current = driver.current_url access_list = (current.split("#"))[1].split("&") access_token = (access_list[0].split("="))[1] # acces_token expires_in = (access_list[1].split("="))[1] #     user_id = (access_list[2].split("="))[1] # id      #    driver.close()
      
      





最近まで、VK APIはすべてのデータをxml形式で返していましたが、これは少し不便でした。 現在、答えはjson辞書にシリアライズされており、問題なく作業できます。 ここでは、 jsonライブラリが役立ちます。具体的には、文字列を辞書に変換するload()メソッドが役立ちます



さらに、アクションプランは非常に単純です。

  1. リクエストを実行し、アカウントプレイリストからのすべてのオーディオレコーディングのリストを応答で取得します(6000に制限)。
  2. 回答を辞書に変換します。
  3. 辞書から必要な情報(アーティスト、トラック名、トラックへのリンク)を取得します。
  4. オーディオレコーディングを目的のディレクトリにダウンロードし、トラックの名前が保存されている標準の文字セットではなく、目的の名前を呼び出します。




最初のステップ:



 #    print "Connecting" #   url = "https://api.vkontakte.ru/method/" \ "audio.get?uid=" + user_id +\ "&access_token=" + access_token #      artists_list = [] titles_list = [] links_list = [] #         number = 0 #        page = requests.get(url) html = page.text
      
      





2番目のステップ:



 my_dict = json.loads(html) #  loads()
      
      







3番目のステップは、コメントなしですべてが明確だと思います。



 for i in my_dict['response']: artists_list.append(i['artist']) titles_list.append(i['title']) links_list.append(i['url']) number += 1
      
      





4番目の最終ステップ:



 #  ,       path = "downloads" if not os.path.exists(path): os.makedirs(path) #    print "Need to download: ", number #    for i in range(0, number): #     /   new_filename = path+"/"+artists_list[i] + " - " + titles_list[i] + ".mp3" print "Downloading: ", new_filename, i #     if not os.path.exists(new_filename): #   ,           with open(new_filename, "wb") as out: response = requests.get(links_list[i].split("?")[0]) out.write(response.content) print "Download complete."
      
      





現在、私はVKからのオーディオレコーディングを聴くための自作プレーヤーに取り組んでいます(はい、それは別のプレーヤーであり、既存の人気プレーヤー用のプラグインではありません)。 将来的には、プロセスを説明する記事を書く予定です。



それだけです、ご清聴ありがとうございました。



UPD:

記事はコメントの要望に応じて若干編集されています。



All Articles