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が入る。
この記事に対するペタ貼りのリンクは、記事より下に表示される。
だから、この『アメンバーエントリーボタン』がペタ貼りのリンクより前に来るかどうかで記事がアメンバー限定かどうかを判断出来る。
- 正規表現で『アメンバーエントリー』のリンクを検出する
- 正規表現のパターンマッチでの結果で得られる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ソースの先頭からの文字数)を得る事ができる。
これで、とりあえず、アメンバー限定記事と通常記事の場合分けは出来る様になったはず。次回以降で、アメンバー限定記事の処理について書きます。