Automatisierung von geplanten WordPress-Beiträgen mit ChatGPT und Perl oder Python

In diesem Beitrag zeigen wir Ihnen, wie Sie mithilfe eines Perl- oder Python-Programms automatisch Inhalte von ChatGPT generieren und als geplante Beiträge in Ihrer WordPress-Instanz veröffentlichen. Dies ermöglicht es Ihnen, automatisch generierte Inhalte zu überprüfen und bei Bedarf anzupassen, bevor sie live gehen.

Mit ein paar Anpassungen und Erweiterungen können Sie dieses Skript weiter an Ihre spezifischen Bedürfnisse anpassen und den Workflow automatisieren.

OpenAI API-Schlüssel

Sie benötigen einen API-Schlüssel von OpenAI, um Zugriff auf die ChatGPT-Modelle zu erhalten. Besuchen Sie dazu die OpenAI API-Seite, um Ihren API-Schlüssel zu generieren.

WordPress-Anwendungspasswort

Um Beiträge programmgesteuert in WordPress zu erstellen, müssen Sie ein Anwendungspasswort generieren. Dies können Sie in Ihrem WordPress-Admin-Panel unter „Benutzer“ -> „Dein Profil“ im Abschnitt „Anwendungspasswörter“ tun.

Selbst signierte SSL-Zertifikate

Wenn Ihre WordPress-Installation auf einer privaten Domain mit selbst signierten SSL-Zertifikaten gehostet wird, stellt das Programm sicher, dass diese akzeptiert werden.

Funktionsweise des Programms

Das Programm liest die Konfigurationsdaten aus einer JSON-Datei (config.json). Diese Datei enthält die notwendigen Zugangsdaten und API-URLs. Das Programm führt folgende Schritte aus:

Laden der Konfiguration

Die Zugangsdaten und URLs werden aus der config.json-Datei geladen.

Generieren des Inhalts mit ChatGPT

Ein Prompt wird an die OpenAI API gesendet, und das Modell gpt-4 generiert eine Antwort, die als Inhalt des WordPress-Beitrags verwendet wird.

Planen des Beitrags in WordPress

Der generierte Inhalt wird als neuer Beitrag in WordPress erstellt und so geplant, dass er in genau 24 Stunden veröffentlicht wird. Dadurch haben Sie genügend Zeit, den Beitrag zu überprüfen und bei Bedarf zu bearbeiten.

Fehlerbehandlung und Debugging

Das Programm enthält Mechanismen zur Fehlerbehandlung und gibt detaillierte Fehlermeldungen aus, um die Diagnose und Behebung von Problemen zu erleichtern.

JSON-Konfigurationsdatei

nano config.json
{
    "openai_api_key": "YOUR_CORRECT_OPENAI_API_KEY",
    "openai_api_url": "https://api.openai.com/v1/chat/completions",
    "openai_model": "gpt-4",
    "wordpress_url": "https://wordpress.lan/wp-json/wp/v2/posts",
    "wordpress_user": "YOUR_WORDPRESS_USERNAME",
    "wordpress_password": "YOUR_APPLICATION_PASSWORD"
}

Perl-Skript

nano chatgpt-wordpress.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open ':std', ':encoding(UTF-8)';
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use JSON;
use MIME::Base64;
use IO::Socket::SSL;
use File::Slurp;
use POSIX qw(strftime);

# Konfigurationsdatei laden
my $config_file = 'config.json';
my $config_content = read_file($config_file);
my $config = decode_json($config_content);

# OpenAI API-Details
my $openai_api_key = $config->{openai_api_key};
my $openai_api_url = $config->{openai_api_url};
my $openai_model = $config->{openai_model};

# WordPress API-Details
my $wordpress_url = $config->{wordpress_url};
my $wordpress_user = $config->{wordpress_user};
my $wordpress_password = $config->{wordpress_password};

# Prompt an ChatGPT senden
sub get_chatgpt_response {
    my ($prompt, $api_key, $api_url, $model) = @_;
    
    my $ua = LWP::UserAgent->new(
        ssl_opts => { verify_hostname => 0, SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE }
    );
    my $response = $ua->request(POST $api_url,
        Content_Type => 'application/json',
        Authorization => "Bearer $api_key",
        Content => encode_json({
            model => $model,
            messages => [{role => "user", content => $prompt}],
            max_tokens => 1000,
        })
    );
    
    if ($response->is_success) {
        my $content = decode_json($response->decoded_content);
        return $content->{choices}->[0]->{message}->{content};
    } else {
        warn "Error contacting OpenAI API: " . $response->status_line . "\n" . $response->decoded_content;
        return "Dies ist ein Platzhaltertext, da die API-Quota überschritten wurde.";
    }
}

# Beitrag auf WordPress veröffentlichen
sub publish_to_wordpress {
    my ($title, $content, $status, $url, $user, $password) = @_;
    
    my $ua = LWP::UserAgent->new(
        ssl_opts => { verify_hostname => 0, SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE }
    );
    my $encoded_auth = encode_base64("$user:$password", '');

    # Veröffentlichungsdatum in 24 Stunden
    my $publish_date = strftime("%Y-%m-%dT%H:%M:%S", localtime(time + 24 * 60 * 60));
    
    my $response = $ua->request(POST $url,
        Content_Type => 'application/json',
        Authorization => "Basic $encoded_auth",
        Content => encode_json({
            title => $title,
            content => $content,
            status => 'future',
            date => $publish_date,
        })
    );
    
    if ($response->is_success) {
        my $result = decode_json($response->decoded_content);
        return $result->{link};
    } else {
        die "Error contacting WordPress API: " . $response->status_line . "\n" . $response->decoded_content;
    }
}

# Beispielaufruf
my $prompt = "Erkläre die Vorteile von Perl für die Webentwicklung.";
my $response = get_chatgpt_response($prompt, $openai_api_key, $openai_api_url, $openai_model);

my $title = "ChatGPT-Erklärung zu Perl";
my $status = "future"; # Geplanter Beitrag

my $result_link = publish_to_wordpress($title, $response, $status, $wordpress_url, $wordpress_user, $wordpress_password);

print "Beitrag veröffentlicht: $result_link\n";

Python-Script

nano chatgpt-wordpress.py
import requests
import json
from base64 import b64encode
from datetime import datetime, timedelta
import urllib3

# Warnungen für unsichere SSL-Verbindungen unterdrücken
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# Konfigurationsdatei laden
with open('config.json', 'r') as f:
    config = json.load(f)

# OpenAI API-Details
openai_api_key = config['openai_api_key']
openai_api_url = config['openai_api_url']
openai_model = config['openai_model']

# WordPress API-Details
wordpress_url = config['wordpress_url']
wordpress_user = config['wordpress_user']
wordpress_password = config['wordpress_password']

# Prompt an ChatGPT senden
def get_chatgpt_response(prompt, api_key, api_url, model):
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {api_key}'
    }
    data = {
        'model': model,
        'messages': [{'role': 'user', 'content': prompt}],
        'max_tokens': 1000
    }
    
    try:
        response = requests.post(api_url, headers=headers, json=data)
        response.raise_for_status()
        content = response.json()
        return content['choices'][0]['message']['content']
    except requests.exceptions.RequestException as e:
        print(f"Error contacting OpenAI API: {e}")
        return "Dies ist ein Platzhaltertext, da die API-Quota überschritten wurde."

# Beitrag auf WordPress veröffentlichen
def publish_to_wordpress(title, content, status, url, user, password):
    auth_str = f'{user}:{password}'
    encoded_auth = b64encode(auth_str.encode()).decode()
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Basic {encoded_auth}'
    }
    
    # Veröffentlichungsdatum in 24 Stunden
    publish_date = (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%dT%H:%M:%S')
    
    data = {
        'title': title,
        'content': content,
        'status': status,
        'date': publish_date
    }
    
    try:
        response = requests.post(url, headers=headers, json=data, verify=False)  # Zertifikatsprüfung deaktiviert
        response.raise_for_status()
        result = response.json()
        return result['link']
    except requests.exceptions.RequestException as e:
        print(f"Error contacting WordPress API: {e}")
        return None

# Beispielaufruf
prompt = "Erkläre die Vorteile von Python für die Webentwicklung."
response = get_chatgpt_response(prompt, openai_api_key, openai_api_url, openai_model)

title = "ChatGPT-Erklärung zu Python"
status = "future"  # Geplanter Beitrag

result_link = publish_to_wordpress(title, response, status, wordpress_url, wordpress_user, wordpress_password)

if result_link:
    print(f"Beitrag veröffentlicht: {result_link}")
else:
    print("Beitrag konnte nicht veröffentlicht werden.")