Advertisement
Guest User

instabot.py

a guest
Jul 12th, 2018
3,376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 43.02 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from __future__ import print_function
  5. from .unfollow_protocol import unfollow_protocol
  6. from .userinfo import UserInfo
  7. import atexit
  8. import datetime
  9. import itertools
  10. import json
  11. import logging
  12. import random
  13. import signal
  14. import sys
  15. import sqlite3
  16. import time
  17. import requests
  18. from .sql_updates import check_and_update, check_already_liked, check_already_followed
  19. from .sql_updates import insert_media, insert_username, insert_unfollow_count
  20. from .sql_updates import get_usernames_first, get_usernames, get_username_random
  21. from .sql_updates import check_and_insert_user_agent
  22. from fake_useragent import UserAgent
  23. import re
  24.  
  25. class InstaBot:
  26.     """
  27.    Instagram bot v 1.2.0
  28.    like_per_day=1000 - How many likes set bot in one day.
  29.  
  30.    media_max_like=0 - Don't like media (photo or video) if it have more than
  31.    media_max_like likes.
  32.  
  33.    media_min_like=0 - Don't like media (photo or video) if it have less than
  34.    media_min_like likes.
  35.  
  36.    tag_list = ['cat', 'car', 'dog'] - Tag list to like.
  37.  
  38.    max_like_for_one_tag=5 - Like 1 to max_like_for_one_tag times by row.
  39.  
  40.    log_mod = 0 - Log mod: log_mod = 0 log to console, log_mod = 1 log to file,
  41.    log_mod = 2 no log.
  42.  
  43.    https://github.com/LevPasha/instabot.py
  44.    """
  45.     database_name = "follows_db.db"
  46.     follows_db = None
  47.     follows_db_c = None
  48.  
  49.     url = 'https://www.instagram.com/'
  50.     url_tag = 'https://www.instagram.com/explore/tags/%s/?__a=1'
  51.     url_likes = 'https://www.instagram.com/web/likes/%s/like/'
  52.     url_unlike = 'https://www.instagram.com/web/likes/%s/unlike/'
  53.     url_comment = 'https://www.instagram.com/web/comments/%s/add/'
  54.     url_follow = 'https://www.instagram.com/web/friendships/%s/follow/'
  55.     url_unfollow = 'https://www.instagram.com/web/friendships/%s/unfollow/'
  56.     url_login = 'https://www.instagram.com/accounts/login/ajax/'
  57.     url_logout = 'https://www.instagram.com/accounts/logout/'
  58.     url_media_detail = 'https://www.instagram.com/p/%s/?__a=1'
  59.     url_user_detail = 'https://www.instagram.com/%s/'
  60.     api_user_detail = 'https://i.instagram.com/api/v1/users/%s/info/'
  61.  
  62.     user_agent = "" ""
  63.     accept_language = 'en-US,en;q=0.5'
  64.  
  65.     # If instagram ban you - query return 400 error.
  66.     error_400 = 0
  67.     # If you have 3 400 error in row - looks like you banned.
  68.     error_400_to_ban = 3
  69.     # If InstaBot think you are banned - going to sleep.
  70.     ban_sleep_time = 2 * 60 * 60
  71.  
  72.     # All counter.
  73.     bot_mode = 0
  74.     like_counter = 0
  75.     follow_counter = 0
  76.     unfollow_counter = 0
  77.     comments_counter = 0
  78.     current_user = 'hajka'
  79.     current_index = 0
  80.     current_id = 'abcds'
  81.     # List of user_id, that bot follow
  82.     bot_follow_list = []
  83.     user_info_list = []
  84.     user_list = []
  85.     ex_user_list = []
  86.     unwanted_username_list = []
  87.     is_checked = False
  88.     is_selebgram = False
  89.     is_fake_account = False
  90.     is_active_user = False
  91.     is_following = False
  92.     is_follower = False
  93.     is_rejected = False
  94.     is_self_checking = False
  95.     is_by_tag = False
  96.     is_follower_number = 0
  97.  
  98.     self_following = 0
  99.     self_follower = 0
  100.  
  101.     # Log setting.
  102.     logging.basicConfig(filename='errors.log', level=logging.INFO)
  103.     log_file_path = ''
  104.     log_file = 0
  105.  
  106.     # Other.
  107.     user_id = 0
  108.     media_by_tag = 0
  109.     media_on_feed = []
  110.     media_by_user = []
  111.     login_status = False
  112.  
  113.     # Running Times
  114.     start_at_h = 0,
  115.     start_at_m = 0,
  116.     end_at_h = 23,
  117.     end_at_m = 59,
  118.  
  119.     # For new_auto_mod
  120.     next_iteration = {"Like": 0, "Follow": 0, "Unfollow": 0, "Comments": 0}
  121.  
  122.     def __init__(self,
  123.                  login,
  124.                  password,
  125.                  like_per_day=1000,
  126.                  media_max_like=50,
  127.                  media_min_like=0,
  128.                  follow_per_day=0,
  129.                  follow_time=5 * 60 * 60,
  130.                  unfollow_per_day=0,
  131.                  start_at_h=0,
  132.                  start_at_m=0,
  133.                  end_at_h=23,
  134.                  end_at_m=59,
  135.                  database_name='follows_db.db',
  136.                  comment_list=[["this", "the", "your"],
  137.                                ["photo", "picture", "pic", "shot", "snapshot"],
  138.                                ["is", "looks", "feels", "is really"],
  139.                                ["great", "super", "good", "very good", "good",
  140.                                 "wow", "WOW", "cool", "GREAT", "magnificent",
  141.                                 "magical", "very cool", "stylish", "beautiful",
  142.                                 "so beautiful", "so stylish", "so professional",
  143.                                 "lovely", "so lovely", "very lovely", "glorious",
  144.                                 "so glorious", "very glorious", "adorable",
  145.                                 "excellent", "amazing"],
  146.                                [".", "..", "...", "!", "!!", "!!!"]],
  147.                  comments_per_day=0,
  148.                  tag_list=['cat', 'car', 'dog'],
  149.                  max_like_for_one_tag=5,
  150.                  unfollow_break_min=15,
  151.                  unfollow_break_max=30,
  152.                  log_mod=0,
  153.                  proxy="",
  154.                  user_blacklist={},
  155.                  tag_blacklist=[],
  156.                  unwanted_username_list=[],
  157.                  unfollow_whitelist=[]):
  158.  
  159.         self.database_name = database_name
  160.         self.follows_db = sqlite3.connect(database_name, timeout=0, isolation_level=None)
  161.         self.follows_db_c = self.follows_db.cursor()
  162.         check_and_update(self)
  163.         fake_ua = UserAgent()
  164.         self.user_agent = check_and_insert_user_agent(self, str(fake_ua.random))
  165.         self.bot_start = datetime.datetime.now()
  166.         self.start_at_h = start_at_h
  167.         self.start_at_m = start_at_m
  168.         self.end_at_h = end_at_h
  169.         self.end_at_m = end_at_m
  170.         self.unfollow_break_min = unfollow_break_min
  171.         self.unfollow_break_max = unfollow_break_max
  172.         self.user_blacklist = user_blacklist
  173.         self.tag_blacklist = tag_blacklist
  174.         self.unfollow_whitelist = unfollow_whitelist
  175.         self.comment_list = comment_list
  176.  
  177.         self.time_in_day = 24 * 60 * 60
  178.         # Like
  179.         self.like_per_day = like_per_day
  180.         if self.like_per_day != 0:
  181.             self.like_delay = self.time_in_day / self.like_per_day
  182.  
  183.         # Follow
  184.         self.follow_time = follow_time
  185.         self.follow_per_day = follow_per_day
  186.         if self.follow_per_day != 0:
  187.             self.follow_delay = self.time_in_day / self.follow_per_day
  188.  
  189.         # Unfollow
  190.         self.unfollow_per_day = unfollow_per_day
  191.         if self.unfollow_per_day != 0:
  192.             self.unfollow_delay = self.time_in_day / self.unfollow_per_day
  193.  
  194.         # Comment
  195.         self.comments_per_day = comments_per_day
  196.         if self.comments_per_day != 0:
  197.             self.comments_delay = self.time_in_day / self.comments_per_day
  198.  
  199.         # Don't like if media have more than n likes.
  200.         self.media_max_like = media_max_like
  201.         # Don't like if media have less than n likes.
  202.         self.media_min_like = media_min_like
  203.         # Auto mod seting:
  204.         # Default list of tag.
  205.         self.tag_list = tag_list
  206.         # Get random tag, from tag_list, and like (1 to n) times.
  207.         self.max_like_for_one_tag = max_like_for_one_tag
  208.         # log_mod 0 to console, 1 to file
  209.         self.log_mod = log_mod
  210.         self.s = requests.Session()
  211.         # if you need proxy make something like this:
  212.         # self.s.proxies = {"https" : "http://proxyip:proxyport"}
  213.         # by @ageorgios
  214.         if proxy != "":
  215.             proxies = {
  216.                 'http': 'http://' + proxy,
  217.                 'https': 'http://' + proxy,
  218.             }
  219.             self.s.proxies.update(proxies)
  220.         # convert login to lower
  221.         self.user_login = login.lower()
  222.         self.user_password = password
  223.         self.bot_mode = 0
  224.         self.media_by_tag = []
  225.         self.media_on_feed = []
  226.         self.media_by_user = []
  227.         self.unwanted_username_list = unwanted_username_list
  228.         now_time = datetime.datetime.now()
  229.         log_string = 'Instabot v1.2.0 started at %s:\n' % \
  230.                      (now_time.strftime("%d.%m.%Y %H:%M"))
  231.         self.write_log(log_string)
  232.         self.login()
  233.         self.populate_user_blacklist()
  234.         signal.signal(signal.SIGTERM, self.cleanup)
  235.         atexit.register(self.cleanup)
  236.  
  237.     def populate_user_blacklist(self):
  238.         for user in self.user_blacklist:
  239.             user_id_url = self.url_user_detail % (user)
  240.             info = self.s.get(user_id_url)
  241.  
  242.             # prevent error if 'Account of user was deleted or link is invalid
  243.             from json import JSONDecodeError
  244.             try:
  245.                 all_data = json.loads(info.text)
  246.             except JSONDecodeError as e:
  247.                 self.write_log('Account of user %s was deleted or link is '
  248.                                'invalid' % (user))
  249.             else:
  250.                 # prevent exception if user have no media
  251.                 id_user = all_data['user']['id']
  252.                 # Update the user_name with the user_id
  253.                 self.user_blacklist[user] = id_user
  254.                 log_string = "Blacklisted user %s added with ID: %s" % (user,
  255.                                                                         id_user)
  256.                 self.write_log(log_string)
  257.                 time.sleep(5 * random.random())
  258.  
  259.     def login(self):
  260.         log_string = 'Trying to login as %s...\n' % (self.user_login)
  261.         self.write_log(log_string)
  262.         self.login_post = {
  263.             'username': self.user_login,
  264.             'password': self.user_password
  265.         }
  266.  
  267.         self.s.headers.update({
  268.             'Accept': '*/*',
  269.             'Accept-Language': self.accept_language,
  270.             'Accept-Encoding': 'gzip, deflate, br',
  271.             'Connection': 'keep-alive',
  272.             'Content-Length': '0',
  273.             'Host': 'www.instagram.com',
  274.             'Origin': 'https://www.instagram.com',
  275.             'Referer': 'https://www.instagram.com/',
  276.             'User-Agent': self.user_agent,
  277.             'X-Instagram-AJAX': '1',
  278.             'Content-Type': 'application/x-www-form-urlencoded',
  279.             'X-Requested-With': 'XMLHttpRequest'
  280.         })
  281.  
  282.         r = self.s.get(self.url)
  283.         self.s.headers.update({'X-CSRFToken': r.cookies['csrftoken']})
  284.         time.sleep(5 * random.random())
  285.         login = self.s.post(
  286.             self.url_login, data=self.login_post, allow_redirects=True)
  287.         self.s.headers.update({'X-CSRFToken': login.cookies['csrftoken']})
  288.         self.csrftoken = login.cookies['csrftoken']
  289.         #ig_vw=1536; ig_pr=1.25; ig_vh=772;  ig_or=landscape-primary;
  290.         self.s.cookies['ig_vw'] = '1536'
  291.         self.s.cookies['ig_pr'] = '1.25'
  292.         self.s.cookies['ig_vh'] = '772'
  293.         self.s.cookies['ig_or'] = 'landscape-primary'
  294.         time.sleep(5 * random.random())
  295.  
  296.         if login.status_code == 200:
  297.             r = self.s.get('https://www.instagram.com/')
  298.             finder = r.text.find(self.user_login)
  299.             if finder != -1:
  300.                 ui = UserInfo()
  301.                 self.user_id = ui.get_user_id_by_login(self.user_login)
  302.                 self.login_status = True
  303.                 log_string = '%s login success!' % (self.user_login)
  304.                 self.write_log(log_string)
  305.             else:
  306.                 self.login_status = False
  307.                 self.write_log('Login error! Check your login data!')
  308.         else:
  309.             self.write_log('Login error! Connection error!')
  310.  
  311.     def logout(self):
  312.         now_time = datetime.datetime.now()
  313.         log_string = 'Logout: likes - %i, follow - %i, unfollow - %i, comments - %i.' % \
  314.                      (self.like_counter, self.follow_counter,
  315.                       self.unfollow_counter, self.comments_counter)
  316.         self.write_log(log_string)
  317.         work_time = datetime.datetime.now() - self.bot_start
  318.         log_string = 'Bot work time: %s' % (work_time)
  319.         self.write_log(log_string)
  320.  
  321.         try:
  322.             logout_post = {'csrfmiddlewaretoken': self.csrftoken}
  323.             logout = self.s.post(self.url_logout, data=logout_post)
  324.             self.write_log("Logout success!")
  325.             self.login_status = False
  326.         except:
  327.             logging.exception("Logout error!")
  328.  
  329.     def cleanup(self, *_):
  330.         # Unfollow all bot follow
  331.         if self.follow_counter >= self.unfollow_counter:
  332.             for f in self.bot_follow_list:
  333.                 log_string = "Trying to unfollow: %s" % (f[0])
  334.                 self.write_log(log_string)
  335.                 self.unfollow_on_cleanup(f[0])
  336.                 sleeptime = random.randint(self.unfollow_break_min,
  337.                                            self.unfollow_break_max)
  338.                 log_string = "Pausing for %i seconds... %i of %i" % (
  339.                     sleeptime, self.unfollow_counter, self.follow_counter)
  340.                 self.write_log(log_string)
  341.                 time.sleep(sleeptime)
  342.                 self.bot_follow_list.remove(f)
  343.  
  344.         # Logout
  345.         if self.login_status:
  346.             self.logout()
  347.  
  348.     def get_media_id_by_tag(self, tag):
  349.         """ Get media ID set, by your hashtag """
  350.  
  351.         if self.login_status:
  352.             log_string = "Get media id by tag: %s" % (tag)
  353.             self.write_log(log_string)
  354.             if self.login_status == 1:
  355.                 url_tag = self.url_tag % (tag)
  356.                 try:
  357.                     r = self.s.get(url_tag)
  358.                     all_data = json.loads(r.text)
  359.                     self.media_by_tag = list(all_data['graphql']['hashtag']['edge_hashtag_to_media']['edges'])
  360.                 except:
  361.                     self.media_by_tag = []
  362.                     self.write_log("Except on get_media!")
  363.                     logging.exception("get_media_id_by_tag")
  364.             else:
  365.                 return 0
  366.  
  367.     def get_instagram_url_from_media_id(self, media_id, url_flag=True, only_code=None):
  368.         """ Get Media Code or Full Url from Media ID Thanks to Nikished """
  369.         media_id = int(media_id)
  370.         if url_flag is False: return ""
  371.         else:
  372.             alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
  373.             shortened_id = ''
  374.             while media_id > 0:
  375.                 media_id, idx = divmod(media_id, 64)
  376.                 shortened_id = alphabet[idx] + shortened_id
  377.             if only_code: return shortened_id
  378.             else: return 'instagram.com/p/' + shortened_id + '/'
  379.  
  380.     def get_username_by_media_id(self, media_id):
  381.         """ Get username by media ID Thanks to Nikished """
  382.  
  383.         if self.login_status:
  384.             if self.login_status == 1:
  385.                 media_id_url = self.get_instagram_url_from_media_id(int(media_id), only_code=True)
  386.                 url_media = self.url_media_detail % (media_id_url)
  387.                 try:
  388.                     r = self.s.get(url_media)
  389.                     all_data = json.loads(r.text)
  390.  
  391.                     username = str(all_data['graphql']['shortcode_media']['owner']['username'])
  392.                     self.write_log("media_id=" + media_id + ", media_id_url=" +
  393.                                    media_id_url + ", username_by_media_id=" + username)
  394.                     return username
  395.                 except:
  396.                     logging.exception("username_by_mediaid exception")
  397.                     return False
  398.             else:
  399.                 return ""
  400.  
  401.     def get_username_by_user_id(self, user_id):
  402.         """ Get username by user_id """
  403.         if self.login_status:
  404.             try:
  405.                 url_info = self.api_user_detail % user_id
  406.                 r = self.s.get(url_info, headers="")
  407.                 all_data = json.loads(r.text)
  408.                 username = all_data["user"]["username"]
  409.                 return username
  410.             except:
  411.                 logging.exception("Except on get_username_by_user_id")
  412.                 return False
  413.         else:
  414.             return False
  415.  
  416.     def get_userinfo_by_name(self, username):
  417.         """ Get user info by name """
  418.  
  419.         if self.login_status:
  420.             if self.login_status == 1:
  421.                 url_info = self.url_user_detail % (username)
  422.                 try:
  423.                     r = self.s.get(url_info)
  424.                     all_data = json.loads(r.text)
  425.                     user_info = all_data['user']
  426.                     follows = user_info['follows']['count']
  427.                     follower = user_info['followed_by']['count']
  428.                     follow_viewer = user_info['follows_viewer']
  429.                     if follower > 3000 or follows > 1500:
  430.                         self.write_log('   >>>This is probably Selebgram, Business or Fake account')
  431.                     if follow_viewer:
  432.                         return None
  433.                     return user_info
  434.                 except:
  435.                     logging.exception("Except on get_userinfo_by_name")
  436.                     return False
  437.             else:
  438.                 return False
  439.  
  440.     def like_all_exist_media(self, media_size=-1, delay=True):
  441.         """ Like all media ID that have self.media_by_tag """
  442.  
  443.         if self.login_status:
  444.             if self.media_by_tag != 0:
  445.                 i = 0
  446.                 for d in self.media_by_tag:
  447.                     # Media count by this tag.
  448.                     if media_size > 0 or media_size < 0:
  449.                         media_size -= 1
  450.                         l_c = self.media_by_tag[i]['node']['edge_liked_by']['count']
  451.                         if ((l_c <= self.media_max_like and
  452.                              l_c >= self.media_min_like) or
  453.                             (self.media_max_like == 0 and
  454.                              l_c >= self.media_min_like) or
  455.                             (self.media_min_like == 0 and
  456.                              l_c <= self.media_max_like) or
  457.                             (self.media_min_like == 0 and
  458.                              self.media_max_like == 0)):
  459.                             for blacklisted_user_name, blacklisted_user_id in self.user_blacklist.items(
  460.                             ):
  461.                                 if self.media_by_tag[i]['node']['owner'][
  462.                                         'id'] == blacklisted_user_id:
  463.                                     self.write_log(
  464.                                         "Not liking media owned by blacklisted user: "
  465.                                         + blacklisted_user_name)
  466.                                     return False
  467.                             if self.media_by_tag[i]['node']['owner'][
  468.                                     'id'] == self.user_id:
  469.                                 self.write_log(
  470.                                     "Keep calm - It's your own media ;)")
  471.                                 return False
  472.                             if check_already_liked(self, media_id=self.media_by_tag[i]['node']['id']) == 1:
  473.                                 self.write_log("Keep calm - It's already liked ;)")
  474.                                 return False
  475.                             try:
  476.                                 if (len(self.media_by_tag[i]['node']['edge_media_to_caption']['edges']) > 1):
  477.                                     caption = self.media_by_tag[i]['node']['edge_media_to_caption'][
  478.                                         'edges'][0]['node']['text'].encode(
  479.                                             'ascii', errors='ignore')
  480.                                     tag_blacklist = set(self.tag_blacklist)
  481.                                     if sys.version_info[0] == 3:
  482.                                         tags = {
  483.                                             str.lower(
  484.                                                 (tag.decode('ASCII')).strip('#'))
  485.                                             for tag in caption.split()
  486.                                             if (tag.decode('ASCII')
  487.                                                 ).startswith("#")
  488.                                         }
  489.                                     else:
  490.                                         tags = {
  491.                                             unicode.lower(
  492.                                                 (tag.decode('ASCII')).strip('#'))
  493.                                             for tag in caption.split()
  494.                                             if (tag.decode('ASCII')
  495.                                                 ).startswith("#")
  496.                                         }
  497.  
  498.                                     if tags.intersection(tag_blacklist):
  499.                                         matching_tags = ', '.join(
  500.                                             tags.intersection(tag_blacklist))
  501.                                         self.write_log(
  502.                                             "Not liking media with blacklisted tag(s): "
  503.                                             + matching_tags)
  504.                                         return False
  505.                             except:
  506.                                 logging.exception("Except on like_all_exist_media")
  507.                                 return False
  508.  
  509.                             log_string = "Trying to like media: %s" % \
  510.                                          (self.media_by_tag[i]['node']['id'])
  511.                             self.write_log(log_string)
  512.                             like = self.like(self.media_by_tag[i]['node']['id'])
  513.                             # comment = self.comment(self.media_by_tag[i]['id'], 'Cool!')
  514.                             # follow = self.follow(self.media_by_tag[i]["owner"]["id"])
  515.                             if like != 0:
  516.                                 if like.status_code == 200:
  517.                                     # Like, all ok!
  518.                                     self.error_400 = 0
  519.                                     self.like_counter += 1
  520.                                     log_string = "Liked: %s. Like #%i." % \
  521.                                                  (self.media_by_tag[i]['node']['id'],
  522.                                                   self.like_counter)
  523.                                     insert_media(self,
  524.                                                  media_id=self.media_by_tag[i]['node']['id'],
  525.                                                  status="200")
  526.                                     self.write_log(log_string)
  527.                                 elif like.status_code == 400:
  528.                                     log_string = "Not liked: %i" \
  529.                                                  % (like.status_code)
  530.                                     self.write_log(log_string)
  531.                                     insert_media(self,
  532.                                                  media_id=self.media_by_tag[i]['node']['id'],
  533.                                                  status="400")
  534.                                     # Some error. If repeated - can be ban!
  535.                                     if self.error_400 >= self.error_400_to_ban:
  536.                                         # Look like you banned!
  537.                                         time.sleep(self.ban_sleep_time)
  538.                                     else:
  539.                                         self.error_400 += 1
  540.                                 else:
  541.                                     log_string = "Not liked: %i" \
  542.                                                  % (like.status_code)
  543.                                     insert_media(self,
  544.                                                  media_id=self.media_by_tag[i]['node']['id'],
  545.                                                  status=str(like.status_code))
  546.                                     self.write_log(log_string)
  547.                                     return False
  548.                                     # Some error.
  549.                                 i += 1
  550.                                 if delay:
  551.                                     time.sleep(self.like_delay * 0.9 +
  552.                                                self.like_delay * 0.2 *
  553.                                                random.random())
  554.                                 else:
  555.                                     return True
  556.                             else:
  557.                                 return False
  558.                         else:
  559.                             return False
  560.                     else:
  561.                         return False
  562.             else:
  563.                 self.write_log("No media to like!")
  564.  
  565.     def like(self, media_id):
  566.         """ Send http request to like media by ID """
  567.         if self.login_status:
  568.             url_likes = self.url_likes % (media_id)
  569.             try:
  570.                 like = self.s.post(url_likes)
  571.                 last_liked_media_id = media_id
  572.             except:
  573.                 logging.exception("Except on like!")
  574.                 like = 0
  575.             return like
  576.  
  577.     def unlike(self, media_id):
  578.         """ Send http request to unlike media by ID """
  579.         if self.login_status:
  580.             url_unlike = self.url_unlike % (media_id)
  581.             try:
  582.                 unlike = self.s.post(url_unlike)
  583.             except:
  584.                 logging.exception("Except on unlike!")
  585.                 unlike = 0
  586.             return unlike
  587.  
  588.     def comment(self, media_id, comment_text):
  589.         """ Send http request to comment """
  590.         if self.login_status:
  591.             comment_post = {'comment_text': comment_text}
  592.             url_comment = self.url_comment % (media_id)
  593.             try:
  594.                 comment = self.s.post(url_comment, data=comment_post)
  595.                 if comment.status_code == 200:
  596.                     self.comments_counter += 1
  597.                     log_string = 'Write: "%s". #%i.' % (comment_text,
  598.                                                         self.comments_counter)
  599.                     self.write_log(log_string)
  600.                 return comment
  601.             except:
  602.                 logging.exception("Except on comment!")
  603.         return False
  604.  
  605.     def follow(self, user_id):
  606.         """ Send http request to follow """
  607.         if self.login_status:
  608.             url_follow = self.url_follow % (user_id)
  609.             try:
  610.                 follow = self.s.post(url_follow)
  611.                 if follow.status_code == 200:
  612.                     self.follow_counter += 1
  613.                     log_string = "Followed: %s #%i." % (user_id,
  614.                                                         self.follow_counter)
  615.                     self.write_log(log_string)
  616.                     username = self.get_username_by_user_id(user_id=user_id)
  617.                     insert_username(self, user_id=user_id, username=username)
  618.                 return follow
  619.             except:
  620.                 logging.exception("Except on follow!")
  621.         return False
  622.  
  623.     def unfollow(self, user_id):
  624.         """ Send http request to unfollow """
  625.         if self.login_status:
  626.             url_unfollow = self.url_unfollow % (user_id)
  627.             try:
  628.                 unfollow = self.s.post(url_unfollow)
  629.                 if unfollow.status_code == 200:
  630.                     self.unfollow_counter += 1
  631.                     log_string = "Unfollowed: %s #%i." % (user_id,
  632.                                                           self.unfollow_counter)
  633.                     self.write_log(log_string)
  634.                 return unfollow
  635.             except:
  636.                 logging.exception("Exept on unfollow!")
  637.         return False
  638.  
  639.     def unfollow_on_cleanup(self, user_id):
  640.         """ Unfollow on cleanup by @rjmayott """
  641.         if self.login_status:
  642.             url_unfollow = self.url_unfollow % (user_id)
  643.             try:
  644.                 unfollow = self.s.post(url_unfollow)
  645.                 if unfollow.status_code == 200:
  646.                     self.unfollow_counter += 1
  647.                     log_string = "Unfollow: %s #%i of %i." % (
  648.                         user_id, self.unfollow_counter, self.follow_counter)
  649.                     self.write_log(log_string)
  650.                 else:
  651.                     log_string = "Slow Down - Pausing for 5 minutes so we don't get banned!"
  652.                     self.write_log(log_string)
  653.                     time.sleep(300)
  654.                     unfollow = self.s.post(url_unfollow)
  655.                     if unfollow.status_code == 200:
  656.                         self.unfollow_counter += 1
  657.                         log_string = "Unfollow: %s #%i of %i." % (
  658.                             user_id, self.unfollow_counter,
  659.                             self.follow_counter)
  660.                         self.write_log(log_string)
  661.                     else:
  662.                         log_string = "Still no good :( Skipping and pausing for another 5 minutes"
  663.                         self.write_log(log_string)
  664.                         time.sleep(300)
  665.                     return False
  666.                 return unfollow
  667.             except:
  668.                 log_string = "Except on unfollow... Looks like a network error"
  669.                 logging.exception(log_string)
  670.         return False
  671.  
  672.     def auto_mod(self):
  673.         """ Star loop, that get media ID by your tag list, and like it """
  674.         if self.login_status:
  675.             while True:
  676.                 random.shuffle(self.tag_list)
  677.                 self.get_media_id_by_tag(random.choice(self.tag_list))
  678.                 self.like_all_exist_media(random.randint \
  679.                                               (1, self.max_like_for_one_tag))
  680.  
  681.     def new_auto_mod(self):
  682.         while True:
  683.             now = datetime.datetime.now()
  684.             if (
  685.                     datetime.time(self.start_at_h, self.start_at_m) <= now.time()
  686.                     and now.time() <= datetime.time(self.end_at_h, self.end_at_m)
  687.             ):
  688.                 # ------------------- Get media_id -------------------
  689.                 if len(self.media_by_tag) == 0:
  690.                     self.get_media_id_by_tag(random.choice(self.tag_list))
  691.                     self.this_tag_like_count = 0
  692.                     self.max_tag_like_count = random.randint(
  693.                         1, self.max_like_for_one_tag)
  694.                     self.remove_already_liked()
  695.                 # ------------------- Like -------------------
  696.                 self.new_auto_mod_like()
  697.                 # ------------------- Follow -------------------
  698.                 self.new_auto_mod_follow()
  699.                 # ------------------- Unfollow -------------------
  700.                 self.new_auto_mod_unfollow()
  701.                 # ------------------- Comment -------------------
  702.                 self.new_auto_mod_comments()
  703.                 # Bot iteration in 1 sec
  704.                 time.sleep(3)
  705.                 # print("Tic!")
  706.             else:
  707.                 print("sleeping until {hour}:{min}".format(hour=self.start_at_h,
  708.                                                            min=self.start_at_m), end="\r")
  709.                 time.sleep(100)
  710.  
  711.     def remove_already_liked(self):
  712.         self.write_log("Removing already liked medias..")
  713.         x = 0
  714.         while x < len(self.media_by_tag):
  715.             if check_already_liked(self, media_id=self.media_by_tag[x]['node']['id']) == 1:
  716.                 self.media_by_tag.remove(self.media_by_tag[x])
  717.             else:
  718.                 x += 1
  719.  
  720.     def new_auto_mod_like(self):
  721.         if time.time() > self.next_iteration["Like"] and self.like_per_day != 0 \
  722.                 and len(self.media_by_tag) > 0:
  723.             # You have media_id to like:
  724.             if self.like_all_exist_media(media_size=1, delay=False):
  725.                 # If like go to sleep:
  726.                 self.next_iteration["Like"] = time.time() + \
  727.                                               self.add_time(self.like_delay)
  728.                 # Count this tag likes:
  729.                 self.this_tag_like_count += 1
  730.                 if self.this_tag_like_count >= self.max_tag_like_count:
  731.                     self.media_by_tag = [0]
  732.             # Del first media_id
  733.             del self.media_by_tag[0]
  734.  
  735.     def new_auto_mod_follow(self):
  736.         if time.time() > self.next_iteration["Follow"] and \
  737.                         self.follow_per_day != 0 and len(self.media_by_tag) > 0:
  738.             if self.media_by_tag[0]['node']["owner"]["id"] == self.user_id:
  739.                 self.write_log("Keep calm - It's your own profile ;)")
  740.                 return
  741.             if check_already_followed(self, user_id=self.media_by_tag[0]['node']["owner"]["id"]) == 1:
  742.                 self.write_log("Already followed before " + self.media_by_tag[0]['node']["owner"]["id"])
  743.                 self.next_iteration["Follow"] = time.time() + \
  744.                                                 self.add_time(self.follow_delay/2)
  745.                 return
  746.             log_string = "Trying to follow: %s" % (
  747.                 self.media_by_tag[0]['node']["owner"]["id"])
  748.             self.write_log(log_string)
  749.  
  750.             if self.follow(self.media_by_tag[0]['node']["owner"]["id"]) != False:
  751.                 self.bot_follow_list.append(
  752.                     [self.media_by_tag[0]['node']["owner"]["id"], time.time()])
  753.                 self.next_iteration["Follow"] = time.time() + \
  754.                                                 self.add_time(self.follow_delay)
  755.  
  756.     def new_auto_mod_unfollow(self):
  757.         if time.time() > self.next_iteration["Unfollow"] and self.unfollow_per_day != 0:
  758.             if self.bot_mode == 0:
  759.                 log_string = "Trying to unfollow #%i: " % (self.unfollow_counter + 1)
  760.                 self.write_log(log_string)
  761.                 self.auto_unfollow()
  762.                 self.next_iteration["Unfollow"] = time.time() + \
  763.                                                     self.add_time(self.unfollow_delay)
  764.             if self.bot_mode == 1:
  765.                 unfollow_protocol(self)
  766.  
  767.     def new_auto_mod_comments(self):
  768.         if time.time() > self.next_iteration["Comments"] and self.comments_per_day != 0 \
  769.                 and len(self.media_by_tag) > 0 \
  770.                 and self.check_exisiting_comment(self.media_by_tag[0]['node']['shortcode']) == False:
  771.             comment_text = self.generate_comment()
  772.             log_string = "Trying to comment: %s" % (self.media_by_tag[0]['node']['id'])
  773.             self.write_log(log_string)
  774.             if self.comment(self.media_by_tag[0]['node']['id'], comment_text) != False:
  775.                 self.next_iteration["Comments"] = time.time() + \
  776.                                                   self.add_time(self.comments_delay)
  777.  
  778.     def add_time(self, time):
  779.         """ Make some random for next iteration"""
  780.         return time * 0.9 + time * 0.2 * random.random()
  781.  
  782.     def generate_comment(self):
  783.         c_list = list(itertools.product(*self.comment_list))
  784.  
  785.         repl = [("  ", " "), (" .", "."), (" !", "!")]
  786.         res = " ".join(random.choice(c_list))
  787.         for s, r in repl:
  788.             res = res.replace(s, r)
  789.         return res.capitalize()
  790.  
  791.     def check_exisiting_comment(self, media_code):
  792.         url_check = self.url_media_detail % (media_code)
  793.         check_comment = self.s.get(url_check)
  794.         if check_comment.status_code == 200:
  795.             all_data = json.loads(check_comment.text)
  796.             if all_data['graphql']['shortcode_media']['owner']['id'] == self.user_id:
  797.                 self.write_log("Keep calm - It's your own media ;)")
  798.                 # Del media to don't loop on it
  799.                 del self.media_by_tag[0]
  800.                 return True
  801.             comment_list = list(all_data['graphql']['shortcode_media']['edge_media_to_comment']['edges'])
  802.             for d in comment_list:
  803.                 if d['node']['owner']['id'] == self.user_id:
  804.                     self.write_log("Keep calm - Media already commented ;)")
  805.                     # Del media to don't loop on it
  806.                     del self.media_by_tag[0]
  807.                     return True
  808.             return False
  809.         else:
  810.             insert_media(self, self.media_by_tag[0]['node']['id'], str(check_comment.status_code))
  811.             self.media_by_tag.remove(self.media_by_tag[0])
  812.             return False
  813.  
  814.     def auto_unfollow(self):
  815.         checking = True
  816.         while checking:
  817.             username_row = get_username_random(self)
  818.             if not username_row:
  819.                 self.write_log("Looks like there is nobody to unfollow.")
  820.                 return False
  821.             current_id = username_row[0]
  822.             current_user = username_row[1]
  823.             unfollow_count = username_row[2]
  824.  
  825.             if not current_user:
  826.                 current_user = self.get_username_by_user_id(user_id=current_id)
  827.             if not current_user:
  828.                 log_string = "api limit reached from instagram. Will try later"
  829.                 self.write_log(log_string)
  830.                 return False
  831.             for wluser in self.unfollow_whitelist:
  832.                 if wluser == current_user:
  833.                     log_string = (
  834.                         "found whitelist user, starting search again")
  835.                     self.write_log(log_string)
  836.                     break
  837.             else:
  838.                 checking = False
  839.  
  840.         if self.login_status:
  841.             log_string = "Getting user info : %s" % current_user
  842.             self.write_log(log_string)
  843.             if self.login_status == 1:
  844.                 url_tag = self.url_user_detail % (current_user)
  845.                 try:
  846.                     r = self.s.get(url_tag)
  847.                     all_data = json.loads(re.search('{"activity.+show_app', r.text, re.DOTALL).group(0)+'":""}')['entry_data']['ProfilePage'][0]
  848.  
  849.                     user_info = all_data['graphql']['user']
  850.                     i = 0
  851.                     log_string = "Checking user info.."
  852.                     self.write_log(log_string)
  853.  
  854.                     follows = user_info['edge_follow']['count']
  855.                     follower = user_info['edge_followed_by']['count']
  856.                     media = user_info['edge_owner_to_timeline_media']['count']
  857.                     follow_viewer = user_info['follows_viewer']
  858.                     followed_by_viewer = user_info[
  859.                         'followed_by_viewer']
  860.                     requested_by_viewer = user_info[
  861.                         'requested_by_viewer']
  862.                     has_requested_viewer = user_info[
  863.                         'has_requested_viewer']
  864.                     log_string = "Follower : %i" % (follower)
  865.                     self.write_log(log_string)
  866.                     log_string = "Following : %s" % (follows)
  867.                     self.write_log(log_string)
  868.                     log_string = "Media : %i" % (media)
  869.                     self.write_log(log_string)
  870.                     if follows == 0 or follower / follows > 2:
  871.                         self.is_selebgram = True
  872.                         self.is_fake_account = False
  873.                         print('   >>>This is probably Selebgram account')
  874.                     elif follower == 0 or follows / follower > 2:
  875.                         self.is_fake_account = True
  876.                         self.is_selebgram = False
  877.                         print('   >>>This is probably Fake account')
  878.                     else:
  879.                         self.is_selebgram = False
  880.                         self.is_fake_account = False
  881.                         print('   >>>This is a normal account')
  882.  
  883.                     if media > 0 and follows / media < 25 and follower / media < 25:
  884.                         self.is_active_user = True
  885.                         print('   >>>This user is active')
  886.                     else:
  887.                         self.is_active_user = False
  888.                         print('   >>>This user is passive')
  889.  
  890.                     if follow_viewer or has_requested_viewer:
  891.                         self.is_follower = True
  892.                         print("   >>>This account is following you")
  893.                     else:
  894.                         self.is_follower = False
  895.                         print('   >>>This account is NOT following you')
  896.  
  897.                     if followed_by_viewer or requested_by_viewer:
  898.                         self.is_following = True
  899.                         print('   >>>You are following this account')
  900.  
  901.                     else:
  902.                         self.is_following = False
  903.                         print('   >>>You are NOT following this account')
  904.  
  905.                 except:
  906.                     logging.exception("Except on auto_unfollow!")
  907.                     time.sleep(3)
  908.                     return False
  909.             else:
  910.                 return False
  911.  
  912.             if (
  913.                     self.is_selebgram is not False
  914.                     or self.is_fake_account is not False
  915.                     or self.is_active_user is not True
  916.                     or self.is_follower is not True
  917.             ):
  918.                 self.write_log(current_user)
  919.                 self.unfollow(current_id)
  920.                 insert_unfollow_count(self, user_id=current_id)
  921.  
  922.     def get_media_id_recent_feed(self):
  923.         if self.login_status:
  924.             now_time = datetime.datetime.now()
  925.             log_string = "%s : Get media id on recent feed" % (self.user_login)
  926.             self.write_log(log_string)
  927.             if self.login_status == 1:
  928.                 url_tag = 'https://www.instagram.com/?__a=1'
  929.                 try:
  930.                     r = self.s.get(url_tag)
  931.                     all_data = json.loads(r.text)
  932.  
  933.                     self.media_on_feed = list(
  934.                         all_data['graphql']['user']['edge_web_feed_timeline'][
  935.                             'edges'])
  936.  
  937.                     log_string = "Media in recent feed = %i" % (
  938.                         len(self.media_on_feed))
  939.                     self.write_log(log_string)
  940.                 except:
  941.                     logging.exception("get_media_id_recent_feed")
  942.                     self.media_on_feed = []
  943.                     time.sleep(20)
  944.                     return 0
  945.             else:
  946.                 return 0
  947.  
  948.     def write_log(self, log_text):
  949.         """ Write log by print() or logger """
  950.  
  951.         if self.log_mod == 0:
  952.             try:
  953.                 now_time = datetime.datetime.now()
  954.                 print(now_time.strftime("%d.%m.%Y_%H:%M")  + " " + log_text)
  955.             except UnicodeEncodeError:
  956.                 print("Your text has unicode problem!")
  957.         elif self.log_mod == 1:
  958.             # Create log_file if not exist.
  959.             if self.log_file == 0:
  960.                 self.log_file = 1
  961.                 now_time = datetime.datetime.now()
  962.                 self.log_full_path = '%s%s_%s.log' % (
  963.                     self.log_file_path, self.user_login,
  964.                     now_time.strftime("%d.%m.%Y_%H:%M"))
  965.                 formatter = logging.Formatter('%(asctime)s - %(name)s '
  966.                                               '- %(message)s')
  967.                 self.logger = logging.getLogger(self.user_login)
  968.                 self.hdrl = logging.FileHandler(self.log_full_path, mode='w')
  969.                 self.hdrl.setFormatter(formatter)
  970.                 self.logger.setLevel(level=logging.INFO)
  971.                 self.logger.addHandler(self.hdrl)
  972.             # Log to log file.
  973.             try:
  974.                 self.logger.info(log_text)
  975.             except UnicodeEncodeError:
  976.                 print("Your text has unicode problem!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement