
前言
我决定进入一个新市场,特别是因为我的在线商店的目标受众(没有Instagram帐户)长期以来一直对VK副本的出现感兴趣。 这个想法很好,但是页面上分别有数百个帖子,我不想手动
ctrl + c ctrl + v ,再加上猴子工作的进一步前景并不令人印象深刻。
我确信互联网上到处都是免费的解决方案,所以我开始谷歌搜索。 自然,搜索结果的第一页充满了付费服务,并具有相当广泛的功能。 但是对我来说,就一切而言,我必须将所有帖子从Instagram页面转移到公共VK,然后同时进行补充。
找不到合适的东西,
也许他看起来很不好 ,决定
勒死蟾蜍自己写剧本。 选择python语言。 简单,方便,没有多余的装饰,并且速度在此问题上并不重要。
Instagram api和VK上的文档非常详细,任务似乎并不复杂。 在几个晚上有空的时候,我开始工作。 第一步是在Instagram和VK中都获得令牌。 这样做没有问题,都在几分钟之内就收到了。
然后第一个陷阱就等着我...
交叉发布前20个帖子
令我惊讶的是,我发现在Instagram政策改变之后,有可能仅在页面的最后20个帖子中获得一个json字典(链接到照片,该帖子的描述,发布日期...)。 这适合我进行第二项任务-时常更新新职位给公众。 因为新出版物很少出现在我的身边,所以20篇帖子很方便。 决定首先承担这项任务。
我们得到VK会话并声明必要的变量:
session = vk.Session( access_token='123abc')
接下来,我们编写main函数。 首先,我们获得了将要使用的数据数组:
answer = get( 'https://api.instagram.com/v1/users/[id_inst]/media/recent?access_token=[access_token]', verify=True).json()
在请求中,您必须插入数据而不是方括号。 您可以按用户名找到页面ID,例如,
此处 。
如果有什么退还给我们,请继续:
if answer: for x in answer['data']:
我re悔我知道使用全局变量很不好,但是脚本的大小使您不必深入研究复杂性
因此,如果帖子的发布日期超过了我们设置的日期,请创建一个文件夹,该文件夹的名称(注意重言式,尤其是跳过)特别注意其发布日期。 接下来是检查照片和视频的数量。 当然,您可以附加它,我只是不需要它。 将照片上传到创建的文件夹。 我们使用
标题键获取帖子的描述,然后转到
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))])
我们确定文件夹中的照片数量,将它们上传到VK服务器,添加到发布参数中并公开发布。 使用
append_attach函数可以添加参数:
def append_attach(x, directory):
直接将照片上传到VK服务器是由
upload_foto函数执行的:
def upload_foto(num_foto, directory):
我们整理出第二项任务。 该脚本可以单独运行,也可以按计划运行(例如,在
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')
也许他并没有走最简单,最快的方式,但结果还是可以实现的。 谢谢大家的关注,我准备回答有关
govnokod脚本的所有问题和批评。
全部三个脚本全部:
交叉发布前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'
按文件夹对照片排序 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')