Advertisement
stuppid_bot

Untitled

Feb 17th, 2016
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.26 KB | None | 0 0
  1. ########################################################################
  2. # Copyright (c) 2013-2016. Сергей Снегирев <tz4678@gmail.com>.         #
  3. # Авторские права защищены Законом.                                    #
  4. #                                                                      #
  5. # Вы можете распространять на безвозмездной основе данное ПО (далее по #
  6. # тексту - программное обеспечение). Вы можете модицировать данное ПО  #
  7. # для использования в личных целях без права распространения.          #
  8. # Автор(-ы) не несёт(-ут) отвественности за прямой или косвенный вред, #
  9. # причиненный данным ПО. ДАННОЕ ПО ВЫ ИСПОЛЬЗУЕТЕ НА СВОЙ СТРАХ И      #
  10. # РИСК.                                                                #
  11. ########################################################################
  12. from .api import (
  13.     ApiClient,
  14.     ApiError,
  15.     ClientError,
  16.     NetworkError,
  17.     UploadError
  18. )
  19. from .progressdialog import ProgressDialog
  20. from .ui.friends_delete_dialog import Ui_FriendsDeleteDialog
  21. from .ui.friends_requests_cancel_dialog import Ui_FriendsRequestsCancelDialog
  22. from PyQt5.QtCore import (
  23.     pyqtProperty,
  24.     pyqtSignal,
  25.     pyqtSlot,
  26.     QObject,
  27.     QTimer
  28. )
  29. from PyQt5.QtWidgets import QDialog, QMessageBox
  30. import logging
  31. import time
  32.  
  33. log = logging.getLogger(__name__)
  34.  
  35.  
  36. class Bot(ApiClient):
  37.     authenticateCall = pyqtSignal()
  38.     wallTestCall = pyqtSignal()
  39.     wallDeleteCall = pyqtSignal()
  40.     friendsDeleteCall = pyqtSignal()
  41.     friendsRequestsSubmitCall = pyqtSignal()
  42.     friendsRequestsCancelCall = pyqtSignal()
  43.     followersAddCall = pyqtSignal()
  44.     followersBlockCall = pyqtSignal()
  45.  
  46.     def __init__(self, *arg, **kw):
  47.         super().__init__(*arg, **kw)
  48.         self.authenticateCall.connect(self.authenticate)
  49.         self.wallTestCall.connect(self.wallTest)
  50.         self.wallDeleteCall.connect(self.wallDelete)
  51.         self.friendsDeleteCall.connect(self.friendsDelete)
  52.         self.friendsRequestsSubmitCall.connect(self.friendsRequestsSubmit)
  53.         self.friendsRequestsCancelCall.connect(self.friendsRequestsCancel)
  54.         self.followersAddCall.connect(self.followersAdd)
  55.         self.followersBlockCall.connect(self.followersBlock)
  56.  
  57.     @pyqtProperty(bool, constant=True)
  58.     def isAuthed(self):
  59.         return bool(self.token and self.token.access)
  60.  
  61.     def wallTest(self):
  62.         for i in range(1, 21):
  63.             self.api.wall.post(
  64.                 message="Тестовое сообщение #{}. Timestamp: {}".format(
  65.                     i, time.time()))
  66.  
  67.     # VkBot.wallDeleteCall()
  68.     def wallDelete(self):
  69.         answer = QMessageBox.question(
  70.             None,
  71.             self.tr("Удалить записи со стены?"),
  72.             self.tr("Вы действительно хотите удалить записи со стены?")
  73.         )
  74.         if answer != QMessageBox.Yes:
  75.             return
  76.         log.debug("Начали удалять записи со стены")
  77.         task = WallDeleteTask(self)
  78.         task.run()
  79.  
  80.     def friendsDelete(self):
  81.         dialog = FriendsDeleteDialog()
  82.         if not dialog.exec_():
  83.             return
  84.         flags = 0
  85.         if dialog.deletedCheck.checkState() == 2:
  86.             flags |= FRIEND_DELETED
  87.         if dialog.bannedCheck.checkState() == 2:
  88.             flags |= FRIEND_BANNED
  89.         if dialog.inactiveCheck.checkState() == 2:
  90.             flags |= FRIEND_INACTIVE
  91.         task = FriendsDeleteTask(self, flags)
  92.         task.run()
  93.  
  94.     def friendsRequestsSubmit(self):
  95.         FriendsRequestsSubmitTask(self).run()
  96.  
  97.     def friendsRequestsCancel(self):
  98.         d = FriendsRequestsCancelDialog()
  99.         if not d.exec_():
  100.             return
  101.         addBlackList = d.addBlackListCheck.checkState() == 2
  102.         FriendsRequestsCancelTask(self, addBlackList).run()
  103.  
  104.     def followersAdd(self):
  105.         FollowersAddTask(self).run()
  106.  
  107.     def followersBlock(self):
  108.         answer = QMessageBox.question(
  109.             None,
  110.             self.tr("Заблокировать подписчиков?"),
  111.             self.tr("Вы действительно хотите заблокировать подписчиков?")
  112.         )
  113.         if answer != QMessageBox.Yes:
  114.             return
  115.         FollowersBlockTask(self).run()
  116.  
  117.     @pyqtSlot(str)
  118.     def say(self, what):
  119.         log.info("VkBot say: {}".format(what))
  120.  
  121.  
  122. class Task(QObject):
  123.     def __init__(self, bot, title, text):
  124.         super().__init__(bot)
  125.         self.bot = bot
  126.         self.dialog = ProgressDialog()
  127.         self.dialog.setWindowTitle(self.tr(title))
  128.         self.dialog.text.setText(self.tr(text))
  129.         self.dialog.cancel.clicked.connect(self.stop)
  130.         self.dialog.progress.setValue(0)
  131.         self.running = True
  132.  
  133.     def run(self):
  134.         self.dialog.show()
  135.         self.handle()
  136.  
  137.     def handle(self):
  138.         # while self.running:
  139.         #     do smth
  140.         pass
  141.  
  142.     def stop(self):
  143.         self.running = False
  144.         self.dialog.close()
  145.  
  146.  
  147. class WallDeleteTask(Task):
  148.     def __init__(self, bot):
  149.         super().__init__(
  150.             bot,
  151.             "Удаление записей со стены",
  152.             "Получаем список записей"
  153.         )
  154.  
  155.     def handle(self):
  156.         # https://vk.com/dev/wall.get
  157.         offset = 0
  158.         count = 100
  159.         post_ids = []
  160.         while self.running:
  161.             wall = self.bot.api.wall.get(offset=offset, count=count)
  162.             post_ids += [post.id for post in wall['items']]
  163.             offset += count
  164.             if offset >= wall.count:
  165.                 break
  166.         self.dialog.progress.setMaximum(len(post_ids))
  167.         counter = 0
  168.         self.dialog.text.setText(self.tr("Удаляем записи"))
  169.         for post_id in post_ids:
  170.             if not self.running:
  171.                 return
  172.             self.bot.api.wall.delete(post_id=post_id)
  173.             counter += 1
  174.             self.dialog.progress.setValue(counter)
  175.         self.dialog.close()
  176.  
  177.  
  178. FRIEND_BANNED = 0b001
  179. FRIEND_DELETED = 0b010
  180. FRIEND_INACTIVE = 0b100
  181. HUNDRED_DAYS = 100 * 24 * 60 * 60
  182.  
  183.  
  184. class FriendsDeleteTask(Task):
  185.     def __init__(self, bot, flags=0):
  186.         super().__init__(
  187.             bot,
  188.             "Удаление друзей",
  189.             "Получаем список друзей"
  190.         )
  191.         self.flags = flags
  192.  
  193.     def handle(self):
  194.         offset = 0
  195.         count = 5000
  196.         if self.flags == 0:
  197.             user_ids = []
  198.             while self.running:
  199.                 friends = self.bot.api.friends.get(offset=offset, count=count)
  200.                 user_ids += friends['items']
  201.                 offset += count
  202.                 if offset >= friends.count:
  203.                     break
  204.         else:
  205.             user_ids = []
  206.             ts = time.time() - HUNDRED_DAYS
  207.             while self.running:
  208.                 friends = self.bot.api.friends.get(
  209.                     offset=offset,
  210.                     count=count,
  211.                     # Все равно какое, но поле задать нужно
  212.                     fields='last_seen'
  213.                 )
  214.                 for friend in friends['items']:
  215.                     if self.flags & FRIEND_BANNED:
  216.                         if friend.get('deactivated') == 'banned':
  217.                             user_ids.append(friend.id)
  218.                     if self.flags & FRIEND_DELETED:
  219.                         if friend.get('deactivated') == 'deleted':
  220.                             user_ids.append(friend.id)
  221.                     if self.flags & FRIEND_INACTIVE:
  222.                         # print(friend)
  223.                         if ('last_seen' in friend and
  224.                                 friend.last_seen.time < ts):
  225.                             # Более 100 дней назад заходил(а)
  226.                             user_ids.append(friend.id)
  227.                 offset += count
  228.                 if offset >= friends.count:
  229.                     break
  230.         self.dialog.progress.setMaximum(len(user_ids))
  231.         counter = 0
  232.         self.dialog.text.setText(self.tr("Удаляем друзей"))
  233.         for uid in user_ids:
  234.             if not self.running:
  235.                 return
  236.             self.bot.api.friends.delete(user_id=uid)
  237.             counter += 1
  238.             self.dialog.progress.setValue(counter)
  239.         self.dialog.close()
  240.  
  241.  
  242. class FriendsRequestsSubmitTask(Task):
  243.     def __init__(self, bot):
  244.         super().__init__(
  245.             bot,
  246.             "Подтверждение заявок",
  247.             "Получаем список заявок в друзья"
  248.         )
  249.  
  250.     def handle(self):
  251.         offset = 0
  252.         count = 1000
  253.         user_ids = []
  254.         while self.running:
  255.             friends = self.bot.api.friends.getRequests(
  256.                 offset=offset,
  257.                 count=count
  258.             )
  259.             user_ids += friends['items']
  260.             offset += count
  261.             if offset >= friends.count:
  262.                 break
  263.         self.dialog.progress.setMaximum(len(user_ids))
  264.         counter = 0
  265.         self.dialog.text.setText(self.tr("Добавляем в друзья"))
  266.         for uid in user_ids:
  267.             if not self.running:
  268.                 return
  269.             self.bot.api.friends.add(user_id=uid)
  270.             counter += 1
  271.             self.dialog.progress.setValue(counter)
  272.         self.dialog.close()
  273.  
  274.  
  275. class FriendsRequestsCancelTask(Task):
  276.     def __init__(self, bot, addBlackList=False):
  277.         super().__init__(
  278.             bot,
  279.             "Отмена заявок",
  280.             "Получаем список исходящих заявок в друзья"
  281.         )
  282.         self.addBlackList = addBlackList
  283.  
  284.     def handle(self):
  285.         offset = 0
  286.         count = 1000
  287.         user_ids = []
  288.         while self.running:
  289.             friends = self.bot.api.friends.getRequests(
  290.                 offset=offset,
  291.                 count=count,
  292.                 out=1,
  293.             )
  294.             user_ids += friends['items']
  295.             offset += count
  296.             if offset >= friends.count:
  297.                 break
  298.         self.dialog.progress.setMaximum(len(user_ids))
  299.         counter = 0
  300.         self.dialog.text.setText(self.tr("Отменяем заявки"))
  301.         for uid in user_ids:
  302.             if not self.running:
  303.                 return
  304.             self.bot.api.friends.delete(user_id=uid)
  305.             if self.addBlackList:
  306.                 self.bot.api.account.banUser(user_id=uid)
  307.             counter += 1
  308.             self.dialog.progress.setValue(counter)
  309.         self.dialog.close()
  310.  
  311.  
  312. class FollowersAddTask(Task):
  313.     def __init__(self, bot):
  314.         super().__init__(
  315.             bot,
  316.             "Добавление подписчиков",
  317.             "Получаем список подписчиков"
  318.         )
  319.  
  320.     def handle(self):
  321.         offset = 0
  322.         count = 1000
  323.         user_ids = []
  324.         while self.running:
  325.             users = self.bot.api.users.getFollowers(
  326.                 offset=offset,
  327.                 count=count
  328.             )
  329.             user_ids += users['items']
  330.             offset += count
  331.             if offset >= users.count:
  332.                 break
  333.         self.dialog.progress.setMaximum(len(user_ids))
  334.         counter = 0
  335.         self.dialog.text.setText(self.tr("Добавляем в друзья"))
  336.         for uid in user_ids:
  337.             if not self.running:
  338.                 return
  339.             self.bot.api.friends.add(user_id=uid)
  340.             counter += 1
  341.             self.dialog.progress.setValue(counter)
  342.         self.dialog.close()
  343.  
  344.  
  345. class FollowersBlockTask(Task):
  346.     def __init__(self, bot):
  347.         super().__init__(
  348.             bot,
  349.             "Блокировка подписчиков",
  350.             "Получаем список подписчиков"
  351.         )
  352.  
  353.     def handle(self):
  354.         offset = 0
  355.         count = 1000
  356.         user_ids = []
  357.         while self.running:
  358.             users = self.bot.api.users.getFollowers(
  359.                 offset=offset,
  360.                 count=count
  361.             )
  362.             user_ids += users['items']
  363.             offset += count
  364.             if offset >= users.count:
  365.                 break
  366.         self.dialog.progress.setMaximum(len(user_ids))
  367.         counter = 0
  368.         self.dialog.text.setText(self.tr("Блокируем"))
  369.         for uid in user_ids:
  370.             if not self.running:
  371.                 return
  372.             self.bot.api.account.banUser(user_id=uid)
  373.             counter += 1
  374.             self.dialog.progress.setValue(counter)
  375.         self.dialog.close()
  376.  
  377.  
  378. class FriendsDeleteDialog(QDialog, Ui_FriendsDeleteDialog):
  379.     def __init__(self, parent=None):
  380.         super(QDialog, self).__init__(parent)
  381.         self.setupUi(self)
  382.  
  383.  
  384. class FriendsRequestsCancelDialog(QDialog, Ui_FriendsRequestsCancelDialog):
  385.     def __init__(self, parent=None):
  386.         super(QDialog, self).__init__(parent)
  387.         self.setupUi(self)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement