Search 4 Truth

Search 4 Truth

Pythonと仮想通貨

プライバシーポリシー

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

当サイト「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に組み込んでみたいと思います。

【Python】英単語帳を作る

さて、今年も受験シーズンが本格的にはじまりセンター試験の日になりましたね。
去年の今頃は私も勉強に勤しんでいました。

そんな訳ですが、今回はPythonを使ってフラッシュ英単語帳を作っていきたいと思います。”フラッシュ”というのは私が勝手に名付けたものですが、高速で流れる数値を暗算していくフラッシュ暗算を想像してみたらわかると思います。これの英単語バージョンです。

プログラムの大まかな流れは、英単語サイトのスクレイピング→ファイルに書き込み→英語と日本語に分ける→英語と日本語を交互に出していくというものです。使い方は英単語が出てきて数秒後に日本語(解答)が出てきます。英単語が流れてる間に日本語を想像する、という単純なものです。同一サイトの過度なスクレイピングはサーバー負担の原因となるので、ファイルに書き込んでしまいます。

モジュール

  • BeautifulSoup(外部モジュール pip3 install BeautifulSoup4)
  • random
  • urllib
  • time
  • os
  • re

スクレイピングの対象

http://www7b.biglobe.ne.jp/~browneye/english/
今回はTOEIC頻出単語400点コースを対象としました。

コード

from bs4 import BeautifulSoup as bs
import urllib.request as ur 
import re
import random 
from time import sleep
import os

def Soup():
    url = 'http://www7b.biglobe.ne.jp/~browneye/english/TOEIC400-1.htm'
    req = ur.urlopen(url)
    html = bs(req,"html.parser")
    html = str(html)
    return html

#url =  スクレイピング対象のURL
#htmlを戻り値とする(文字列の同士の正規表現なのでstrをつける)

def Re():
    pa = '<td>(.+)</td>'   
    ma = re.findall(pa,Soup())
    return ma

#pa = 正規表現のパターン(tdタグに囲まれた文字列)を格納 
#ma = 上記の正規表現にマッチする文字列をリストで格納
#変数maを戻り値とする

以前紹介したスクレイピングと正規表現の型を流用しています。

s4t.hatenablog.com

画像はサイトの表記ミスだと思いますが、英語、日本語訳、品詞の順番に全て関数Reの戻り値に格納されます。

f:id:lisbeths:20180113162938p:plain

if not os.path.exists('tango.txt'): 
    for i in Re():
        with open('tango.txt','a') as a:
            a.write(i + '\n'#もし"tango.txt"というファイルが存在しなかったら
#”tango.txt"というファイルを生成し英語、日本語訳、品詞を順番に書き込む

生成されたtango.txtはこんな感じ。

f:id:lisbeths:20180113163844p:plain

else:
    with open('tango.txt','r') as r:
        text = r.read().split('\n')
        jp = text[1::3]
        en = text[::3]
        
        while True:
            ran = random.randint(0,len(jp) - 1)
            print(en[ran])
            sleep(2)
            print(jp[ran])
            print('')
            sleep(1)

#"tango.txt"が生成されていた場合
#"tango.txt"を読み込み変数textに段落でsplitしリストとして格納

#下記を無限ループ 擬似乱数はループ内で再定義する必要があるの
#変数enとjpにそれぞれ英語と日本語訳を格納(スライスの説明は略)
#変数ranに0から変数jpのリストに格納されている数から1引いた数までで擬似乱数を格納
#変数jpのインデックスに擬似乱数を入れて出力、sleep2秒、変数enの...、sleep1秒

全体像。

from bs4 import BeautifulSoup as bs
import urllib.request as ur 
import re
import random 
from time import sleep
import os

def Soup():
    url = 'http://www7b.biglobe.ne.jp/~browneye/english/TOEIC400-1.htm'
    req = ur.urlopen(url)
    html = bs(req,"html.parser")
    html = str(html)
    return html

def Re():
    pa = '<td>(.+)</td>'   
    ma = re.findall(pa,Soup())
    return ma

if not os.path.exists('tango.txt'):
    for i in Re():
        with open('tango.txt','a') as a:
            a.write(i + '\n')
            
else:
    with open('tango.txt','r') as r:
        text = r.read().split('\n')
        en = text[::3]
        jp = text[1::3]
        
        while True:
            ran = random.randint(0,len(jp) - 1)
            print(en[ran])
            sleep(2)
            print(jp[ran])
            print('')
            sleep(1)

実行してみました。

f:id:lisbeths:20180113170746g:plain

英単語は反復練習!!!(って誰かが言ってた)

完。

【仮想通貨】デモトレードツールを作ってみる【Python】

今日からPythonを使い仮想通貨の自動取引botを作っていく過程を日記仕立てでお送りします。

今回は"仮想の"仮想通貨自動取引botをつくるまでが目標です。"仮想の"というのはいわばデモ取引のことで実際の取引を行わず数字が上がり下りをする様を眺めて差額でどのくらい損益が出るのかをニヤニヤしながら見守るものを指します。

今回はbitFlyerAPIのTickerを2秒毎に取得して買値を固定し売値をwhileでぶん回して更新し続けどのくらい損益が出るのかを見守っていきます。

買値は大学生の現実的な価格(だと勝手に思っている)0.06BTC(約108,000円)を買います。売買手数料は加味しません。

では作っていきます。

使った環境

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

日記形式なので今後は新しいものが追加される度にそれだけを紹介します

モジュール

  • time(標準モジュール)
  • requests(外部モジュール pip3 install requests)

実践

なにはともあれAPIを叩く。

import requests
from time import sleep

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

# ticker = getリクエストでjson形式でtickerを取得
# price = 買値と売値を格納 2000000.0のよう返ってくるのでintで小数点以下を切る
# return 戻り値として上記の変数priceをタプルで戻す


国内の取引所のAPIの叩きかたは前回の記事で扱いました〜。(初新着エントリーしました!ありがとうございます!)

s4t.hatenablog.com

wallet = 0.06
ask = bitflyer()[0] * wallet

#変数walletに買うBTCの枚数を格納
#whileの外で買値を定義・固定(更新しないように)
#変数askに現在の買値に変数walletをかける

while True:
    bid = bitflyer()[1] * wallet
    profit = bid - ask
    print(profit)
    sleep(2)[f:id:lisbeths:20180112155108p:plain]

# bid = 買値を出し毎回更新する
# profit = ひきざん
# 出力
# スリープ(2びょう〜)

全体像

import requests
from time import sleep

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

wallet = 0.06
ask = bitflyer()[0] * wallet

while True:
    bid = bitflyer()[1] * wallet
    profit = bid - ask
    print(profit)
    sleep(2)

とりあえず1BTCで動かす。
うぉおおめちゃもうかってるぅう!!!!利確ぅ!!(ctrl + c)(池沼)

f:id:lisbeths:20180112153116g:plain

続いて0.06BTC。

f:id:lisbeths:20180112154355g:plain

(完)

【Python対応】crontabを設定するために最低限覚えたいvim

作ったプログラムはcrontabで定期実行していますが、設定する上で必ず引っかかるのがvimです。

今回はvimの文法を一から覚えるのは酷なので最低限必要なコマンドを紹介します。

1,crontabを開く

コマンドプロンプトを開きます。プリインストールのもので構いません。(私はiTermを使いました)

crontab -e

で編集します。

2, 編集する

先程のコマンドを実行したら編集するためにInsert(書き込み)モードに入ります。キーボードで「i」を打ちます。

f:id:lisbeths:20180110133324p:plain

入りました。これで編集可能になりました。

さっそく設定していきます

crontabの設定の構図としては

分 時間 日 月 曜日 Pythonのpath ディレクトリー/test.py

になっています。

毎日午前7時にtest.pyを実行する設定をしていきます。

まずは日時を設定していきます。

0 7 * * * 

これで完了です。 毎日7時なので、日、月、曜日は指定する必要は無いところは「*」と記述します。

次にPythonのpathを通すために別のウィンドウで以下のコードを入力・実行して下さい。

witch Python3

3の部分は個々のバージョンに合わせてください

/usr/local/bin/Python3

と出たので先程のcrontabの設定に戻り日時の隣におきます。

0 7 * * *  /usr/local/bin/Python3 

次に動かしたいプログラムがあるディレクトリーを階層ごとに記述します。

0 7 * * *  /usr/local/bin/Python3 desktop/py/test.py

私は"デスクトップ"の"py"というフォルダにある"test.py"というプログラムを指定しました。

3, 保存する

設定が終わったら、保存をします。そのままウィンドウを消してはいけません。

キーボード左端の「Esc」キーを押してInsertモードを終了します。

次に「:」を押し「wq」を押すと保存されます。

f:id:lisbeths:20180110141838p:plain

おまけ

crontab -l

で保存した設定が見られます。

f:id:lisbeths:20180110142051p:plain


今回はMacBookでの設定を紹介しましたが、パソコンを一日中動かしたくは無いという方はRaspberry Piを使用するのも手です。(当ブログで紹介してるcrontabを伴うプログラムは全てラズパイで動かしています)

【Python】LINEに電車の遅延情報を送る

さて、前回の続きです。

s4t.hatenablog.com

今回は上記の記事の発展版であるスクレイピングしたデータをLINEに送る、というプログラムを作っていきます。対象となるサイトは、鉄道運行情報様のサイトです。

こちらのサイトをスクレイピングしてLINE NotifyのAPIを使い指定した時間に通知を送る、というところまでが今回の目標です。まずは前回の記事を参考にしてLINEで任意の文字列を送るところまでやってみてください。

使用した環境

  • MacBook Air Early 2015 Sierra 10.12.6
  • Python 3.6.2
  • iTerm2(コマンドプロント)
  • 前回の記事で取得したアクセストークン
  • Chrome(htmlを読むため)
  • 鉄道運行情報で通知を送りたい路線のURL(今回は中央線を使用)

モジュール

  • BeautifulSoup(コマンドプロンプトにて pip3 install BeautifulSoup4 でインストール)
  • urllib(標準モジュールのためインストール不要)
  • re(”)

コード

私がスクレイピングする際にいつも使っている型を紹介します。

from bs4 import BeautifulSoup as bs
import urllib.request as ur 
import re

def Soup():
    url = 'url'
    req = ur.urlopen(url)
    html = bs(req,"html.parser")
    return html
    
#def Re():
    #pa = '正規表現'
    #ma = re.findall(pa,Soup())
    #return ma

簡単に説明すると、関数Soupでリンク先のhtmlを取得して関数Reの正規表現で欲しい情報だけを抽出するというものです。大体のhtmlは上記の関数Soupで抜けます。正規表現は抽出するhtmlによってその都度変わるのでこれに関しては以下の記事を参考にしてみて下さい。上記のコードによく使う正規表現の型かきましたが今回は使わないのでコメントアウトしました。

qiita.com


正直な話どの記事を読んでもの正規表現は理解できなかったのでいつもノリでやっています。

とりあえず中央線の運行情報が乗ったURLを関数Soupのurlに代入してhtmlを取り出してみます。

f:id:lisbeths:20180110105859p:plain

矢印のところを抜き出したいのですが、いちいちこの文字列を探すのが面倒なのでChromeを使いhtmlを視覚的に見える要素から、それがどのhtmlなのかを探す方法を紹介します。

中央線のページを使ってやっていきます。まずは右クリックで検証をクリック。

f:id:lisbeths:20180110110749p:plain

右にhtmlがズラッとでてきました。そしてなんにもない空白をクリックしてhtml側に標準を合わせます。(表現がわからないからわかって)

f:id:lisbeths:20180110111413p:plain

「command + f」を押す。

f:id:lisbeths:20180110111837p:plain

抽出したい文字列を入力。→ 一致。

f:id:lisbeths:20180110150955p:plain

簡単にまとめるとこう。

f:id:lisbeths:20180110112920p:plain

このようなhtmlがとれました。

<div class="corner_block_row_detail_d" style="padding-left:5px;">
現在、平常通り運転しています。</div>

この中にある「現在、平常通り運転しています」という文字列を抽出していきます。

from bs4 import BeautifulSoup as bs
import urllib.request as ur 
import re

def Soup():
    url = 'http://www.jikokuhyo.co.jp/search/detail/line_is/kanto_chuokaisoku'
    req = ur.urlopen(url)
    html = bs(req,"html.parser")
    return html

#BeautifulSoupでhtmlを取得して変数htmlを戻り値としました
  
match = Soup().find(class_="corner_block_row_detail_d").string.replace('\n','')

#変数matchに正規表現を書きました
#htmlが<div class>となっていたのでclassを指定します classとするとエラーがでるのでclass_とします 
#クラス名を先程取得した"corner_block_row_detail_d"をいれます。
#.stringでクラス内の文字列を抽出 無駄な改行があったので空白とreplaceしました

#出力します

print(match)

#「現在、平常通り運転しています。」、又は遅延情報など運行情報が出たら成功

実際に遅延情報をLINEに送ってみる

前回の記事のコードをそのまま流用しました。

from bs4 import BeautifulSoup as bs
import urllib.request as ur 
import re
import requests

def line(Me):
    line_notify_token = 'アクセストークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    message = '\n' + Me
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token}
    line_notify = requests.post(line_notify_api, data=payload, headers=headers)

def Soup():
    url = 'http://www.jikokuhyo.co.jp/search/detail/line_is/kanto_chuokaisoku'
    req = ur.urlopen(url)
    html = bs(req,"html.parser")
    return html
    
match = Soup().find(class_="corner_block_row_detail_d").string.replace('\n','')
text = '中央線快速の運行情報\n> ' + match

#変数textで実際にLINEに送るテキストを編集しました

line(text)
    

実行

先程のコードを"LINE.py"として保存しました。実行してみます。

python3 LINE.py

できた〜

f:id:lisbeths:20180110131352p:plain

これをcrontabを使って指定した時間に通知が来るように設定すれば便利です。

s4t.hatenablog.com

寝る