
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')
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']:
Me arrependoEu 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))])
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):
E o upload direto de fotos para o servidor VK é realizado pela função
upload_foto :
def upload_foto(num_foto, directory):
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')
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'
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')