рдЪреЗрддрд╛рд╡рдиреА! рдХреЛрдб рдХреЗ рднрд╛рдЧ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рд▓реЗрдЦ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдкрдиреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рд╡реЗ GitHub рдкрд░ рд╕реНрд░реЛрдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
- рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд╡реЗрджрди рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдгред
- рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
- рдЧреНрд░рд╛рдл рджреГрд╢реНрдпред
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:
- рдкрд╛рдпрдерди 3.4
- рдЕрдиреБрд░реЛрдз
- d3
- Mozilla FireFox, рдХреНрд░реЛрдо рдореЗрдВ рдЪреВрдВрдХрд┐ рдЖрдк XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд╛рдиреАрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреЛрдИ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ -m http.server 8000 )
рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд╡реЗрджрди рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг
VKontakte API рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреЗ рдПрдкреАрдЖрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдпрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рд╣рдореЗрдВ рдЖрдкрдХреЗ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рдПрдХ рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдХреЛрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЖрд╡реЗрджрди рдкреНрд░рдмрдВрдзрди рдкреГрд╖реНрда рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реЗрдЯрд┐рдВрдЧ рдЯреИрдм рдкрд░, access_token рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ ред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 3 рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВред
рд╡реАрдХреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, url рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

https://oauth.vk.com/authorize?client_id=ID&scope=friends,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.21&response_type=token
рдЙрджреНрдзрд░рдг: vk.com/dev/auth_mobile :
APP_ID - рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛;
рдЕрдиреБрдорддрд┐рдпрд╛рдБ - рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрд╡реЗрджрди рдХреА рдЕрдиреБрдорддрд┐;
рдкреНрд░рджрд░реНрд╢рди - рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдВрдбреЛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рд╕рдорд░реНрдерд┐рдд: рдкреГрд╖реНрда, рдкреЙрдкрдЕрдк рдФрд░ рдореЛрдмрд╛рдЗрд▓ред
REDIRECT_URI - рдЬрд┐рд╕ рдкрддреЗ рддрдХ access_token рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
API_VERSION рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ API рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, PERMISSIONS рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рд░реНрд╡рд░ (рд╕рджрд╛ рдЯреЛрдХрди) рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдордп рджреЛрд╕реНрддреЛрдВ рдФрд░ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдкрддрд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрдирддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐
рдЕрдЧрд▓рд╛, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:

Access_token рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж, рдЧреНрд░рд╛рд╣рдХ рдХреЛ REDIRECT_URI рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдЬреЛ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдПрдХ рд▓рд┐рдВрдХ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛрдЧреАред
https://oauth.vk.com/blank.html#access_token=ACCESS_TOKEN&expires_in=0&user_id=USER_ID
рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП access_token рдФрд░ user_id рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реБрдП рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред рдЕрдм рд╣рдо рд╡реАрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╣рдо рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдИрдбреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЧреНрд░рд╛рдл рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, users.get рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ ред рдпрд╣ рдПрдХ рдЖрдИрдбреА рдФрд░ рдХрдИ рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЦреЗрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд┐рдо рдирд╛рдо рдФрд░ рдкрд╣рд▓рд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдЖрдзрд╛рд░_рдЗрдирдлреЛ () рд╡рд┐рдзрд┐ рдЖрдИрдбреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлреЛрдЯреЛ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред
def base_info(self, ids): """read https://vk.com/dev/users.get""" r = requests.get(self.request_url('users.get', 'user_ids=%s&fields=photo' % (','.join(map(str, ids))))).json() if 'error' in r.keys(): raise VkException('Error message: %s. Error code: %s' % (r['error']['error_msg'], r['error']['error_code'])) r = r['response'] # , id settings.py if 'deactivated' in r[0].keys(): raise VkException("User deactivated") return r
рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдорд┐рддреНрд░реЛрдВ рд╕реЗ рдЖрдИрдбреА рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддреЗ рд╣реИрдВред рдЙрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВред
рдЕрдм рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдорд┐рддреНрд░ рд╣реИрдВред рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧреАред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдЗрд╕рдХреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ, рд╣рдо user_id рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реЗрдЯрд┐рдВрдЧ рдереНрд░реЗрдб рдФрд░ рдлрд╝реАрд▓реНрдбреНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рджреЛрд╕реНрддреЛрдВ, рдЙрдирдХреЗ рдирд╛рдо, рдЙрдкрдирд╛рдо рдФрд░ рдлрд╝реЛрдЯреЛ рдХреА рдЖрдИрдбреА рд╣реЛрдЧреАред рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЗ рдкрд╛рд╕ рдЙрдирдХреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рдердВрдмрдиреЗрд▓ рд╣реЛрдВред
def friends(self, id): """ read https://vk.com/dev/friends.get """ r = requests.get(self.request_url('friends.get', 'user_id=%s&fields=uid,first_name,last_name,photo' % id)).json()['response'] #self.count_friends = r['count'] return {item['id']: item for item in r['items']}
рдлрд┐рд░ рдЖрддрд╛ рд╣реИ рдордЬрд╝реЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ред
рджреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЖрдо рджреЛрд╕реНрддреЛрдВ рдХреА рдЖрдИрдбреА рд╕реВрдЪреА friends.getMutual рд╡рд┐рдзрд┐ рд▓реМрдЯрд╛рддреА рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рджреЛрд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЖрдкрдХреЛ users.get рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реМ рдпрд╛ рджреЛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛рдПрдБ рдереЛрдбрд╝реА рдХрдо рд╕реНрдерд┐рдд рд╣реИрдВред
рдЕрдм рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рджреЛрд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ редgetMutual рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдПрди-рдорд┐рддреНрд░ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрди-рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рджреЛрд╕реНрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓ рдЬрд╛рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╡реИрдз рд╕рдВрдЦреНрдпрд╛ рд╣реЛред
рдорд╛рди рд▓реАрдЬрд┐рдП рдЬрд┐рд╕ рдЖрдИрдбреА рдХреЛ рд╣рдордиреЗ рд╕реНрдХреИрди рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕рдореЗрдВ 25 рджреЛрд╕реНрдд рд╣реИрдВред

рдХреЗрд╡рд▓ 52 рдЕрдиреБрд░реЛрдз рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ users.get рдПрдХ рдЖрдИрдбреА рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

25 рдорд┐рддреНрд░ - 28 рдЕрдиреБрд░реЛрдз, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рджреЛрд╕реНрддреЛрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

рдФрд░ рдпрд╣рд╛рдВ рдирд┐рд╖реНрдкрд╛рджрди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ 25 рдХреЙрд▓ рддрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣реА рд╣реИ, рдЕрдВрдд рдореЗрдВ, VKScript рдореЗрдВ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
return { тАЬid": API.friends.getMutual({"source_uid":source, "target_uid":target}), // * 25 ... };
рдРрд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рд╣рд░ рд╕рдордп API.friends.getMutual рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдореЗрдВ рдмрд╕ 25 рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдорд┐рддреНрд░ рдЖрдИрдбреА рдХреЗ рдмреИрдЪ рдореЗрдВ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд░реНрдХрд┐рдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рджреЛрд╕реНрдд рдХреЛ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдорд╛рдирд╡-рдкрдардиреАрдп рд╕рдВрд░рдЪрдирд╛ рдХреА рд░рдЪрдирд╛ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдБ рдПрдХ рдорд┐рддреНрд░ рдХреА рдЖрдИрдбреА рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рдорд┐рддреНрд░реЛрдВ рдХреА рдЖрдИрдбреА рд╕реВрдЪреА рдХреЗ рдмрдЬрд╛рдп, рдорд┐рддреНрд░реЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
[({ }, [{ }, { }]),({ }, None)]
рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рдЖрдИрдбреА, рдкрд╣рд▓рд╛ рдирд╛рдо, рдЕрдВрддрд┐рдо рдирд╛рдо, рдлреЛрдЯреЛ, рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ - рд╕рд╛рдорд╛рдиреНрдп рдорд┐рддреНрд░реЛрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рд╣реИрдВ, рдЕрдЧрд░ рдХреЛрдИ рдЖрдо рджреЛрд╕реНрдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдХреЛрдИ рдирд╣реАрдВред рдЯреНрдпреВрдкрд▓ рд╕рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВред
def common_friends(self): """ read https://vk.com/dev/friends.getMutual and read https://vk.com/dev/execute """ def parts(lst, n=25): """ - 25 """ return [lst[i:i + n] for i in iter(range(0, len(lst), n))] result = [] for i in parts(list(self.all_friends.keys())): # code ( execute) code = 'return {' for id in i: code = '%s%s' % (code, '"%s": API.friends.getMutual({"source_uid":%s, "target_uid":%s}),' % (id, self.my_id, id)) code = '%s%s' % (code, '};') for key, val in requests.get(self.request_url('execute', 'code=%s' % code)).json()['response'].items(): if int(key) in list(self.all_friends.keys()): # result.append((self.all_friends[int(key)], [self.all_friends[int(i)] for i in val] if val else None)) return result
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдорд┐рддреНрд░реЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдорд┐рддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреМрдбрд╝реЗрдВ:
python main.py
рдЧреНрд░рд╛рдл рджреГрд╢реНрдп
рдЪреБрдирд╛рд╡ d3 рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛, рдЕрд░реНрдерд╛рддреН рдШреБрдорд╛рд╡рджрд╛рд░ рд▓рд┐рдВрдХ рдкрд░ ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, json рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ, рдЬреЛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
{ "nodes": [ {"name":"Myriel","group":1, "photo": "path"}, {"name":"Napoleon","group":1, "photo": "path"}, {"name":"Mlle.Baptistine","group":1, "photo": "path"} ], "links":[ {"source":1,"target":0,"value":1}, {"source":2,"target":0,"value":8} ] }
Index.html рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реБрдП рджреЛрд╕реНрддреЛрдВ рдХреЗ рдлреЛрдЯреЛ рдиреЛрдб рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдЧреНрд░рд╛рдлрд╝ рдХреА рддреБрд░рдВрдд рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
python 2d3.py
рд╡реЗрдм рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ miserables.json рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред Mozilla FireFox рдореЗрдВ index.html рдЦреЛрд▓рдирд╛ рди рднреВрд▓реЗрдВ рдпрд╛ python -m http.server 8000 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ Chrome рдореЗрдВ рдЦреЛрд▓реЗрдВред
рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдореИрдВ рд╡реЗрдмрдЬреАрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред
рдпрд╣ рдореЗрд░реЗ рдПрдХ рджреЛрд╕реНрдд рдХреА рджреЛрд╕реНрддреА рдХрд╛ рдЧреНрд░рд╛рдл рдХреИрд╕рд╛ рд╣реИред рдЬреБрдбрд╝рд╛рд╡ рд╣реА рд╕рдм рдХреБрдЫ рд╣реИред

рдмреЗрд╢рдХ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреМрди рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдЦ рдиреЗ рдореБрдЭреЗ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛:
рдореЗрд░реЗ 333 рджреЛрд╕реНрддреЛрдВ рдкрд░, 119 рд╕реЗрдХрдВрдб рд▓рдЧреЗред

рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рд╣рд┐рдореБрд░рд╛ рдХреЗ VKontakte рдкрд░ 321 рджреЛрд╕реНрдд рдереЗред рдЗрд╕рдореЗрдВ рдореБрдЭреЗ 9 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧрд╛ (рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо, рд╕рд┐рд░реНрдл рджреЛрд╕реНрдд рдирд╣реАрдВ рдереЗред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА VKontakte рдХреЗ рдЙрджрд╛рд░рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реАрдВ: рддреНрд░реБрдЯрд┐ рдХреЛрдб 15 рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ( 'error_msg': 'рдкреНрд░рд╡реЗрд╢ рдирд┐рд╖реЗрдз: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп', 'error_code': 15 ), рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред , рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдФрд░ friends.get рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ user_id рдХреЗ рдмрдЬрд╛рдп uid ред 2 рджрд┐рди рдмрд╛рдж:

рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЧрд┐рдЯрд╣рдм рдкрд░ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ , рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рддреЗ рд╣реИрдВ ...
UPD (05/27/2014):
рдЬреИрд╕рд╛ рдХрд┐ WTFRU7 рдиреЗ рдореБрдЭреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ , рдореИрдВрдиреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ ред
GetMutual рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐ рдмрдирд╛рдПрдБред рдкреНрд░рдкрддреНрд░ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП execute_getMutual.js рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБред рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд░реВрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

UPD (06/16/2014):
рд╣рдореЗрдВ рдПрдХ рдЕрд╕реАрдорд┐рдд рдЯреЛрдХрди рдорд┐рд▓рддрд╛ рд╣реИред
UPD (07/11/2014):
рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
UPD (11/14/2014):
рд╡рд┐рд╕реНрддрд╛рд░