Skip to content

Commit f469455

Browse files
authored
Merge pull request #66 from neigrok/master
Add VkAudio
2 parents eb6755f + 903c771 commit f469455

5 files changed

Lines changed: 132 additions & 1 deletion

File tree

examples/get_all_audio.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# -*- coding: utf-8 -*-
2+
import collections
3+
4+
import vk_api
5+
from vk_api.audio import VKAudio
6+
7+
8+
def main():
9+
""" Пример составления топа исполнителей для профиля вк """
10+
11+
login, password = 'login', 'password'
12+
vk_session = vk_api.VkApi(login, password)
13+
14+
try:
15+
vk_session.auth()
16+
except vk_api.AuthError as error_msg:
17+
print(error_msg)
18+
return
19+
20+
vkaudio = VKAudio(vk_session)
21+
22+
artists = collections.Counter()
23+
24+
offset = 0
25+
26+
while True:
27+
audios = vkaudio.get(owner_id=-99463083, offset=offset)
28+
29+
if not audios:
30+
break
31+
32+
for audio in audios:
33+
artists[audio['artist']] += 1
34+
35+
offset += len(audios)
36+
37+
# Составляем рейтинг первых 15
38+
print('\nTop 15:')
39+
for artist, tracks in artists.most_common(15):
40+
print('{} - {} tracks'.format(artist, tracks))
41+
42+
# Ищем треки самого популярного
43+
most_common_artist = artists.most_common(1)[0][0]
44+
45+
print('\nSearch for', most_common_artist)
46+
47+
tracks = vkaudio.search(q=most_common_artist)[:10]
48+
49+
for n, track in enumerate(tracks, 1):
50+
print('{}. {} {}'.format(n, track['title'], track['url']))
51+
52+
if __name__ == '__main__':
53+
main()

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
beautifulsoup4
12
requests
23
enum34

vk_api/audio.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# -*- coding: utf-8 -*-
2+
from bs4 import BeautifulSoup
3+
4+
from .exceptions import AccessDenied
5+
6+
7+
class VKAudio:
8+
def __init__(self, vk):
9+
self._vk = vk
10+
11+
def get(self, owner_id, offset=0):
12+
""" Получение списка аудиозаписей пользователя
13+
14+
:param owner_id: ID владельца (отрицательные значения для групп)
15+
:param offset: смещение
16+
"""
17+
18+
response = self._vk.http.get(
19+
'https://m.vk.com/audios{}'.format(owner_id),
20+
params={
21+
'offset': offset
22+
},
23+
allow_redirects=False
24+
)
25+
26+
if not response.text:
27+
raise AccessDenied(
28+
'You don\'t have permissions to browse {}\'s audio'.format(
29+
owner_id
30+
)
31+
)
32+
33+
return scrap_data(response.text)
34+
35+
def search(self, q='', offset=0):
36+
""" Поиск аудиозаписей
37+
38+
:param q: запрос
39+
:param offset: смещение
40+
"""
41+
42+
response = self._vk.http.get(
43+
'https://m.vk.com/audio',
44+
params={
45+
'act': 'search',
46+
'q': q,
47+
'offset': offset
48+
}
49+
)
50+
51+
return scrap_data(response.text)
52+
53+
54+
def scrap_data(html):
55+
""" Парсинг списка аудиозаписей """
56+
57+
soup = BeautifulSoup(html, 'html.parser')
58+
tracks = []
59+
60+
for audio in soup.find_all('div', {'class': 'audio_item ai_has_btn'}):
61+
ai_artist = audio.select('.ai_artist')
62+
artist = ai_artist[0].text
63+
link = audio.select('.ai_body')[0].input['value']
64+
65+
tracks.append({
66+
'artist': artist,
67+
'title': audio.select('.ai_title')[0].text,
68+
'dur': audio.select('.ai_dur')[0]['data-dur'],
69+
'id': audio['id'],
70+
'url': link
71+
})
72+
73+
return tracks

vk_api/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class VkApiError(Exception):
1515
pass
1616

1717

18+
class AccessDenied(VkApiError):
19+
pass
20+
21+
1822
class AuthorizationError(VkApiError): # todo: delete
1923
pass
2024

vk_api/vk_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# -*- coding: utf-8 -*-
1+
# -*- coding: utf-8 -*-
22
"""
33
@author: Kirill Python
44
@contact: https://vk.com/python273

0 commit comments

Comments
 (0)