2013年11月21日木曜日

[Python] Bloggerの更新pingを一括で送信するスクリプト

Bloggerにはping送信先を自由に設定する機能が無いため、pingは手動で送信するか、ping送信サービス等を利用する必要があります。

でもそんなことをするのは面倒なので、pingを一括送信できるスクリプトを書きました。

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

u"""ブログの更新pingを一括で送信するスクリプト

別途インストールの必要があるライブラリ
https://pypi.python.org/pypi/feedparser
"""

import os
import time
import datetime

import feedparser
import xmlrpclib

# bloggerの投稿(Atom)のURL
FEED_URL = "http://ブログのURL.blogspot.com/feeds/posts/default"
# 前回パース時の最新記事の投稿時刻を記録しておくファイル(本スクリプトと同一フォルダ内)
LOG_FILE = "log.txt"
# 上ファイルの時刻保存フォーマット
TIME_FORMAT = "%c"

# データがパース出来なかった際に送信されるサイト名とURL
SITE_TITLE = "ブログ名"
SITE_URL   = "http://ブログのURL.blogspot.com/"

# PINGの送信先一覧
PING_SERVER_LIST = [
"http://api.my.yahoo.co.jp/RPC2",
"http://blog.goo.ne.jp/XMLRPC",
"PING送信先を追記していく",
]

def parse_articles(log_file_path):
    u"""最新記事の投稿時刻とブログ名、URLを取得する
    """
    flag_updated = False
    title, url = SITE_TITLE, SITE_URL
    try:
        last_update_time = datetime.datetime.strptime(open(log_file_path, 'r').read(), TIME_FORMAT)
    except Exception as e:
        print e
        last_update_time = datetime.datetime(2013,1,1)
    print "last update : ", last_update_time
    try:
        feed = feedparser.parse(FEED_URL)
        feed_time_str = feed['entries'][0]['updated']
        feed_update_time = datetime.datetime.strptime(feed_time_str[:feed_time_str.rfind('.')],"%Y-%m-%dT%H:%M:%S")
        if feed_update_time > last_update_time:
            print "new articles available"
            flag_updated = True
            open(log_file_path, 'w').write(feed_update_time.strftime(TIME_FORMAT))
        title = feed['feed']['title']
        url   = feed['feed']['link']
        print "parsed : ", feed_time_str, title, url
    except Exception as e:
        print "parse error : ", e            
    return flag_updated, title, url

def send_ping(title, url):
    u"""PINGを各サーバに送信する
    """
    if isinstance(title, unicode):
        title = title.encode('utf-8')
    xmlrpclib.Transport.user_agent = __file__
    for ping_server in PING_SERVER_LIST:
        try:
            server = xmlrpclib.Server(ping_server)
            response = server.weblogUpdates.ping(title, url)
            print "ping sended to ", ping_server
            print "server response :", response['message']
        except Exception as e:
            print "send error : ", e
        time.sleep(1.0)

def main():
    log_file_path = os.path.join(os.path.abspath(os.path.dirname(__file__)),LOG_FILE)
    updated, title, url = parse_articles(log_file_path)
    if updated:
        send_ping(title, url)

if __name__ == "__main__":
    main()


なお feedparser のインストールは、feedparser.zip をダウンロードして、以下のコマンドを実行するだけ。
$ unzip feedparser.zip
$ cd feedparser/
$ sudo python setup.py install


僕はこれを crontab で1時間に1回動かしています。最低でも更新から1時間以内にpingが送信される仕組み。
$ crontab -e

# Bloggerの更新pingを毎時0分に送信する
0 * * * * /pythonまでのパス/python /スクリプトまでのパス/send_ping.py >> /cronのログファイルまでのパス/cron_log.txt 2>&1


参考にしたページ
ブログの更新を通知するPythonスクリプト - Python Tips

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...