vk.comから音楽をダウンロードする

最近のvk.comのオーディオ録音に関する誇大宣伝の後、私はそれを安全に再生し、コレクション全体をハードドライブにコピーすることにしました。 これを解決するために、Javaで簡単なユーティリティを作成しました。 以下はコメント付きの彼女のコードです。 この記事は、汎用プログラミング言語に精通しており、その上に書かれたプログラムをコンパイルおよび実行できる読者を対象としています。



重要な注意:オーディオ録音が既に削除されている場合、この方法でダウンロードすることはほとんどの場合機能しません。



準備する


音声録音のリストはサイトのAPIを介して取得されます; APIへのアクセスにはアクセストークンが必要です。 トークンを取得するには、アドレスにアクセスする必要があります(これは、開発者向けのvk.comドキュメントで説明されている標準的な方法です)。



oauth.vk.com/authorize?client_id=3711445&scope=audio&

redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.0&response_type=token









ロードされたページで、アプリケーションがオーディオ録音にアクセスできるようにします。その後、フォームのアドレスにリダイレクトされます:



oauth.vk.com/blank.html#access_token=abc&expires_in=86400&user_id=123456









ここではaccess_tokenパラメーターが必要です-覚えておいてください。 最後のパラメーターuser_idはユーザーIDです。これも必要です。



これらの手順に従うことで、実際にあなたのアプリケーションへの録音のリストへのアクセスを許可しましたが、これで受け取ったトークンは私にはわからないため、アクセス権もありません。



コードを書く


トークンがあり、ダウンロードを開始できます。簡単に言えば、スキームは次のとおりです。JSON形式のオーディオレコーディングのリストを取得し、必要な情報(曲名、アーティスト名、実際にはmp3ファイルのアドレス)を解析し、意味のある名前を付けてファイルをダウンロードします。



オーディオレコーディングのリストを取得するには、POSTリクエストを以下に送信します。

(APIメソッドaudio.getを参照)



  URIBuilder builder = new URIBuilder(); builder.setScheme("https").setHost("api.vk.com").setPath("/method/audio.get") .setParameter("oid", USER_ID) //    ,     .setParameter("need_user", "0") .setParameter("count", "2000") //    .setParameter("offset", "0") // ,       .setParameter("access_token", ACCESS_TOKEN); //  ,   URI uri = builder.build();
      
      





リクエストを送信し、レスポンスを処理します。

Apache HttpClientライブラリを使用してHTTPリクエストを処理します)



  HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instream = null; try { instream = entity.getContent(); String responseAsString = IOUtils.toString(instream); parseAndDownload(responseAsString); } finally { if (instream != null) instream.close(); } }
      
      





JSONの解析には、ファイルのダウンロードにjson simpleを使用します-Apache Commons IO

(重要な注意-ファイルをアップロードするフォルダーが既に存在している必要があります)



  private static void parseAndDownload(String resp) throws IOException, ParseException { JSONParser parser = new JSONParser(); JSONObject jsonResponse = (JSONObject) parser.parse(resp); JSONArray mp3list = (JSONArray) jsonResponse.get("response"); for (int i=1; i<mp3list.size(); i++) { JSONObject mp3 = (JSONObject) mp3list.get(i); //   ! String pathname = "e:/vkmp3/" + fixWndowsFileName(mp3.get("artist") + " - " + mp3.get("title")); try { File destination = new File(pathname + ".mp3"); if (!destination.exists()) { FileUtils.copyURLToFile(new URL((String) mp3.get("url")), destination); } } catch (FileNotFoundException e) { System.out.print("ERROR "+pathname); } } }
      
      





曲の名前とアーティストの名前には、ファイル名での使用が禁止されている文字が含まれている場合があります。次の文字を削除します。

Apache Commons Langが使用)



  private static String fixWndowsFileName(String pathname) { String[] forbiddenSymbols = new String[] {"<", ">", ":", "\"", "/", "\\", "|", "?", "*"}; //  windows String result = pathname; for (String forbiddenSymbol: forbiddenSymbols) { result = StringUtils.replace(result, forbiddenSymbol, ""); } //      '& amp',      return StringEscapeUtils.unescapeXml(result); }
      
      







コンパイル、実行-喜ぶ、オンラインのオーディオコレクション全体がディスクにダウンロードされる様子を見てください。



結論の観察




完全に機能するソースコード


コード



依存関係リスト





All Articles