きゃっとぐるーぶ

忘れてもいいようにメモを取っても、メモを取ったことを忘れる男の備忘録

日本将棋連盟の詰将棋URLをランダムで表示する

日本将棋連盟にはプロ棋士が考案した詰将棋が数多くあり、新作もほぼまいにち公開されています。それをTwitterなどに流して解いてもらうようです。それを見ていて私としては、ランダムに出題するページがあったらいいのになあと思ったので作りました。ランダムにURLを表示するだけですが・・・。

f:id:catgroove:20190515133446j:plain

どなたか、変数や関数の名付け方とそれに必要な英語をわたしに教えてくだせぇ! と思ったらあるんですねぇ。

プログラミングでよく使う英単語のまとめ【随時更新】 - Qiita

うまくメソッド名を付けるための参考情報 - Qiita

from time import sleep
from pathlib import Path
from bs4 import BeautifulSoup

import re
import os
import sys
import json
import random
import requests


SAVE_DIRECTORY = Path(os.environ['HOME']) / '.cache'
FILENAME_JSON = SAVE_DIRECTORY / 'tumeshogi_links.json'


if FILENAME_JSON.exists():
    DOWNLOAD_ALLOW = False
else:
    DOWNLOAD_ALLOW = True

# ダウンロード間隔
INTERVAL_SEC = 5

# 出題
QUESTIONS = []
# 出題数
NUM_OF_QUESTIONS = 3
QUESTION_SET = ['3', '5', '7']

tumeshogi_links = {"3": [], "5": [], "7": [], "9": [], "other": []}



def pageDownload(url):
    r = requests.get(url)
    if r.status_code == 200:
        r.encoding = r.apparent_encoding
        soup = BeautifulSoup(r.text, 'lxml')
        return soup
    else:
        return None


def create_Tumeshogipage_Links(url):
    soup = pageDownload(url)
    links = [x['href'] for x in soup.select('.section04 li a')]
    authors = [x.text for x in soup.select('.section04 li p')]
    rows = [row for row in zip(authors, links)]

    return rows


def create_Category_numpage_Links(url):
    soup = pageDownload(url)
    ret = [x['href'] for x in soup.select('.pagingElements01 ul li a')]
    return ret[0:-1]


def sorting(arg):
    global tumeshogi_links

    if re.search(r'[3](?=手詰)', arg[0]):
        tumeshogi_links['3'].append(arg)
    elif re.search(r'[5](?=手詰)', arg[0]):
        tumeshogi_links['5'].append(arg)
    elif re.search(r'[7](?=手詰)', arg[0]):
        tumeshogi_links['7'].append(arg)
    elif re.search(r'[9](?=手詰)', arg[0]):
        tumeshogi_links['9'].append(arg)
    else:
        tumeshogi_links['other'].append(arg)



def save_tumeshogi_links(arg):
    with open(FILENAME_JSON, 'w') as f:
        json.dump(arg, f, indent=2, ensure_ascii=False)


def load_tumeshogi_links():
    with open(FILENAME_JSON, 'r') as f:
        data = json.load(f)
    return data


def main():
    categorys = ['short', 'middle', 'long', 'everyday']
    tpl_url = 'https://www.shogi.or.jp/tsume_shogi/{}'

    for category in categorys:
        url = tpl_url.format(category)
        cate_numpage_links = create_Category_numpage_Links(url)
        sleep(INTERVAL_SEC)
        for cnl in cate_numpage_links:
            ret = create_Tumeshogipage_Links(cnl)
            [sorting(link) for link in ret]
            sleep(INTERVAL_SEC)
    save_tumeshogi_links(tumeshogi_links)

def question():
    if not tumeshogi_links:
        tumeshogi_links = load_tumeshogi_links()

    def add_questions(arg):
        if arg in tumeshogi_links.keys():
            QUESTIONS.extend(tumeshogi_links[arg])

    ARGS = sys.argv[1:]

    if ARGS:
        for arg in ARGS:
            add_questions(arg)
    else:
        for arg in QUESTION_SET:
            add_questions(arg)

    questions = random.sample(QUESTIONS, NUM_OF_QUESTIONS)
    for que in questions:
        print("\n".join(que))


if __name__ == '__main__':
    if DOWNLOAD_ALLOW:
        main()
    question()

できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)

できる 仕事がはかどるPython自動処理 全部入り。 (「できる全部入り。」シリーズ)