togetter→EPUB変換

結局、togetterの番号から記事を取ってきてテキストにするスクリプトを書いて、reStructuredTextあたりとして処理してpandocでEPUBに変換することで、ニンジャスレイヤーをEPUBでオフラインで読むことができるようになりました。最近はこれでAndroidのFBReaderで読んでますが、動作も安定しているし、途中で中断しても続きから開けるのでかなり快適になりました。

とりあえずスクリプトを載せておきます。Cookieとかcsrf_tokenがないと続きを読み込めないみたいだが、かなり適当にやっても普通にテキストに変換することができた。ニンジャスレイヤーのテキストに関しては一部エスケープしないといけなかったり、&が&になってしまったりするようだが、おおむね読むのに問題ない状況になっている。

#! /usr/bin/python
# encoding: UTF-8

import urllib, urllib2
import cookielib
from BeautifulSoup import BeautifulSoup as BS

class tog:
  def __init__(self, tid):
    self.title=str(tid)
    self.tid=tid
    self.cookie=cookielib.CookieJar()
    self.texts=[]
    self.opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
  def call_api(self, name, tid, data):
    url="http://togetter.com/api/%s/%d" %(name, tid)
    data["csrf_token"]=self.csrf_token
    params=urllib.urlencode(data)
    fp=self.opener.open(url, params)
    html=fp.read()
    return html
  def get(self):
    fp=self.opener.open("http://togetter.com/li/%d" %(self.tid))
    html=fp.read()
    soup=BS(html)
    self.csrf_token=soup.find('meta', {"name":"csrf_token"})["content"]
    self.title=soup.find("meta", {"name":"twitter:title"})["content"]
    return html
  def parse2txt(self, html):
    soup=BS(html)
    for i in soup.findAll("div", {"class":"tweet"}):
      self.texts.append(i.text)
    rest=filter(lambda f: f.text.startswith(u"残りを読む"), soup.findAll("a", {"class": "btn comment_btn"}))
    if len(rest)==1:
      rstr=rest[0]["onclick"]
      page=int(rstr.split(",",1)[1].strip(");"))
      return page
    return None
  def readall(self):
    html=self.get()
    rest=self.parse2txt(html)
    while rest!=None:
      html=self.call_api("moreTweets", self.tid, {"page":rest})
      rest=self.parse2txt(html)

if __name__=="__main__":
  import sys
  tg=tog(int(sys.argv[1]))
  tg.readall()
  titlelen=len(tg.title.encode("EUC-JP"))
  print tg.title.encode("UTF-8")
  print "-"*titlelen
  print ""
  for t in tg.texts:
    print t.encode("UTF-8")
    print ""

読み進めたのは今のところ第2部の終わりくらいまで。ヨロシサン製薬が実際大活躍でしたな。ビョーキ・トシヨリ・ヨロシサン。ヨロシサン関係のニンジャ…特にケジメニンジャ=サンやサブジュゲイター=サン、セントール=サンあたりはかなり良かった。

ただ就職するならヨロシサンよりオムラ・インダストリだよね。モーター理念バンザイ。最後は残念なことになっちゃったけど。

コメント

  1. はじめまして。突然のコメント失礼致します。
    ニンジャスレイヤーをオフラインで読みたくてこちらのページにたどり着いた者ですが、Pythonに関しては殆ど知識がありません。
    とりあえずスクリプトをコピペして実行してみたのですが
    Traceback (most recent call last):
    File “./togetter.py”, line 48, in
    tg=tog(int(sys.argv[1]))
    IndexError: list index out of range
    となり動作しません。
    もしコメントをご覧になりましたらどうすれば動作するかを教えて頂ければ幸いです。

  2. コメントありがとうございます。

    コマンドの引き数にはtogetterのIDを入れます。例えばURLが「http://togetter.com/li/522348」なら、コマンドは「python togetter.py 522348」になります。

  3. 昨日コメントした者ですが、自己解決しました。普通にリスト番号を後ろに打てば良かったんですね。
    ありがたく使わせて頂きます。

  4. はじめまして。

    Pythonを使うのは初めてですが、オフラインでニンジャスレイヤーを読みたくてスクリプトを実行してみました。
    Python2.7.9で「python togetter.py 72554」と実行してみましたが、
    コマンドライン上には本文らしきもの(UTF-8なので文字化けして正確な内容は把握できませんが)が表示されるものの、
    EPUBのファイルが作成されません。
    コマンドで出力ファイル名を指定する必要があるのでしょうか。

    以上、よろしくお願いします。

  5. このスクリプトはtogetterから引っ張ってきたHTMLをつなげてUTF-8のテキストファイルに変換する部分までのものです。EPUBにするには、例えばpandocを使えば変換できます。pandoc -f html -t epub -o out.epub input.txt みたいな感じです。

  6. アドバイスありがとうございます。

    このスクリプトはtogetterをテキストに変換するだけなので、EPUBに変換するには別のツールが必要ということですね。
    windowsのコマンドプロンプトで実行すると、UTF-8だと文字化けするので、shift-jisにする必要がありますね。
    スクリプトでテキストファイルとして保存できればいいのかもしれませんが、知識がないので…
    自分の環境では「続きを読む」以降が読み込めないので、勉強して自分なりに使いやすくしてみようと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です