0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Github Actions + Pythonで定期的にTwitterのユーザー名を変更する

Last updated at Posted at 2021-02-13

#はじめに
この記事はうじまるさんのuzimaru0000/apex_rank_statusをPythonで書かせていただいたものを記事にしたものです
この記事では前回の記事と同様にTRACKER NETWORKのAPIを叩いてApex Legendsのランクポイントを取得し、それをTwitterのユーザー名に反映させます
ランクポイント関連のコードは記事の本質とは異なっているため、コードだけを載せるだけにします
また、__リポジトリを作成している__ことを前提に説明します

このコードのリポジトリ
#参考
uzimaru0000/apex_rank_status

#目次

#Twitter APIで名前を変更する
##Twitter APIの申請
この記事を参考にしてください
2020年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説
API申請が通ったら、API KEYとアクセストークンを控えておきます

##環境変数
今回はGithub Actionsを使用しているので、リポジトリに環境変数を設定して、それを読み込むようにします
以下の形式で環境変数を設定、使用します

名前 中身
API_KEY TwitterのAPI Key
API_SECRET_KEY TwitterのAPI Secret Key
ACCESS_TOKEN TwitterのAccess Token
ACCESS_TOKEN_SECRET TwitterのAccess Token Secret
TRN_API_KEY TRNのApi Key
APEX_USER_IDENTIFIER Apexのユーザ名
TWITTER_USER_NAME_TEMPLATE Twitterのユーザー名テンプレート (ex: "hayapo{}")

##使用するライブラリ
PythonのTwitterのラッパーであるpython-twitterを使用します

import twitter

使用する際はドキュメントを参照すると良し

##ランクポイントを取得する
この説明は前回の記事が詳しいです
ここではコードだけ載せます

import requests, json, os
from pprint import pprint
url = "https://public-api.tracker.gg/v2/apex/standard/profile/origin/SIN_HA_JECHT_DA"
header = {"TRN-Api-Key":os.environ['TRN_API_KEY']}#環境変数から読み込むようにしてる

res = requests.get(url, headers=header).json()

uzimaru0000/apex_rank_statusではランクポイントからランクに応じた絵文字を名前に付与しています。この記事でも、それを真似したいと思います。

main.py
rank_status = res["data"]["segments"][0]["stats"]["rankScore"]
rank_emoji = apex.set_rankname(rank_status)
rank_point = math.floor(res["data"]["segments"][0]["stats"]["rankScore"]["value"])
apex.py
import emoji

Apex_rank = {\
    'Bronze' : emoji.emojize(':3rd_place_medal:'),\
    'Silver' : emoji.emojize(':2rd_place_medal:'),\
    'Gold' : emoji.emojize(':1rd_place_medal:'),\
    'Platinum' : emoji.emojize(':trophy:'),\
    'Diamond' : emoji.emojize(':gem_stone:'),\
    'Master' :  emoji.emojize(':atom_symbol:'),\
    'Predator' : emoji.emojize(':ogre:')\
    }

def set_rankname(rank_status):
    if 0 <= rank_status['value']  < 1200:
        return Apex_rank['Bronze'] #🥉
    elif 1200 <= rank_status['value'] < 2800:
        return Apex_rank['Silver'] #🥈
    elif 2800 <= rank_status['value'] < 4800:
        return Apex_rank['Gold'] #🥇
    elif 4800 <= rank_status['value'] < 7200:
        return Apex_rank['Platinum'] #🏆
    elif 7200 <= rank_status['value'] < 10000:
        return Apex_rank['Diamond']  #💎
    elif 10000 <= rank_status['value']:
        if rank_status['rank'] is not None:
            if rank_status['rank'] <= 750:
                return Apex_rank['Predator'] #👹
            else:
                return Apex_rank['Master'] #⚛️
        else:
            return Apex_rank['Master'] #⚛️
    else:
        return emoji.emojize(':zzz:')

##ユーザー名を作成する
上記のコードで、ランクポイントを取得し、ランクに応じた絵文字をセットしました

次に、環境変数のTWITTER_USER_NAME_TEMPLATEに絵文字とランクポイントを埋め込みます

main.py
name = env.twitter_user_name_template.replace('{}','{}{}'.format(rank_emoji, str(rank_point)))

これでユーザー名の作成は完了です

##Twitter APIでユーザー名を変更する
python-twitterを使用したユーザ名の変更は簡単で、UpdateProfileモジュールのnameの部分に変更したい文字列を指定してあげるだけでいいです

main.py
#apiオブジェクトの作成
api = twitter.Api(consumer_key=env.CK, consumer_secret=env.CS, access_token_key=env.AT, access_token_secret=env.AS)
#UpdateProfileで名前変更
api.UpdateProfile(name=name)

これでAPIを使用して名前を変更するコードができました

#Github Actions
次にGithub Actionsにデプロイする方法を説明します

##環境変数の設定
環境変数で説明した通りに環境変数を設定します
環境変数を公開したくないので、Secretsを使用して安全に環境変数を使用できます
SettingsSectretsに移動し、右上のNew Repository secretボタンで環境変数を設定します

こんな感じになったらOK
スクリーンショット 2021-02-13 234918.png

##ActionとWorkflow
Github Actionsでは.github/workflowにおいたYAMLファイルで実行したい処理とその条件を定義するだけで簡単にプロジェクトをデプロイできます
環境変数やPythonファイルの実行などの個々のコマンドをAction、Actionの流れなどをまとめたものがWorkflowという認識で大丈夫だと思います
WorkflowはWorkflow構文と言うもので記述します
構文については公式のドキュメントを参照してください

###Workflowの構造
Workflowはこのような階層構造になっています

Workflow
  └ jobs
    └ jobの名前
      └ steps
        └ Action #個々のアクション

##Workflowの作成
Workflowを作成します
.github/workflowディレクトリを作成、そこにcron.ymlを作成します
以下のコードはcron.ymlに記述するものです
説明のためまとまったコードごとに分けていますが、最後にまとめたコードを貼っています
###スケジュールの設定
定期的に実行させるためにcrontabコマンドを使用してスケジュールを設定します
Workflowでcrontabコマンドを使うには、jobと同じインデントレベルにおいてon構文で使用します
スケジュールは分 時 日 月 曜日で指定します

on:
  schedule:
    - cron: '*/15 * * * *'

このようにすることで15分ごとにWorkflowが実行されます

###環境変数を読み込む

jobs:
  build:
   env:
     API_KEY: ${{ secrets.API_KEY }}
     API_SECRET_KEY: ${{ secrets.API_SECRET_KEY }}
     ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
     ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }}
     TRN_API_KEY: ${{ secrets.TRN_API_KEY }}
     APEX_USER_IDENTIFIER: ${{ secrets.APEX_USER_IDENTIFIER }}
     TWITTER_USER_NAME_TEMPLATE: ${{ secrets.TWITTER_USER_NAME_TEMPLATE }}

###リポジトリのチェックアウトとセットアップ
まずリポジトリをチェックアウし、Pythonをインストールします
バージョンを3.8.7、アーキテクチャをx64に設定しました
今回は外部ライブラリを使用するためpipをインストールし、requirements.txtの内容をインストールするようにしています
毎回、PyPIにアクセスして依存関係をインストールするのはかっこ悪いので、actions/cache@v1を用いて依存関係をキャッシュします

jobs:
  build:
   steps:
        #チェックアウト
      - uses: actions/checkout@v2

        #Pythonのセットアップ
      - name: Set up Python
        uses: actions/setup-python@v1
        with:
          python-version: '3.8.7'
          architecture: x64

        #pipのキャッシュ作成
      - name: Cache pip 
        uses: actions/cache@v1
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
          restore-keys: |
            ${{ runner.os }}-pip-

        #pipのインストールと依存関係のインストール
      - name: pip Install
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

###Pythonファイルの実行
あとは実行するだけです

jobs:
  build:
   steps:
        #実行
      - name: Run main.py
        run: python main.py

###YAMLコード全体

name: cron

on:
  schedule:
    - cron: '*/15 * * * *'

jobs:
  build:
    runs-on: ubuntu-latest

    env:
      API_KEY: ${{ secrets.API_KEY }}
      API_SECRET_KEY: ${{ secrets.API_SECRET_KEY }}
      ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
      ACCESS_TOKEN_SECRET: ${{ secrets.ACCESS_TOKEN_SECRET }}
      TRN_API_KEY: ${{ secrets.TRN_API_KEY }}
      APEX_USER_IDENTIFIER: ${{ secrets.APEX_USER_IDENTIFIER }}
      TWITTER_USER_NAME_TEMPLATE: ${{ secrets.TWITTER_USER_NAME_TEMPLATE }}

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v1
        with:
          python-version: '3.8.7'
          architecture: x64
      
      - name: Cache pip
        uses: actions/cache@v1
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
          restore-keys: |
            ${{ runner.os }}-pip-
      
      - name: pip Install
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run main.py
        run: python main.py

#成功してるか確認
##GithubのActionsを見てみる
スクリーンショット 2021-02-14 012630.png
ちゃんと出来てる:relaxed:

##Twitterの名前
スクリーンショット 2021-02-14 012928.png
できてる:relaxed:

#終わり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?