[[AtCoder]]

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
programming_algorithm:contest_history:atcoder [2019/04/15]
ikatakos [PythonでAtCoder]
programming_algorithm:contest_history:atcoder [2019/04/15] (現在)
ikatakos
ライン 86: ライン 86:
  
 ++++ Dokuwiki記事用テンプレート自動生成Pythonスクリプト(コンテスト名・問題名・リンクを埋める)| ++++ Dokuwiki記事用テンプレート自動生成Pythonスクリプト(コンテスト名・問題名・リンクを埋める)|
 +
 +開催中のコンテストなど、ログインが必要なコンテストでも取得するべくセッションを利用するように変更。(参考:​ [[https://​github.com/​kyuridenamida/​atcoder-tools|GitHub - kyuridenamida/​atcoder-tools:​ Convenient modules & tools for AtCoder users, written in Python 3.5]])
 +
 +
  
 <sxh python> <sxh python>
 import os import os
 +from typing import Optional
 +from http.cookiejar import LWPCookieJar
 +import pyperclip
 import requests import requests
 import bs4 import bs4
-import pyperclip 
  
-contest ​= 'abc001'+CONTEST ​= 'abc124'​ 
 + 
 +USERNAME = ''​ 
 +PASSWORD = ''​ 
 + 
 +url_root = '​https://​atcoder.jp'​ 
 +default_cookie_path = os.path.dirname(__file__) + '/​session.txt'
  
  
 def dokuwiki_link(url,​ title): def dokuwiki_link(url,​ title):
     return '​[['​ + url + '​|'​ + title + '​]]'​     return '​[['​ + url + '​|'​ + title + '​]]'​
 +
 +
 +def save_cookie(session:​ requests.Session,​ cookie_path:​ Optional[str] = None):
 +    cookie_path = cookie_path or default_cookie_path
 +    os.makedirs(os.path.dirname(cookie_path),​ exist_ok=True)
 +    session.cookies.save()
 +    os.chmod(cookie_path,​ 0o600)
 +
 +
 +def load_cookie_to(session:​ requests.Session,​ cookie_path:​ Optional[str] = None):
 +    cookie_path = cookie_path or default_cookie_path
 +    session.cookies = LWPCookieJar(cookie_path)
 +    if os.path.exists(cookie_path):​
 +        session.cookies.load()
 +        return True
 +    return False
 +
 +
 +def try_login(session):​
 +    login_url = url_root + '/​login'​
 +
 +    # ユーザー名がログインページに含まれるかで、ログイン状態を判定
 +    # もしユーザー名が一般的で非ログイン時でも当てはまってしまう場合はもう少し工夫が必要
 +    r = session.get(login_url)
 +    if USERNAME in r.text:
 +        # print('​Already logged in.')
 +        return True
 +
 +    # csrf_token取得
 +    s = bs4.BeautifulSoup(r.text,​ '​lxml'​)
 +    csrf_token = s.find(attrs={'​name':​ '​csrf_token'​}).get('​value'​)
 +
 +    post_data = {
 +        "​csrf_token":​ csrf_token,
 +        "​username":​ USERNAME,
 +        "​password":​ PASSWORD,
 +    }
 +    r = session.post(login_url,​ data=post_data)
 +    if '​tokens mismatch.'​ in r.text:
 +        print('​Login error.'​)
 +        print(r.text)
 +        return False
 +
 +    save_cookie(session)
 +    return True
  
  
 def main(): def main():
-    ​url_root = '​https://​beta.atcoder.jp'​ +    ​# セッション開始 
-    ​tasks_url ​url_root + '/​contests/​{contest}/​tasks'​.format(contest=contest)+    ​session ​requests.Session() 
 +    load_cookie_to(session) 
 + 
 +    if try_login(session):​ 
 +        pass 
 +    else: 
 +        return
  
-    r = requests.get(tasks_url)+    ​tasks_url = url_root + f'/​contests/​{CONTEST}/​tasks'​ 
 +    ​r = session.get(tasks_url)
     bs = bs4.BeautifulSoup(r.text,​ '​lxml'​)     bs = bs4.BeautifulSoup(r.text,​ '​lxml'​)
  
ライン 120: ライン 184:
     for problem_url in problem_urls:​     for problem_url in problem_urls:​
         problem_url = url_root + problem_url         problem_url = url_root + problem_url
-        r = requests.get(problem_url)+        r = session.get(problem_url)
         bs = bs4.BeautifulSoup(r.text,​ '​lxml'​)         bs = bs4.BeautifulSoup(r.text,​ '​lxml'​)
         title = bs.find('​title'​).text         title = bs.find('​title'​).text
ライン 128: ライン 192:
         dokuwiki_buf.append('​==== 例 ====\n\n\n'​)         dokuwiki_buf.append('​==== 例 ====\n\n\n'​)
         dokuwiki_buf.append('​==== 解法 ====\n\n\n'​)         dokuwiki_buf.append('​==== 解法 ====\n\n\n'​)
-        dokuwiki_buf.append('<​sxh python>​\n\n\n</​ sxh>​\n\n\n'​)+        dokuwiki_buf.append('<​sxh python>​\n\n\n<​ /​sxh>​\n\n\n'​)
  
 +    # print(''​.join(dokuwiki_buf))
     pyperclip.copy(''​.join(dokuwiki_buf))     pyperclip.copy(''​.join(dokuwiki_buf))
  
ライン 135: ライン 200:
 if __name__ == '​__main__':​ if __name__ == '​__main__':​
     main()     main()
 +
 </​sxh>​ </​sxh>​
  
programming_algorithm/contest_history/atcoder.txt · 最終更新: 2019/04/15 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0