Я являюсь модератором на одном форуме Discourse (у меня нет доступа к бэкенду). Кто-то создал множество тем, в которых изображения были подключены через прямые ссылки к стороннему хостингу (в данном случае — Google Docs). Этот человек покинул компанию, и теперь все эти ссылки на изображения нерабочие.
Я могу (и уже делаю) вручную проходить по некоторым его сообщениям, чтобы найти и исправить (благодаря Internet Archive) битые изображения. Но это трудозатратно. Мне бы хотелось получить список всех тем, содержащих эти нерабочие URL-адреса изображений, чтобы мы могли коллективно исправить их, загрузив изображения на сайт заново.
Конечно, я могу использовать поиск для запроса with:images #tutorials, но не могу искать внутри URL-адресов изображений (например, googleusercontent). Возможно ли это без доступа к API или к бэкенд-командам rake?
Администратор мог создать запрос в Data Explorer для поиска таких постов.
Но если администратор не хотел, чтобы это происходило, ему следовало включить опцию загрузки изображений на локальный диск. Это проблема, которую они сами создали, и исправлять её — не совсем задача модератора.
Это значит, что вы тоже не можете установить Data Explorer? Это был бы предпочтительный инструмент для такой задачи.
Как оформлены изображения в постах? Они отображаются просто как обычный URL, используется [img], <img>, …?
Чтобы проиллюстрировать вашу проблему: пост может содержать битую ссылку на изображение, например: https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNaW4QQ43EQ-8qqQPntDP7so6Cg19PVSLN9bXv3ZhQqHZtomb8CGY3XArx3GIaZ04d0p9K3V-buaf73-M5dpq2wPuvnjsapStHdTkTVoPj2q9RAmcdczmE12HYz57PNOdVuft1/s1600-h/eastern_coastal_pcn_ap.jpg
Если я ищу googleusercontent, результатов ноль. Однако я могу найти сообщения, в которых есть изображения, на которые ссылается URL, содержащий текст googleusercontent. Не знаю, является ли это ошибкой или особенностью того, что Discourse не ищет URL-адреса ссылок на изображения в формате Markdown.
Полагаю, поиск в Discourse выполняется по обработанному посту, который содержит HTML.
Поиск игнорирует HTML-теги, а теги IMG не содержат текста, поэтому невозможно найти то, что вы ищете.
Почему бы вам не использовать API?
Вы можете создать локальный скрипт, который выполняет поисковый запрос по сообщениям пользователя, содержащим изображения, проходит по результатам (достаточно медленно, чтобы не превысить лимиты запросов, и при необходимости вы можете запросить исходное содержимое постов) и выводит сообщения, содержащие искомую подстроку.
Возможно, существует более простое решение, но при отсутствии других вариантов я бы поступил именно так. Это довольно просто реализовать.
Я не запрашивал API-ключ (бюрократия), и я не знал, что он нужен для того, что я считал «простым» поисковым запросом. Я также не знал, что он не заглядывает внутрь HTML-тегов в содержимом. Теперь всё понятно, спасибо.
Это не проблема, созданная администратором. Это просто ситуация, о которой администраторы и создатели контента не знали, пока один из сотрудников не уволился и доступ к Google Docs для его аккаунта не был закрыт, из-за чего изображения исчезли или перестали работать.
Я согласен, что мог бы запросить API-ключ или написать локальный скрипт для парсинга сайта и поиска проблемных постов. Я сделаю одно из этих.
Не уверен, что наличие API-ключа могло бы помочь вам проще решить вашу проблему.
Вот пример скрипта на Python, который перебирает мои посты (1 пост каждые 3 секунды) на meta и возвращает те, в сыром содержимом которых есть подстрока upload://:
import requests
import time
def fetch_posts(page):
url = f"https://meta.discourse.org/search.json?q=%40cocoquark&page={page}"
response = requests.get(url)
return response.json()
def fetch_post_content(post_id):
url = f"https://meta.discourse.org/posts/{post_id}/raw"
response = requests.get(url)
return response.text
def process_posts():
page = 1
while True:
print(f"страница {page}")
data = fetch_posts(page)
for post in data['posts']:
content = fetch_post_content(post['id'])
if "upload://" in content:
print("https://meta.discourse.org/posts/" + str(post['id']))
time.sleep(3)
if len(data['posts']) < 50:
print("Результатов больше нет.")
break
page += 1
if __name__ == "__main__":
process_posts()
Вам не нужен ключ API для выполнения простого поиска, но я не вижу смысла «использовать API» для выполнения простого поиска.
Возможно, я неправильно понял суть проблемы. Казалось, что она не возникла бы, если бы опция «загружать удаленные изображения локально» была включена, а по умолчанию она включена. Но также возможно, что она была отключена по какой-то бюрократической причине, которую установил администратор. Я думаю, что решить вашу проблему без плагина Data Explorer или доступа к Rails будет излишне сложно.