Iruca Log

Iruca Log

東京に住むWeb系エンジニアによる技術&雑記ブログ

SNSでフォローする!

任意のはてなブログの読者になる・読者をやめるプログラム書いた [python]

こんにちは、イルカです。

自分のはてなブログの読者になってくれた方のブログの読者に自動的になり返す(twitterのフォローバックみたいな!)を実現したいと思ってます。

今回は「任意のはてなブログの読者になる/読者をやめる」プログラムを書いてみました。



関連記事もどうぞ!
iruca21.hateblo.jp
iruca21.hateblo.jp

最後まで読むのが面倒な方へ

下に書いているプログラムを実行すると、特定のはてなブログの読者になったり、読者をやめたりが自動的にできます。

実行前と実行後でちゃんと表示が変わることで確認済み!

f:id:iruca21:20170419012620j:plain

プログラム紹介

概要

はてなブログの「読者になる」「読者をやめる」APIを利用して、プログラムでこれらの操作を行えるようにしました。

ご利用は自己責任で!
はてなのサーバや運営に迷惑をかけないようにしましょう。

必要モジュール

python モジュール requests が必要です。
以下の手順などでインストールしておいてください。

yum -y install python-setuptools
easy_install pip
pip install requests

プログラム詳細

subscribe_util.py

#!/usr/bin/python
#-*- coding:utf-8 -*-

import requests
from urlparse import urlparse
import time


"""
任意のはてなブログの読者になったり、購読を中止したりする
"""

def get_rk( hatena_id, password ):
    """はてなIDとログインパスワードからrkを取得します。
    rkが何なのかはよく分からない。
    """
    target_url = "https://www.hatena.ne.jp/login"
    payload = {'name': hatena_id, 'password': password}
    response = requests.post(target_url, data=payload )

    rk = response.headers["Set-Cookie"].split("rk=")[1].split(";")[0]
    return rk

def get_rkm_rkc(rk, hatena_id, blog_hostname ):
    """はてなブログを購読する前段階で必要になるrkm, rkcの値を取得します。
    rkm, rkcが何なのかはよく分からない。
    Args:
        rk: get_rk関数で得られるトークン文字列
        hatena_id: 読者になりたいはてなブログの著者のはてなID
        blog_hostname: 読者になりたいはてなブログのホスト名
    Returns:
        (rkm文字列, rkc文字列) のタプル
    """

    headers = {"Cookie" : "rk="+ str(rk) }
    target_url = "http://blog.hatena.ne.jp/%s/%s/subscribe" % (hatena_id, blog_hostname)
    response = requests.get( target_url, headers=headers ).content
   
    # responseのhtmlに下記のような部品が含まれるので強引にrkmとrkcの値を切り取る
    #   <input type="hidden" name="rkm" value="XXXXX"/>
    #   <input type="hidden" name="rkc" value="XXXXX"/>
    rkm = response.split("name=\"rkm\" value=\"")[1].split("\"/>")[0]
    rkc = response.split("name=\"rkc\" value=\"")[1].split("\"/>")[0]

    return (rkm, rkc)


def subscribe( rk, rkm, rkc, hatena_id, blog_hostname ):
    """ 任意のはてなブログの読者になる。
    Args:
        rk: get_rk関数で得られるトークン文字列
        rkm: get_rkm_rkc関数で得られるトークン文字列
        rkc: get_rkm_rkc関数で得られるトークン文字列
        hatena_id: 読者になりたいはてなブログの著者のはてなID
        blog_hostname: 読者になりたいはてなブログのホスト名
    Returns:
        なし
    """
    target_url = "http://blog.hatena.ne.jp/%s/%s/subscribe" % (hatena_id, blog_hostname)
    headers = {"Cookie" : "rk="+ str(rk) }
    payload = {"confirm" : "", "delete" : "", "rkm" : rkm, "rkc" : rkc, "iframe" : "1"}
    
    response = requests.post( target_url, headers=headers, data=payload)
 
    return 
   
def unsubscribe( rk, rkm, rkc, hatena_id, blog_hostname ):
    """ 任意のはてなブログの購読を中止する。
    Args:
        rk: get_rk関数で得られるトークン文字列
        rkm: get_rkm_rkc関数で得られるトークン文字列
        rkc: get_rkm_rkc関数で得られるトークン文字列
        hatena_id: 購読を中止したいはてなブログの著者のはてなID
        blog_hostname: 購読を中止したいはてなブログのホスト名
    Returns:
        なし
    """
    target_url = "http://blog.hatena.ne.jp/%s/%s/subscribe" % (hatena_id, blog_hostname)
    headers = {"Cookie" : "rk="+ str(rk) }
    payload = {"confirm" : "", "delete" : "1", "rkm" : rkm, "rkc" : rkc, "iframe" : "1"}

    response = requests.post( target_url, headers=headers, data=payload)

    return

if __name__ == "__main__":
    # 自分のhatena_id
    hatena_id = "XXXXX"
    # 自分のはてなログインパスワード
    login_password = "XXXXX"

    # 読者になりたいはてなブログの著者のはてなID
    target_hatena_id = "buzama-www_pipipipipi"
    # 読者になりたいはてなブログのホスト名
    target_blog_hostname = "pipipipipi-www.hatenablog.com"

    rk = get_rk( hatena_id, login_password )
    
    (rkm, rkc) =  get_rkm_rkc(rk, target_hatena_id, target_blog_hostname )

    # 読者になる!
    subscribe( rk, rkm, rkc, target_hatena_id, target_blog_hostname )
    
    # 読者をやめる!
    #unsubscribe( rk, rkm, rkc, target_hatena_id, target_blog_hostname )
    

実行してみる

プログラム中の下記設定部分を書き変えてください。

    # 自分のhatena_id
    hatena_id = "XXXXX"
    # 自分のはてなログインパスワード
    login_password = "XXXXX"

    # 読者になりたいはてなブログの著者のはてなID
    target_hatena_id = "buzama-www_pipipipipi"
    # 読者になりたいはてなブログのホスト名
    target_blog_hostname = "pipipipipi-www.hatenablog.com"


では、実行してみます。
今回は、ピピピピピさん( id:buzama-www_pipipipipi )さんが読者になってくれたということで、ピピピピピさんのブログ
pipipipipi-www.hatenablog.com
の読者になり返してみます!

実行例

[root@hoge subscribe]# python subscribe_util.py
[root@hoge subscribe]#

特に出力はありません。
でもブラウザから確認してみると…

f:id:iruca21:20170419012620j:plain

うんうん、ちゃんと反映されてる。
満足!

まとめ

自分のブログを読者登録してくれた方を読者登録返しするプログラムも、完成間近でわくわくしてきました。

読者から外されたらこちらも読者外し返しもするようにしないと、一方的に自分の購読が増えちゃうから気をつけよう。
読者から外れたい場合は、上のプログラムでコメントアウトしている「unsubscribe」関数の方を使ってください。



ではでは!