Data Explorer-Abfragen mit der Discourse API ausführen

:bookmark: Dieser Leitfaden erklärt, wie Sie die Discourse API verwenden, um Abfragen mit dem Data Explorer Plugin zu erstellen, auszuführen und zu verwalten.

:person_raising_hand: Erforderliches Benutzerniveau: Administrator

Praktisch jede Aktion, die über die Discourse-Benutzeroberfläche ausgeführt werden kann, kann auch über die Discourse API ausgelöst werden.

Dieses Dokument bietet einen umfassenden Überblick über die Verwendung der API speziell in Verbindung mit dem Data Explorer Plugin.

Eine allgemeine Übersicht darüber, wie Sie die richtige API-Anfrage für eine Aktion finden, finden Sie unter: Reverse engineer the Discourse API .

Ausführen einer Data Explorer Abfrage

Um eine Data Explorer Abfrage über die API auszuführen, senden Sie eine POST-Anfrage an /admin/plugins/explorer/queries/<query-id>/run. Die Abfrage-ID finden Sie, indem Sie sie auf Ihrer Discourse-Seite besuchen und den id-Parameter in der Adressleiste überprüfen.

Unten sehen Sie ein Beispiel für eine Abfrage mit der ID 20, die Themen nach Aufrufen an einem bestimmten Datum zurückgibt:

--[params]
-- date :viewed_at

SELECT
topic_id,
COUNT(1) AS views_for_date
FROM topic_views
WHERE viewed_at = :viewed_at
GROUP BY topic_id
ORDER BY views_for_date DESC

Diese Abfrage kann von einem Terminal aus mit folgendem Befehl ausgeführt werden:

curl -X POST "https://your-site-url/admin/plugins/explorer/queries/20/run" \
-H "Content-Type: multipart/form-data;" \
-H "Api-Key: <api-key>" \
-H "Api-Username: system" \
-F 'params={"viewed_at":"2019-06-10"}'

Beachten Sie, dass Sie <api-key> und <your-site-url> durch Ihren API-Schlüssel und Ihre Domain ersetzen müssen.

Umgang mit großen Datensätzen

Das Data Explorer Plugin beschränkt die Ergebnisse standardmäßig auf 1000 Zeilen. Um größere Datensätze seitenweise abzurufen, können Sie die unten stehende Beispielabfrage verwenden:

--[params]
-- integer :limit = 100
-- integer :page = 0
SELECT * 
FROM generate_series(1, 10000)
OFFSET :page * :limit 
LIMIT :limit

Um die Ergebnisse seitenweise abzurufen, erhöhen Sie den page-Parameter in der Anfrage:

curl -X POST "https://your-site-url/admin/plugins/explorer/queries/27/run" \
-H "Content-Type: multipart/form-data;" \
-H "Api-Key: <api-key>" \
-H "Api-Username: system" \
-F 'params={"page":"0"}'

Stoppen Sie, wenn result_count null ist.

Weitere Informationen zum Umgang mit großen Datensätzen finden Sie unter: Result Limits and Exporting Queries

Entfernen von relations-Daten aus den Ergebnissen

Wenn Data Explorer-Abfragen über die Benutzeroberfläche ausgeführt werden, wird den Ergebnissen ein relations-Objekt hinzugefügt. Diese Daten werden zum Rendern des Benutzers in den UI-Ergebnissen verwendet, sind aber wahrscheinlich nicht erforderlich, wenn Abfragen über die API ausgeführt werden.

Um diese Daten aus den Ergebnissen zu entfernen, fügen Sie Ihrer Anfrage den Parameter download=true hinzu:

curl -X POST "https://your-site-url/admin/plugins/explorer/queries/27/run" \
-H "Content-Type: multipart/form-data;" \
-H "Api-Key: <api-key>" \
-H "Api-Username: system" \
-F 'params={"page":"0"}' \
-F "download=true"

API-Authentifizierung

Details zur Generierung eines API-Schlüssels für die Anfragen finden Sie hier: Create and configure an API key .

Wenn der API-Schlüssel nur zum Ausführen von Data Explorer-Abfragen verwendet werden soll, können Sie im Dropdown-Menü „Scope“ „Granular“ auswählen und dann den Scope „run queries“ auswählen.

FAQs

Gibt es einen API-Endpunkt, den ich verwenden kann, um die Liste der Berichte und die ID-Nummern abzurufen? Ich möchte eine Dropdown-Liste damit erstellen?

Ja, Sie können eine authentifizierte GET-Anfrage an /admin/plugins/explorer/queries.json senden, um eine Liste aller Abfragen auf der Seite zu erhalten.

Ist es möglich, Abfragen über die API zu erstellen?

Ja. Dokumentation dazu finden Sie unter Create a Data Explorer query using the API

Ist es möglich, Parameter mit der Post-Anfrage zu senden?

Ja, SQL-Parameter fügen Sie mit der Option -F hinzu, wie in den Beispielen gezeigt.

Wird der CSV-Export für Abfragen von der API unterstützt?

Obwohl die JSON-Ausgabe Standard ist, können Sie Ergebnisse manuell in CSV konvertieren. Der native CSV-Export wird nicht mehr unterstützt.

Zusätzliche Ressourcen

39 „Gefällt mir“
Watching API
"DataExplorer::ValidationError: Missing parameter end_date of type string
Get total list of topics and their view counts from Discourse API
Best API for All First Posts in a Category
Category API request downloads all topics
Get Latest topic for Current user
TimeStamp of Tag
How can I get the list of Discourse Topic IDs dynamically
Passing params to Data Explorer using API requires enclosing a value
Reports by Discourse
API rate limits
Getting recently updated posts using the REST API
`DataExplorer::ValidationError: Missing parameter` when running Data Explorer queries with [params] via API
`DataExplorer::ValidationError: Missing parameter` when running Data Explorer queries with [params] via API
Backend data retrieve for analytics
Discourse-user-notes API
Admin dashboard report reference guide
How to query the topics_with_no_response.json API with filters
Use API to get topics for a period using js
Access Discourse database with n8n
Why getUserById doesn't return the user's email?
Grant a custom badge through the API
Is there an API endpoint for recently edited posts
How to query gamification score via the API?
1.5X cheers on specific TL's or groups
Page Publishing
Validation error even when parameter passed while running data explorer API with Curl
How to fetch posts/topics by multiple usernames
How to change the response default_limit in data explorer?
How to change the response default_limit in data explorer?
Order/Filter searched topics by latest update to First Post
API Filter users by emails, including secondary emails
Ability to have granular scope for data explorer?
Daily, weekly, or total stats by user over a specified time range
Looking for help posting automating data explorer reports to my forum
How to get all topics from a specific category using offset/page param in the API query?
Discourse 有哪个接口能直接获取某个帖子的最后一条评论信息
想得到活跃的用户——通过api
API endpoint to create invite links has moved to /invites.json
How to get a password from database?
Can I send an external URL to the Discourse API for it to return topics linking to that URL?
Identifying users in multiple groups using AND rather than OR?
Restrict moderator access to only the stats panel on the admin dashboard?
How to get all the deleted posts for a specific topic
Discourse forum traffic query data
Download a user's posting history via Discourse API?
Discourse Data Explorer Query Response to Slack
Filter topics in category containing file attachments
Discord Integration with Webhooks
Download result of queries into Google Spreadsheet
Who's online "API"?
Is there any endpoint that would provide a user's external account IDs from their Discourse ID?
API post request without an Accept header returns 406
Best way to get (via API) a list of users from a group, and their bios
Create a Data Explorer query using the API
Automate the syncing of Discourse queries to Google Sheets
How to get a full list of badges of all users

Dieser Kommentar scheint anzudeuten, dass CSV-Exporte über die API möglich sind. Ist das möglich? Nur aus Neugier, da ich die Daten als CSV benötige. Ich kann sie immer als JSON abrufen und in CSV konvertieren, aber wenn es eine eingebaute Möglichkeit gibt, CSV zu erhalten, wäre das etwas einfacher.

Ist es möglich, eine Abfrage ‘wie erstellt oder aktualisiert in den letzten 50 Sekunden’ durchzuführen?

:robot: KI sagt

-- [params]
-- int :seconds = 50

SELECT
    p.id AS post_id,
    p.created_at,
    p.updated_at,
    p.raw AS post_content,
    p.user_id,
    t.title AS topic_title,
    t.id AS topic_id
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id
WHERE
    (EXTRACT(EPOCH FROM (NOW() - p.created_at)) <= :seconds
    OR EXTRACT(EPOCH FROM (NOW() - p.updated_at)) <= :seconds)
    AND p.deleted_at IS NULL
    AND t.deleted_at IS NULL
ORDER BY p.created_at DESC
LIMIT 50

Habe einen schnellen Test gemacht, es scheint zu funktionieren :slight_smile:

1 „Gefällt mir“

Ich sehe das „Gefällt mir :heart:“, das ich zu einem Beitrag hinzugefügt habe, mit Ihrer Abfrage nicht.

Ich glaube, Sie müssen post_actions verwenden

--[params]
--string :timespan = 50 seconds

SELECT post_id,
       user_id,
       created_at,
       updated_at,
       deleted_at
FROM  post_actions
WHERE post_action_type_id=2 AND updated_at > NOW() - INTERVAL :timespan

Version mit schöneren Ergebnissen

--[params]
--string :timespan = 50 seconds
--boolean :include_in_timespan_deleted = false

SELECT
  post_id,
  user_id,
  CASE
    WHEN EXTRACT(EPOCH FROM (NOW() - created_at)) < 60 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - created_at))), ' seconds ago')
    WHEN EXTRACT(EPOCH FROM (NOW() - created_at)) < 3600 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - created_at)) / 60), ' minutes ago')
    WHEN EXTRACT(EPOCH FROM (NOW() - created_at)) < 86400 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - created_at)) / 3600), ' hours ago')
    ELSE CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - created_at)) / 86400), ' days ago')
  END AS relative_created_at,
  CASE
    WHEN EXTRACT(EPOCH FROM (NOW() - updated_at)) < 60 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - updated_at))), ' seconds ago')
    WHEN EXTRACT(EPOCH FROM (NOW() - updated_at)) < 3600 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - updated_at)) / 60), ' minutes ago')
    WHEN EXTRACT(EPOCH FROM (NOW() - updated_at)) < 86400 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - updated_at)) / 3600), ' hours ago')
    ELSE CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - updated_at)) / 86400), ' days ago')
  END AS relative_updated_at,
  CASE
    WHEN deleted_at IS NULL THEN 'no'
    WHEN EXTRACT(EPOCH FROM (NOW() - deleted_at)) < 60 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - deleted_at))), ' seconds ago')
    WHEN EXTRACT(EPOCH FROM (NOW() - deleted_at)) < 3600 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - deleted_at)) / 60), ' minutes ago')
    WHEN EXTRACT(EPOCH FROM (NOW() - deleted_at)) < 86400 THEN CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - deleted_at)) / 3600), ' hours ago')
    ELSE CONCAT(ROUND(EXTRACT(EPOCH FROM (NOW() - deleted_at)) / 86400), ' days ago')
  END AS relative_deleted_at
FROM
  post_actions
WHERE
  post_action_type_id = 2
  AND updated_at > NOW() - INTERVAL :timespan
  AND (
    :include_in_timespan_deleted = false
    OR (deleted_at IS NOT NULL AND deleted_at > NOW() - INTERVAL :timespan)
  )

2 „Gefällt mir“

Oooh, ich habe falsch gelesen! Ich habe den Satz als „Ist es möglich, eine Abfrage wie ‚vor 50 Sekunden erstellt oder aktualisiert‘ durchzuführen?“ gelesen.

(beachten Sie die Position des einfachen Anführungszeichens)

1 „Gefällt mir“

Danke an alle,

Ich habe hier gepostet, weil ask.discourse mich hierher verwiesen hat.
Ich suche nach der Möglichkeit, ob die API diese Funktion bereitstellt.

1 „Gefällt mir“

Ja, natürlich.

Sie erstellen die Abfrage im Daten-Explorer und führen die Abfrage dann über die API aus, wie in dieser Anleitung beschrieben.

Ich habe Moin’s Abfrage gerade über die API ausgeführt und sie hat die erwarteten Ergebnisse ordnungsgemäß zurückgegeben.

4 „Gefällt mir“

Ich habe mich das auch gefragt. Ist JSON der einzige Weg, Daten über die API zu exportieren, oder wird auch der CSV-Export für den Data Explorer unterstützt?

Danke euch allen,

Entschuldigung für die späte Antwort – war kurz offline.

Was ich derzeit tue, ist, alle heute erstellten Themen/Beiträge zu suchen und die Themen/Beiträge herauszufiltern, die vor dem Zeitstempel aktualisiert wurden.

1 „Gefällt mir“

Wenn Sie sich nicht die Hände schmutzig machen wollen, können Sie den Bot unter ask.discourse.com fragen. Er ist normalerweise ziemlich genau, was SQL-Abfragen im Zusammenhang mit Discourse betrifft (aber gehen Sie nicht davon aus, dass er richtig liegt, überprüfen Sie den Code, um sicher zu sein).

1 „Gefällt mir“

Ist der Content-Type-Header korrekt?
In den Entwicklertools wird bei der Inspektion einer Data Explorer-Abfrage mit Parametern der Content-Type-Header wie folgt angezeigt:

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

Der aktuelle cURL-Befehl enthält jedoch:

-H "Content-Type: multipart/form-data;"


1 „Gefällt mir“
  • multipart/form-data
  • application/x-www-form-urlencoded
  • application/json

sind alles gültige Content-Types, die Sie bei einer API-Anfrage verwenden können.

1 „Gefällt mir“

@blake
Sprache Python
Bibliothek requests
Könnten Sie eine API-Beispielabfrage für den Daten-Explorer bereitstellen, die drei Parameter enthält
siehe
Thema, in dem angegeben ist, dass Parameter streng in doppelten Anführungszeichen angegeben werden müssen

Sicher, hier ist ein Beispiel mit Python:

import json
import requests

API_KEY      = "YOUR_API_KEY"
API_USERNAME = "system"
QUERY_ID     = 20
SITE_URL     = "https://your-site-url"

# alle Werte müssen Strings sein
params = {
    "user_id":   "2",
    "viewed_at": "2019-06-10",
    "limit":     "5"
}

# Data Explorer erwartet Parameter als JSON-kodierten String
payload = {
    "params": json.dumps(params)
}

url = f"{SITE_URL}/admin/plugins/explorer/queries/{QUERY_ID}/run"
headers = {
    "Api-Key":       API_KEY,
    "Api-Username":  API_USERNAME,
    "Content-Type":  "application/json"
}

r = requests.post(url, headers=headers, json=payload)
r.raise_for_status()
print(r.json())
3 „Gefällt mir“