Python版 ぴくぴくダウンローダーを作成している夢を見た
6月 27, 2014 — 10:50

完全オープンソースにするか悩みどころですが取りあえずモチベーション維持のためにもちょくちょくソースコードを公開していこうと思います。

単純にダウンロードするなら簡単なんですが、アレもできてコレもできてとなると中々大変なんですよね(汗

GUIを作るのがかなりしんどいので取りあえず、いつも通りCUI版を作ってGUIを上からかぶせる感じで行こうと思います。
実はTideSDKを使う予定だったけど暗礁に乗り上げてます。誰かアドバイスをください。
※ 毎回GUI後付でやってるけどうまく行っている気がしない・・・

今回の目標
・Pythonを触ったことがない人でも処理をおおまかに理解できるよう書く(そもそも自分がPythonド素人)
・Java版の時みたいに糞長いソースコードを力押しで書かない(今後の保守性を再優先)
・Perl版の時みたいに正規表現のスクランブルにしない(あれは黒歴史)

# vi PixivBrowser.py

# -*- coding:utf-8 -*-
#################################################################
#
# Pixivのブラウザエミュレータ
#
#  Pixivの接続情報を保持する
#  UA設定やProxy設定を組み込むかもしれない
# 
# 【制作開始日時】 2014/06/25
# 【   製作者   】 orbit
# 【  動作環境  】 Python 2.7 (Win, Mac, Linuxで動くのが理想)
#
# 【   更新日   】
#    2014/06/25    ログイン処理に関する部分を作成 
#                  seleniumを使うか悩んだがPixivへの負荷を考慮
#
#    2014/06/27    認証を行うメソッドの名前を変更
#
#################################################################
import mechanize

# Pixivのブラウザエミュレータを担当するクラス
class PixivBrowser(object):
  def __init__(self):

    # Pixivのログインページ
    self.loginurl = 'https://www.secure.pixiv.net/login.php'
    # Pixivのユーザーページ
    self.userpage = 'http://www.pixiv.net/mypage.php'

    # ブラウザエミュレータのインスタンス生成
    self.browser = mechanize.Browser()

    # 当然検索エンジンよけを無視
    self.browser.set_handle_robots(False)

  # Pixivの認証を行う
  def auth(self, username, password):
    # ユーザ情報
    self.username = username # ユーザー名
    self.password = password # パスワード

    # ログインページを開く
    self.browser.open(self.loginurl)
    
    # ユーザ名とパスワードを指定してログイン
    self.browser.select_form(nr=1)
    self.browser["pixiv_id"] = self.username
    self.browser[  "pass"  ] = self.password
    self.browser.submit()

    # ログインに成功した確認する
    res = self.browser.response() # レスポンスを受け取る
    url = res.geturl()            # 現在のURLを取得する

    # ログイン後にユーザページにいないのはログイン失敗
    if(url != self.userpage):
      # ログインに失敗した場合はどうしようもないので例外を投げる
      raise PixivBrowserException("login failed. please check you are account.")

    # ログインページのHTMLを取得
    html = self.browser.response().read()

    # 問題なくログインできたらドヤ顔でログインページのHTMLを返す
    return html

  # ブラウザエミュレータを返す
  def getBrowser(self):
    return self.browser

# PixivBrowserのプログラム内で処理継続が不能になったら呼ばれる例外クラス
class PixivBrowserException(Exception):
  def __init__(self, str):
    self.str = str   # strはraise文から受け取る引数

  def __str__(self): # エラーメッセージ
    return '%s' % (self.str)

## 以下、デバッグ用の処理 ##
if __name__ == '__main__':
  pb = PixivBrowser()
  pb.auth('**************', '**************')

# vi PixivSearch.py

# -*- coding:utf-8 -*-
#################################################################
#
# Pixivの絵画(絵・漫画)を検索・ページングするプログラム
#
#  検索で並び順の変更に対応するかもしれない
# 
# 【制作開始日時】 2014/06/27
# 【   製作者   】 orbit
# 【  動作環境  】 Python 2.7 (Win, Mac, Linuxで動くのが理想)
#
# 【   更新日   】
#    2014/06/27    検索とページングを行う部分を作成
#                  絵・漫画・小説の他にうごくイラストをサポート
#
#################################################################

# Pixivの絵画(絵・漫画)を検索するクラス
class PixivSearch(object):
  def __init__(self, browser):
    ## ページ情報 ##
    # Pixivのユーザーページ
    self.userpage = 'http://www.pixiv.net/mypage.php'
    # 検索ページベース
    self.pixibass = 'http://www.pixiv.net'
    
    # 並び順
    self.pagesort = '&order=date_d'
    
    # ページ番号
    self.pagenumb = 1;
    
    ##  ブラウザ  ##
    self.browser   = browser
  
  # 通常の検索(絵・漫画混在) 今回、仕様的に使うか微妙
  def search(self, keyword):
    # 検索キーワード
    self.keyword = keyword
    
    # 検索パラメータをつける
    self.searcurl = self.pixibass + '/search.php?word=' + keyword + self.pagesort + '&p='
    
    # ページ番号を付加して検索ページを開く
    self.browser.open(self.searcurl + str(self.pagenumb))
    
    # 検索結果ページのHTMLを取得
    html = self.browser.response().read()
    
    # 検索結果ページのHTMLを返す
    return html
  
  # 絵の検索
  def searchImage(self, keyword):
    # 検索キーワード
    self.keyword = keyword
    
    # 検索パラメータをつける
    self.searcurl = self.pixibass + '/search.php?word=' + keyword + '&manga=0' + self.pagesort + '&p='
    
    # ページ番号を付加して検索ページを開く
    self.browser.open(self.searcurl + str(self.pagenumb))
    
    # 検索結果ページのHTMLを取得
    html = self.browser.response().read()
    
    # 検索結果ページのHTMLを返す
    return html
  
  # 漫画の検索
  def searchComic(self, keyword):
    # 検索キーワード
    self.keyword = keyword
    
    # 検索パラメータをつける
    self.searcurl = self.pixibass + '/search.php?word=' + keyword + '&manga=1' + self.pagesort + '&p='
    
    # ページ番号を付加して検索ページを開く
    self.browser.open(self.searcurl + str(self.pagenumb))
    
    # 検索結果ページのHTMLを取得
    html = self.browser.response().read()
    
    # 検索結果ページのHTMLを返す
    return html
  
  # うごくイラストの検索
  def searchUgoku(self, keyword):
    # 検索キーワード
    self.keyword = keyword
    
    # 検索パラメータをつける
    self.searcurl = self.pixibass + '/search.php?word=' + keyword + '&type=ugoira' + self.pagesort + '&p='
    
    # ページ番号を付加して検索ページを開く
    self.browser.open(self.searcurl + str(self.pagenumb))
    
    # 検索結果ページのHTMLを取得
    html = self.browser.response().read()
    
    # 検索結果ページのHTMLを返す
    return html
  
  # 小説の検索
  def searchNovel(self, keyword):
    # 検索キーワード
    self.keyword = keyword
    
    # 検索パラメータをつける
    self.searcurl = self.pixibass + '/novel/search.php?s_mode=s_tag&word=' + keyword + self.pagesort + '&p='
    
    # ページ番号を付加して検索ページを開く
    self.browser.open(self.searcurl + str(self.pagenumb))
    
    # 検索結果ページのHTMLを取得
    html = self.browser.response().read()
    
    # 検索結果ページのHTMLを返す
    return html
  
  # ページ番号を前進
  def nextPage(self):
    # ページ番号をインクリメントする
    self.pagenumb = self.pagenumb + 1
    
    # 次のページ番号を返す
    return self.pagenumb
  
  # ページ番号を後進 今回、仕様的に使うか微妙
  def backPage(self):
    # ページ番号をデクリメントする
    self.pagenumb = self.pagenumb - 1
    
    # 次のページ番号を返す
    return self.pagenumb
  
  # 現在のページ番号を得る
  def getPage(self):
    # 現在のページ番号を返す
    return self.pagenumb
  
  # 現在のページ番号を変更する
  def setPage(self, page):
    # ページ番号を書き換える
    self.pagenumb = page
    
    # 現在のページ番号を返す
    return self.pagenumb

# PixivSearchのプログラム内で処理継続が不能になったら呼ばれる例外クラス
class PixivSearchException(Exception):
  def __init__(self, str):
    self.str = str   # strはraise文から受け取る引数

  def __str__(self): # エラーメッセージ
    return '%s' % (self.str)

## 以下、デバッグ用の処理 ##
if __name__ == '__main__':
  from PixivBrowser import *

  pb = PixivBrowser()
  pb.auth('**************', '**************')
  browser = pb.getBrowser()

  ps = PixivSearch(browser)
  #print ps.search("ミク")
  #print ps.searchImage("ミク")
  #print ps.searchComic("ミク")
  #print ps.searchUgoku("ミク")
  #print ps.searchNovel("ミク")
  ps.setPage(100)
  ps.nextPage()
  print ps.search("ミク")

進捗状態
次は検索結果のHTMLを構文解析するクラスと作品ごと情報を保持するクラスを作成する予定
ID検索の部分に入るまでもう少し時間がかかりそうな予感

Python (mechanize + BeautifulSoup) でPixivにログインしてタイトルタグの中身を取得する夢を見た
6月 24, 2014 — 21:18

PythonでPixivにログインしてタイトルタグの中身を取得する夢を見たのでメモしておきます

# -*- coding:utf-8 -*-
import mechanize
import BeautifulSoup

login_page = 'https://www.secure.pixiv.net/login.php'

username = "**************"
password = "**************"

br = mechanize.Browser()
br.set_handle_robots(False)

# ログインページを開く
br.open(login_page)

# ユーザ名とパスワードを指定してログイン
br.select_form(nr=1)
br["pixiv_id"] = username
br[  "pass"  ] = password
br.submit()

# マイページを取得
html = br.response().read()

# スクレイピング
soup = BeautifulSoup.BeautifulSoup(html)
recipe_title = soup.find("title")
print(recipe_title.string)

br.close()
ぴくぴくダウンローダ for Java(仮) Ver 5.00
1月 14, 2013 — 16:54

修正された項目

・Pixivの仕様変更により作品のダウンロードに失敗するようになったので対応しました。
・ラジオボタンの挙動にバグがあったので修正しました。
・プログレスバーの存在理由がほとんど無いため廃止しました。

計画していた拡張はひと通り済んだのでしばらくは更新は行わないかもしれません。

Windows7 での実行の様子
WS000000

MacOSX での実行の様子
スクリーンショット 2013-01-14 16.31.21

Linux での実行の様子
Screenshot-ぴくぴくダウンローダ for Java (仮)

コマンドモードでの実行の様子

ダウンロード

こちらのダウンロードページよりダウンロードをお願い致します。

質問・問い合わせについて

質問・問い合わせは下のコメント欄にお願いいたします。また、質問を行う前に下記を確認してください。手順に沿わない場合は返答できない場合がございます。

正常に動かない等の問題があり質問・問い合わせを行う場合、実行場所(一軒家や集合住宅や学校などこれらの場所ではネットワークの環境が異なるため)、OS、Javaのバージョン、収集対象(実行時に指定したパラメータ)、停止した場所のコンソールの内容をお書きください。書いて頂けない場合こちらで検証することができないので返答することができません。

追加して欲しい機能がある場合、特にPixivの機能に依存するものなどは実際のページまでのURLなど詳しい情報をお書きください。それらの情報を元に今後のアップデートで実装可能か検討させて頂きます。

ぴくぴくダウンローダ for Java(仮) Ver 4.12
7月 25, 2012 — 15:47

修正された項目

イラスト・漫画を作品名+作者名で保存するのに対応しました。(GUIでのみ提供)
ラジオボタンの挙動にバグがあったので修正しました。
上記の拡張によりインターフェースを若干改変しました。

計画していた拡張はひと通り済んだのでしばらくは更新は行わないかもしれません。

Windows 7 での実行の様子

コマンドモードでの実行の様子

ダウンロード

こちらのダウンロードページよりダウンロードをお願い致します。

質問・問い合わせについて

質問・問い合わせは下のコメント欄にお願いいたします。また、質問を行う前に下記を確認してください。手順に沿わない場合は返答できない場合がございます。

正常に動かない等の問題があり質問・問い合わせを行う場合、実行場所(一軒家や集合住宅や学校などこれらの場所ではネットワークの環境が異なるため)、OS、Javaのバージョン、収集対象(実行時に指定したパラメータ)、停止した場所のコンソールの内容をお書きください。書いて頂けない場合こちらで検証することができないので返答することができません。

追加して欲しい機能がある場合、特にPixivの機能に依存するものなどは実際のページまでのURLなど詳しい情報をお書きください。それらの情報を元に今後のアップデートで実装可能か検討させて頂きます。

__追記(2012/10/31)__

Pixivの仕様が変わったようで小説収集機能が動作しないようです。時間を見つけて近日中に対応したいと思います。

ぴくぴくダウンローダ for Java(仮) Ver 3.01
7月 9, 2012 — 23:31

時間を見つけながらマイナーアップデートを行いました。

修正された項目
・ショーケースの画像をダウンロードしないようになりました。
・拡張子の後ろにゴミがつかないようになりました。
・設定時に適用を押すと、閉じるを押さずに設定を完了できるようになりました。

動作を確認した項目
・Windows環境ではJava Ver 7でも動作することを確認しました。

推奨環境:Core2Duo以降のデュアルコアCPU搭載のパソコン
動作環境:Windows MacOSX Linux でJavaが動作する環境

Windows 7 での実行の様子

コマンドモードでの実行の様子

Download
こちらのダウンロードページよりダウンロードをお願い致します。

ぴくぴくダウンローダ 漫画対応版 β 02.01 公開
2月 14, 2011 — 12:02

Pixivの好きな絵師さん、好きなタグの画像をPixivを自動で巡回して収集するプログラム ぴくぴくダウンローダ の漫画対応版を公開します。

Vectorに登録変更を行う間こちらからダウンロードください。

画像ではミクの画像でブックマーク数が1件以上ある画像(漫画を含む)を収集しているところです。

Download
こちらのダウンロードページよりダウンロードをお願い致します。

色々と好評価だったので調子にのってみましたww

多分機能的にはこれでほぼ完成になるのではないかと思います。インターフェースとかそこら辺の更新は今後気が向けばまた行うかもしれませんw

———- 追記 ———–

次回の更新で漫画を自動でフォルダ分けする機能をつけたいと思います。

ぴくぴくダウンローダ インストーラ付き 公開 β01.00
1月 20, 2011 — 15:52

Pixivの画像を寝ている合間もひたすらダウンロードするソフトです。

インストール画面

動作画面

Download
こちらのダウンロードページよりダウンロードをお願い致します。

pixivの画像を寝ている間にどんどんダウンロードするソフト ぴくぴくダウンローダ GUI 公開
1月 19, 2011 — 23:17


画像では東方タグを含みなおかつブックマーク数が3人以上ある画像を収集しております。

Download
こちらのダウンロードページよりダウンロードをお願い致します。

疲れてReadMe.txtを書く気力がありませんでしたので同封してませんが”ぴくぴくダウンローダ.exe”をダブルクリックして起動させ(少し時間がかかります)
ツール(T)の設定をクリックし、”わたしを読んでね(pget).txt”を読みながら設定してしまえばあとは好きなキーワードや絵師さんの画像を好きなだけ収集できます。

元はCUIなので後ろのプロンプトは消さないようにお願いします。(黒い画面の奴が本体です)
中断するときはプログラムをとじてください。(詳しい事は下に書きますが、仕様です)

ここからは分かるひとだけ・・・つか、もはやひとりごと
今回のWindowsでのPerl/Tkを利用したGUIプログラミングはとてつもなく面倒でした・・・やはりWindowsでの開発はPerlでは向かない事を改めて実感しましたね。
内部処理がUTF8なのでオプションを受け取る時もShift-jisからUTF8へデコード、system()使うときはUTF8からShift-jisへ・・・あげくに、UTF8はフラグがあるのでますます分かりづらい。もはや変数内の文字コードと格闘する状態になってました。
そして、forkで作った子プロセスを何故かkillできない。。。PIDが違うので多分エミュレータの問題なのでしょうね。よって中止ボタンの作成は今回行なっておりません。(気が向けば今後作るかも)

後日気が向けばもう少しヘルプ(H)等を改善します。

PerlはUNIXならすごく便利なんですけどね・・・今回のプログラムで何か色々なものを学んだ気がします。Rubyに移行するかな・・・

Pixiv 画像 ダウンロード ぴくぴくダウンローダ Ver α 03.00 公開
1月 19, 2011 — 9:05

昨日公開したPixivダウンローダではタグ検索にヒットすれば無差別的にダウンロードしていました
そして、放置していたらとてつもない容量になったのでPixivサーバにも負荷をかけないようにブックマーク数を制限して人気の画像だけ収集する機能をつけました。

そもそもたくさん画像あったら欲しい画像を探すのも大変だし・・・

Download
こちらのダウンロードページよりダウンロードをお願い致します。

そろそろGUIを付けるかな?

Pixiv画像ダウンローダ ぴくぴくダウンローダ 公開
1月 17, 2011 — 16:47

まぁ、あのままじゃ何か凄い中途半端だったので新しく検索して画像を保存できる機能と重複を防いでPixiv鯖に負荷を掛けないようにする機能を追加しました。
GUIはまだ対応してません。今後気が向いたら対応するかも。

まぁそんな感じで置いておきます。

Download
こちらのダウンロードページよりダウンロードをお願い致します。

うん。まだまだ開発せねば・・・色々と分かったw
ポチっとエンター押すだけで画像を巡回してとってきてしまうのでフォルダーの中が画像でいっぱいになります。。。
枚数ごとにフォルダー分けしたいね。。。このままではよろしくない。

もう一つ、このソフトBotに近い性質があるのでバッチで纏めてWindowsのスケージューラーに登録すればお気に入りの絵師さんの新しい画像を定期的にダウンロードさせることが可能かと思います。