無料で全自動投稿のエログサイトをPythonで作る方法

全自動投稿のエログサイトをPythonで作る方法【随時更新】
20171029_抜ける動画集めました
TOPページのイメージ
avgle api python 詳細ページ
記事詳細ページのイメージ

今回は更新作業不要で自動で記事が投稿されるエロブログ(通称エログ)をPythonで作ってみます。

主に使うものは以下の通りです。

  • Avgle.comのAPI(エロ動画情報をJSON形式で受け取る)
  • Python 3.6.1(スクリプト言語)
  • Bottle 0.12(ルーティングやレスポンスの処理)
  • requests 1.0.4(リクエストを処理するHTTPライブラリ)
  • Semantic-ui(見た目、デザインのCSSフレームワーク)
  • Heroku(サーバー、条件付きで無料で使えます。)

全自動でエロ動画をアップするエロブログを作るための概要

多くのユーザーを獲得するためには定期的な動画更新が欠かせないですが、それらを手動で更新するのは苦痛なので、Pythonを使って楽をしましょう。

Avgle.comのAPIを利用すれば、DBを独自に用意せずとも新着動画を取得し表示することができます。

なので、Avgle.comのAPIをPythonの外部モジュールであるrequestsで引っ張ってきて、
bottleでルーティング処理して表示させています。デザインはめんどいのでSemantic-UIというCSSフレームワークを利用し、簡単におしゃれなデザインのサイトを作ります。

そして広告での売り上げが立つまでは、サーバーは無料で使えるHerokuを利用します。
[memo title=”MEMO”]Herokを利用する場合、ドメインがhttps://*******.herokuapp.com/といった具合に自動で生成されます。CNAMEを設定することで任意の独自ドメインを利用することもできますが、お金かけずにやりたい場合はこのままでも良いのではないかと思います。また、一定時間アクセスがないとDynoがアイドル状態になり、次回アクセス時に起動時間が多少かかります。10秒くらい。[/memo]

 

以下の本は、Pythonを使ってルーティン作業を自分から無くすためのアイデアブックとして欠かせない僕のバイブルです。

ざっくりな流れ

Pythonスクリプの作成自体は時間がかかりますが、
以下にスクリプトの一部を記載するので、コピペすれば瞬殺です。

  • Pythonスクリプトの作成
  • Herokuアカウントの作成(環境変数の設定)
  • Herokuへスクリプトをアップロード
  • DMMのアフィリエイトアカウントを作成し広告を貼り付ける

最終的なディレクトリ構成

以下のようなディレクトリ構成になりました。
フロント部分はCSSフレームワークに委ねます。

app/
├ views/
│ └ common/
│  └ header.tpl
│  └ footer.tpl
│  └ sidebar.tpl
│ └ index_template.tpl
│ └ post_template.tpl
│ └ top_template.tpl
├ avgle.py
├ main.py
├ Procfile
├ requirements.txt
└ runtime.txt

ファイルの中身

avgle.py

# Avgle.comのJSON処理をする独自のPythonライブラリ
import requests
import json

AVGLE_END_POINT = 'https://api.avgle.com/v1'
SEARCH_END_POINT = 'https://api.avgle.com/v1/search/'

params = {
    'limit': 10,
    'type': 'public'
}

def get_videos(page=0, order='', category=''):
    get_videos_uri = AVGLE_END_POINT + '/videos/' + str(page)

    if order: params['o'] = order
    if category: params['c'] = category

    res = requests.get(get_videos_uri, params=params).json()

    if res['success']:
        return res['response']
    else:
        raise ValueError('データを取得できませんでした。')

def get_video(id):
    get_video_uri = AVGLE_END_POINT + '/video/' + str(id)
    res = requests.get(get_video_uri, params=params).json()
    if res['success']:
        return res['response']['video']
    else:
        raise ValueError('データを取得できませんでした。')

def search_videos(query, page=1):
    get_video_uri = SEARCH_END_POINT + str(query) + '/' + str(page)
    res = requests.get(get_video_uri, params=params).json()
    if res['success']:
        return res['response']
    else:
        raise ValueError('データを取得できませんでした。')

if __name__ == '__main__':

main.py

'''
bottleとvue.jsで作る簡単なwebアプリケーション
'''

from bottle import route, run, template, get, post, request, static_file, view
import avgle
import os

# 独自で設定しておくと便利
config = {
    'site_name'  : 'サイト名',
    'domain'     : 'https://************.com',
    'videos_path': 'https://************.com/videos'
}

# TOPページの処理
@get('/')
def get_index():
    page  = request.query.page or '0'
    res = avgle.get_videos(page)
    return template('top_template', res=res, config=config)

# 一覧ページの処理
@get('/videos')
def get_videos():
    page  = request.query.page or '0'
    order = request.query.order or 'mr'
    query = request.query.s or False
    category = request.query.category or ''
    if query:
        res = avgle.search_videos(query, page)
    else:
        res = avgle.get_videos(page, order=order, category=category)
    return template('index_template', res=res, query=query, page=page, config=config)

# 詳細ページのリクエスト処理
@get('/videos/')
def get_video(id):
    video = avgle.get_video(id)
    return template('post_template', video=video, config=config)


# サーバー起動
if os.environ.get('APP_LOCATION') == 'heroku':
    run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
else:
    # ローカル環境では、http://localhost:8080で表示。
    # debugをTrueにすることで、エラー内容などを画面に表示させることができる。
    # reloaderをTrueにすることで、いちいちサーバーを再起動させなくてもファイルの変更内容を反映させることができる。
    run(host='localhost', port=8080, debug=True, reloader=True)

Procfile

web: python main.py

requirements.txt

# pip freezeで独自の環境のライブラリをコピペスル必要があります。
bottle==0.12.13
httplib2==0.10.3
lazy-object-proxy==1.3.1
mccabe==0.6.1
oauth2client==4.1.2
oauthlib==2.0.2
requests==2.18.4
requests-oauthlib==0.8.0
rsa==3.4.2
uritemplate==3.0.0
urllib3==1.22

runtime.txt

python-3.6.1

TODO

  • サイトマップの作成
  • ページネーションの作成
  • 動画直下に関連動画を表示させたい

後日談:DMMアフィリエイトの認証を却下されました。

以下はメール本文からの転載となりますが、以下の何らかの理由により申請が却下されました。
[alert title=”不承認理由”]
 ・サイトがWEB公開されていない
 ・ブログなど初回登録時の状態でサイト内容が不明
 ・知的財産権を侵害している
[/alert]
動画記事自体は75,000件以上あるのと、クローラーもブロックしておらず独自ドメインも取得しているので、おそらく「知的財産権を侵害している」に該当するのでしょう。。一応ご報告でした。