Search 4 Truth

Search 4 Truth

Pythonと仮想通貨

ブログの更新を自動的にツイートする【IFTTT】

今回はブロガーに向けた記事となっています。

タイトル通りです。ブログに記事を投稿したら自動的にTwitterで通知してくれる設定をIFTTTで作ってみたので紹介します。(はてなブログ対応)

IFTTT(イフト)って何?って人は以下を参照して下さい。プログラミングの知識は必要ありません。
www.atmarkit.co.jp

今回は ブログに投稿 → Twitterに更新を通知する というものになっていますが、応用すれば色々なことがで切ると思います。色々なことが。

必要なもの

IFTTTのアカウント
Twitterのアカウント

実践す

両アカウント共にログインしておいてください。

ホームに移動して右上の折りたたみメニューから"New Applet"を選択します。

f:id:lisbeths:20180203145601p:plain

「if this then that」(もし〜ならば〜をする)の「this」(もし〜ならば)の部分あたる設定をします。

f:id:lisbeths:20180203145616p:plain

"Choose a service"の検索欄に「Feed」を入れて検索します。

f:id:lisbeths:20180203150102p:plain

"New feed item"を選んで。。。

f:id:lisbeths:20180203150802p:plain

"New feed item"の"Feed URL"に自分のブログのURLの後ろに「/feed」を追加して貼ります。はてなブログの更新フィードの説明はこちらを参照して下さい。貼り終わったら"Create trigger"を選択します。

f:id:lisbeths:20180203150825p:plain

次に「if this then that」(もし〜ならば〜をする)の「that」(〜をする)の部分に当たる設定をします。つまりツイートする設定ですね。

f:id:lisbeths:20180203154253p:plain

"Choose action service"の検索欄に"Twitter"と入力して検索します。

f:id:lisbeths:20180203151829p:plain

"Post a tweet"を選択します。

f:id:lisbeths:20180203152026p:plain

Twitterに投稿する際の文面を設定します。Tweet textに初期設定されている{{EntryTitle}}と{{EntryUrl}}はブログタイトルとブログのURLとなっているのでそのままにします。今回は「ブログ更新!」という文字を入れただけです。完了したら"Create action"を選択します。

f:id:lisbeths:20180203152122p:plain

最後にレシピ(IFTTTの設定のこと)に名前をつけて"Finish"を選択します。

f:id:lisbeths:20180203152541p:plain

完成品

できましたね〜。以前までは作ったレシピを公開することができたのですが今はできなくなっているみたいです。

【仮想通貨】ビットコインの価格をグラフ化してみる 【Python】

今回はbitFlyerのAPIを使って1分足データをグラフにplotしていきたいと思います。私のPython学習の備忘録として書くのでかなり初歩的な内容になるかと思います。

おまけとしてPythonの標準モジュールである「os」を使ってファイル操作を伴い1時間ごとにグラフを更新してTwitterに画像付ツイートをするプログラムを作ってみました

使った環境

・MacBook Air Early 2015 Sierra 10.12.6
・Python3.6.2 pip3

モジュール

・matplotlib(pip3 install matplotlib)
・numpy(pip3 install numpy)
・requests(pip3 install requests)

numpyは使いませんがmatplotlibをインポートする際にインストールが必要らしい?(matplotlibをインポートする時にエラーが出てインストールを強要された)

おまけ
・tweepy(pip3 install tweepy)
・seaborn(pip3 install seaborn)
・os(標準モジュール)

matplotlibでグラフ化する

まずは適当な数字をplotしてみます。

#い つ も の plt
from matplotlib import pyplot as plt

#変数numに1〜5までの数値をリストで格納
num = [1,2,3,4,5]

#グラフにリストnumを描画する
plt.plot(num)

#表示
plt.show(num)

3行で簡単なグラフは生成できます。numpyを使って数列を使いplotするのが恒例のようですが今回はビットコインの価格をplotするのでリストに数値を格納してplotしました。python3ではshow()をしないと表示されないようです。

f:id:lisbeths:20180131140426p:plain

続いてbitFlyerのAPIを叩いてグラフ化していきたいと思います。requestsを使って価格をjson形式で取り出し、1分毎にリストに入れてグラフに描画してみます。

from matplotlib import pyplot as plt
from  time import sleep

#価格を出してタプルで返す
def bf():
    URL = 'https://lightning.bitflyer.jp/v1/getticker'
    ticker = requests.get(URL).json()
    price = int(ticker['best_ask']),int(ticker['best_bid'])
    return price

#一分間隔で変数ask,bidにそれぞれ買値と売値を入れる
for i in range(60):
    price = bf()
    ask.append(price[0])
    bid.append(price[1])
    sleep(60)

#描画する 第二引数に描画方式 (今回は円) 第三引数にラベルを指定
 plt.plot(ask,'-o',label='ask')
 plt.plot(bid,'-o',label='bid')

# plt.plotの数値とラベルを結びつけるために必要
plt.legend()
plt.show()

実行してみます。

f:id:lisbeths:20180201010743p:plain

できましたね〜(書いてる時に思ったんですがアビトラ用に各取引所のデータをplotしたら面白いんじゃねW 後日ブログに...)

おまけ -Twitterに1時間毎にグラフを更新して投稿するbotを作った-

完成品がこちら〜

完全に自己満足botでございました〜〜〜

おやすみなさい

はてなブログPro会員になったので無料ドメインを人柱していく【Freenom】

この度は、はてなブログのpro会員になりました。Google AdSenseに広告掲載を申請するにあたり独自ドメインを取得する必要があるので、今回は無料ドメインを取得する際の手順を簡単にまとめてみました。

私はFreenomというサイトでドメインを取得して実際にこのブログに使用しています。pypiはこのブログでもだいぶお世話になっているPythonモジュールインストールリポジトリ「PyPI」を捩ってみました。

生存確認 1月26日〜

http://www.pypi.cf
いつ使えなくなるか分からないので。。。

ドメインを取得する

何はともあれ欲しいドメインを検索してみましょう。

まずはFreenomに移動して欲しいドメインを検索してみます。

.tk/ .ml/ .ga/ .cf/のドメインが取得可能なようで、3文字以下は有料だそうです。.com/や.info/などは有料ですが取得可能です。お金払うならお名前.comとかでいいでしょう。。

f:id:lisbeths:20180201135458p:plain

特定の文字列も有料だそうで。。。

f:id:lisbeths:20180201135507p:plain

今回は無難にkusaドメインを取得します。欲しいドメインを選択して下までスクロール、"チェックアウト"をクリックで確認画面に行きます。

f:id:lisbeths:20180201162042p:plain

"Period"(期間)を選択します。12Monthまでは無料なので、それを選択します。更新手続きをすれば無料で1年以上使えるらしいですがこれは後述します。

f:id:lisbeths:20180201142727p:plain

メールアドレスを記入して"Verify My Email Address"を選択します。送られてきたメールアドレスのURLにアクセスします。

f:id:lisbeths:20180201142430p:plain

"Your Details"の空欄を全て埋めます。無料なのでクレジットカード情報や本名を記入する必要はありませんでした。SMS認証もないので電話番号もデタラメでOKでしょう。完了したら"Complete Order"を選択します。

f:id:lisbeths:20180201142558p:plain

ドメイン設定

一旦ホームに戻りログインします。

f:id:lisbeths:20180201144819p:plain

右上の折りたたみバーから"Service" → "My Domains"を選択します。

f:id:lisbeths:20180201144841p:plain

"Status" がActiveになっていたら使える状況ってことなんですかね。"Manage Domain" → "Management Freenom DNS"を選択します。

f:id:lisbeths:20180201145627p:plain

・name - www(自由)
・Type - CNAME
・TTL - 3600
・Target - hatenablog.com

以上のように記入したら、"Save Changes"を選択してドメインの設定は完了です。

f:id:lisbeths:20180201151100p:plain

ドメインとブログの紐付け

あとは簡単ですね。

はてなブログに移動して、ダッシュボード → ドメインを設定するブログ → 設定 → 詳細設定に移動します。

独自ドメインの入力フォームに先程取得したドメインを記入して設定します。

f:id:lisbeths:20180201152237p:plain

テスト用ブログに設定してみました。ドメインは一瞬で移行されるみたいです。

f:id:lisbeths:20180201152414p:plain

注意点など

Freenomのサポートページから重要そうなものを抜粋してみました。

Q,WHOISについて
Freenomまたはその子会社はWHOISでライセンシーとして​​表示されます

Q, 無料ドメインの更新期間について
1ヶ月から12ヶ月です。 各登録期間の最後の15日間(有効期限までの15日間)に無料ドメイン名を更新することができます。 有料ドメイン名は、1年間から10年間まで登録することができます。

Q, 私のドメインが無効になることはありますか?
1〜12ヶ月間、選択したドメイン名を使用することができます。 あなたが期限内にドメイン名を更新しない場合登録は解除されます。 各登録期間の最後の15日間に無料ドメインの無料更新ができます。 あなたのウェブサイトが長期間停止している場合や受け入れ難い内容、またはアップロードしていない場合、そのドメインはキャンセルされます。 その結果あなたのドメイン名は、無料または有料登録する他の登録者に対して自動的に利用可能になる可能性があります。

Freenomで取得したドメインを実際に使っている方や、無料ドメインについてデメリットなど述べている方を以下のURLにまとめてみました。

rockrock.tk

tks-lab.hatenablog.com

【仮想通貨】bitFlyer LightningをAPIを使わずにスクレイピングする【Python】

今回は「Selenium」と「PhantomJS」を使ってリアルタイムでbitFlyer Lightningの価格を取得していきたいと思います。

bitFlyerはAPIを提供していますが、1分間にリクエストできる回数が200回と決まっています。そこでseleniumを使ってこのウェブページから直接価格を抜くことで無制限に使うことができます。

f:id:lisbeths:20180130191043p:plain

PhantomJSはウェブブラウザーと同様の振る舞いができるのでサーバーに過度な負担を与えること無く、無限に価格を取り出せます。コード見てさっさと使いたいって人は目次から一気にコードに飛んで下さい。

使った環境

・MacBook Air Early 2015 Sierra 10.12.6
・Python3.6.2 pip3
・iTerm2(コマンドプロント)
・Chrome

準備するもの

・PhantomJS(http://phantomjs.org/
・Selenium(pip3 install selenium)
・BeautifulSoup(pip3 install beautifulsoup4)
・re(標準モジュール)
・bitFlyerのアカウント

PhantomJSはpathを通して使える状態にしておいてください。

スクレイピングの概要

ログイン

まずはbitFlyer Lightningのログイン画面に行きます。

f:id:lisbeths:20180130193015p:plain

右クリックで「検証」を押します。入力フォームである「input要素」をHTMLから探します。(HTML用語はは分からないので。。。。雰囲気でやってます。。)

f:id:lisbeths:20180130203042p:plain

ありましたね。「LoginId」というのがメールアドレス(ID)の入力フォームのようです。

f:id:lisbeths:20180130203146p:plain

パスワードの入力フォームは「Password」でした。

f:id:lisbeths:20180130203854p:plain

次にログインボタンを押します。「Login_btn」というのがボタンのようですね。これでログインすることができるようになったので、コードにまとめます。

from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup as bs
import re

ma = "メールアドレス"
pw = "パスワード"

#関数Loginにログインするための一連の動作をまとめました

def Login():
    
    #「bitFlyer Lightning」に移動
    driver = webdriver.PhantomJS()
    driver.get("https://lightning.bitflyer.jp")
    
    #メールアドレスを入力
    login_id = driver.find_element_by_id("LoginId")
    login_id.send_keys(ma)

    #パスワードを入力
    login_pw = driver.find_element_by_id("Password")
    login_pw.send_keys(pw)
    
    #ログインボタンをクリック
    driver.find_element_by_id('login_btn').click()
文字列出力

これでログインすることができるようになったので、ブラウザでもログインしてみます。次に抜き出したい情報を選びます。今回は買値のみを抜いてみます。さっきと同様に右クリックして「検証」をします。

f:id:lisbeths:20180130212019p:plain

「command + f」でaskなどで検索したら「Best_Ask」という要素を発見しました。

<option value="ASK">Best Ask (現在 1,271,391)</option>

この中にある文字列部を抽出するために正規表現を使います。

#ページのソースをutf-8でエンコード。。。?
#BeautifulSoupでhtmlにパースする
html = driver.page_source.encode("utf-8")
soup = str(bs(html,"html.parser"))

#正規表現のパターン
#htmlの中からパターンを抽出
#findallでリストが返ってくるのでインデックスに0を指定して出力
p = '<option value="ASK">(.+)</option>'
m = re.findall(p,soup)
print(m[0])

さっきのコードとくっつけて実行してみます。

Best Ask (現在 1,267,000)

できましたね。

コード

全体像

from selenium import webdriver
from time import sleep
from bs4 import BeautifulSoup as bs
import re

ma = 'メールアドレス'
pw = 'パスワード'

def Login():
    driver = webdriver.PhantomJS()
    driver.get('https://lightning.bitflyer.jp/?lang=ja')

    login_id = driver.find_element_by_id("LoginId")
    login_id.send_keys(ma)

    login_pw = driver.find_element_by_id("Password")
    login_pw.send_keys(pw)

    driver.find_element_by_id("login_btn").click()

    while True:
        html = driver.page_source.encode("utf-8")
        soup = str(bs(html,"html.parser"))
        p = '<option value="ASK">(.+)</option>'
        m = re.findall(p,soup)
        print(m[0])

if __name__ == '__main__':
    Login()

htmlをパースして正規表現で抜き出す処理を無限ループさせています。メールアドレスとパスワードをそれぞれ変数maとpwに入れて実行します。

f:id:lisbeths:20180130222320g:plain