
Kata Pengantar
Saya memutuskan untuk memasuki pasar baru, terutama karena target audiens toko online saya, yang tidak memiliki akun Instagram, telah lama tertarik pada tampilan duplikat di VK. Idenya bagus, tetapi ada ratusan posting di halaman, masing-masing, saya tidak ingin
ctrl + c ctrl + v secara manual, ditambah prospek lebih lanjut untuk pekerjaan monyet tidak mengesankan.
Percaya bahwa Internet penuh dengan solusi gratis, saya mulai googling. Secara alami, halaman pertama hasil pencarian penuh dengan layanan berbayar, dengan fungsi yang cukup luas. Tetapi bagi saya, hanya untuk semuanya, saya harus mentransfer semua posting dari halaman Instagram ke VK publik dan kemudian mengisi ulang secara bersamaan.
Tidak menemukan sesuatu yang cocok,
mungkin dia terlihat buruk , diputuskan untuk
mencekik kodok untuk menulis naskah sendiri. Memilih bahasa python. Sederhana, nyaman, tanpa embel-embel yang tidak perlu, dan kecepatan tidak penting dalam hal ini.
Dokumentasi di Instagram api dan VK cukup detail dan tugasnya sepertinya tidak rumit. Setelah membebaskan diri beberapa malam, saya mulai bekerja. Langkah pertama adalah mendapatkan token di Instagram dan VK. Tidak ada masalah dengan ini, keduanya diterima dalam beberapa menit.
Kemudian perangkap pertama menunggu saya ...
Crossposting 20 posting pertama
Yang mengejutkan saya, saya menemukan bahwa setelah perubahan dalam kebijakan Instagram, dimungkinkan untuk mendapatkan kamus json (tautan ke foto, deskripsi posting, tanggal publikasi ...) hanya ke 20 posting terakhir halaman. Ini cocok untuk saya dengan tugas kedua - memperbarui publik dengan posting baru dari waktu ke waktu. Karena publikasi baru tidak sering muncul dengan saya dan 20 posting cukup nyaman. Diputuskan untuk mengambil tugas ini terlebih dahulu.
Kami mendapatkan sesi VK dan mendeklarasikan variabel yang diperlukan:
session = vk.Session( access_token='123abc')
Selanjutnya, kita menulis fungsi utama. Untuk memulai, kami mendapatkan larik data yang dengannya kami akan bekerja:
answer = get( 'https://api.instagram.com/v1/users/[id_inst]/media/recent?access_token=[access_token]', verify=True).json()
Dalam permintaan, Anda harus memasukkan data Anda, bukan tanda kurung. Anda dapat menemukan id halaman dengan nama pengguna, misalnya, di
sini .
Jika sesuatu dikembalikan kepada kami, silakan:
if answer: for x in answer['data']:
Saya bertobatSaya tahu bahwa bekerja dengan variabel global buruk, tetapi ukuran skrip memungkinkan Anda untuk tidak mempelajari kompleksitasnya
Jadi, jika tanggal publikasi posting lebih dari tanggal yang kami tetapkan, buat folder yang namanya (perhatian tautologi, terutama sensitif untuk dilewati) tanggal publikasi. Berikutnya adalah pengecekan jumlah foto dan video. Tentunya Anda bisa memasangnya, saya hanya tidak membutuhkannya. Unggah foto ke folder yang dibuat. Kami mengambil deskripsi untuk posting menggunakan tombol
teks dan pergi ke fungsi
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))])
Kami menentukan jumlah foto dalam folder, mengunggahnya ke server VK, menambah parameter posting dan mempublikasikannya di depan umum. Menambahkan ke parameter dilakukan menggunakan fungsi
append_attach :
def append_attach(x, directory):
Dan langsung mengunggah foto ke server VK dilakukan oleh fungsi
upload_foto :
def upload_foto(num_foto, directory):
Kami menyelesaikan tugas kedua. Skrip dapat dijalankan sendiri atau sesuai jadwal (misalnya, dalam
cron , setiap 15 menit sekali). Dan sekarang bagaimana cara mentransfer semua ratusan posting lainnya?
Bungkus seluruh halaman
Bagian dari skrip sudah siap, yang bertanggung jawab untuk publikasi sendiri di VK. Tetap menemukan cara untuk mengempiskan semua foto dan deskripsi untuk mereka. Saya tidak repot-repot menguraikan kode sumber halaman Instagram dan mengambil solusi yang sudah jadi. Bahkan, saya yakin ada banyak program seperti itu, saya menggunakan yang gratis pertama (
Stogram 4K ). Antarmuka intuitif memungkinkan Anda untuk dengan cepat mengunduh semua foto dari halaman. Menu ini juga memiliki ekspor semua deskripsi untuk posting. Kami membutuhkan format "
* .txt ". Tetap hanya menempatkan semua foto dalam folder (satu posting - satu folder) dan mengurai deskripsi posting dari buku teks dengan ekspresi reguler.
Kode berikut akan membantu kami menguraikan foto ke dalam folder:
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
Di sini, titik kuncinya adalah waktu publikasi, yang menggabungkan beberapa foto menjadi satu folder.
Nah, maka semuanya sederhana. Kami membuka setiap folder, mengunggah semua foto ke server, melampirkan deskripsi dan menerbitkan. Jangan lupa tentang pembatasan VK: tidak lebih dari 50 posting per hari:
f = open(os.getcwd() + "\input_opis\\gusi.txt", "rt", errors="ignore", encoding='utf-8')
Mungkin dia tidak mengikuti cara termudah dan tercepat, tetapi hasilnya tercapai. Terima kasih atas perhatian Anda, saya siap menjawab semua pertanyaan dan komentar kritis pada skrip
govnokod saya.
Seluruh 3 skrip secara keseluruhan:
Crossposting 20 posting pertama 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'
Sortir foto berdasarkan folder 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
Posting ke VK semua publikasi 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')