Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.94 KB | None | 0 0
  1. from __future__ import print_function
  2. import json, re, sys
  3. from argparse import ArgumentParser
  4. from getpass import getpass
  5. from requests import Session
  6. from requests.adapters import HTTPAdapter
  7. from urllib3.util.retry import Retry
  8. if sys.version_info[0] < 3:
  9.   from urlparse import urlparse, parse_qs
  10.   input = raw_input
  11. else:
  12.   from urllib.parse import urlparse, parse_qs
  13.  
  14.  
  15. class OlinfoLiker:
  16.  
  17.   def __init__(self, usr, pwd):
  18.     self.__session = Session()
  19.     retry = Retry(backoff_factor=.1, status_forcelist=[429])
  20.     adapter = HTTPAdapter(max_retries=retry)
  21.     self.__session.mount('https://', adapter)
  22.     self.__buffer = []
  23.     self.__lastID = 0
  24.     self.__login(usr, pwd)
  25.     self.__setCSRF()
  26.  
  27.   def __str__(self):
  28.     return '%s loves everyone!' % self.__username
  29.  
  30.   def like(self, target=None):
  31.     post = self.__getPost(target)
  32.     url = 'https://forum.olinfo.it/post_actions'
  33.     data = {'id': post['id'], 'post_action_type_id': 2}
  34.     headers = {
  35.         'X-CSRF-Token': self.__csrf,
  36.         'X-Requested-With': 'XMLHttpRequest'
  37.     }
  38.     r = self.__session.post(url, headers=headers, json=data)
  39.     data = self.__parseJSON(r.text)
  40.     print(self.__username, 'likes', post['username'], '(id: %d)' % post['id'])
  41.  
  42.   def __login(self, usr, pwd):
  43.     url = 'https://training.olinfo.it/api/user'
  44.     data = {'username': usr, 'password': pwd, 'action': 'login'}
  45.     r = self.__session.post(url, json=data)
  46.     try:
  47.       data = self.__parseJSON(r.text)
  48.     except:
  49.       raise Exception('Login fallito')
  50.  
  51.     url = 'https://forum.olinfo.it/session/sso?return_path=%2F'
  52.     r = self.__session.get(url)
  53.     query = parse_qs(urlparse(urlparse(r.url).fragment).query)
  54.  
  55.     url = 'https://training.olinfo.it/api/sso'
  56.     payload = {'payload': query['sso'][0], 'sig': query['sig'][0]}
  57.     r = self.__session.post(url, json=payload)
  58.     data = self.__parseJSON(r.text)
  59.  
  60.     url = 'https://forum.olinfo.it/session/sso_login?' + data['parameters']
  61.     r = self.__session.get(url)
  62.  
  63.     self.__username = r.headers['X-Discourse-Username']
  64.     print('Login completato (%s)' % self.__username)
  65.  
  66.   def __parseJSON(self, text):
  67.     try:
  68.       data = json.loads(text)
  69.     except:
  70.       raise Exception(re.search('<title>(.*?)</title>', text).group(1))
  71.     if 'error' in data:
  72.       raise Exception(data['error'])
  73.     if 'errors' in data:
  74.       for e in data['errors']:
  75.         raise Exception(e)
  76.     return data
  77.  
  78.   def __setCSRF(self):
  79.     url = 'https://forum.olinfo.it/session/csrf.json'
  80.     r = self.__session.get(url)
  81.     data = self.__parseJSON(r.text)
  82.     self.__csrf = data['csrf']
  83.  
  84.   def __getPostsTarget(self, target):
  85.     url = 'https://forum.olinfo.it/user_actions.json?offset=%d&username=%s&filter=5' % (
  86.         self.__lastID, target)
  87.     r = self.__session.get(url)
  88.     self.__lastID += 30
  89.     try:
  90.       data = self.__parseJSON(r.text)
  91.     except:
  92.       raise Exception('Utente non trovato')
  93.     if not data['user_actions']:
  94.       raise Exception('Nessun post trovato')
  95.     ids = [i['post_id'] for i in data['user_actions']]
  96.     while ids:
  97.       url = 'https://forum.olinfo.it/posts.json?before=%d' % ids[0]
  98.       r = self.__session.get(url)
  99.       data = self.__parseJSON(r.text)
  100.       for i in data['latest_posts']:
  101.         if i['id'] not in ids:
  102.           continue
  103.         ids.remove(i['id'])
  104.         for j in i['actions_summary']:
  105.           if 'acted' in j:
  106.             break
  107.         else:
  108.           self.__buffer.append(i)
  109.  
  110.   def __getPostsUnTarget(self):
  111.     url = 'https://forum.olinfo.it/posts.json'
  112.     if self.__lastID:
  113.       if self.__lastID <= 1:
  114.         raise Exception('Nessun post trovato')
  115.       url += '?before=%d' % self.__lastID
  116.     else:
  117.       self.__lastID = 99999
  118.     r = self.__session.get(url)
  119.     data = self.__parseJSON(r.text)
  120.     self.__buffer = []
  121.     for i in data['latest_posts']:
  122.       if i['id'] <= self.__lastID:
  123.         self.__lastID = i['id'] - 1
  124.       if self.__username == i['username']:
  125.         continue
  126.       for j in i['actions_summary']:
  127.         if 'acted' in j:
  128.           break
  129.       else:
  130.         self.__buffer.append(i)
  131.  
  132.   def __getPost(self, target):
  133.     while not self.__buffer:
  134.       if target:
  135.         self.__getPostsTarget(target)
  136.       else:
  137.         self.__getPostsUnTarget()
  138.     return self.__buffer.pop()
  139.  
  140.  
  141. def main():
  142.   parser = ArgumentParser()
  143.   parser.add_argument(
  144.       '-t',
  145.       '--target',
  146.       type=str,
  147.       help='utente a cui mettere like',
  148.       metavar='USER')
  149.   parser.add_argument(
  150.       '-l',
  151.       '--likes',
  152.       type=int,
  153.       default=50,
  154.       help='numero massimo di post a cui mettere like')
  155.   args = parser.parse_args()
  156.  
  157.   username = input('Username: ')
  158.   password = getpass()
  159.  
  160.   try:
  161.     liker = OlinfoLiker(username, password)
  162.     for i in range(args.likes):
  163.       liker.like(target=args.target)
  164.   except Exception as e:
  165.     print('Errore:', e, file=sys.stderr)
  166.  
  167.  
  168. if __name__ == '__main__':
  169.   main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement