Python

【Python】はてなブログに記事を自動投稿するサンプルプログラム

この記事は約6分で読めます。

 

 

案件ではてなブログに記事を自動で投稿するプログラムを作ったので紹介します。

 

はてなブログのAPI

 

はてなブログにはAtom Pub APIというものがあり、これを使うことで記事内容の取得や記事の投稿ができます。しかしこのAPI、投稿する記事の文字量が多い(2000~?)と400エラーを吐くという謎の仕様があり、あまり信用できません。

 

関連記事:

 

なので、他に方法はないかと探していたところ、メールアドレス経由で記事を投稿する方法があり、今回はこちらを紹介したいと思います。

 

前準備

 

まずは自分のメールアドレスが必要になります。Pythonでのメール送信の自動化によく使われるのはYAHOOメールとGmailの二つだと思いますが、Gmailはセキュリティ設定に引っかかってめんどくさいので今回はYAHOOメールを使用したいと思います。Pythonを使ったYAHOOメールの自動化については以下の記事で紹介しています。

 

関連記事:【Python】Yahooメールで受信したメールの宛先・題名・本文を取得する

 

関連記事:【Python】YahooメールのSTMPを使ってメール送信してみる

 

ヤフーメールのSMTP設定方法

 

ヤフーメールでプログラム上からメールを送信するためには、SMTP設定を変更する必要があります。ヤフーメールでのSMTPの設定変更はメール一覧右上の設定ボタンを押し、IMAP/POP/SMTPアクセスのページを表示します。ここで「SMTPを有効にする」というところにチェックが付いているかを確認してください。

 

 

加えてSTMPのポート番号は↑画像の設定情報の部分をクリックすると確認できます。ポート番号はSSLを使う時は465、使わない場合は567を指定してください。

 

参考:https://support.yahoo-net.jp/PccMail/s/article/H000007321

 

はてなブログのAPIメールアドレスを確認する

 

はてなブログでは、ブログごとに専用の「投稿メールアドレス」があり、記事編集画面を利用しないで、メールから記事を投稿することができます。

 

投稿メールアドレスは、各ブログの設定画面の詳細設定ページ で確認できます。記事をそのまま公開するアドレスと、下書きとして投稿するメールアドレスがあります。

 

 

引用:https://help.hatenablog.com/entry/mailpost

 

メール経由ではてなブログに記事を自動投稿する

 

import base64
import smtplib
import ssl
from email.mime.text import MIMEText
from email.utils import formatdate

main_text = 'メールの本文です'
charset = "utf-8"
if charset == "utf-8":
    msg = MIMEText(main_text, "plain", charset)
elif charset == "iso-2022-jp":
    msg = MIMEText(base64.b64encode(main_text.encode(charset, "ignore")), "html", charset)

msg.replace_header("Content-Transfer-Encoding", "base64")
msg["Subject"] = '記事のタイトルです'
msg["From"] = "xxxx@yahoo.co.jp"
# msg["To"] = "xxxx@blog.hatena.ne.jp" #前準備で確認したメールアドレス(見たままで投稿する)
msg["To"] = 'xxxx.hatena@blog.hatena.ne.jp' #前準備で確認したメールアドレス(はてな記法(HTMLが見た目に反映される)で投稿する)
msg["Cc"] = ""
msg["Bcc"] = ""
msg["Date"] = formatdate(None,True)


"""
  nego_combo: ("no-encrypt", 25) or ("no-encrypt", 587) or
              ("ssl", 465)
"""
host = "smtp.mail.yahoo.co.jp"
nego_combo =  ("ssl", 465) # ("通信方式", port番号)

if nego_combo[0] == "no-encrypt":
    smtpclient = smtplib.SMTP(host, nego_combo[1], timeout=10)
elif nego_combo[0] == "starttls":
    smtpclient = smtplib.SMTP(host, nego_combo[1], timeout=10)
    smtpclient.ehlo()
    smtpclient.starttls()
    smtpclient.ehlo()
elif nego_combo[0] == "ssl":
    context = ssl.create_default_context()
    smtpclient = smtplib.SMTP_SSL(host, nego_combo[1], timeout=10, context=context)
smtpclient.set_debuglevel(2) # サーバとの通信のやり取りを出力してくれる


# 自分のヤフーメールのメアドとログインパスワード
username = 'xxxx@yahoo.co.jp'
password = 'xxxxx<パスワード>xxxxx'
smtpclient.login(username, password)

# メールを送信する
smtpclient.send_message(msg)
smtpclient.quit()

 

そのままだと見たままモードで投稿されるのでhtmlを送るとHTMLがそのまま投稿されます。

はてな記法で投稿するためにはメールアドレスの@の前に.hatenaを付けてあげると良いです。

 

参照:https://help.hatenablog.com/entry/mailpost?_ga=2.66072302.1124566400.1665243272-800416567.1662805274#mailpost

 

 

コメント

タイトルとURLをコピーしました