рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рд╡реАрдХреЗ рдорд┐рддреНрд░рддрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣реЛрдмреЗ рдкрд░ рдПрдХ рд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╡реЛрдХреНрдЯреЛрд░рдо рдореИрдереЗрдореЗрдЯрд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ VKontakte рдкрд░ рдорд┐рддреНрд░рддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдкрд╛рдпрдерди рдФрд░ рдбреА 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдЧреНрд░рд╛рдл рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдпрд╣ рдЖрдпрд╛ рд╣реИред



рдЪреЗрддрд╛рд╡рдиреА! рдХреЛрдб рдХреЗ рднрд╛рдЧ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рд▓реЗрдЦ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрдкрдиреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬреЛ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рд╡реЗ GitHub рдкрд░ рд╕реНрд░реЛрдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред



рд╣рдо рдХрд╛рд░реНрдп рдХреЛ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:



рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:



рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрд╡реЗрджрди рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг



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):

рд╡рд┐рд╕реНрддрд╛рд░



All Articles