Screenshot_2020-02-19_さとけん_ダイエット3日目さん___ikemensato__Twitter

PythonとAWSでツイッターの名前に「~日目」の日数カウンタをつける方法

将棋ソフト「ポナンザ」を作った山本一成さんというプログラマーが、以前こんなものを作っていて、自分も似たようなものを作ろうと思い作った。



AWS lambdaとTwitterAPIを使えば比較的簡単に作れるのだが、正直ツイッターのAPI取得やらなんやらで苦労した。

本当はOAuth認証を使い、認証されたユーザーの名前を取得して日数カウンタを付けたかったのだが、それをやろうとするとDynamoDBを使ってユーザー情報をやり取りしなくてはいけないらしい。

結構しんどそうなので、今回はめっちゃシンプルなモノをさっさと作りたかったのである。

というわけで一応雑なコードだが、動いているので公開する。

全コードはこちら


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import datetime
from requests_oauthlib import OAuth1Session

# OAuth認証部分
CK = "Consumer Key を入力"
CS = "Consumer Secret を入力"
AK = 'Access Key'
AS = 'Access token Seecret'


twitter = OAuth1Session(CK, CS, AK, AS)


def lambda_handler(event, context):
   # Twitter Endpoint(検索結果を取得する)
   get_url = 'https://api.twitter.com/1.1/account/verify_credentials.json'

   req_get = twitter.get(get_url)
   account_data = json.loads(req_get.text)
   str_name = account_data['name']

   start_day = datetime.datetime(2020, 2, 16)

   today_day = datetime.datetime.today()
   diff_day = today_day - start_day
   daycount = diff_day.days + 1

   str_daycount = str(daycount) + '日目'

   post_url = 'https://api.twitter.com/1.1/account/update_profile.json'

   user_name = re.sub(r"【.*】", "", str_name) + "【" + str_daycount + "】"

   params = {'name': user_name}

   req_post = twitter.post(post_url, params=params)

   # respons check.
   if req_post.status_code == 200:
       return "ok 200."
   else:
       return "ERROR : " + str(req_post.status_code)


import json
import datetime
from requests_oauthlib import OAuth1Session


ライブラリを読み込む。
twitterAPIをイジるモジュールはたくさんあるが、違いは俺もよく分かっていない。


# OAuth認証部分
CK = "Consumer Key を入力"
CS = "Consumer Secret を入力"
AK = 'Access Key'
AS = 'Access token Seecret'

twitter = OAuth1Session(CK, CS, AK, AS)

TwitterAPIのキーをそれぞれ入力。
キーをOAuth1sessionというモジュール?で通す。

さらっと書いてるが、たぶん本当の初心者は分からないだろう。
各自ググってほしい。


def lambda_handler(event, context):
   get_url = 'https://api.twitter.com/1.1/account/verify_credentials.json'


名前を取得するためのURL。

この辺のURLとかパラメーターはリファレンスを見て探す。


   req_get = twitter.get(get_url)
   account_data = json.loads(req_get.text)
   str_name = account_data['name']
   
   start_day = datetime.datetime(2020, 2, 16)

   today = datetime.datetime.today()
   diff_day = today - start_day
   daycount = diff_day.days + 1

   str_daycount = str(daycount) + '日目'



取得用URLからデータを取得。
jsonデータなので、jsonメソッド?で読み込む。

データから「name」を取り出す。
任意の日付をdatetime型に変換する。

今日の日付を取得。

経過日数 = 開始日 - 今日

例えば、その日なら0日になってしまうので、1を足す。


   post_url = 'https://api.twitter.com/1.1/account/update_profile.json'

   user_name = re.sub(r"【.*】", "", str_name) + "【" + str_daycount + "】"

   params = {'name': user_name}

   req_post = twitter.post(post_url, params=params)


プロフィール更新用のURL。

ユーザーネームから正規表現で【~日目】を削除して、経過日数を付加する。

そして、postする。


   # respons check.
   if req_post.status_code == 200:
       return "ok 200."
   else:
       return "ERROR : " + str(req_post.status_code)


エラーチェックのためのコードらしいが、俺もよく分かっていない。


これをどうすんの?

AWS lambdaに乗せる。

他のサイトを色々見て各自でやってほしい。


以上。

おまけ

近いうちにOAuth認証ユーザーの名前を取得して、誰でもすぐにカウンタを付けられるようにしたい!

俺ならできる(素敵な勘違い)

ここまでお読みいただきありがとうございます。 良かったらスキとシェアをお願いします。