DAY37 pixelaというAPIを使ってログアプリを作る!アカウント登録〜ログ記録まで
python再開して更新してみます。
今回はpixelaというAPIを使ってログをとるアプリを作ります。
製作者は日本人なのでget startedも日本語ドキュメントあってやりやすいかと。
アカウントを作成する
最初にアカウントを作成します。
リンク先の始め方だとcurlでの作業なので
pythonの書き方に変換すると、
import requests
pixela_endpoints = "https://pixe.la/v1/users"
secret_code = "tekitounisakuseisitekudasai"
username = "gakpy2"
# アカウント作成する初回だけ
params = {
"token":secret_code,
"username": username,
"agreeTermsOfService":"yes",
"notMinor":"yes"
}
response = requests.post(url=pixela_endpoints, json=params)
print(response.text)
このような感じになります。curlの-dはデータということで、
見てみるとjson形式になっているのでpythonでもparamsと定義したjsonデータに。
requestsモジュールをインポートして、curlの最初にあるとおりpostでresponseをもらう。
そうすると、pythonのコンソールでは同じような返事がテキストできます。

これでアカウントが作成されました。
ちなみにこれは1回だけしか使わないのでコメントアウトしておきます。
2回以上作動させてもこうなります。

グラフを作る
次にグラフを作ります。オフィシャルのcurlでは
$ curl -X POST https://pixe.la/v1/users/a-know/graphs -H 'X-USER-TOKEN:thisissecret' -d '{"id":"test-graph","name":"graph-name","unit":"commit","type":"int","color":"shibafu"}' {"message":"Success.","isSuccess":true}
こんな感じになっているのですが、 -Hというのを検索してみるとpythonではjsonデータとは別にheaderでの設定がいるらしい。
pythonで書くのならこんな感じになる。
params = {
"id":"test-graph",
"name":"study-graph",
"unit":"commit",
"type":"int",
"color":"ichou",
"timezone":"Japan"
}
headers = {
"X-USER-TOKEN": SECRET_CODE
}
response = requests.post(url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs", headers=headers, json=params )
print(response.text)
タイムゾーンなどは追加した。詳しくは上記リンク先で。
登録が成功するとマイページはこんなふうになります。

グラフにログを記録する
そしてついにログを記録する方法に。
オフィシャルだとこんなcurlですが
$ curl -X POST https://pixe.la/v1/users/a-know/graphs/test-graph -H 'X-USER-TOKEN:thisissecret' -d '{"date":"20180915","quantity":"5"}' {"message":"Success.","isSuccess":true}
見た感じ結構簡単ですね。
jsonデータは日付と質で、ヘッダーは毎回必ずいるようです。
今日はこの記事を1本書いたということで今日の日付で1を登録してみます。
headers = {
"X-USER-TOKEN": SECRET_CODE
}
params = {
"date": "20220810",
"quantity": "1"
}
response = requests.post(url=f"{PIXELA_ENDPOINTS}/{USERNAME}/graphs/{GRAPH_ID}", headers=headers, json=params)
print(response.text)
となると、
{"message":"Success.","isSuccess":true}で成功となりました。
マイページを見ると…

いろんなところに1が増えています。
これで今日のログ記録は完成しました。
とりあえず登録〜記録まではこんな感じです。
復習してみると思ったより簡単でした。
(なぜいままで躊躇して更新していなかったのか…)
8月目標
最近ブログ書けてないので月初めに目標をたてて遂行していこうかと。
8月目標
- Reactを使ってポートフォリオを作成(youtubeをみながら)
- 本業でjavascriptを使って勉強しつつ貢献する(アイデアはqiitaに書く)
- python記事も週1ペースでUdemyのを補完していく
- paizaに登録したのでランクを上げていく
実務未経験でpythonだけは求人も少なくて狭き門だと感じたので、
フロントエンドでReactとJavascriptを7月はやっていっていたのですが
今月はfirebaseとかを使ってreactでデプロイまでできればと計画中。
また客観的に評価をしてもらいたいのでfindyでのランク付以外にも
paizaを使ってランクを上げていく。
paizaの試験なんか質問がクセがないか?回答コードが簡単なんだけど
問題を理解するのに時間かかる笑
freeCodeCampで正規表現を勉強する!
引き続きfreeCodeCampで正規表現も勉強。
matchとかもそうだけどエディタで検索するときにも使えるので
正規表現は結構使えるとよさそう。
スペルミスなどやある程度おおまかな検索をしたい場合は.をつける。
.testでしか使えない?
の中に検索したい文字を入れるとその文字があると出力される。
[aoe]ならa,o,eぞれぞれ検索してくれるし、[a-z]とかならアルファベット全てを検索してくれる。
数字も可能で両方合わせることも可能。/[a-c4-6]/giならabc、456を検索してくれる。
giなので大文字小文字どちらも、同じのもリストに入れてくれる。
検索されないようにするには^を先に入れる。
同じ文字が続く場合は検索したい文字の後ろに+をつけるとまとめて検索してくれる。
s+だとsが1個以上検索、sが2個以上の場合はss+を入力
後ろに何個ついてようが個数を気にせず検索する場合は*を使う
^はの中にいれると検索されないようにする機能を持つが、[]がないと文章の最初という意味になる。
その検索文字が最後の場合は$を検索文字の後ろにつける。
ショートハンド
?の使い方
検索対象をグループしたい場合は()の中に入れる
検索したものを変更したい場合は.replaceを使う。正規表現と合わせて使う
freeCodeCampでjavascriptを勉強する!ES6編
javascriptの基礎からES6も勉強。
アロー関数とか「なにこれ?」状態だったので、
今回これを勉強できてかなりためになった。
無料というのがすごい。
function部分の省略
引数が固定でない場合でも対応できるargumentオブジェクト
ES6ではテンプレートリテラルが使える
pythonでいうprint(f"{name} is {age}")みたいなもの
ファンクションの変数と引数が同じ場合は省略できる。
オブジェクト内でのファンクションの省略
class表記ができるように
classを使う時は最初にconstructorを記述して初期値を設定する。
pythonでいうdef __init__みたいなもの
type="module"で外部jsをインポートができる
promise文で処理を変えたり順序を変更できるようになる
ES6は特に覚えたかった部分のjsなので、だいぶ勉強になりました。
FreeCodeCampでjavascriptを勉強して簡単にまとめてみる。
一通りpythonの基礎はできてきたかなと思って求人を色々見ていると
関西とかでは実務なしのpythonエンジニアはかなり狭き門と感じたので、
フロントエンドもかじってみようとjavascriptも始めることに。
書き方はpythonと似たようなところがあるのでそんなに違和感なくできてる感じです。
とりあえず無料でもしっかり勉強できそうなところで
英語がメインではありますがfreeCodeCampで初歩からスタート。
https://www.freecodecamp.org/learn
とりあえず基礎をメモ的にまとめてみる。
変数定義
前はvarを使っていたがローカルにおいてもグローバルに使えてしまってややこしいので
今はletやconstを使う。
letは定義したものは変更できるけど、
constは基本的にはできない。(配列を定義した場合、配列内のデータは変えられる)
for文、while文、do while文
for文はほぼpythonにも似てる感じ。
pythonなら
pynum = 0
for i in range(10):
pynum += 1
print(pynum)
while文
js
pynum = 0
while pynum < 10:
pynum += 1
print(pynum)
jsにはdo whileというwhileに入る前に1回whileの処理ができる構文がある
再起関数
pythonではわからなかったけどjsで勉強してようやくわかった。
関数の中に自身の関数を入れてforを使わず回転させる。
if elseを使わず分岐ができる 構文
時々出てきたこの構文よくわかってなかったけどこれで納得。
その他よく使うファンクション
freeCodeCampで無料でここまで勉強できるのはすごい!
英語もそんなに難しい英語じゃないのでやりやすいと思います。
次はES6まとめ。
*1:previousValue, currentValue) =>
DAY36 めちゃくちゃ下げた米国の個別株の理由をニュースで知るアプリを作る!
DAY35抜かしちゃったけどAPIの呼び出しの練習なので、
DAY36に飛んで実践。
後日やるけど試したかったのでスクレイピングもつけています。
今回はスクレイピング部分の説明はなしでやります。
米国株の値動きがわかるAPIから今日と昨日の価格を取得して、
暴落していたらその理由がないかニュースAPIでニュースを検索して表示する、
というようなツールを作ります。
暴落しても全体の地合いで個別でニュースがない場合もありますが。。。
では始めます。
from get_company_name import get_company_name
import requests
#dotenv-templete
import os
import datetime as dt
from dotenv import load_dotenv
from os.path import join, dirname
load_dotenv(verbose=True)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
#dotenv-templete
STOCK_NAME = input("Type Company Code eg.TSLA : ")
STOCK_API = os.getenv("STOCK_API")
STOCK_ENDPOINT = "https://www.alphavantage.co/query"
NEWS_API = os.getenv("NEWS_API")
NEWS_ENDPOINT = "https://newsapi.org/v2/everything"
today_news = dt.datetime.today()
today_news = today_news.strftime("%Y-%m-%d")
company_name = get_company_name(STOCK_NAME)
print(company_name)
最初の2行はAPIでjsonを取得するためのrequestsと、
yahooファイナンスから英語の企業名を取得するスクレイピングの自作コードをインポートしてます。
次はAPI関連の情報で、STOCK_NAMEはinputで自分が気になる会社コードを
入れられるようにしています。
today_news部分は今日の日付を取得してNEWS APIのパラメータに合わせたフォーマットに変換しています。
APIで株価データを取得するコーディング
def get_stock_price():
params = {
"function": "TIME_SERIES_DAILY",
"symbol": STOCK_NAME,
"apikey": STOCK_API,
}
url = STOCK_ENDPOINT
r = requests.get(url, params=params)
data = r.json()["Time Series (Daily)"]
data_list = [value for (key,value) in data.items()]
today_data = float(data_list[0]["4. close"])
yesterday_data = float(data_list[1]["4. close"])
if today_data <= yesterday_data * 0.9:
print("OMG! why?")
get_stock_news()
else:
print("Keep it!")
url=をエンドポイントとしてリクエストし、paramsに必要事項を入力して
データをもらっています。
パラーメーターはAPIのドキュメントに書いてあります。
とりあえずrequiredだけやっとけば最低限の価格は取得できます。
取得したjsonを内包記述でリスト変換し、今日と機能の終値だけを取得します。
ニュースを取得するという機能を実装しています。
ニュースを取得する機能の実装
def get_stock_news():
params = {
"q": company_name,
"from": today_news,
"apikey": NEWS_API,
"language": "en",
"searchIn": "title",
}
response = requests.get(NEWS_ENDPOINT, params=params)
response.raise_for_status()
data = response.json()
if data["articles"] == []:
print("no news...")
else:
article_source = data["articles"][0]["source"]["name"]
article_title = data["articles"][0]["title"]
article_url = data["articles"][0]["url"]
print(f"{article_source} : {article_title} - {article_url}")
get_stock_price()
こちらはNEWS APIを使います。
同じようにドキュメントを見てパラメータをparamsにいれていきます。
入力例を見た方がわかりやすいかと思います。
sourcesではニュースサイトの指定もできるので、たとえばCNNだけから取得するということも可能。
取得がもしできなかったり空の場合は no news...と表示し、
あった場合は取得したjsonからメディア名・ニュースタイトル・リンク先を
アウトプットするようにしています。
スクラッチにしてはちゃんと機能したものが作れたので気分がいいです笑
APIを使ったデータ解析になれてきたら、
yahooファイナンスの日本株のapiでfor で全部の株のデータ取得して
解析とかしてみたいな。
Gitはこちら。
pythonとphpの記述比較
pythonの基礎的な記述方法は覚えたつもりなので、
phpの方も少しさらってみると用途は違うものの少しアレンジすれば
phpもできるんじゃなかろうかと思い違いをまとめてみた。
javascriptも基本かじってきているのでそれも後日復習する予定。
変数の定義
記述方法
リストの記述
コンソールに出力する方法
ifの記述
whileの記述
for文の記述
ランダムな整数の出力方法
for文の入れ子記述
ユーザー定義関数
処理の中断・break・continue
引数の個数を限定しない記述方法
用途以外の大まかな違いは、
変数には$がつく
関数はpython = def , php = function
な感じですね。
pythonのコードがすっきりして書きやすいのを再確認しました。
変数とか毎回$つけんのめんどくさい…笑