重要な注意:オーディオ録音が既に削除されている場合、この方法でダウンロードすることはほとんどの場合機能しません。
準備する
音声録音のリストはサイトの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); }
コンパイル、実行-喜ぶ、オンラインのオーディオコレクション全体がディスクにダウンロードされる様子を見てください。
結論の観察
- コードはかなり汚れており、産業用にはあまり適していません(曲数が非常に多いコレクションをダウンロードするには、修正することをお勧めします)が、問題は解決します。
- Javaはアイデアを実証するためにのみ使用されます。このコードをお気に入りの言語に翻訳することは難しくないと思います
- オーディオをダウンロードするための多くのプログラムがありますが、それらへの信頼はまったくありません(個人データを転送するという点で)
- プログラムは数回実行できます-ディスクに存在しないファイルのみがダウンロードされます
完全に機能するソースコード
コード
依存関係リスト
- json-simple-1.1.1.jar
- commons-lang3-3.1.jar
- commons-io-2.4.jar
- httpcomponents-client-4.2.5-bin.zip(アーカイブのすべてのjarファイル)