Поиск URL изображений в темах

Я искал и читал как эффективно искать контент, но не нашёл ответа.

Я являюсь модератором на одном форуме Discourse (у меня нет доступа к бэкенду). Кто-то создал множество тем, в которых изображения были подключены через прямые ссылки к стороннему хостингу (в данном случае — Google Docs). Этот человек покинул компанию, и теперь все эти ссылки на изображения нерабочие.

Я могу (и уже делаю) вручную проходить по некоторым его сообщениям, чтобы найти и исправить (благодаря Internet Archive) битые изображения. Но это трудозатратно. Мне бы хотелось получить список всех тем, содержащих эти нерабочие URL-адреса изображений, чтобы мы могли коллективно исправить их, загрузив изображения на сайт заново.

Конечно, я могу использовать поиск для запроса with:images #tutorials, но не могу искать внутри URL-адресов изображений (например, googleusercontent). Возможно ли это без доступа к API или к бэкенд-командам rake?

Администратор мог создать запрос в Data Explorer для поиска таких постов.

Но если администратор не хотел, чтобы это происходило, ему следовало включить опцию загрузки изображений на локальный диск. Это проблема, которую они сами создали, и исправлять её — не совсем задача модератора.

Это значит, что вы тоже не можете установить Data Explorer? Это был бы предпочтительный инструмент для такой задачи.

Как оформлены изображения в постах? Они отображаются просто как обычный URL, используется [img], <img>, ![](url)…?

Чтобы проиллюстрировать вашу проблему: пост может содержать битую ссылку на изображение, например:
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNaW4QQ43EQ-8qqQPntDP7so6Cg19PVSLN9bXv3ZhQqHZtomb8CGY3XArx3GIaZ04d0p9K3V-buaf73-M5dpq2wPuvnjsapStHdTkTVoPj2q9RAmcdczmE12HYz57PNOdVuft1/s1600-h/eastern_coastal_pcn_ap.jpg

В посте содержится ссылка,

Но в результате получается что-то вроде:

<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNaW4QQ43EQ-8qqQPntDP7so6Cg19PVSLN9bXv3ZhQqHZtomb8CGY3XArx3GIaZ04d0p9K3V-buaf73-M5dpq2wPuvnjsapStHdTkTVoPj2q9RAmcdczmE12HYz57PNOdVuft1/s1600-h/eastern_coastal_pcn_ap.jpg" target="_blank" rel="noopener" class="onebox">
    <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNaW4QQ43EQ-8qqQPntDP7so6Cg19PVSLN9bXv3ZhQqHZtomb8CGY3XArx3GIaZ04d0p9K3V-buaf73-M5dpq2wPuvnjsapStHdTkTVoPj2q9RAmcdczmE12HYz57PNOdVuft1/s1600-h/eastern_coastal_pcn_ap.jpg" width="" height="" loading="lazy">
</a>

В котором нет строки, которую можно было бы найти поиском.

Именно так и происходит?

Верно, я не могу установить плагины.

Они оформлены с использованием стандартного синтаксиса Markdown ![](url), где googleusercontent является частью URL. Например:

![|312x416](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeWkc1cZH8jtNveMhet36oWsLDlUxA-2QadGepx8Uuw1naq6vx5JAd6oyQ2pSmLJkKN97ZnTlV2txMqdNb0QMDCqV0xu-0xOFzePw2hnrNPUNbHoHMWh60KJpP3QkLq2E3Gp0-cKrf3tSWjML8oIQ3I9JQ?key=7YTVKNzk_oQvl95Fd_BKLQ)

Если я ищу googleusercontent, результатов ноль. Однако я могу найти сообщения, в которых есть изображения, на которые ссылается URL, содержащий текст googleusercontent. Не знаю, является ли это ошибкой или особенностью того, что Discourse не ищет URL-адреса ссылок на изображения в формате Markdown.

Полагаю, поиск в Discourse выполняется по обработанному посту, который содержит HTML.
Поиск игнорирует HTML-теги, а теги IMG не содержат текста, поэтому невозможно найти то, что вы ищете.

Почему бы вам не использовать API?

Вы можете создать локальный скрипт, который выполняет поисковый запрос по сообщениям пользователя, содержащим изображения, проходит по результатам (достаточно медленно, чтобы не превысить лимиты запросов, и при необходимости вы можете запросить исходное содержимое постов) и выводит сообщения, содержащие искомую подстроку.

Возможно, существует более простое решение, но при отсутствии других вариантов я бы поступил именно так. Это довольно просто реализовать.

Потому что администратор не выдаст ей ключ API?

Потому что она не программист?

Похоже, это проблема, которую создал администратор и не заинтересован в её решении.

Да, я имею в виду, что ключ не требуется для конечных точек поиска и публикации в API, необходимых для моего предложения, если я не ошибаюсь?

И, конечно, в идеале это потребует базовых знаний программирования, даже если ИИ, вероятно, сможет сгенерировать хороший базовый скрипт.

Упомянутая проблема, безусловно, не идеальна для решения без доступа администратора.

Я не запрашивал API-ключ (бюрократия), и я не знал, что он нужен для того, что я считал «простым» поисковым запросом. Я также не знал, что он не заглядывает внутрь HTML-тегов в содержимом. Теперь всё понятно, спасибо.

Это не проблема, созданная администратором. Это просто ситуация, о которой администраторы и создатели контента не знали, пока один из сотрудников не уволился и доступ к Google Docs для его аккаунта не был закрыт, из-за чего изображения исчезли или перестали работать.

Я согласен, что мог бы запросить API-ключ или написать локальный скрипт для парсинга сайта и поиска проблемных постов. Я сделаю одно из этих.

Спасибо за ответы. :pray:

Для выполнения поиска API-ключ не требуется.

Не уверен, что наличие API-ключа могло бы помочь вам проще решить вашу проблему.

Вот пример :robot: скрипта на 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()
Вывод
страница 1
https://meta.discourse.org/posts/1682015
https://meta.discourse.org/posts/1677389
https://meta.discourse.org/posts/1679834
https://meta.discourse.org/posts/1678673
https://meta.discourse.org/posts/1679833
https://meta.discourse.org/posts/1678629
https://meta.discourse.org/posts/1678229
https://meta.discourse.org/posts/1676531
https://meta.discourse.org/posts/1674982
https://meta.discourse.org/posts/1670250
https://meta.discourse.org/posts/1674421
https://meta.discourse.org/posts/1671959
https://meta.discourse.org/posts/1674355
https://meta.discourse.org/posts/1673357
https://meta.discourse.org/posts/1669322
https://meta.discourse.org/posts/1665519
страница 2
https://meta.discourse.org/posts/1674153
https://meta.discourse.org/posts/1670613
https://meta.discourse.org/posts/1666606
https://meta.discourse.org/posts/1674992
https://meta.discourse.org/posts/1672811
https://meta.discourse.org/posts/1672050
https://meta.discourse.org/posts/1686260
https://meta.discourse.org/posts/1684497
https://meta.discourse.org/posts/1680692
https://meta.discourse.org/posts/1675012
страница 3
Результатов больше нет.

Отлично, спасибо @Canapin!
Я просто обожаю Python :pray:
С вашей помощью я теперь нашёл все потоки с битыми изображениями.
Большое спасибо.

Вам не нужен ключ API для выполнения простого поиска, но я не вижу смысла «использовать API» для выполнения простого поиска.

Возможно, я неправильно понял суть проблемы. Казалось, что она не возникла бы, если бы опция «загружать удаленные изображения локально» была включена, а по умолчанию она включена. Но также возможно, что она была отключена по какой-то бюрократической причине, которую установил администратор. Я думаю, что решить вашу проблему без плагина Data Explorer или доступа к Rails будет излишне сложно.

Друг! Ты просто супер!