Cross-Posting von Posts von Instagram an öffentliche VK in Python



Vorwort


Ich habe mich für einen neuen Markt entschieden, zumal die Zielgruppe meines Online-Shops, der keine Instagram-Konten hat, seit langem am Erscheinen eines Duplikats in VK interessiert ist. Die Idee ist gut, aber es gibt Hunderte von Posts auf der Seite. Ich wollte Strg + Strg + V nicht manuell arbeiten, und die weiteren Aussichten für die Affenarbeit waren nicht beeindruckend.

Zuversichtlich, dass das Internet voller kostenloser Lösungen ist, begann ich zu googeln. Natürlich sind die ersten Seiten der Suchergebnisse voll von kostenpflichtigen Diensten mit ziemlich umfangreichen Funktionen. Aber für mich musste ich für alles alle Beiträge von der Instagram-Seite an die öffentliche VK übertragen und anschließend gleichzeitig wieder auffüllen.

Da er nichts Passendes fand, vielleicht sah er schlecht aus , wurde beschlossen, die Kröte zu erwürgen , um das Drehbuch selbst zu schreiben. Wählen Sie die Python-Sprache. Einfach, bequem, ohne unnötigen Schnickschnack, und Geschwindigkeit ist in dieser Angelegenheit nicht wichtig.

Die Dokumentation auf Instagram API und VK ist sehr detailliert und die Aufgabe scheint nicht kompliziert zu sein. Nachdem ich mich ein paar Abende befreit hatte, machte ich mich an die Arbeit. Der erste Schritt bestand darin, Token sowohl in Instagram als auch in VK zu erhalten. Es gab keine Probleme damit, beide gingen in wenigen Minuten ein.

Dann erwartete mich die erste Falle ...

Crossposting der ersten 20 Beiträge


Zu meiner Überraschung stellte ich fest, dass es nach Änderungen in der Instagram-Richtlinie möglich war, ein JSON-Wörterbuch (Links zu Fotos, Beschreibung des Beitrags, Veröffentlichungsdatum ...) nur für die letzten 20 Beiträge der Seite abzurufen. Dies passte zu mir für die zweite Aufgabe - die Öffentlichkeit von Zeit zu Zeit mit neuen Beiträgen zu aktualisieren. Weil neue Veröffentlichungen bei mir nicht so oft erscheinen und 20 Beiträge sehr praktisch sind. Es wurde beschlossen, diese Aufgabe zuerst zu übernehmen.

Wir erhalten die VK-Sitzung und deklarieren die erforderlichen Variablen:

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  

Als nächstes schreiben wir die Hauptfunktion. Zu Beginn erhalten wir eine Reihe von Daten, mit denen wir arbeiten werden:

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

In der Anfrage müssen Sie Ihre Daten anstelle von eckigen Klammern einfügen. Die Seiten-ID finden Sie beispielsweise hier nach Benutzername.

Wenn uns etwas zurückgegeben wird, fahren Sie fort:

 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) 

Ich bereue
Ich weiß, dass die Arbeit mit globalen Variablen schlecht ist, aber die Größe des Skripts ermöglicht es Ihnen, nicht in die Komplexität einzutauchen

Wenn das Veröffentlichungsdatum des Beitrags größer ist als das von uns festgelegte Datum, erstellen Sie einen Ordner, dessen Name (Aufmerksamkeitstautologie, besonders empfindlich zum Überspringen) das Datum seiner Veröffentlichung ist. Als nächstes wird die Anzahl der Fotos und Videos überprüft. Sicher können Sie es anbringen, ich brauche es einfach nicht. Laden Sie Fotos in den erstellten Ordner hoch. Wir nehmen die Beschreibung für den Beitrag mit dem Untertitelschlüssel und gehen zur Funktion 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    

Wir bestimmen die Anzahl der Fotos im Ordner, laden sie auf den VK-Server hoch, fügen sie den Post-Parametern hinzu und veröffentlichen sie öffentlich. Das Hinzufügen zu Parametern erfolgt mit der Funktion 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     

Das direkte Hochladen von Fotos auf den VK-Server erfolgt über die Funktion 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)) 

Wir haben die zweite Aufgabe erledigt. Das Skript kann entweder einzeln oder nach Zeitplan ausgeführt werden (z. B. in cron einmal alle 15 Minuten). Und wie übertrage ich nun alle anderen Hunderte von Posts?

Ganze Seite umbrechen


Ein Teil des Skripts ist bereits fertig, derjenige, der für die Veröffentlichungen selbst in VK verantwortlich war. Es bleibt ein Weg, alle Fotos und Beschreibungen für sie zu entleeren. Ich habe mich nicht darum gekümmert, die Quellcodes von Instagram-Seiten zu analysieren, und eine vorgefertigte Lösung gefunden. Tatsächlich bin ich mir sicher, dass es viele solcher Programme gibt. Ich habe das erste kostenlose Programm ( 4K Stogram ) verwendet. Über die intuitive Benutzeroberfläche können Sie schnell alle Fotos von der Seite herunterladen. Das Menü enthält auch einen Export aller Beschreibungen für Beiträge. Wir brauchen ein " * .txt " -Format. Es bleibt nur, alle Fotos in Ordnern (ein Beitrag - ein Ordner) abzulegen und die Beschreibungen der Beiträge aus dem Lehrbuch durch regulären Ausdruck zu analysieren.

Der folgende Code hilft uns, die Fotos in Ordner zu zerlegen:

 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 

Entscheidend ist dabei die Veröffentlichungszeit, bei der mehrere Fotos in einem Ordner zusammengefasst werden.

Dann ist alles einfach. Wir öffnen jeden Ordner, laden alle Fotos auf den Server hoch, hängen die Beschreibung an und veröffentlichen sie. Vergessen Sie nicht die VK-Einschränkung: nicht mehr als 50 Beiträge pro Tag:

 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 

Vielleicht ist er nicht den einfachsten und schnellsten Weg gegangen, aber das Ergebnis wurde erzielt. Vielen Dank für Ihre Aufmerksamkeit. Ich bin bereit, alle Fragen und kritischen Kommentare zu meinem Govnokod- Skript zu beantworten.

Alle 3 Skripte in ihrer Gesamtheit:

Crossposting der ersten 20 Beiträge
 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() 


Sortieren Sie Fotos nach Ordnern
 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 


Alle Veröffentlichungen an VK senden
 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/de445408/


All Articles