📚

風俗の人気嬢の空き予約を確認して自分のLine通知する方法

2022/10/31に公開約6,200字

前説

風俗を利用するならば可愛い女性のほうが望ましい!!
男性諸君なら誰しもがそう願う。しかし、可愛い嬢は得てして人気であり、予約を取ることは非常に難しい。
そこで、男性諸君の願いを叶えられるように人気嬢を予約できる確率を少しでも高められプログラムを組んでみた。

概要

やりたいことはシンプルである。

  1. 風俗サイトをスクレイピング
  2. 出勤データを蓄積する
  3. 空いている日があれば自分のLINE通知を出す

なお、スクレイピングするにあたり、対象サイトはスクレイピングが可能かどうかを必ず許可をとってほうが賢明である。

事前準備

通知システム作成にあたり以下の環境を用意する必要がある。

コードの説明

以下にて、主要の処理のPythonコードを抜粋して中身を説明する。
最後に全体コードを載せて、参考になってもらえば幸いである。

コードが汚いなどのコメントは一切受け付けない。汚いことしているので・・・

対象の嬢のページへアクセスして、BeautifulSoup を用いて中身を解析して、出勤データをと宿する

base_url = 'https://excample.net?profid='  ## 対象サイトのベースURL
girls_dict = {'Aさん': 'asan', 'Bさん': 'bsan'}  ## 嬢の辞書リスト
for girl_name, girs_id in girls_dict.items():  
    url = base_url + girs_id  
    html = urllib.request.urlopen(url).read()  
    soup = BeautifulSoup(html, 'html.parser')  
    found = soup.find_all('p', class_=['girl_dt', 'girl_dd'])

日付と出勤ステータスを変数に格納してデータベースへ保存

for elem in found:   
    girl_date = elem.text.strip() ##ここは自身のサイトに合わせて
	girl_status = elem.text.strip()  ##ここは自身のサイトに合わせて
	
	conn = sqlite3.connect('girl.sqlite')  
	cur = conn.cursor()  
	  
	sqlstr_tbl_ddl = 'CREATE TABLE IF NOT EXISTS girls_schedule (name TEXT, date TEXT, status TEXT, primary key(name, date))'  
	cur.execute(sqlstr_tbl_ddl)

	sqlstr_ins = 'INSERT OR REPLACE INTO girls_schedule (name, date, status) VALUES ( ?, ?, ? )'  
	sqldata_ins = (girl_name, girl_date, girl_status)  
	cur.execute(sqlstr_ins, sqldata_ins)  
	  
	conn.commit()

出勤が空いていればLINEで通知する

url = "https://notify-api.line.me/api/notify"  
token = ""  ## 事前に取得したトークンをここに載せる
payload = {'message': message}  
headers = {'Authorization': 'Bearer ' + token}  
requests.post(url, data=payload, headers=headers)

以下が全体のコードである。

import requests  
import urllib.request, urllib.parse, urllib.error  
import time  
from bs4 import BeautifulSoup  
import sqlite3  
import re  
import datetime  


def spider_girl():  
    base_url = 'https://excample.net?profid='  ## 対象サイトのベースURL
girls_dict = {'Aさん': 'asan', 'Bさん': 'bsan'}  ## 嬢の辞書リスト 
    for girl_name, girs_id in girls_dict.items():  
        url = base_url + girs_id  
        html = urllib.request.urlopen(url).read()  
        soup = BeautifulSoup(html, 'html.parser')  
        found = soup.find_all('p', class_=['girl_dt', 'girl_dd'])
        parser_calender(girl_name, found)  
        time.sleep(5)  
  
    get_girls_status()  
    delete_old_data()  
  
  
def parser_calender(girl_name, elems):  
    is_date = True  
    date_patten = r''  ##日付取得の正規表現、対象サイトの形式合わせて自分で書くこと
    for elem in elems:  
        if is_date:  
            girl_date =  re.search(date_patten,elem.text.strip()) ## サイト合わせる
        else:  
            girl_status = elem.text.strip()  ## サイト合わせる
  
            # DB更新  
            update_girls_schedule(girl_name, girl_date, girl_status)  
  
        is_date = False if is_date else True  
  
  
def update_girls_schedule(girl_name, girl_date, girl_status):  
    conn = sqlite3.connect('girl.sqlite')  
    cur = conn.cursor()  
  
    sqlstr_tbl_ddl = 'CREATE TABLE IF NOT EXISTS girls_schedule (name TEXT, date TEXT, status TEXT, primary key(name, date))'  
    cur.execute(sqlstr_tbl_ddl)  
  
    sqlstr_tbl_ddl2 = 'CREATE TABLE IF NOT EXISTS girls_schedule_notified (name TEXT, date TEXT, status TEXT, primary key(name, date))'  
    cur.execute(sqlstr_tbl_ddl2)  
  
    sqlstr_ins = 'INSERT OR REPLACE INTO girls_schedule (name, date, status) VALUES ( ?, ?, ? )'  
    sqldata_ins = (girl_name, girl_date, girl_status)  
    cur.execute(sqlstr_ins, sqldata_ins)  
  
    conn.commit()  
  
  
def delete_old_data():  
    conn = sqlite3.connect('girl.sqlite')  
    cur = conn.cursor()  
  
    sqlstr = 'DELETE FROM girls_schedule WHERE date < ? '  
    sqldata = (g_date,)  
  
    cur.execute(sqlstr, sqldata)  
    conn.commit()  
  
  
def get_girls_status():  
    conn = sqlite3.connect('girl.sqlite')  
    cur = conn.cursor()  
    sqlstr = 'SELECT t1.* FROM girls_schedule AS t1 LEFT JOIN girls_schedule_notified AS t2 ON t1.name = t2.name AND t1.date = t2.date WHERE t1.status != ? and t1.status != ? and t1.date >= ? AND t2.status IS NULL order by date'  
    sqlstr_cnt = 'SELECT count(*) FROM girls_schedule AS t1 LEFT JOIN girls_schedule_notified AS t2 ON t1.name = t2.name AND t1.date = t2.date WHERE t1.status != ? and t1.status != ? and t1.date >= ? AND t2.status IS NULL'  
    sqldata = ('未定', '満員', g_date)  
  
    cur.execute(sqlstr_cnt, sqldata)  
    active_girl_count = cur.fetchone()[0]  
  
    if active_girl_count > 0:  
        message = g_tel + '\n'  
  
        for row in cur.execute(sqlstr, sqldata):  
            girl_info = row[0] + '👉' + row[1] + ' ' + row[2]  
            message = message + girl_info + '\n'  
  
        send_line(message)  
        insert_notified_data()  
  
  
def insert_notified_data():  
    conn = sqlite3.connect('girl.sqlite')  
    cur = conn.cursor()  
  
    sqlstr = 'INSERT OR REPLACE INTO girls_schedule_notified SELECT name, date, status FROM girls_schedule WHERE status != ? and status != ? and date >= ? '  
    sqldata = ('未定', '満員', g_date)  
    cur.execute(sqlstr, sqldata)  
    conn.commit()  
  
  
# Send line  
def send_line(message):  
    url = "https://notify-api.line.me/api/notify"  
    token = ""  ## 事前に取得したトークンをここに載せる
    payload = {'message': message}  
    headers = {'Authorization': 'Bearer ' + token}  
    requests.post(url, data=payload, headers=headers)  
  
  
# Press the green button in the gutter to run the script.  
if __name__ == '__main__':  
    g_year = datetime.date.today().year  
    g_date = str(datetime.date.today())  
    g_tel = ''  # 店の電話番号
    spider_girl()

今回の説明を省略して機能は以下があり、コードの中身を読み解いてもらえば理解できるはず。

  • 空いている日のデータを別テーブルにも保存して、今後回帰分析を用いた出勤予想にするため
  • LINE通知済みの日程は再通知しない仕組み

定期実行化

CrontabでPythonを5分置きに起動できるように設定する。

*/3 * * * * /usr/bin/python3 /home/ubuntu/repo/girl/main.py

最後に

職場では主にC#, Powershell, SQLなどMicrosoft系の言語を使っており、 Pythonで真面目にコード書いたのは初めてである。

初Pythonプログラミングはこんなお下劣であることをお許しあれ。

Discussion

ログインするとコメントできます