はじめに
数日前に話題になっていた「Twitterの名前を5分毎に東京の天気☼☂☃と連動させるサーバレスプログラムを書いたら色々知らないことが出てきた話」を読んで、Pythonのいい練習になりそう!って事で自分でやってみた話です。
数日経って元記事見てみたら、既に何人かやっている人いるみたいです。(同じくPython3の人もいる)
が、まぁ、他より割りと詳しく書いているので、試してみたい人はどうぞ。
楽しいお題?をくれた山本一成さんに感謝します。
前提
- Python3がインストールされている
- Twitterのアカウントを持っている
- AWSアカウントを持っている
OpenWeatherMapAPIのAPIキーを取得
- OpenWeatherMapにアクセス → Sign Up
- API keysでKeyを確認
- 検索したい都市名を取得
- ここのJSONから調べる
- 面倒なら「tokyo」、「osaka」、「nagoya-shi」、「london」とか
- ブラウザで試す
- ↓のURLに都市名とAPI Keyを入れこんで確認
http://api.openweathermap.org/data/2.5/weather?q=${都市名}&appid=${API Key}
Python3からOpenWeatherMapAPIを叩く
requests
というモジュールを使う例が多かったのでpipで入れる
- 後でLambdaに乗せる時ために、「-t」オプションをつけてスクリプトと同じ場所にインストール
pip install requests -t .
- コードを書いて実行
import requests
import json
SEARCH_CITY = "tokyo"
OPEN_WEATHER_MAP_API_KEY = "取得したAPI Key"
API_URL = "http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
url = API_URL.format(city=SEARCH_CITY, key=OPEN_WEATHER_MAP_API_KEY)
r = requests.get(url)
data = json.loads(r.text)
print(data)
twitter
というモジュールを使う例が多かったのでpipで入れる
- 後でLambdaに乗せる時ために、「-t」オプションをつけてスクリプトと同じ場所にインストール
pip install twitter -t .
- コードを書いて実行
import twitter
auth = twitter.OAuth(consumer_key="Consumer Key (API Key)",
consumer_secret="Consumer Secret (API Secret)",
token="Access Token",
token_secret="Access Token Secret")
t = twitter.Twitter(auth=auth)
t.account.update_profile(name="山pです。")
ちなみに
- Tweetする場合
t.statuses.update(status="ついーとするないよう")
import requests
import json
import twitter
SEARCH_CITY = "tokyo"
OPEN_WEATHER_MAP_API_KEY = "取得したAPI Key"
API_URL = "http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
WEATHER_EMOJI_MAP = {
"01d": "☀",
"02d": "🌤",
"03d": "☁",
"04d": "⛅",
"09d": "🌧",
"10d": "🌦",
"11d": "🌩",
"13d": "🌨",
"50d": "🌁"
}
def get_weather_icon():
url = API_URL.format(city=SEARCH_CITY, key=OPEN_WEATHER_MAP_API_KEY)
r = requests.get(url)
data = json.loads(r.text)
return data["weather"][0]["icon"].replace("n", "d")
def get_weather_emoji():
return WEATHER_EMOJI_MAP.get(get_weather_icon())
def update_twitter_screen_name(name):
auth = twitter.OAuth(consumer_key="Consumer Key (API Key)",
consumer_secret="Consumer Secret (API Secret)",
token="Access Token",
token_secret="Access Token Secret")
t = twitter.Twitter(auth=auth)
t.account.update_profile(name=name)
def main():
emoji = get_weather_emoji()
twitter_name = "山p" + emoji
update_twitter_screen_name(twitter_name)
if __name__ == '__main__':
main()
- 天気を絵文字に変換するのがかなり面倒なので、ここでは種類が少ないiconを使って変換してます。
- 正確に天気が欲しい場合には↓を見て変換すれば良いと思います。
Lambadaに乗せるために準備
コードを変更
- mainではなく、eventとcontextを受け取るhandler関数を作成
- Lambdaで環境変数を設定できるので、コードからKeyなどを除去して環境変数から取得するようにする。
import requests
import json
import twitter
import os
SEARCH_CITY = os.environ["SEARCH_CITY"]
OPEN_WEATHER_MAP_API_KEY = os.environ["OPEN_WEATHER_MAP_API_KEY"]
TWITTER_CONSUMER_KEY = os.environ["TWITTER_CONSUMER_KEY"]
TWITTER_CONSUMER_SECRET = os.environ["TWITTER_CONSUMER_SECRET"]
TWITTER_TOKEN = os.environ["TWITTER_TOKEN"]
TWITTER_TOKEN_SECRET = os.environ["TWITTER_TOKEN_SECRET"]
API_URL = "http://api.openweathermap.org/data/2.5/weather?q={city}&APPID={key}"
WEATHER_EMOJI_MAP = {
"01d": "☀",
"02d": "🌤",
"03d": "☁",
"04d": "⛅",
"09d": "🌧",
"10d": "🌦",
"11d": "🌩",
"13d": "🌨",
"50d": "🌁"
}
def get_weather_icon():
url = API_URL.format(city=SEARCH_CITY, key=OPEN_WEATHER_MAP_API_KEY)
r = requests.get(url)
data = json.loads(r.text)
return data["weather"][0]["icon"].replace("n", "d")
def get_weather_emoji():
return WEATHER_EMOJI_MAP.get(get_weather_icon())
def update_twitter_screen_name(name):
auth = twitter.OAuth(consumer_key=TWITTER_CONSUMER_KEY,
consumer_secret=TWITTER_CONSUMER_SECRET,
token=TWITTER_TOKEN,
token_secret=TWITTER_TOKEN_SECRET)
t = twitter.Twitter(auth=auth)
t.account.update_profile(name=name)
def handler(event, context):
emoji = get_weather_emoji()
twitter_name = "山p" + emoji
update_twitter_screen_name(twitter_name)
Zip圧縮
- ここでわざわざライブラリをスクリプトと同じ場所に置いていることが生きてくる
- フォルダ毎ではなくて、ファイルを直で圧縮
- コマンド例 :
zip -r upload.zip *
Lambadaに乗せる
- AWS Lambdaを開く
- 関数の作成
- 名前 : 関数の名前
- ランタイム : Python 3.6
- ロール : 新しいロールを作成して選択
- とりあえず「Designer」は後回し
- 関数コード
- コードエントリタイプ : .ZIPファイルをアップロード
- ランタイム : Python 3.6
- ハンドラ : スクリプト名.関数名
- 例 : スクリプト名が「main.py」で、関数が↑の通り「handler」の場合「main.handler」
- 環境変数
- テストイベントの選択
- 保存
- テスト!!
- 正しく実行されたことを確認
- Twitterの名前が変更されていることを確認
- Designer
- CloudWatch Events
- 新規ルール作成
- ルールタイプ : スケジュール式
- スケジュール式 : cron(1 * * * ? *)
- 保存
参考