Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import print_function
- import json, re, sys
- from argparse import ArgumentParser
- from getpass import getpass
- from requests import Session
- from requests.adapters import HTTPAdapter
- from urllib3.util.retry import Retry
- if sys.version_info[0] < 3:
- from urlparse import urlparse, parse_qs
- input = raw_input
- else:
- from urllib.parse import urlparse, parse_qs
- class OlinfoLiker:
- def __init__(self, usr, pwd):
- self.__session = Session()
- retry = Retry(backoff_factor=.1, status_forcelist=[429])
- adapter = HTTPAdapter(max_retries=retry)
- self.__session.mount('https://', adapter)
- self.__buffer = []
- self.__lastID = 0
- self.__login(usr, pwd)
- self.__setCSRF()
- def __str__(self):
- return '%s loves everyone!' % self.__username
- def like(self, target=None):
- post = self.__getPost(target)
- url = 'https://forum.olinfo.it/post_actions'
- data = {'id': post['id'], 'post_action_type_id': 2}
- headers = {
- 'X-CSRF-Token': self.__csrf,
- 'X-Requested-With': 'XMLHttpRequest'
- }
- r = self.__session.post(url, headers=headers, json=data)
- data = self.__parseJSON(r.text)
- print(self.__username, 'likes', post['username'], '(id: %d)' % post['id'])
- def __login(self, usr, pwd):
- url = 'https://training.olinfo.it/api/user'
- data = {'username': usr, 'password': pwd, 'action': 'login'}
- r = self.__session.post(url, json=data)
- try:
- data = self.__parseJSON(r.text)
- except:
- raise Exception('Login fallito')
- url = 'https://forum.olinfo.it/session/sso?return_path=%2F'
- r = self.__session.get(url)
- query = parse_qs(urlparse(urlparse(r.url).fragment).query)
- url = 'https://training.olinfo.it/api/sso'
- payload = {'payload': query['sso'][0], 'sig': query['sig'][0]}
- r = self.__session.post(url, json=payload)
- data = self.__parseJSON(r.text)
- url = 'https://forum.olinfo.it/session/sso_login?' + data['parameters']
- r = self.__session.get(url)
- self.__username = r.headers['X-Discourse-Username']
- print('Login completato (%s)' % self.__username)
- def __parseJSON(self, text):
- try:
- data = json.loads(text)
- except:
- raise Exception(re.search('<title>(.*?)</title>', text).group(1))
- if 'error' in data:
- raise Exception(data['error'])
- if 'errors' in data:
- for e in data['errors']:
- raise Exception(e)
- return data
- def __setCSRF(self):
- url = 'https://forum.olinfo.it/session/csrf.json'
- r = self.__session.get(url)
- data = self.__parseJSON(r.text)
- self.__csrf = data['csrf']
- def __getPostsTarget(self, target):
- url = 'https://forum.olinfo.it/user_actions.json?offset=%d&username=%s&filter=5' % (
- self.__lastID, target)
- r = self.__session.get(url)
- self.__lastID += 30
- try:
- data = self.__parseJSON(r.text)
- except:
- raise Exception('Utente non trovato')
- if not data['user_actions']:
- raise Exception('Nessun post trovato')
- ids = [i['post_id'] for i in data['user_actions']]
- while ids:
- url = 'https://forum.olinfo.it/posts.json?before=%d' % ids[0]
- r = self.__session.get(url)
- data = self.__parseJSON(r.text)
- for i in data['latest_posts']:
- if i['id'] not in ids:
- continue
- ids.remove(i['id'])
- for j in i['actions_summary']:
- if 'acted' in j:
- break
- else:
- self.__buffer.append(i)
- def __getPostsUnTarget(self):
- url = 'https://forum.olinfo.it/posts.json'
- if self.__lastID:
- if self.__lastID <= 1:
- raise Exception('Nessun post trovato')
- url += '?before=%d' % self.__lastID
- else:
- self.__lastID = 99999
- r = self.__session.get(url)
- data = self.__parseJSON(r.text)
- self.__buffer = []
- for i in data['latest_posts']:
- if i['id'] <= self.__lastID:
- self.__lastID = i['id'] - 1
- if self.__username == i['username']:
- continue
- for j in i['actions_summary']:
- if 'acted' in j:
- break
- else:
- self.__buffer.append(i)
- def __getPost(self, target):
- while not self.__buffer:
- if target:
- self.__getPostsTarget(target)
- else:
- self.__getPostsUnTarget()
- return self.__buffer.pop()
- def main():
- parser = ArgumentParser()
- parser.add_argument(
- '-t',
- '--target',
- type=str,
- help='utente a cui mettere like',
- metavar='USER')
- parser.add_argument(
- '-l',
- '--likes',
- type=int,
- default=50,
- help='numero massimo di post a cui mettere like')
- args = parser.parse_args()
- username = input('Username: ')
- password = getpass()
- try:
- liker = OlinfoLiker(username, password)
- for i in range(args.likes):
- liker.like(target=args.target)
- except Exception as e:
- print('Errore:', e, file=sys.stderr)
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement