نشرات مشتركة من Instagram إلى VK العامة في بيثون



مقدمة


قررت الدخول في سوق جديد ، خاصة وأن الجمهور المستهدف لمتجري عبر الإنترنت ، والذي لا يملك حسابات في Instagram ، مهتم منذ فترة طويلة بظهور نسخة مكررة من VK. الفكرة جيدة ، لكن هناك المئات من المشاركات على الصفحة ، على التوالي ، لم أكن أرغب في ctrl + c ctrl + v يدويًا ، بالإضافة إلى أن المزيد من فرص عمل القرود لم تكن مثيرة للإعجاب.

واثقًا من أن الإنترنت مليء بالحلول المجانية ، لقد بدأت googling. بطبيعة الحال ، فإن الصفحات الأولى من نتائج البحث مليئة بالخدمات المدفوعة ، مع وظائف واسعة إلى حد ما. لكن بالنسبة لي ، فقط لكل شيء ، اضطررت إلى نقل جميع المنشورات من صفحة Instagram إلى VK العامة ومن ثم إعادة تعبئتها في وقت واحد.

عدم العثور على أي شيء مناسب ، ربما كان يبدو سيئًا ، فقد خنق الضفدع لكتابة السيناريو بنفسه. اختار لغة الثعبان. بسيطة ومريحة ، دون زخرفة دون داع ، والسرعة ليست مهمة في هذا الشأن.

الوثائق على Instagram api و VK مفصلة تمامًا والمهمة لا تبدو معقدة. بعد أن حررت نفسي بضعة أمسيات ، بدأت العمل. كانت الخطوة الأولى هي الحصول على الرموز في كل من Instagram و VK. لم تكن هناك مشاكل مع هذا ، تم استلامهما في بضع دقائق.

ثم أول مأزق ينتظرني ...

Crossposting أول 20 وظيفة


لدهشتي ، وجدت أنه بعد التغييرات في سياسة Instagram ، كان من الممكن الحصول على قاموس json (روابط للصور ، وصف للنشر ، تاريخ النشر ...) فقط إلى آخر 20 مشاركة في الصفحة. هذا يناسبني للمهمة الثانية - تحديث الجمهور بمشاركات جديدة من وقت لآخر. لأن المنشورات الجديدة لا تظهر في كثير من الأحيان معي و 20 منشورات مريحة للغاية. تقرر تولي هذه المهمة أولاً.

نحصل على جلسة VK ونعلن المتغيرات الضرورية:

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  

بعد ذلك ، نكتب الوظيفة الرئيسية. للبدء ، نحصل على مجموعة من البيانات التي سنعمل بها:

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

في الطلب ، يجب عليك إدراج بياناتك بدلاً من الأقواس المربعة. يمكنك العثور على معرف الصفحة حسب اسم المستخدم ، على سبيل المثال ، هنا .

إذا تم إرجاع شيء إلينا ، تابع:

 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) 

أنا أتوب
أعلم أن التعامل مع المتغيرات العالمية أمر سيئ ، لكن حجم البرنامج النصي يسمح لك بعدم الخوض في التعقيد

لذلك ، إذا كان تاريخ نشر المنشور أكثر من التاريخ الذي حددناه ، فقم بإنشاء مجلد باسمه (علم الاهتمام ، حساس بشكل خاص لتخطي) تاريخ نشره. التالي يتم التحقق من عدد الصور والفيديو. بالتأكيد يمكنك إرفاقه ، أنا فقط لا أحتاج إليه. تحميل الصور إلى المجلد الذي تم إنشاؤه. نأخذ وصف المنشور باستخدام مفتاح التسمية التوضيحية وننتقل إلى وظيفة 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    

نحدد عدد الصور في المجلد ، ونرفعها إلى خادم VK ، ونضيف إلى معلمات النشر وننشرها في الأماكن العامة. تتم إضافة المعلمات باستخدام وظيفة 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     

ويتم تحميل الصور مباشرة إلى خادم VK بواسطة وظيفة 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)) 

قمنا بتسوية المهمة الثانية. يمكن تشغيل البرنامج النصي إما من تلقاء نفسه أو حسب الجدول الزمني (على سبيل المثال ، في cron ، مرة واحدة كل 15 دقيقة). والآن كيف تنقل المئات من المشاركات الأخرى؟

التفاف الصفحة بأكملها


جزء من البرنامج جاهز بالفعل ، الذي كان مسؤولاً عن المنشورات نفسها في VK. يبقى أن نجد طريقة لتقليص جميع الصور والأوصاف الخاصة بهم. لم أكن مهتمًا بتحليل الشفرات المصدرية لصفحات Instagram واتخذت حلاً جاهزًا. في الواقع ، أنا متأكد من أن هناك الكثير من هذه البرامج ، لقد استخدمت البرنامج المجاني الأول ( 4K Stogram ). تسمح لك الواجهة البديهية بالتعامل بسرعة مع تنزيل جميع الصور من الصفحة. تحتوي القائمة أيضًا على تصدير لجميع أوصاف المنشورات. نحتاج إلى تنسيق " * .txt ". يبقى فقط وضع كل الصور في مجلدات (منشور واحد - مجلد واحد) وتحليل أوصاف المنشورات من الكتاب المدرسي بالتعبير العادي.

ستساعدنا التعليمة البرمجية التالية في تحليل الصور في مجلدات:

 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 

النقطة الأساسية هنا هي وقت النشر ، والذي يجمع بين عدة صور في مجلد واحد.

حسنًا ، كل شيء بسيط. نفتح كل مجلد ، وتحميل جميع الصور إلى الخادم ، وإرفاق الوصف ونشر. لا تنس تقييد VK: لا يزيد عن 50 مشاركة في اليوم:

 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 

ربما لم يسير على الطريق الأسهل والأسرع ، ولكن تم تحقيق النتيجة. شكرا لكم جميعا على اهتمامكم ، وأنا على استعداد للإجابة على جميع الأسئلة والتعليقات النقدية على نصي govnokod .

جميع النصوص الثلاثة في مجملها:

Crossposting أول 20 وظيفة
 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() 


فرز الصور حسب المجلدات
 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 


نشر إلى VK جميع المنشورات
 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/ar445408/


All Articles