NO IMAGE

ワードプレス半自動化プログラム

  • 2024年4月10日
  • 2024年4月11日
  • 未分類
  • 4view
NO IMAGE

こちらは、検索キーワードを羅列したテキストファイルを読み込み、1行目から順にキーワードに沿って記事をワードプレスとtwitter(x)に自動投稿するpythonプログラムになります。

タイトル、URLも自動生成し、Googleインデックス登録まで行ってくれるので、人間の作業は校正とアイキャッチを手動で設定していくだけで済みます。

テキストファイル(sug2)

パンダ 中国 ツアー
パンダ 中国 帰る
パンダ 中国 借りてる
パンダ 中国 観光
.
.
.

メインスクリプト(main.py)

import json
from openai import OpenAI
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
from textwrap import dedent
import requests
import argparse
import traceback
import tweepy
import time

args=0
ti=0
sl=0

bearar_token = ‘token1’
consumer_key = ‘key1’
consumer_secret = ‘secret1’
access_token_key = ‘token2’
access_token_secret = ‘secret2’

client = tweepy.Client(
bearer_token = bearar_token,
consumer_key = consumer_key,
consumer_secret = consumer_secret,
access_token = access_token_key,
access_token_secret = access_token_secret
)

def heredoc(s):
return dedent(s).strip()

class ChatGPT:
def __init__(self, api_key, model=”gpt-3.5-turbo-0125″):
self.client = OpenAI(api_key=api_key)
self.model = model

def completion(self, prompt):
response = self.client.chat.completions.create(
model=self.model,
messages=[
{
“role”: “user”,
“content”: prompt,
}
])
return response.choices[0].message.content.strip()

def gen_article(openai_api_key, question):
try:
print(“ChatGPTで記事生成中…”)
chat_gpt = ChatGPT(openai_api_key, ‘gpt-3.5-turbo-0125’)
prompt = heredoc(f”””
指示:
下記質問をもとに600字以上でブログ記事を作成してください。
本文はhtml形式にし、適宜h2タグで見出しを作成してください。

質問:
{question}

記事:
“””)

return chat_gpt.completion(prompt)
except Exception:
print(‘ChatGPTへのリクエストでエラーが発生しました。’)
print(traceback.format_exc())
exit(1)

def post_article(title, slug, body, user, password):
try:
print(“WordPressに記事を投稿中…”)

# ブログのURL
blog_url = ‘https://ukgwr.com/’

# 送信する記事データ
post_data = {
‘title’: title,
‘content’: body,
‘slug’: slug,
‘status’: ‘publish’, # draft=下書き、publish=公開 省略時はdraftになる
}

# Post APIのURL
post_api_url = f'{blog_url}/wp-json/wp/v2/posts’

# 記事投稿リクエスト
response = requests.post(post_api_url, json=post_data, auth=(user, password))

res_json = response.json()

return res_json[‘link’]except Exception:
print(‘WordPressへの投稿でエラーが発生しました。’)
print(traceback.format_exc())
exit(2)

def index_article(json_key_file_path, url):
try:
print(“Indexing APIにリクエストを送信中…”)

credentials = ServiceAccountCredentials.from_json_keyfile_name(
json_key_file_path,
scopes=[
‘https://www.googleapis.com/auth/indexing’,
],
)

http = credentials.authorize(httplib2.Http())
response, content = http.request(
‘https://indexing.googleapis.com/v3/urlNotifications:publish’,
method=’POST’,
body=f'{{“url”: “{url}”, “type”: “URL_UPDATED”}}’,
)

if response.status == 200:
return True
else:
print(json.loads(content.decode(‘utf-8’))[‘error’][‘message’])
return False

except Exception:
print(‘Indexing APIへのリクエストでエラーが発生しました。’)
print(traceback.format_exc())
print(json.dumps(json.loads(content.decode(‘utf-8’))))
exit(3)

def auto_article(openai_api_key, question, title, slug, user, password, json_key_file_path):
body = gen_article(openai_api_key, question)
url = post_article(title, slug, body, user, password)
is_success = index_article(json_key_file_path, url)
return is_success

if __name__ == ‘__main__’:
parser = argparse.ArgumentParser(description=’ChatGPTが生成した記事をWordPressに投稿し、IndexingAPIを用いてクローリングを依頼するプログラム。’)
parser.add_argument(‘-o’, ‘–open-api-key’, dest=’openai_api_key’, type=str, required=True, help=’OpenAI APIのAPIキー’)
parser.add_argument(‘-q’, ‘–question’, type=str, required=True, help=’ChatGPTへ投げかける質問’)
parser.add_argument(‘-t’, ‘–title’, type=str, required=True, help=’記事のタイトル’)
parser.add_argument(‘-s’, ‘–slug’, type=str, required=True, help=’記事のスラッグ’)
parser.add_argument(‘-u’, ‘–user’, type=str, required=True, help=’WordPress管理画面のログインユーザーID’)
parser.add_argument(‘-p’, ‘–password’, type=str, required=True, help=’WordPress管理画面のアプリケーションパスワード’)
parser.add_argument(‘-f’, ‘–filepath’, type=str, required=True, help=’GCPのJSONキーファイルのパス’)

args = parser.parse_args()

ti=args.title
sl=args.slug

is_success = auto_article(args.openai_api_key, args.question, args.title, args.slug, args.user, args.password, args.filepath)

if is_success:
print(“成功しました。”)
else:
print(“失敗しました。”)

str1=”https://ukgwr.com/”
str2=str1+sl
str3=str2+”\n”
str4=str3+ti

client.create_tweet(text=str4)
print(ti+” “+”をツイートしました”)

スタートアップファイル(postwp.sh)

n=1

while true
do

m=$((n))$”p”

keyword=$(sed -n $m sug2)
echo $keyword

if [ “$keyword” = “” ]; then
echo 終了しました。
exit 1

fi

slug=$(py trans.py $keyword)

title=$(echo $keyword | py pattern.py)

echo $title

py main.py -f /home/example.json -o apicode1 -q “$keyword” -t $title -s $slug -u username -p apicode2

sleep 10

done