Last active
June 11, 2017 06:18
-
-
Save martysyuk/4ef8f70f00e1dca54746ee2506f607c0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: UTF-8 -*- | |
interests = ['семейная психология', 'психология отношений', 'мужская психология', 'возрастная психология'] | |
message = 'Метки: #психолог #детский_психолог #семейный_психолог #место_силы #развитие_гендерной_идентичности #развитие_коммуникативных_навыков #новосибирск #психология #мартысюк #rupsy #skype_консультация #консультация_психолога #therapie_mit_martysyuk #therapie #skype_therapie #психологические_группы' | |
repost_to = '28713533' | |
reposts_count = 1 | |
repost_wait = 3600 | |
maximum_checking_count = 30 | |
token_url = 'https://oauth.vk.com/blank.html#access_token=48ae5fdf67733547a8dbdff8cbb45875f53c06cc1f1730aaaa9e61254995db80ed72e249558f6c5ce7918&expires_in=86400&user_id=4119375' | |
user_id = 'martysyuk' | |
app_id = 6064589 | |
show_error = False | |
if __name__ == '__main__': | |
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: UTF-8 -*- | |
"""Authon: Martysyuk Ilya | |
Title: Python Engineer | |
E-Mail: martysyuk@mail.ru | |
Phone: +7 (383) 299-1-373 | |
Skype: martysyuk | |
""" | |
from urllib.parse import urlencode, urlparse | |
import requests | |
import time | |
from config import show_error | |
class VKApiRequest: | |
def __init__(self, app_id, token_url='', scope='friends,messages,search,users,groups,wall', api_ver='5.64'): | |
self.token = '' | |
self.app_id = app_id | |
self.api_ver = api_ver | |
self.authorize_url = 'http://oauth.vk.com/authorize' | |
auth_data = { | |
'client_id': self.app_id, | |
'display': 'popup', | |
'response_type': 'token', | |
'scope': scope, | |
'v': self.api_ver | |
} | |
if token_url == '': | |
token_url = '?'.join((self.authorize_url, urlencode(auth_data))) | |
print('Перейдите по ссылке и скопируйте ее результат в переменную token_url:') | |
print(token_url) | |
exit(1) | |
else: | |
# token_url = 'https://oauth.vk.com/blank.html#access_token=775c71580676149067843d41ae6a34e2f48c5fc1f0a955e5f44e9106d18f90bde84407ff0ce3a334619e2&expires_in=86400&user_id=4119375' | |
o = urlparse(token_url) | |
fragments = dict((i.split('=') for i in o.fragment.split('&'))) | |
self.token = fragments['access_token'] | |
def get_user_id(self, user): | |
return self.response('users.get', {'user_ids': user})[0]['id'] | |
@staticmethod | |
def response_error(_response): | |
if _response['error']['error_code'] == 6: | |
time.sleep(0.5) | |
return True | |
else: | |
if show_error: | |
print('Error code: {}: {}'.format(_response['error']['error_code'], _response['error']['error_msg'])) | |
return False | |
def response(self, _method, _params): | |
_params.update({'access_token': self.token, | |
'v': self.api_ver | |
}) | |
while True: | |
_response = requests.get('https://api.vk.com/method/' + _method, _params).json() | |
try: | |
return _response['response'] | |
except KeyError: | |
if self.response_error(_response): | |
continue | |
else: | |
return False | |
if __name__ == '__main__': | |
pass |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: UTF-8 -*- | |
"""Authon: Martysyuk Ilya | |
Title: Python Engineer | |
E-Mail: martysyuk@mail.ru | |
Phone: +7 (383) 299-1-373 | |
Skype: martysyuk | |
Доработать: | |
1) Проверку сделаных репостов, чтобы не повторялись. | |
2) сделать автоматическую авторизацию уазанного пользователя | |
""" | |
import vkapi | |
import time | |
import pandas as pd | |
import config as cfg | |
class Wrapper: | |
def __init__(self): | |
self.df = pd.DataFrame(columns=['owner_id', 'post_id', 'likes']) | |
self.interests = cfg.interests | |
self.vk_request = vkapi.VKApiRequest(cfg.app_id, cfg.token_url) | |
self.users_id = self.vk_request.get_user_id(cfg.user_id) | |
self.groups_with_interests = dict() | |
self.now_time = time.time() | |
# 60 seconds * 60 minutes * 24 hours in day. | |
self.maximum_old_posts_time = self.now_time - 60 * 60 * 24 | |
self.post_to_repost = list() | |
self.already_posted = list() | |
def get_groups_by_interests(self): | |
query = {'type': 'group', | |
'country_id': 1, | |
'sort': 2, | |
'count': cfg.maximum_checking_count} | |
groups_list = [] | |
for interest in self.interests: | |
query.update({'q': interest}) | |
response = self.vk_request.response('groups.search', query) | |
for each in response['items']: | |
groups_list.append('-'+str(each['id'])) | |
self.groups_with_interests.update({interest: groups_list}) | |
groups_list = [] | |
def search_posts_with_max_likes(self): | |
query = {'count': cfg.maximum_checking_count, | |
'filter': 'owner'} | |
for each in self.groups_with_interests: | |
for group_id in self.groups_with_interests[each]: | |
query.update({'owner_id': group_id}) | |
_response = self.vk_request.response('wall.get', query) | |
try: | |
for post in _response['items']: | |
if post['date'] > self.maximum_old_posts_time: | |
self.df.loc[len(self.df)] = [post['owner_id'], post['id'], post['likes']['count']] | |
except TypeError: | |
pass | |
self.df = self.df.sort_values('likes', ascending=0).head(cfg.reposts_count) | |
self.repost() | |
self.df = pd.DataFrame(columns=['owner_id', 'post_id', 'likes']) | |
if cfg.repost_wait > 0: | |
print('Waiting {} seconds to next repost...'.format(cfg.repost_wait)) | |
time.sleep(cfg.repost_wait) | |
def repost(self): | |
for each in range(len(self.df)): | |
_getter = self.df.iloc[each] | |
self.post_to_repost.append('wall{}_{}'.format(str(_getter['owner_id']).replace('.0', ''), | |
str(_getter['post_id'])).replace('.0', '')) | |
for each in self.post_to_repost: | |
if each not in self.already_posted: | |
self.vk_request.response('wall.repost', {'object': each, | |
'group_id': cfg.repost_to, | |
'message': cfg.message}) | |
self.already_posted.append(each) | |
print('Repost done!') | |
def main(): | |
print('Starting searching posts...') | |
wrapper = Wrapper() | |
wrapper.get_groups_by_interests() | |
wrapper.search_posts_with_max_likes() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
VK Auto Reposter