【レベル4】Pythonでワードプレスに記事を読み書き投稿するプログラム

Bookmark this on Google Bookmarks
Pocket

練習問題

wordpress_xmlrpcを使ってワードプレスに投稿するプログラムを書きなさい。

この問題を解くのに必要な知識

特になし

解説

ワードプレスに投稿するライブラリが存在します。
これは、ワードプレスサイトの

xmlrpc.php

というphpページにアクセスして投稿できるようにしたものらしいですが、詳しいことはわかりません。素人だもの。
一つ明らかなのは、こいつをpipでモジュールとしてインストールすれば、Pyhonからワードプレスに記事が投稿可能になるということです。

python-wordpress_xmlrpcのインストール

まずはターミナル(Windowsならコマンドプロンプト)を開いて、
[python]pip install python-wordpress-xmlrpc[/python]
これでモジュールのインストールが完了しました。

モジュールのインポート

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo

ここから具体的に投稿条件を記述していきます。

wp = Client('http://[サイトのアドレス]/xmlrpc.php', 'ユーザー名', 'ログインパスワード')
post = WordPressPost()
post.title = 'タイトル'
post.content = 'ここに投稿内容'
post.terms_names = {'post_tag': ['タグ名1','タグ名2'],'category': ['カテゴリ名1','カテゴリ名2']}
post.status='publish'
wp.call(NewPost(post))

[サイトのアドレス][ユーザー名][ログインパスワード]を入れれば、すぐに投稿できます。
一応は、使い勝手が悪すぎますが、Pythonからワードプレスみ投稿する環境ができました。

解答

[python]
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo

wp = Client(‘http://[サイトのアドレス]/xmlrpc.php’, ‘ユーザー名’, ‘ログインパスワード’)
post = WordPressPost()
post.title = ‘タイトル’
post.content = ‘ここに投稿内容’
post.terms_names = {‘post_tag’: [‘タグ名1′,’タグ名2′],’category’: [‘カテゴリ名1′,’カテゴリ名2′]}
post.status=’publish’
wp.call(NewPost(post))
[/python]

ただこれでは使い勝手が悪すぎます。
もう少し変数を定義してすっきりさせましょう。

練習問題

新規にテキストファイルを作成し、随時書き込み、保存したファイルを読み出し、その内容をワードプレスに投稿するプログラムを書きなさい。

この問題を解くのに必要な知識

  • open() 関数
  • while文
  • 使い勝手をよくしてみる。

    importの部分は省きます
    プレースホルダー を使うと便利です
    [python]
    url='[サイトのアドレス]’
    username='[ユーザー名]’
    password='[パスワード]’
    wp = Client(‘%s’ % url, ‘%s’ % username, ‘%s’ % password)
    post = WordPressPost()
    post.title = ‘タイトル’
    post.content = ‘ここに投稿内容’
    post.terms_names = {‘post_tag’: [‘タグ名1′,’タグ名2′],’category’: [‘カテゴリ名1′,’カテゴリ名2′]}
    post.status=’publish’
    wp.call(NewPost(post))
    [/python]

    タイトルと本文をinput() 形式で入力できるようにする。

    input() を使えば、楽にタイトルと本文を挿入することができます。

    [python]
    p_title=input(‘タイトル名:’)
    p_content=input(‘本文:’)

    post.title=p_title
    post.content=p_content
    [/python]
    これで少しは楽になりました。試しに実行してみると、タイトルと本文を入力すれば投稿することができますね。
    しかしこれではinputが一行しか入力できないので、困ったものです。
    endと入力するまで続けてかけるようにします。

    input() で複数行の入力

    while文 でinput() を繰り返します。
    whileは便利です。個人的にはfor文よりも扱いがし易く、理解しやすいと思っています。
    [python]
    while True:
    text=input("文章を入力:")
    if text=="end":
    break
    [/python]
    このようにしてあげれば、endと入力するまで、書き続けられます。
    しかしこれでは、せっかく書いた文章が保存されません。
    次に、txtファイルに保存する方法を解説します。

    一度ワードプレスのことは忘れて、頭をまっさらにしましょう。

    テキストファイルを作成する

    テキストファイルを新規に作成するには、open() 関数を用います。
    [python]
    p_title=input(‘タイトル:’)
    directory=’ファイルのパス’
    file=open(‘%s/%s.txt’ % (directory,p_title),’a’,encoding=’utf-8′) #書き込み追記モード
    [/python]
    %s/%sの部分がよくわからないかもしれません。

    これは、プレースホルダー を連続して使っています。
    通常であれば、

    '%s' % sample1

     で変数sample1を挿入できますが、複数を異なる場所に挿入したい場合は、

    '%s %s' % (sample1, sample2)

    とします。

    今回は、’ファイルのパス/タイトル.txt’というテキストファイルを作成したかったので、このような形になりました。

    ‘w’は書き込みモードで、開くたびに内容を消去してまっさらな状態から書き込むモードです。

    open() で、モードの選択を行う。
  • ‘r’:読み込みモード
  • ‘w’:書き込み用に開き、まずファイルを切り詰める
  • ‘a’:書き込み用に開き、ファイルが存在する場合は末尾に追記する
  • ‘b’:バイナリモード
  • 使うのはこの4つくらいです。

    今回は、続けて書けるように’a’で開きましょう。
    上の繰り返し入力と合わせてファイルに追記するコードはこのようになります。

    [python]
    p_title=input(‘タイトル:’)
    directory=’ファイルのパス’
    file=open(‘%s/%s.txt’ % (directory,p_title),’a’,encoding=’utf-8′) #書き込み追記モード
    while True: #エラーがなければ延々と繰り返す構文。便利。
    text=input("文章を入力:")
    if text=="end":
    break #whileのループから抜け出す呪文
    else:
    file.write(‘%s\n’ % text) #改行\nを入れないと、詰め詰めになる
    file.close()
    [/python]
    file.write(‘ここに内容’)とすれば、ファイルに書き込みすることができます。
    書き込んだ後は、file.close()で閉じましょう。

    ファイルのパスは、右クリックからoptionキーを押すことでコピーできます。
    MacOSのデスクトップの場合、
    /Users/ユーザー名/Desktop

    がパスになります。

    テキストファイルを読み出し、ワードプレスに投稿する

    これで、新しく作成するメモ帳が完成しましたね。

    次は、こいつを読み込みます。
    [python title=”Pythonコード”]
    file=open(‘%s/%s.txt’ % (directory,p_title),’r’,encoding=’utf-8′)
    [/python]
    モードを’r’に変更することを忘れないようにしましょう。

    ここで、忘れていたワードプレスの呪文を引っ張ってきます。
    [python title=”Pythonコード”]
    file=open(‘%s/%s.txt’ % (directory,p_title),’r’,encoding=’utf-8′)

    wp = Client(‘%s’ % url, ‘%s’ % username, ‘%s’ % password)
    post = WordPressPost()
    post.title = p_title
    post.content = file.read() #ここに、読み込み内容
    post.terms_names = {‘post_tag’: [‘タグ名1′,’タグ名2′],’category’: [‘カテゴリ名1′,’カテゴリ名2′]}
    post.status=’publish’
    wp.call(NewPost(post))
    file.close()
    [/python]
    file.read()とすれば、内容を読み込むことができます。
    file.close()で閉じるのを忘れないようにしましょう。
    これで、新しくメモを作成し、ワードプレスに投稿することができるようになりましたね。
    file.close()で閉じるのを忘れないようにしましょう。

    解答

    [python title=”Pythonコード”]
    from wordpress_xmlrpc import Client, WordPressPost
    from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
    from wordpress_xmlrpc.methods.users import GetUserInfo

    #初期設定欄
    p_title=input(‘タイトル:’)
    directory=’/Users/SeiyaAsada/Desktop’
    url='[サイトのアドレス]’
    username='[ユーザー名]’
    password='[パスワード]’

    #ファイルを書き込み
    file=open(‘%s/%s.txt’ % (directory,p_title),’a’,encoding=’utf-8′)
    while True:
    text=input("文章を入力:")
    if text=="end":
    break
    else:
    file.write(‘%s\n’ % text)
    file.close()

    #ファイルを読み出し、ワードプレスに投稿
    file=open(‘%s/%s.txt’ % (directory,p_title),’r’,encoding=’utf-8′)
    wp = Client(‘%s’ % url, ‘%s’ % username, ‘%s’ % password)
    post = WordPressPost()
    post.title = p_title
    post.content = file.read() #ここに、読み込み内容
    post.terms_names = {‘post_tag’: [‘タグ名1′,’タグ名2′],’category’: [‘カテゴリ名1′,’カテゴリ名2′]}
    post.status=’publish’
    wp.call(NewPost(post))
    file.close()
    [/python]

    書き込み、保存し、追記してワードプレスに投稿する

    次はいよいよ、本格的に投稿プログラムを完成させます。
    ここまで、新たに書き込み、それを投稿するところまで作りましたが、一発で長い文章を書き続けるのは辛いところです。

    タイトルを指定することで追記できますが、「【完成形】Pythonでワードプレスに投稿するプログラム」なんていちいち打って入られません。

    しかも、endと入力した場合にすぐに投稿されてしまいます。

    そこで、os.listdir()を使い、ディレクトリ内のファイルをリストアップします。
    [python title=”Pythonコード”]
    import os
    files = os.listdir(directory)
    [/python]
    これでディレクトリ内のファイルを読み出すことができます。
    あとは、リスト化です。
    [python title=”Pythonコード”]
    import os
    files = os.listdir(directory)
    for i in range(len(files)) : #フォルダ内のファイルリストを表示
    print("%s:%s" % (i,files[i]))
    [/python]
    仮にディレクトリ内に[test1.txt][test2.txt][test3.txt]があるとき、このように表示されます。

    0:test1.txt
    1:test2.txt
    2:test3.txt
    

    あとは、任意の番号を指定するだけでファイルを引っ張り出してくれるコードを記述するだけです。
    [python title=”Pythonコード”]
    files = os.listdir(directory)
    while True:
    for i in range(len(files)) : #フォルダ内のファイルリストを表示
    print("%s:%s" % (i,files[i]))
    #番号を入力させて、エラーが出なければbreakで次へ
    try:
    title=str(files[int(input("番号入力:"))]).replace(".txt","")
    f=open("%s/%s.txt" % (directory,title),"r",encoding="utf-8")
    break
    #エラーが出れば(番号が違う、番号じゃないなど)ループさせる
    except:
    print("番号を入力してください")
    print(file.read()) #開いたファイルを表示してみましょう
    [/python]

    これを、新しくファイルを作成するか、既存のファイルを読み込むか、選択できるようにすればいいわけですね!

    [python title=”Pythonコード”]
    while True:
    new=input(‘\n新規作成?(y/n):’)
    #新規作成を選んだ場合、タイトルを新たに決めて、ファイルを作成します
    if new == "y":
    while True:
    p_title=input(‘タイトルを入力:’)
    if p_title=="":
    print("タイトルが入力されていません。")
    else:
    break
    break
    #既存のファイルを開く場合、指定ディレクトリのフォルダからファイル一覧を出し、選択させます
    elif new== "n":
    files = os.listdir(directory)
    while True:
    for i in range(len(files)) : #フォルダ内のファイルリストを表示
    print("%s:%s" % (i,files[i]))
    #番号を入力させて、エラーが出なければbreakで次へ
    try:
    #replace()で、拡張子を一旦消す。
    p_title=str(files[int(input("番号入力:"))]).replace(".txt","")
    f=open("%s/%s.txt" % (directory,p_title),"r",encoding="utf-8")
    print(f.read()) #ファイルの中身を表示させて、確かめる
    f.close()
    break
    #エラーが出れば(番号が違う、番号じゃないなど)ループさせる
    except:
    print("番号を入力してください")
    break
    #yでもnでもない入力の場合、ループさせる。
    else:
    continue
    f=open("%s/%s.txt" % (directory,p_title),"a",encoding="utf-8")
    [/python]

    これで、新規作成時と既存のファイルを編集する両方に対応できました。

    ただし、まだ問題が残っています。
    このままでは文章をを書き終え、endと入力した場合にすぐにワードプレスに投稿されてしまします。

    投稿するか保存するかの条件

    ファイルを閉じた瞬間に、「ワードプレスに投稿しますか?」と選択可能なコードを入れましょう。
    [python title=”Pythonコード”]
    #ワードプレスに投稿するかどうか
    doupost=input(‘ワードプレスに投稿しますか?(y)’)
    if doupost==’y’:
    f=open("%s/%s.txt" % (directory,p_title),"r",encoding="utf-8")
    print(‘投稿しています…Wait for a second…’)
    wp = Client(‘%s’ % url, ‘%s’ % username, ‘%s’ % password)
    post = WordPressPost()
    post.title = p_title
    post.content = file.read()
    post.terms_names = {‘post_tag’: [‘タグ名1′,’タグ名2′],’category’: [‘カテゴリ名1′,’カテゴリ名2′]}
    post.status=’publish’
    wp.call(NewPost(post))
    file.close()
    print(‘投稿が完了しました。’)
    else:#yとしない場合。
    print(‘投稿をやめました。’)
    [/python]
    これで、ブログ投稿プログラムの完成です。

    いえ、もうひとつ加えましょう。
    ワードプレスに投稿するかしないかに関わらず、全ての作業が完了したら、また続きを編集するか、別のファイルを編集できたらいいですよね。

    全体をwhile文で囲ってあげればよいです。
    [python title=”Pythonコード”]
    while True:
    #[今まで書いたプログラムコード]
    conti=input(‘このまま編集を続けますか?(y):’)
    if conti=="y":
    continue
    else:
    break
    print(‘作業を終了しました。’)
    [/python]
    といった感じにすれば、完成です。

    まとめ

    ここまで解説した内容はそれぞれの箇所でバラバラなので、ちゃんと書きましょう。
    [python title=”Pythonコード”]
    while True:#全体の繰り返し
    while True:#ファイル作成、読み込み時のループ
    new=input(‘\n新規作成?(y/n):’)
    #新規作成を選んだ場合、タイトルを新たに決めて、ファイルを作成します
    if new == "y":
    while True:
    p_title=input(‘タイトルを入力:’)
    if p_title=="":
    print("タイトルが入力されていません。")
    else:
    break
    break
    #既存のファイルを開く場合、指定ディレクトリのフォルダからファイル一覧を出し、選択させます
    elif new== "n":
    files = os.listdir(directory)
    while True:
    for i in range(len(files)) : #フォルダ内のファイルリストを表示
    print("%s:%s" % (i,files[i]))
    #番号を入力させて、エラーが出なければbreakで次へ
    try:
    #replace()で、拡張子を一旦消す。
    p_title=str(files[int(input("番号入力:"))]).replace(".txt","")
    f=open("%s/%s.txt" % (directory,p_title),"r",encoding="utf-8")
    print(f.read()) #ファイルの中身を表示させて、確かめる
    f.close()
    break
    #エラーが出れば(番号が違う、番号じゃないなど)ループさせる
    except:
    print("番号を入力してください")
    break
    #yでもnでもない入力の場合、ループさせる。
    else:
    continue
    #文章の編集開始
    f=open("%s/%s.txt" % (directory,p_title),"a",encoding="utf-8")
    while True:
    text=input("文章を入力:")
    if text=="end":
    break
    else:
    file.write(‘%s\n’ % text)
    file.close()

    #ファイルを読み出し、ワードプレスに投稿
    file=open(‘%s/%s.txt’ % (directory,p_title),’r’,encoding=’utf-8′)
    doupost=input(‘ワードプレスに投稿しますか?(y)’)
    if doupost==’y’:
    f=open("%s/%s.txt" % (directory,p_title),"r",encoding="utf-8")
    print(‘投稿しています…Wait for a second…’)
    wp = Client(‘%s’ % url, ‘%s’ % username, ‘%s’ % password)
    post = WordPressPost()
    post.title = p_title
    post.content = file.read()
    post.terms_names = {‘post_tag’: [‘タグ名1′,’タグ名2′],’category’: [‘カテゴリ名1′,’カテゴリ名2′]}
    post.status=’publish’
    wp.call(NewPost(post))
    file.close()
    print(‘投稿が完了しました。’)
    else:#yとしない場合。
    print(‘投稿をやめました。’)
    conti=input(‘このまま編集を続けますか?(y):’)
    if conti=="y":
    continue
    else:
    break
    print(‘作業を終了しました。’)
    [/python]

    ふぅ、ちゃんと動いてくれることを願っています。
    もしかすると、インデントの違いでエラーが出る可能性はありますが、適宜修正してください。

    また、以下に究極形のコードを公開しておきます。

    究極形でできること

  • ディレクトリを選択
  • 複数のWPアカウントから選択
  • ファイルを新規作成
  • ファイルを読み出し
  • 読み出し時に保存内容を確認
  • 編集時のスニペット登録・呼び出し
  • 投稿時に[下書き]or[公開]
  • 投稿時にカテゴリ追加
  • どうぞ。
    ちなみに、この記事はこれで作ったプログラムで書いて投稿しています。

    [python]
    import os #フォルダの中身を探る
    import sys #プログラム強制終了用
    from wordpress_xmlrpc import Client, WordPressPost
    from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
    from wordpress_xmlrpc.methods.users import GetUserInfo

    #スニペット中のendを入力するまで繰り返し書かせる子プログラムの定義
    def write_roop():
    i=1
    while True:
    text=input(‘%s:’ % i)
    if text==’end’:
    break
    else:
    f.write(‘%s\n’ % text)
    i+=1
    continue

    #ディレクトリ選択
    place=["Desktop","User"]
    print("———————–")
    for i in range(int(len(place))):
    print("%s:%s" % (i,place[i]))
    print("———————–")
    while True:
    select=input("どのディレクトリで作業しますか?:")
    if select=="0":
    directory="/Users/ユーザー名/Desktop"
    break
    elif select=="1":
    directory="/Users/ユーザー名"
    break
    else:
    continue

    #どのアカウントを使用するか
    account=["アカウント1","アカウント2"]
    print("———————–")
    for i in range(int(len(account))):
    print("%s:%s" % (i,account[i]))
    print("———————–")
    while True:
    page=input("どのアカウントで投稿しますか?:")
    if page=="0":
    url="アカウント1のURL"
    username="アカウント1のユーザー名"
    password="アカウント1ののパスワード"
    break
    elif page=="1":
    url="アカウント2のURL"
    username="アカウント2のユーザー名"
    password="アカウント2ののパスワード"
    break
    else:
    continue

    while True: #最後の編集を続ける選択をした場合のループ
    #書き始めを決定します
    while True:
    new=input(‘\n新規作成?(y/n):’)
    #新規作成を選んだ場合、タイトルを新たに決めて、ファイルを作成します
    if new == "y":
    while True:
    title=input(‘タイトルを入力:’)
    if title=="":
    print("タイトルが入力されていません。")
    else:
    break
    break
    #既存のファイルを開く場合、指定ディレクトリのフォルダからファイル一覧を出し、選択させます
    elif new== "n":
    files = os.listdir(directory)
    while True:
    for i in range(len(files)) : #フォルダ内のファイルリストを表示
    print("%s:%s" % (i,files[i]))
    #番号を入力させて、エラーが出なければbreakで次へ
    try:
    title=str(files[int(input("番号入力:"))]).replace(".txt","")
    f=open("%s/%s.txt" % (directory,title),"r",encoding="utf-8")

    print(”’

    ファイルの内容

                    ''')
                    print(f.read())
    

    print(”’


                    ''')
                    f.close()
                    break
                #エラーが出れば(番号が違う、番号じゃないなど)ループさせる
                except:
                    print("番号を入力してください")
            break
        #endと入力した場合、強制終了
        elif new=="end":
            sys.exit()
        #yでもnでもendでもない入力の場合、ループさせる。
        else:
            continue
    f=open("%s/%s.txt" % (directory,title),"a",encoding="utf-8")
    
    #本文を繰り返し入力させる
    while True:
        content=input("文章を入力(or end):")
        #endと打てば本文入力終了
        if content=="end":
            break
    
        #見出し1
        elif content=='#':
            f.write('<h1>%s</h1>\n' % input("<h1>"))
            print('</h1>')#視覚的な補助
    
        #見出し2
        elif content=='##':
            f.write('<h2>%s</h2>\n' % input("<h2>"))
            print('</h2>')#視覚的な補助
    
        #見出し3
        elif content=='###':
            f.write('<h3>%s</h3>\n' % input("<h3>"))
            print('</h3>')#視覚的な補助
    
        #list
        #見出し3
        elif content=='li':
            f.write('<li>%s</li>\n' % input("<li>"))
            print('</>')#視覚的な補助
    
        #pre
        elif content=='pre':
            f.write('<pre>')
            print('<pre>')#視覚的な補助
            write_roop()
            f.write('</pre>\n')
            print('</pre>')#視覚的な補助
    
        #その他普通の文字列はそのまま書き込み
        else:
            f.write("%s\n" % content)
    #最後にファイルを閉じる
    f.close()
    print("保存しました。")
    
    #ワードプレスに投稿するかどうか
    doupost=input('ワードプレスに投稿しますか?(y)')
    if doupost=='y':
        f=open("%s/%s.txt" % (directory,title),"r",encoding="utf-8")
        #カテゴリー設定
        category=[]
        while True:
            cat=str(input("カテゴリーを入力:"))
            if cat=="end":
                break
            category.append(cat)
        while True:
            dp=input('下書き(draft)か公開(publish)を選択してください。(d/p)')
            if dp=='p':
                p_status='publish'
                break
            elif dp=='d':
                p_status='draft'
                break
            else:
                continue
        print('投稿しています...Wait for a second...')
    
        wp = Client('%s/xmlrpc.php' % url, username, password)
        post = WordPressPost()
        post.title = title
        post.content = f.read()
        post.terms_names = {'post_tag': [],'category': category}
        post.status=p_status
        wp.call(NewPost(post))
    
        f.close()
        print('投稿が完了しました。')
    else:
        print('投稿をやめました。')
    
    #最後に、編集を続けるかどうかの条件。yで、最初に戻り、新規作成と既存のファイルの編集が出来る。
    while True:
        conti=input("編集を続けますか?(y/n)")
        if conti=="y":
            break
        elif conti=="n":
            print("作業を終了します。")
            sys.exit()
        else:
            print("入力してください")
            continue
    

    [/python]