SE吾郎の備忘録

24歳SEの勉強用の備忘録です.皆様の役にも立てれば幸いです.

【備忘録】pythonからはてなブログを自動投稿(更新)する方法<実装編>

今回の記事は前回の続きで実装編です.
pythonコードを丸ごと載せているので,前回記事で取得した情報を使って一部書き換えることで動作することができます

segoro.hatenablog.com

変更するのはsetting部分のみで,usernameにの''の間に自分のユーザーネームを入力してください.
同様に,blognameにブログの名前,blogtitleにブログのタイトル,api_keyにブログのキーを入力してください.
こちらが実装のコードとなります.


from datetime import datetime
import requests as req
import hashlib
import random
import base64
import requests

# setting -----------------------------------------------------------                                
username = 'username'
blogname  = 'segoro.hatenablog.com'
blogtitle = '12345678901234'
api_key = '*******'
draft = 'no' # yes or no    

# time check --------------------------------------------------------
import datetime
now = datetime.datetime.now()
dtime = str(now.year)+"""-"""+str(now.month)+"""-"""+str(now.day)+"""T"""+str(now.hour)+""":"""+str(\
now.minute)+""":"""+str(now.second)

# function  ---------------------------------------------------------

def create_data(title,body):
    template = """<?xml version="1.0" encoding="utf-8"?>                                             
    <entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">               
    <title>{0}</title>                                                                               
    <author><name>{1}</name></author>                                                                
    <content type="text/html">                                                                 
    {2}                                                                             
    </content>                                                                                       
    <updated>{3}</updated>                                                                           
    <category term="" />                                                                             
    <app:control>                                                                                    
    <app:draft>{4}</app:draft>                                                                       
    </app:control>                                                                                   
    </entry>                                                                                         
    """
     
    data = template.format(title, username, body, dtime, draft).encode()
    return data
    
    
def post_hatena(data):
    headers = {'X-WSSE': wsse(username, api_key)}
    url = 'http://blog.hatena.ne.jp/{0}/{1}/atom/entry'.format(username, blogname)
    r = requests.post(url, data=data, headers=headers)
    
    
def get_hatena(data):
    uri = 'https://ipocalender.hatenablog.com/entry/IPOsummary/2021/Nov'
    url = 'https://blog.hatena.ne.jp/{0}/{1}/atom/entry/{2}'.format(username, blogname, blogtitle)
    r = requests.get(uri, auth=(username, api_key))


def wsse(username, api_key):
    created = datetime.datetime.now().isoformat() + "Z"
    b_nonce = hashlib.sha1(str(random.random()).encode()).digest()
    b_digest = hashlib.sha1(b_nonce + created.encode() + api_key.encode()).digest()
    c = 'UsernameToken Username="{0}", PasswordDigest="{1}", Nonce="{2}", Created="{3}"'
    return c.format(username, base64.b64encode(b_digest).decode(), base64.b64encode(b_nonce).decode(\
    ), created)


if __name__ == '__main__':
    title = 'test'
    print(dtime)
    data = create_data(title, dtime)
    put_hatena(data)