Rubyによるアメブロのペタ貼り自動化スクリプト(12) アメンバー限定記事の処理(2)

僕のスクリプトだと、アメンバー限定記事で本来読めない記事でも、『記事から』ペタを貼ってしまう。
依頼者はそこら辺が困ると言う。
アメンバー限定記事がある時は、認定されている場合には『記事から』、認定されていない場合には『プロフから』でペタを貼って欲しい。
そういうリクエストだ。

アメンバー限定記事の仕組みを調べる。まずブログのトップページで、アメンバー限定記事の場合には、記事が直接表示されない。この表示状態はアメンバーの認定されていても、されていなくても同じだ。
記事のタイトルは表示されるが、記事本文の代わりに『アメンバーエントリーボタン』と『アメンバーエントリーテキスト』、『アメンバーエントリーリクエスト』が表示される。
ソースは以下の形になる。

<div class="contents">
<div class="subContents">
<div class="amemberEntry">
<p class="amemberEntryBtn">
<a href="http://secret.ameba.jp/********/amemberentry-???????????.html" class="btn002">
<img src="http://stat.ameba.jp/p_skin/cmn/img/amember/btn002.gif" alt="アメンバー限定記事を読む"></a></p>
<p class="amemberEntryTxt"><a href="http://helps.ameba.jp/qguide/amember/post_186.html" target="_blank">
アメンバー限定記事を読むには</a></p>
<p class="amemberEntryReq"><a href="http://amember.ameba.jp/amemberRequest.do?oAid=********">
アメンバーになる</a></p>
</div>

********にはブログのID、???????????にはブログのエントリーNoが入る。

この記事に対するペタ貼りのリンクは、記事より下に表示される。
だから、この『アメンバーエントリーボタン』がペタ貼りのリンクより前に来るかどうかで記事がアメンバー限定かどうかを判断出来る。

  1. 正規表現で『アメンバーエントリー』のリンクを検出する
  2. 正規表現のパターンマッチでの結果で得られるMatchDataオブジェクトをつかって、『アメンバーエントリー』とペタ貼りのリンクとどちらがより先頭に近いかで、アメンバー限定記事かどうかを判断する。

まず、アメンバーエントリーのリンクを検出する正規表現は、下記の通り。

amember_entry = Regexp.new("http://secret.ameba.jp/[A-Za-z0-9\\-]+/amemberentry-[0-9]+.html")

次に、アメンバー限定記事かどうかを判定するコードは以下の通り。

    response = Net::HTTP.get('ameblo.jp','/'+line+'/')
    if peta_blog_e_get = peta_entry.match(response) #ペタリンクの検出
      entry_point = peta_blog_e_get.begin(0) #テキスト先頭からペタリンクまでの文字数

      if (amenber_e_get = amember_entry.match(response)) and (entry_point > amenber_e_get.begin(0))
    #アメンバーエントリーのリンクを検出
    #検出されたらその位置までの文字数を、ペタリンクまでの文字数と比較する。

        #ここにアメンバー限定記事への処理を書く

      else
    #通常記事の処理
        peta_e_path = peta_blog_e_get.to_s
   end
  end

Rubyでは、正規表現のパターンマッチで(正規表現でなくても使える?)テキストから文字列を検出した結果に、MatchDataオブジェクトが返される。
このオブジェクトのメソッドのbegin(0)で、マッチした配列の先頭オフセットの値(この場合にはhtmlソースの先頭からの文字数)を得る事ができる。

これで、とりあえず、アメンバー限定記事と通常記事の場合分けは出来る様になったはず。次回以降で、アメンバー限定記事の処理について書きます。