Postagens cruzadas do Instagram para o VK público em Python



Prefácio


Decidi entrar em um novo mercado, principalmente porque o público-alvo da minha loja on-line, que não possui contas no Instagram, há muito tempo se interessa pela aparência de uma duplicata na VK. A ideia é boa, mas existem centenas de postagens na página, respectivamente, eu não queria trabalhar ctrl + c ctrl + v manualmente, além de outras perspectivas para o trabalho com macacos não serem impressionantes.

Confiante em que a Internet está cheia de soluções gratuitas, comecei a pesquisar no Google. Naturalmente, as primeiras páginas dos resultados da pesquisa estão cheias de serviços pagos, com funcionalidades bastante abrangentes. Mas para mim, apenas para tudo, tive que transferir todas as postagens da página do Instagram para o VK público e, posteriormente, reabastecê-la simultaneamente.

Não encontrando nada adequado, talvez ele estivesse parecendo mal , foi decidido estrangular o sapo para escrever o roteiro. Escolha a linguagem python. Simples, conveniente, sem frescuras desnecessárias, e a velocidade não é importante nesta questão.

A documentação na API do Instagram e no VK é bastante detalhada e a tarefa não parece complicada. Tendo me libertado algumas noites, comecei a trabalhar. O primeiro passo foi obter tokens no Instagram e no VK. Não houve problemas com isso, ambos foram recebidos em alguns minutos.

Então a primeira armadilha me esperava ...

Cruzando os primeiros 20 posts


Para minha surpresa, descobri que, após alterações na política do Instagram, foi possível obter um dicionário json (links para fotos, descrição da postagem, data de publicação ...) apenas nas últimas 20 postagens da página. Isso me serviu para a segunda tarefa - atualizar o público com novas postagens de tempos em tempos. Como novas publicações não aparecem com tanta frequência comigo e 20 postagens são bastante convenientes. Decidiu-se assumir essa tarefa primeiro.

Nós obtemos a sessão VK e declaramos as variáveis ​​necessárias:

session = vk.Session( access_token='123abc') #  123abc   vk_api = vk.API(session, v='5.85') groupID = '12345678' #id  vk upload_url = vk_api.photos.getWallUploadServer(group_id=groupID)['upload_url'] #  vk   data = [] photo_id = 0 attachments = [] direct = 'C:/Users/jo/PycharmProjects/repost/foto' #     d = date(2019, 3, 21) # ,      data_parsing = int(time.mktime(d.timetuple())) #    unix  

Em seguida, escrevemos a função principal. Para começar, obtemos uma matriz de dados com a qual trabalharemos:

 answer = get( 'https://api.instagram.com/v1/users/[id_inst]/media/recent?access_token=[access_token]', verify=True).json() 

Na solicitação, você deve inserir seus dados em vez de colchetes. Você pode encontrar o ID da página por nome de usuário, por exemplo, aqui .

Se algo nos for devolvido, vá em frente:

 if answer: for x in answer['data']: #     json  global photo_id #     photo_id = 0 global attachments attachments = [] global data data = [] date_create = x['created_time'] # date_create    Unix if int(date_create) > data_parsing: n = 0 #     if not os.path.isdir(direct + '/' + date_create): #     os.makedirs(direct + '/' + date_create) if 'carousel_media' in x: #      for a in x['carousel_media']: li = list(a.keys()) #      if li.count('videos') == 0: #    ,      req.urlretrieve(a['images']['standard_resolution']['url'], "foto/" + date_create + "/" + str(n) + ".jpg") #       if x['caption'] is not None: #   text = str(x['caption']['text']) else: text = ' ' n = n + 1 post_foto(date_create, text) else: #      req.urlretrieve(x['images']['standard_resolution']['url'], "foto/" + date_create + "/0.jpg") if x['caption'] is not None: #   text = str(x['caption']['text']) else: text = ' ' post_foto(date_create, text) 

Me arrependo
Eu sei que trabalhar com variáveis ​​globais é ruim, mas o tamanho do script permite que você não mergulhe na complexidade

Portanto, se a data de publicação da postagem for maior que a data definida, crie uma pasta cujo nome (tautologia da atenção, especialmente sensível à falta) na data de sua publicação. A seguir, são verificados o número de fotos e vídeos. Certamente você pode anexá-lo, eu simplesmente não preciso disso. Faça o upload de fotos para a pasta criada. Pegamos a descrição da postagem usando a tecla legenda e vamos para a função post_foto :

 def post_foto(date_create, text): quantity_foto = len([name for name in os.listdir(direct + "/" + date_create) if os.path.isfile(os.path.join(direct + "/" + date_create, name))]) #     append_attach(quantity_foto, date_create) params = {'attachments': attachments, 'message': text, 'owner_id': '-' + groupID, 'from_group': '1'} vk_api.wall.post(**params) #    VK    

Determinamos o número de fotos na pasta, as carregamos no servidor VK, adicionamos aos parâmetros de publicação e publicamos em público. A adição de parâmetros é feita usando a função append_attach :

 def append_attach(x, directory): #     for t in range(x): upload_foto(t, directory) global photo_id photo_id = data[t][0]['id'] global attachments attachments.append('photo' + str(data[t][0]['owner_id']) + '_' + str(photo_id)) #  id     

E o upload direto de fotos para o servidor VK é realizado pela função upload_foto :

 def upload_foto(num_foto, directory): #     request = requests.post(upload_url, files={'photo': open("foto/" + directory + "/" + str(num_foto) + ".jpg", "rb")}) params = {'server': request.json()['server'], 'photo': request.json()['photo'], 'hash': request.json()['hash'], 'group_id': groupID} global data data.append(vk_api.photos.saveWallPhoto(**params)) 

Nós resolvemos a segunda tarefa. O script pode ser executado sozinho ou dentro do cronograma (por exemplo, no cron , uma vez a cada 15 minutos). E agora como transferir todas as outras centenas de postagens?

Quebrar a página inteira


Parte do script já está pronta, a responsável pelas próprias publicações em VK. Resta encontrar uma maneira de esvaziar todas as fotos e descrições para eles. Não me preocupei em analisar os códigos-fonte das páginas do Instagram e tomei uma solução pronta. Na verdade, tenho certeza de que existem muitos desses programas, usei o primeiro gratuito ( 4K Stogram ). A interface intuitiva permite que você lide rapidamente com o download de todas as fotos da página. O menu também possui uma exportação de todas as descrições para postagens. Precisamos de um formato " * .txt ". Resta apenas colocar todas as fotos em pastas (uma postagem - uma pasta) e analisar as descrições das postagens do livro pela expressão regular.

O código a seguir nos ajudará a decompor as fotos em pastas:

 i = 0 for top, dirs, files in os.walk(os.getcwd()+"\\res\\"): for nm in files: if re.findall(r'\d\d\.\d\d\.\d\d', nm): old_file = os.path.join(top, nm) frq = re.findall(r'\d\d\d\d-\d\d-\d\d \d\d\.\d\d\.\d\d', str(nm)) frq = str(frq[0]) if not os.path.exists(os.getcwd()+"\\res\\" + frq): i = 0 os.makedirs(os.getcwd() + "\\res\\" + frq) new_file = os.path.join(os.getcwd() + "\\res\\" + frq, str(i)+'.jpg') os.rename(old_file, new_file) i = i+1 else: new_file = os.path.join(os.getcwd() + "\\res\\" + frq, str(i)+'.jpg') os.rename(old_file, new_file) i = i+1 

Aqui, o ponto principal é o tempo de publicação, que combina várias fotos em uma pasta.

Bem, então tudo é simples. Abrimos cada pasta, carregamos todas as fotos para o servidor, anexamos a descrição e publicamos. Não se esqueça da restrição VK: não mais que 50 posts por dia:

 f = open(os.getcwd() + "\input_opis\\gusi.txt", "rt", errors="ignore", encoding='utf-8') #     data = f.read() #  ,      result = re.findall(r'"([^\"]*)"', data, re.S) new_x = [el for el, _ in groupby(result)] #     dlina = new_x.__len__() i = 1 f.close() for top, dirs, files in os.walk(os.getcwd() + "\\res\\"): #   for nm in dirs: attachments = [] photo_id = 0 data = [] DIR = 'C:/Users/jo/PycharmProjects/repost/res/' + nm #     quantity_foto = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))]) post_foto(quantity_foto, nm) attachments.reverse() #   params = {'attachments': attachments, 'message': new_x[dlina - i], 'owner_id': '-' + groupID, 'from_group': '1'} vk_api.wall.post(**params) i = i + 1 

Talvez ele não tenha seguido o caminho mais fácil e rápido, mas o resultado foi alcançado. Obrigado a todos pela atenção, estou pronto para responder a todas as perguntas e comentários críticos no meu script govnokod .

Todos os 3 scripts em sua totalidade:

Cruzando os primeiros 20 posts
 from requests import get import urllib.request as req import vk import requests import os import time from datetime import date session = vk.Session( access_token='123abc') vk_api = vk.API(session, v='5.85') groupID = '12345678' #id  vk upload_url = vk_api.photos.getWallUploadServer(group_id=groupID)['upload_url'] #  vk   data = [] photo_id = 0 attachments = [] direct = 'C:/Users/jo/PycharmProjects/repost/foto' #     d = date(2019, 3, 21) # ,      data_parsing = int(time.mktime(d.timetuple())) #    unix  def upload_foto(num_foto, directory): #     request = requests.post(upload_url, files={'photo': open("foto/" + directory + "/" + str(num_foto) + ".jpg", "rb")}) params = {'server': request.json()['server'], 'photo': request.json()['photo'], 'hash': request.json()['hash'], 'group_id': groupID} global data data.append(vk_api.photos.saveWallPhoto(**params)) def append_attach(x, directory): #             for t in range(x): upload_foto(t, directory) global photo_id photo_id = data[t][0]['id'] global attachments attachments.append('photo' + str(data[t][0]['owner_id']) + '_' + str(photo_id)) #  id     def post_foto(date_create, text): quantity_foto = len([name for name in os.listdir(direct + "/" + date_create) if os.path.isfile(os.path.join(direct + "/" + date_create, name))]) #     append_attach(quantity_foto, date_create) params = {'attachments': attachments, 'message': text, 'owner_id': '-' + groupID, 'from_group': '1'} vk_api.wall.post(**params) #    VK    def get_all(): answer = get( 'https://api.instagram.com/v1/users/12345678/media/recent?access_token=123abc', verify=True).json() #     instagram if answer: for x in answer['data']: #     json  global photo_id #     photo_id = 0 global attachments attachments = [] global data data = [] date_create = x['created_time'] # date_create    Unix if int(date_create) > data_parsing: n = 0 #     if not os.path.isdir(direct + '/' + date_create): #     os.makedirs(direct + '/' + date_create) if 'carousel_media' in x: #      for a in x['carousel_media']: li = list(a.keys()) #      if li.count('videos') == 0: #    ,      req.urlretrieve(a['images']['standard_resolution']['url'], "foto/" + date_create + "/" + str(n) + ".jpg") #       if x['caption'] is not None: #   text = str(x['caption']['text']) else: text = ' ' n = n + 1 post_foto(date_create, text) else: #      req.urlretrieve(x['images']['standard_resolution']['url'], "foto/" + date_create + "/0.jpg") if x['caption'] is not None: #   text = str(x['caption']['text']) else: text = ' ' post_foto(date_create, text) get_all() 


Classificar fotos por pastas
 import re import os i = 0 for top, dirs, files in os.walk(os.getcwd()+"\\res\\"): for nm in files: if re.findall(r'\d\d\.\d\d\.\d\d', nm): old_file = os.path.join(top, nm) frq = re.findall(r'\d\d\d\d-\d\d-\d\d \d\d\.\d\d\.\d\d', str(nm)) frq = str(frq[0]) if not os.path.exists(os.getcwd()+"\\res\\" + frq): i = 0 os.makedirs(os.getcwd() + "\\res\\" + frq) new_file = os.path.join(os.getcwd() + "\\res\\" + frq, str(i)+'.jpg') os.rename(old_file, new_file) i = i+1 else: new_file = os.path.join(os.getcwd() + "\\res\\" + frq, str(i)+'.jpg') os.rename(old_file, new_file) i = i+1 


Postando em VK todas as publicações
 import os import vk import requests import re from itertools import groupby session = vk.Session( access_token='123abc') vk_api = vk.API(session, v='5.85') groupID = '12345678' upload_url = vk_api.photos.getWallUploadServer(group_id=groupID)['upload_url'] data = [] photo_id = 0 attachments = [] def upload_foto(num_foto, direc): request = requests.post(upload_url, files={'photo': open('res/' + direc + "/" + str(num_foto) + ".jpg", "rb")}) params = {'server': request.json()['server'], 'photo': request.json()['photo'], 'hash': request.json()['hash'], 'group_id': groupID} global data data.append(vk_api.photos.saveWallPhoto(**params)) def post_foto(x, direc): for i in range(x): upload_foto(i, direc) global photo_id photo_id = data[i][0]['id'] global attachments attachments.append('photo' + str(data[i][0]['owner_id']) + '_' + str(photo_id)) f = open(os.getcwd() + "\input_opis\\gusi.txt", "rt", errors="ignore", encoding='utf-8') #     data = f.read() #  ,      result = re.findall(r'"([^\"]*)"', data, re.S) new_x = [el for el, _ in groupby(result)] #     dlina = new_x.__len__() i = 1 f.close() for top, dirs, files in os.walk(os.getcwd() + "\\res\\"): #   for nm in dirs: attachments = [] photo_id = 0 data = [] DIR = 'C:/Users/jo/PycharmProjects/repost/res/' + nm #     quantity_foto = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))]) post_foto(quantity_foto, nm) attachments.reverse() #   params = {'attachments': attachments, 'message': new_x[dlina - i], 'owner_id': '-' + groupID, 'from_group': '1'} vk_api.wall.post(**params) i = i + 1 

Source: https://habr.com/ru/post/pt445408/


All Articles