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

プライバシーポリシー

当サイトに掲載されている広告について

当サイト「Search 4 Truth」はAmazon.co.jpのアソシエイト・プログラムの参加者です。Amazon.co.jpの商品やサービスを紹介し、リンクすることにより紹介料を獲得しています。

また、Google AdSenseにつきましては現在申請中ですが、審査が完了次第広告を掲載します。こちらはCookieを使用してお客様の過去のアクセスに応じて広告を配信します。

Cookieにつきましてはこちらにアクセスすればパーソナライズ広告に使われる第三者配信事業者のCookieを無効にすることができます。

アクセス解析ツールについて

当サイトでは、Googleが提供しているアクセス解析ツール「Google Analytics」を利用しています。

こちらはトラフィックデータの収集のため、Cookieを使用しています。このトラフィックデータは匿名で収集されており個人を特定することはできません。またCookieにつきましては前述通りこちらにアクセスすればパーソナライズ広告に使われる第三者配信事業者のCookieを無効にすることができます。

免責事項

当サイトのリンクやバーナーから他サイトに移動された場合、移動先で提供される情報、サービス等については一切の責任を負いません。

当サイトで掲載されている画像の著作権・肖像権は各権利所有者に帰属します。権利を侵害する目的ではございません。記事の内容や掲載画像等に問題がございましたら、各種権利所有者様本人がこちらまで、メッセージでご連絡下さい。確認後、対応させていただきます。

当サイトのコンテンツにつきましては、可能な限り正確な情報を掲載することに努めていますが、誤った情報が入り込んだり・古くなった情報が存在する場合があります。

当サイトに掲載された情報によって生じた損害等の一切の責任を負いかねますのでご了承下さい。

Pythonからはてなブログに記事を投稿する

はてなブログにはAtomPubというAPIを公開しているのでプログラムで簡単に記事を投稿することができますが、メールで記事を投稿することもできます。

はてなブログヘルプの参考記事

help.hatenablog.com

今回は記事のメール投稿をPythonによって実現したいと思います。送信用のメールアドレスにはGmailを使うので各自で取得しておいてください。2段階認証をしているアカウントでは使えなかったので私は送信用のメールアドレスを改めて作りました。投稿用(送信先メールアドレス)は、はてなブログの記事の管理画面 → 設定 → 詳細設定 から下にスクロールすると個々に割り当てられたメールアドレスがあります。下書き用と投稿用があるのでお好きな方を使ってください。


f:id:lisbeths:20180124152714p:plain


使い方&コード


以下の記事はからあげ (id:karaage)さんという方の記事です。こちらの記事で着想を得ました〜ありがとうございます。

karaage.hatenadiary.jp

使うモジュールは 「gmail」というモジュールのみです。pipでインストールしてください。

pip3 install gmail


次に下記プログラムをそのままコピーし、保存。送信用メールアドレス(Gmail)を「username」に。送信用メールアドレスのパスワードを「password」に。投稿用メールアドレスを「snedmail」に。自分のものにそれぞれ書き換えて下さい。

#mailpost-hatena.py
import gmail

def mail(head,sentence):
    username = 'hoge@gmail.com'
    password = 'password'
    sendmail = 'yourhatenaemail@blog.hatena.ne.jp'
    client = gmail.GMail(username,password)
    message = gmail.Message(head,text=sentence,to=sendname)
    client.send(message)
    client.close()

with open('hoge.txt','r') as r:
    h = r.readline().replace('\n','')
    s = r.read().replace(h,'')
    r.close()

mail(h,s)


次に投稿するための記事ファイルを用意します。今回は「hoge.txt」(任意のファイル名)ファイルを用意しました。これを「mailpost-hatena.py」と同じディレクトリーに保存してください。

[Python]こんにち!
ちくわ!


記述方法は一行目がタイトルでそれ以降が本文となっています。タイトルの前に大括弧 [ ] をつけて文字を入れると、カテゴリーになります。(タイトルの後ろでは反映されない)

投稿してみる


以上の行程が完了したら、実際に動かしてみましょう。

python3 postmail-hatena.py


テスト用に作成したブログに投稿してみました。

animestation.hateblo.jp

Raspberry Pi等で、定期投稿してみるのもいいかもしれません。例として、AmazonのKindleの日替わりセールのページをスクレイピングして定期投稿してみました。需要があるかどうか分かりませんが、AmazonのトラッキングIDを登録すればはてブ側が自動的にアフィリエイトリンクを生成してくれるので、ちょっとおもしろいことができるかもしれません。これに関しては後日記事にします。

animestation.hateblo.jp



メールに画像を添付して送信すると、記事にも添付画像がアップロードされます。PythonのGmailモジュールもMessageオブジェクトにデフォルト引数としてattachments=['img.jpg']を指定すると、画像を添付して送信できますが、なぜだか記事にはアップロードされませんでした。手動ではできるんですけどね。。。原因が分かる人がいたら教えてください!

【仮想通貨】いなごFlyerをスクレイピングする【Python】

今回は、いなごFlyerをPythonを使って(ほぼ)リアルタイムで数値の上下を観測できるようにスクレイピングしてみます。今回はJavascriptで動的にHTMLが生成されているサイトのスクレイピングなのでseleniumを使います。私はヘッダーレスブラウザのPhantomJSをwebkitとして使用しました。

こちらの記事を参考にしました。

cryptojapan.ml

環境

・MacBook Air Early 2015 Sierra 10.12.6
・Python 3.6.2 pip3
・iTerm2(コマンドプロント)
・CotEditor(エディター)

モジュールなど

・Selenium(pip3 install selenium)
・PhantomJS(http://phantomjs.org/
・time(標準モジュール)

コード

初めてのseleniumを使うスクレイピングなので簡潔にかきました。他の方の記事を見るとpathやら何やらを代入していたのですが特に何もしなくてもできたので記述しませんでした。

from selenium import webdriver
from time import sleep

#関数VOLでボリュームをスクレイプ
def VOL():
	for buyvol in driver.find_elements_by_id("buyVolumePerMeasurementTime"):
		ask = buyvol.text
	for sellvol in driver.find_elements_by_id("sellVolumePerMeasurementTime"):
		bid = sellvol.text
	return ask,bid

#seleniumの設定
#htmlを取得 ブラウザでこのウェブページに入る感覚(?)
#一回getしちゃえばjsを拾えてるみたいなのでwhileの外に
driver = webdriver.PhantomJS()
driver.get("https://inagoflyer.appspot.com/btcmac")

#無限ループさせてボリュームを更新させる
while True:
    print('-----------------')
	vol = VOL()
    print('buybol: ' + vol[0] + 'sellvol: ' + vol[1])

おまけ

素っ気なかったのでbFのapiを叩いて価格変動も一緒に観察できるようにしました。

from selenium import webdriver
from time import sleep
import requests

def BTC():
    URL = 'https://lightning.bitflyer.jp/v1/getticker'
    ticker = requests.get(URL).json()
    price = "{:,d}".format(int(ticker['best_ask'])),"{:,d}".format(int(ticker['best_bid']))
    return price

def VOL():
	for buyvol in driver.find_elements_by_id("buyVolumePerMeasurementTime"):
		ask = buyvol.text
	for sellvol in driver.find_elements_by_id("sellVolumePerMeasurementTime"):
		bid = sellvol.text
	return ask,bid

driver = webdriver.PhantomJS()
driver.get("https://inagoflyer.appspot.com/btcmac")

while True:
	btc = BTC()
	vol = VOL()
	print('-----------------------------')
	text = 'ask: ' + btc[0] + ' / vol: ' +vol[0] + '\n' + 'bid: ' + btc[1] + ' / vol: ' + vol[1]
	print(text)
	sleep(1)

実行

f:id:lisbeths:20180121215525g:plain

ボリュームと価格を同時にみることができるようになりました。製作中の自動取引botに組み込んでみたいと思います。