Skip to content

Instantly share code, notes, and snippets.

@martysyuk
Last active June 11, 2017 06:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save martysyuk/4ef8f70f00e1dca54746ee2506f607c0 to your computer and use it in GitHub Desktop.
Save martysyuk/4ef8f70f00e1dca54746ee2506f607c0 to your computer and use it in GitHub Desktop.
# -*- 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
# -*- 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
# -*- 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()
@martysyuk
Copy link
Author

VK Auto Reposter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment