Да, я забыл случайно, редко телеграмом пользуюсь. У меня много хардкода разного, потому что делал разово.
Сейчас нет возможность склеить все в один файл, могу просто сурсы отдать
Для начала нужно достать все ссылки, которые есть.
second.xlsx - название дока с данными из таблицы
urls.txt - текстовик, куда будут сохранены ссылки на доки вк
Таблицы разные были по структуре, поэтому тут два варианта, один когда есть просто ссылка на док, второй вариант когда ссылка сделана в виде гипер ссылки
from openpyxl import load_workbook
import time
import re
wb = load_workbook('second.xlsx')
with open('urls.txt', 'w', encoding='utf-8') as f:
for sheetname in wb.sheetnames:
sheet = wb[sheetname]
for i in range(1, sheet.max_row+1):
content = sheet.cell(row=i, column=4).value
if content:
f.write(content + '\n')
'''url = re.search(r'=HYPERLINK\("(.+?)"', content)
if url:
f.write(url.group(1).split('?')[0] + '\n')'''
Второй скрипт для парсинга темы и поска всех документов, которые заливали в тему.
app_id - ID приложения с
https://vk.com/apps?act=manage
login, password - логин и пароль от ВК
Сначала собираются все доки, затем читаются ссылки, которые сохранили на прошлом шаге.
Пробегаем по каждому доку, обрезаем его до знака ?, чтобы получить базу, т.е. vk.com/document123_123
Пробегаем по всем URL из прошлого шага, если базовая часть дока есть в URL, то новая ссылка записывается в файл restored.txt
import vk_requests
import time
import json
app_id = 'todo'
login = 'todo'
password = 'todo'
api = vk_requests.create_api(app_id=app_id, login=login, password=password)
def get_docs():
all_docs = []
comments_count = api.board.getComments(group_id=135725718, topic_id=34975471, count=1, offset=3)['count']
for x in range(comments_count//100 + 1):
print('Parsing {}/{} page'.format(x, comments_count//100 + 1))
comments = api.board.getComments(group_id=135725718, topic_id=34975471, count=100, offset=x * 100)['items']
for comment in comments:
attachments = comment.get('attachments', None)
if attachments:
for attachment in attachments:
if attachment['type'] != 'doc':
continue
attachment_url = attachment['doc'].get('url', None)
if attachment_url:
all_docs.append(attachment_url)
time.sleep(0.3)
return all_docs
if __name__ == '__main__':
docs = get_docs()
with open('urls.txt', 'r', encoding='utf-8') as f:
urls = f.readlines()
with open('restored.txt', 'w', encoding='utf-8') as f:
for doc in docs:
base_doc = doc.split('?')[0]
for url in urls:
if base_doc in url:
f.write(doc + '\n')
Последний скрипт читает исходный файл с таблицей, читает все ссылки из прошлого шага. Пробегает по всем колонкам с ссылками, если база этой ссылки есть в списке восстановленых ссылок, то ячейка перезаписывает на восстановленую ссылку. Далее сохраняется
second.xlsx - таблица с данными
restored.txt - файл с новыми ссылками из прошлого шага
from openpyxl import load_workbook
import re
wb = load_workbook('second.xlsx')
with open('restored.txt', 'r', encoding='utf-8') as f:
restored_urls = f.readlines()
for sheetname in wb.sheetnames:
sheet = wb[sheetname]
for i in range(1, sheet.max_row+1):
content = sheet.cell(row=i, column=4).value
if content:
url = content
base_url = url.split('?')[0]
for restored_url in restored_urls:
if base_url in restored_url:
sheet.cell(row=i, column=4).value = restored_url
'''if content:
url = re.search(r'=HYPERLINK\("(.+?)"', content)
if url:
base_url = url.group(1).split('?')[0]
for restored_url in restored_urls:
if base_url in restored_url:
cell_text = '=HYPERLINK("{}";"Скачать")'.format(restored_url)
sheet.cell(row=i, column=4).value = cell_text'''
wb.save('restored2.xlsx')