Advertisement
stuppid_bot

Скрипт для автоматического постинга объявлений на belg.ru

May 18th, 2015
565
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.37 KB | None | 0 0
  1. import requests
  2. import re
  3. from captcha import CaptchaDialog
  4. import os
  5. from urllib.parse import urlencode
  6.  
  7.  
  8. class Client:
  9.     def __init__(self, session=None):
  10.         self.session = session or requests.session()
  11.         self.session.headers['User-Agent'] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
  12.         self.host = 'belg.ru'
  13.         self.base_url = 'http://' + self.host
  14.  
  15.     def auth(self, login, password, ngeo):
  16.         # Версии сайта для Старого Оскола и Белгорода имеют разные базы
  17.         self.session.cookies.set('ngeo', ngeo, domain=self.host, path='/')
  18.  
  19.         url = self.base_url + '/altcms/extensions/login/o_login.php'
  20.  
  21.         payload = {
  22.             'login': login,
  23.             'pass': password
  24.         }
  25.  
  26.         r = self.session.post(url, payload,
  27.                               headers={'X-Requested-With': 'XMLHttpRequest'})
  28.         text = r.text
  29.  
  30.         if text == '0' or text == '':
  31.             raise Exception("Ошибка авторизации")
  32.  
  33.     def post_ad(self,
  34.                 content,
  35.                 phone,
  36.                 second_pid,
  37.                 third_rubric,
  38.                 price=0,
  39.                 pk=1000,
  40.                 add_rooms='',
  41.                 add_model='',
  42.                 add_color='',
  43.                 add_year='',
  44.                 add_run='',
  45.                 map_lat=0,
  46.                 map_lng=0,
  47.                 full_content='',
  48.                 files=[],
  49.                 ad_id=None):
  50.         """Добавляет либо редактирует объявление если передан ad_id."""
  51.  
  52.         url = self.base_url + '/cabinet.html?announce' + ('&id=' + str(ad_id)
  53.                                                      if ad_id else '')
  54.         r = self.session.get(url)
  55.         text = r.text
  56.         hidden = re.findall('<input type="hidden" name="([^"]+)" value="([^"]+)', text)
  57.         """
  58.        [('retpath', 'http,//mail.yandex.ru/for/belg.ru'),
  59.         ('price', '0'),
  60.         ('map_noconfirm', '0'),
  61.         ('map_lat', '0'),
  62.         ('map_lng', '0'),
  63.         ('p_uid', '***'),
  64.         ('a_id', '***'),
  65.         ('act', 'new'),
  66.         ('q_id', '***')]
  67.        """
  68.         hiddendict = dict(hidden)
  69.         """
  70.        (function(selector) {
  71.            var o = {};
  72.            $.each($($(selector)[0]).serializeArray(), function(_, v) {
  73.                o[v.name] = v.value;
  74.            });
  75.            var js = JSON.stringify(o, 0, 4);
  76.            console.log(js);
  77.            prompt('Copy,', js);
  78.        })('#an_add_form');
  79.        // http,//belg.ru/cabinet.html?announce
  80.        """
  81.         m = re.search(r'<img src="(/antibot/\?PHPSESSID=[^"]+)', text)
  82.         captcha_url = self.base_url + m.group(1)
  83.  
  84.         d = CaptchaDialog(captcha_url, self.session)
  85.  
  86.         keystring = ''
  87.         if d.exec_():
  88.             keystring = d.ui.captchaEdit.text()
  89.  
  90.         payload = [
  91.             ("content",       content),
  92.             ("phone[]",       phone),
  93.             ("second_pid",    second_pid),
  94.             ("third_rubric",  third_rubric),
  95.             ("price",         price),
  96.             ("pk",            pk),
  97.             ("add_rooms",     add_rooms),
  98.             ("add_model",     add_model),
  99.             ("add_color",     add_color),
  100.             ("add_year",      add_year),
  101.             ("add_run",       add_run),
  102.             ("map_noconfirm", 1 if int(map_lat) == 0 and int(map_lng) == 0 else 0),
  103.             ("map_lat",       map_lat),
  104.             ("map_lng",       map_lng),
  105.             ("full_content",  full_content),
  106.             ("p_uid",         hiddendict['p_uid']),
  107.             ("a_id",          hiddendict['a_id']),
  108.             ("act",           hiddendict['act']),
  109.             ("keystring",     keystring)
  110.         ]
  111.  
  112.         if files:
  113.             for filename in files:
  114.                 fp = open(filename, 'rb')
  115.                 data = fp.read()
  116.                 fp.close()
  117.  
  118.                 payload1 = {
  119.                     'uid': hiddendict['p_uid'],
  120.                     'a_id': hiddendict['a_id'],
  121.                     'act': 'new'
  122.                 }
  123.  
  124.                 url = self.base_url + '/altcms/extensions/cabinet/inc/upload.php'
  125.                 r = self.session.post(url, payload1,
  126.                                       files={'myfile': (os.path.basename(filename),
  127.                                                         data)})
  128.                
  129.                 payload.append(('filearr[]', r.text))
  130.  
  131.         payload = urlencode(payload, encoding='1251')
  132.         r = self.session.post(self.base_url + '/altcms/extensions/cabinet/save.php',
  133.                               payload,
  134.                               headers={'Content-Type': 'application/x-www-form-urlencoded'})
  135.  
  136.         # Объявление сохранено
  137.         if r.url == self.base_url + '/cabinet.html?me_announce&save':
  138.             return hiddendict['a_id']
  139.  
  140.             # Ищем первое объявление в списке
  141.             r = self.session.get(r.url)
  142.             regex = r'/cabinet\.html\?announce&id=([^"]+)'
  143.             m = re.search(regex, r.text)
  144.             ad_id = int(m.group(1))
  145.             # Возвращаем id объявления
  146.             return ad_id
  147.  
  148.         raise Exception("Ошибка при сохранении объявления")
  149.  
  150.     def del_ad(self, ad_id):
  151.         url = self.base_url + '/altcms/extensions/cabinet/inc/a_del.php'
  152.         r = self.session.post(url, {'id': ad_id},
  153.                               headers={'X-Requested-With': 'XMLHttpRequest'})
  154.  
  155.         if r.text != 'ok':
  156.             raise Exception("Ошибка удаления объявления")
  157.  
  158.  
  159. if __name__ == '__main__':
  160.     c = Client()
  161.     c.auth('***', '***', 'st')
  162.     kw = dict(content='Тестовое объявление',
  163.               phone='***',
  164.               second_pid='070100',
  165.               third_rubric='070101',
  166.               files=['D:\\Gallery\\Говно\\82Y6jtWYuKA.jpg',
  167.                      'D:\\Gallery\\Говно\\270b6e0f875a67723f6891933f1569bd.jpg'])
  168.     ad_id = c.post_ad(**kw)
  169.     # А теперь отредактируем объявление
  170.     kw = dict(kw)
  171.     kw['content'] = 'Текст объявления изменен'
  172.     assert ad_id == c.post_ad(ad_id=ad_id, **kw)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement