どうもバカルダーです。今回はPythonでFC2ブログに投稿をするための方法と具体的なPythonコードを紹介します。
XML-RPCではタグやアイキャッチ画像の設定は不可能ですが、POST送信による投稿でそれらを可能にする方法を紹介します。これらを組み合わせて自動更新型ブログも作成可能です。
PythonによるFC2ブログ投稿にはXML-RPCとPOST送信する方法の2通りある
PythonによるFC2ブログ投稿にはXML-RPCを使う方法とPOST送信する方法の2通りあります。XML-RPCの方が一般的ですが、あまり細かく記事の設定を行えないというデメリットがあります。
XML-RPC投稿のデメリット
XML-RPC投稿のデメリットとして「ユーザータグ」「アイキャッチ画像個別指定」「投稿テーマ」等の詳細な設定が出来ません。また、カテゴリ設定も1回のリクエストで完了しないため、記事を編集する形でカテゴリをセットしなくてはなりません。
POST送信による投稿のメリット
POST送信によるFC2ブログの投稿はXML-RPC投稿のデメリットを全てカバーできます。手動更新する時と全く同じように細かく設定して記事を投稿できます。
ただし、設定項目が多いのでコードが長くなってしまいます。
POST送信によるFC2ブログ投稿のPythonコード(旧投稿画面を想定)
まず、FC2のログイン画面でログインformのname属性にログイン情報をPOST送信してログインします。そのセッションを保ったまま、FC2ブログ新規記事投稿画面の記事タイトルや本文に対応するname属性に投稿内容をPOST送信します。
念のためheaderを指定して不審なログインだと思われないようにしましょう。
import requests
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
#FC2ログイン
loginurl = 'https://secure.id.fc2.com/index.php?mode=login&switch_language=ja'
payload = {
"email":"メールアドレス",
"pass":"パスワード",
"keep_login":"1",
"image":"ログイン",
"done":"blog",
}
s = requests.Session()
res=s.post(loginurl ,data=payload, headers=headers)
print(res)
payload2 = {
"entry[title]":"記事タイトル",
"entry[category]":"カテゴリ番号(デフォルトは0)",
"name":"",
"entry[tag]":"タグ(半角スペース区切り)",
"entry[allowtag]":"",
"entry[body]":"本文",
"entry[extend]":"追記内容",
"entry[genre]":"ジャンル番号",
"entry[theme]":"テーマ番号",
"entry[eyecatch]":"アイキャッチ画像URL",
"entry[sendtb]":"",
#自動改行(a),htmlのみ(b)
"entry[format]":"b",
"entry[allowcomment]":"n",
"entry[allowtb]":"n",
#保存時の時間で投稿ならauto
"entry[timestamp]":"edit",
"entry[year]":"投稿年",
"entry[month]":"投稿月",
"entry[day]":"投稿日",
"entry[hour]":"投稿時",
"entry[minute]":"00",
"entry[second]":"00",
"entry[is_pinned]":"n",
#公開(y)、下書き(n)、予約(f)
"entry[property]":"f",
#FC2ブログの各ジャンル新着記事へ更新する("checked" or "")
"entry[topping]":"checked",
#以下は各々違うので要確認
"process":"save",
"mode":"editor",
"mission_id":"",
"tbtheme_id":"",
"entry[eno]":"",
"MAX_FILE_SIZE":"500",
"entry[sessid]":"",
"entry[sespsd]":"",
"checkid":"",
}
posturl="https://admin.blog.fc2.com/control.php?mode=editor&process=new"
res2=s.post(posturl ,data=payload2,headers=headers)
print(res2)
新規記事投稿フォームのname属性を右クリック⇒検証で調べてvalueに値をPOSTするだけです。「以下は各々違うので要確認」の部分はtype=”hidden”で表示されないようになっているので右クリック⇒検証で調べる必要があります。
トラックバック送信などは不要ならば、値を入れずに削除してしまっても大丈夫です。いろいろ試してみてください。
アイキャッチ画像の設定について
アイキャッチ画像の画像URLは外部サーバーの画像URLでは出来なったので、後述するXML-RPCによる画像アップロードを行ってFC2ブログの画像URLを取得してから指定するようにします。
XML-RPCでFC2ブログに新規投稿するPythonコード
続いてXML-RPCによる投稿pythonコードです。前述のようにアイキャッチ画像等の詳細な設定は出来ません。「metaWeblog.newPost」というメソッドを使用します。
import xmlrpc.client
# xmlrpcで使用するドメイン(編集不要)
DOMAIN = "http://blog.fc2.com/xmlrpc.php"
# xmlrpcで使用するBLOG_ID
BLOG_ID = ""
# xmlrpcで使用するUSERNAME
USERNAME = "xxxxx@xxx.xxx"
# xmlrpcで使用するPASSWORD
PASSWORD = "xxxxx"
contents = {}
contents["title"] = "タイトル"
contents["description"] = "記事"
contents["mt_text_more"]="追記内容"
contents["dateCreated"]:'2020-01-01'
#公開なら1、下書きは0
publish=1
proxy = xmlrpc.client.ServerProxy(DOMAIN)
proxy.metaWeblog.newPost(BLOG_ID, USERNAME, PASSWORD, contents, publish)
XML-RPCでFC2に画像ファイルをアップロードして画像URLを取得するPythonコード
次はxmlrpcを使ってFC2ブログに画像をアップロードして、FC2の画像URLを取得するpythonコードです。
「metaWeblog.newMediaObject」というメソッドを使用します。FC2にアップロードする前にBase64にエンコードとデコードする必要があります。
import base64
import requests
import xmlrpc.client
#画像URLからエンコードする場合↓
def encodeToBase64url(imgurl):
img_base64 = base64.b64encode(imgurl)
return img_base64
url="画像URL"
response = requests.get(url)
image = response.content
#PC内のファイルからエンコードする場合↓
def encodeToBase64(filename):
with open(filename, "rb") as f:
img_base64 = base64.b64encode(f.read())
return img_base64
#ファイルパス
image = "C:\\Users\\a\\Pictures\\name.jpg"
#base64にエンコードしてデコード
img_en =encodeToBase64(image)
img_dec= base64.b64decode(img_en)
#fc2画像アップロード
# xmlrpcで使用するドメイン
DOMAIN = "http://blog.fc2.com/xmlrpc.php"
# xmlrpcで使用するBLOG_ID
BLOG_ID = ""
# xmlrpcで使用するUSERNAME
USERNAME = ""
# xmlrpcで使用するPASSWORD
PASSWORD = ""
imgg = {}
#画像のファイル名を自由に設定
imgg["name"]="test.jpg"
imgg["bits"]=img_dec
proxy = xmlrpc.client.ServerProxy(DOMAIN)
img1=proxy.metaWeblog.newMediaObject(BLOG_ID, USERNAME, PASSWORD, imgg)
imgurl=img1["url"]
print(imgurl)
画像URLからアップロードする方法とPC内のファイルからアップロードする方法の2通りを記載していますので、不要な方は削除してください。
XML-RPCで最新記事のカテゴリーを変更するPythonコード
最後に記事のカテゴリを変更するためのPythonコードです。使用するメソッドは以下の3つです。
- mt.getCategoryList(現在のカテゴリーリストを取得)
- mt.getRecentPostTitles(最新記事のタイトルやpostidを取得)
- mt.setPostCategories(既存記事にカテゴリーを設定)
import xmlrpc.client
# xmlrpcで使用するドメイン
DOMAIN = "http://blog.fc2.com/xmlrpc.php"
# xmlrpcで使用するBLOG_ID
BLOG_ID = ""
# xmlrpcで使用するUSERNAME
USERNAME = ""
# xmlrpcで使用するPASSWORD
PASSWORD = ""
proxy = xmlrpc.client.ServerProxy(DOMAIN)
#カテゴリリストの確認。未分類からテストへ変更する場合
catelist=proxy.mt.getCategoryList(BLOG_ID, USERNAME, PASSWORD)
#>>[{'categoryId': '0', 'categoryName': '未分類'}, {'categoryId': '1', 'categoryName': 'テスト'}]
#リストにしないとエラーになる
cate=[catelist[1]]
print(cate)
#最新記事のpostidを取得
#取得件数
num=1
post=proxy.mt.getRecentPostTitles(BLOG_ID, USERNAME, PASSWORD,num)
postid=post[0]["postid"]
#BLOG_IDを入れるとエラーになるので削除
setcate=proxy.mt.setPostCategories(postid,USERNAME, PASSWORD,cate)
print(setcate)
注意点としては、カテゴリリストを取得したら、変更したいカテゴリを[]で囲んでリストにしないとエラーになる所です。また、「mt.setPostCategories」では「BLOG_ID」を入れるとエラーになるので削除しました。
定期的に自動投稿して自動更新型ブログを作成するには?
以上のコードとスクレイピング等を組み合わせれば夢の自動更新型ブログが出来上がります。
pythonを定期実行するにはBATファイル化して自分のパソコンでタスクスケジューラを設定したり、クラウドを使うならGoogle Croud PlatformやAWSを使うのがおすすめです。
PythonやPHP、ワードプレス、無料ブログとクラウドを組み合わせて各種作業の自動化プログラムの作成依頼も承っています。お問合せページか以下のTwitterからご連絡ください。
コメント