スナックelve 本店

バツイチ40代女の日記です

ブコメ一覧出力プログラム

f:id:elve:20180506123254p:plain
f:id:elve:20180506123319p:plain
f:id:elve:20180506123330p:plain
というわけでプログラムではてぶを抽出します。
クソ仕様ですw
ブログのURLから日付を取得してるので日付と6桁の値がURL末尾に入らないブログでは使えないor誤動作するっすw
三日はてブを45日くらいにして出力ちょっと弄ってる。いうなれば「月はてブ」。
汚いコードだけど何かの参考になれば幸い
html出力といいつつはてなブログに貼り付けることを考えた出力のため改行など追加してください。

出力

htmlだと
f:id:elve:20180506125935p:plain
黄色の部分に改行入らない。
ソースを表示してもらえれば
f:id:elve:20180506130100p:plain
コピペでブログに貼り付けれるっす。
するとエントリのタイトルやアイコンが表示されてIDコールが乱れ飛びますwww
お気をつけてwww

コード

# -*- coding:utf-8 -*-
import urllib
import urllib.request
import json
import datetime as dt
import sys
from bs4 import BeautifulSoup

# HTML出力
def HtmlOutput(bmInfos):
    f = open('月はてブ.html', 'ab')
    tableStr = f'<h3>{bmInfos[0]["url"]}</h3>\n'
    tableStr += f'[{bmInfos[0]["url"]}:title]\n'
    for b in bmInfos:
        bUrl = b['url'].replace("http://", "")
        bUrl = b['url'].replace("https://", "s/")
        bUrl = urllib.parse.quote(bUrl)
        if b['star'] == 1:
            tableStr += '★'
        tableStr += f'<img src="https://cdn.profile-image.st-hatena.com/users/{b["user"]}/profile_s.gif">id:{b["user"]}'
        tableStr += f' {b["date"].strftime("%Y/%m/%d")}\n'
        tableStr += f'{b["comment"]}\n'
    html = f"""
    {tableStr}
    """
    f.write(html.encode('utf-8'))
    f.close()


# 入力したはてなIDがスター(黄)つけているか
# 0: はてなスターをつけていない
# 1: はてなスターをつけている
def GetImgIndex(time, eid, user):
    # URL作成
    url = f'http://b.hatena.ne.jp/{user}/'
    url += time.strftime("%Y%m%d")
    url += "#bookmark-" + str(eid)
    url = urllib.parse.quote(url)
    # アクセス(エンコードしない)
    r = urllib.request.urlopen("http://s.hatena.com/entry.json?uri=" + url).read()
    # jsonに変換
    jsonStr = json.loads(r)

    for st in jsonStr['entries']:
        for st2 in st['stars']:
            if st2['name'] == myId:
                return 1
    return 0


# ---メイン処理ここから--ー
# 検索値、ユーザーID入力
myStr = input("検索したいurl: ")
myId = input("あなたのはてなID: ")
if myStr == "" or myId == "":
    print("なんか入れて")
    sys.exit()
if myId.encode('utf-8').isalnum():
    if len(myId) > 15:
        print("長すぎる")
        sys.exit()
else:
    print("半角英数以外")
    sys.exit()
f = open('月はてブ.html', 'wb')
html = f"""
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
"""
f.write(html.encode('utf-8'))
f.close()

pageCount = 0
endflg = False
while True:
    r = urllib.request.urlopen("http://b.hatena.ne.jp/search/text?safe=off&q=" + urllib.parse.quote(myStr, '') +\
    "&users=1&of=" + str(pageCount * 40)).read()
    
    pageCount += 1
    
    soup = BeautifulSoup(r, 'lxml') 
    for a in soup.find_all("a", attrs={"class": "capture"}):
        bmInfos = []
        targetURL=a.get("href")
        tmpD = targetURL[len(targetURL)-17:]
        try:
            chkD = dt.datetime.strptime(tmpD[:10], '%Y/%m/%d')
        except:
            continue
        if chkD < (dt.datetime.now() - dt.timedelta(days=45)):
            endflg = True
            break
        r = urllib.request.urlopen("http://b.hatena.ne.jp/entry/jsonlite/?url=" + urllib.parse.quote(targetURL, '')).read()
        jsonStr = json.loads(r)
        for bm in jsonStr['bookmarks']:
            tdatetime = dt.datetime.strptime(bm['timestamp'], '%Y/%m/%d %H:%M:%S')
            if tdatetime > (dt.datetime.now() - dt.timedelta(days=45)):
                if bm['comment'] != "":
                    bmInfo = {"star": GetImgIndex(tdatetime, jsonStr['eid'], bm['user']), "url": jsonStr['url'], "user": bm['user'], "date": tdatetime, "comment": bm['comment']}
                    bmInfos.append(bmInfo)
        if len(bmInfos) > 0:
            HtmlOutput(bmInfos)
    if endflg:
        break

f = open('月はてブ.html', 'ab')
html = f"""
</body>
</html>
"""
f.write(html.encode('utf-8'))
f.close()

print("END")