파이썬 에어프가 트위터 아이콘에 야간 모드를 구현한 이야기

경위



최근 왠지 UI로 다크 모드가 유행하고 있군요! 집중할 수 있다든가 할 수 없다든가(나는 진짜로 집중할 수 없다)
최신 iOS나 MacOS, Twitter 앱 등에서는 자동으로 다크 모드로 전환해 주는 기능도 붙어 있어 이쪽은 제대로 편리하고 있습니다


그런데 다크 모드로 전환하면 아이콘이 새하얀 뭔가 떠 버리고 있습니다! ! ! 이건 조금 신경이 쓰인다...
하지만 자동 변경마다 치마치마 업로드하는 것도 번거롭고 ... 어떻게하면 ...

개요



차번은 이 근처에서, 옛날에 취득한 API 키를 오랫동안 방치하고 있어 절각이므로 프로필 아이콘을 자동으로 변경해 주는 프로그램을 써 보았습니다.
우리 쪽 크리에이터에서 Python 자체가 에어프이므로 이르지 못하는 점이 죽을 정도 있을까 생각합니다만 따뜻한 눈으로 읽어 주실 수 있으면 다행입니다.

환경


  • Mac OS 10.15 Catalina (Public Beta 9)
  • Python 3.6.6

  • 사전 준비



    Twitter API 신청을 통해 전제로 계속합니다. 여기 등을 참조하십시오.

    이미지 준비



    일반 모드와 야간 모드용 프로필을 각각 준비했습니다. 색조 반전 정도라면 Python에서도 할 수 있을 것 같은 생각이 들지 않아도 됩니다만 그것은 다른 때에 해 봅니다.


    패키지 도입



    pip를 사용하여 패키지를 설치합니다.
    % pip install requests requests-oauthlib
    

    API 토큰 설명


    config.py 를 준비하고 Twitter Developers/App Details→keys and tokens 의 각 토큰을 기재합니다.

    config.py
    CONSUMER_KEY = "xxxxx" #API key
    CONSUMER_SECRET = "xxxxx" #API secret key
    ACCESS_TOKEN = "xxxxx" #access token
    ACCESS_TOKEN_SECRET = "xxxxx" #access token secret
    

    코드



    main.py
    #パッケージのインポート
    import json, config, sys, os, datetime
    from requests_oauthlib import OAuth1Session
    
    #トークン
    CK = config.CONSUMER_KEY
    CS = config.CONSUMER_SECRET
    AT = config.ACCESS_TOKEN
    ATS = config.ACCESS_TOKEN_SECRET
    
    twitter = OAuth1Session(CK, CS, AT, ATS)
    #プロフィール画像の変更用のエンドポイント
    url = "https://api.twitter.com/1.1/account/update_profile_image.json"
    #現在時間の取得
    ctime = datetime.datetime.now()
    
    #現在時間が朝7時の場合の命令
    if ctime.hour == 22:
        files = {"image": open("day.jpg", 'rb')}
        update_profile = twitter.post(url, files = files)
        print("change to day mode")
        if update_profile.status_code != 200:
            print("FAILED... :( ")
    #現在時間が17時の場合の命令(ダークモードへ変更)
    elif ctime.hour == 8:
        files = {"image": open("night.jpg", 'rb')}
        update_profile = twitter.post(url, files = files)
        print("changed to night mode")
        if update_profile.status_code != 200:
            print("FAILED... :( ")
    
    #それ以外の場合(多分なくて大丈夫)
    else:
        print("good night :)")
        sys.exit()
    

    쁘띠 해설



    cron으로 돈 돌리는 전제로 실행 시점에서의 시간을 기초로 if로 명령을 나누는 프로그램이 되고 있습니다. CircleCI(후술)의 cron이 UTC인것 같기 때문에 주의입니다.
    GitHub의 개인 리포지토리를 사용하지 않으면 토큰이 둥글게 보이므로 환경 변수를 사용해주는 것이 좋을지도 모릅니다.

    CircleCI에 배포



    자신이 CircleCI의 시스템을 거의 전혀 이해하지 못했기 때문에 이 근처에서 계속 빠져 있었습니다.

    각 파일 준비



    패키지 지정 → requirements.txt



    사용한 패키지명을 기술하면 CircleCI측에도 인스톨 해 줍니다.

    requirements.txt
    requests
    requests_oauthlib
    

    명령 등의 선언 → ~/.circleci/config.yml



    이게 뭐야
    현재 진행형으로 기법을 이해하고 있지 않기 때문에 깊은 해설은 할 수 없습니다. 친구에게 도움을 받았습니다. 괴롭히지 마세요 ...
    이것은 정말로 무엇입니까 ...

    config.yml
    version: 2
    jobs:
      build: #ディレクトリを指定します。適宜変更してください。
        working_directory: ~/yourdirectory
        docker: #Pythonのバージョンを指定します。
           - image: circleci/python:3.6.6
        steps:
          - checkout
          - run:
              command: | #実行するコマンドを記述します。pipenvでパッケージをとってきます。
                sudo pip install pipenv
                sudo pipenv install -r ./requirements.txt
                sudo pipenv run python3 main.py
    
    workflows:
      version: 2
      build_workflow:
        triggers:
          - schedule: #実行時間を記述します。UTCなので注意
              cron: "0 8,22 * * *"
              filters:
                branches:
                  only: #ブランチを指定します。
                    - master
        jobs:
          - build
    

    디렉토리



    이미지 정도는 디렉토리를 만들어 정리해주는 것이 좋았을지도 ...
    root/
    ├ main.py
    ├ config.py
    ├ day.jpg
    ├ night.jpg
    ├ requirements.txt
    └ .circleci/
      └config.yml
    

    동작 결과



    찍은 📹 htps // t. 코 / 에로 gZgX3 쿠 피 c. 라고 r. 코 m / 에 T4xyClG — Oblivion//요청⭕️ (@OblivionMGD) 10월 9, 2019


    동영상내의 시점에서는 Heroku로 움직이고 있습니다만 제대로 움직일 수 있습니다. 내용은 대체로 함께입니다. 24시간 프로그램을 계속 돌리는 것은 바보였다

    빌드에 30sec 정도 걸리므로 패키지를 캐시 해주면 실행 시간을 단축할 수 있을지도 모릅니다.

    요약



    일단 생각했던 느낌의 프로그램을 쓸 수 있었습니다. 지금도 제대로 사용하고 있습니다.

    Twitter API를 다루는 법을 모르거나 pipenv가 제대로 알지 못하거나 우왕왕왕했기 때문에 평소 코딩은 중요하다는 느낌입니다 ...

    단지 시행착오하면서 자신의 요구에 맞는 제품을 만드는 것도 의외로 즐겁네요!

    또 가려운 곳을 긁고 싶어지면 도전해 보려고 생각합니다.

    그럼


    좋은 웹페이지 즐겨찾기