
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')
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']:
Ich bereueIch 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))])
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):
Das direkte Hochladen von Fotos auf den VK-Server erfolgt über die Funktion
upload_foto :
def upload_foto(num_foto, directory):
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')
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'
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')