Search 4 Truth

Search 4 Truth

Pythonと仮想通貨

【Python】LINE Notifyを使ってPythonから通知を送ってみる

LINE Notifyというサービスをご存知でしょうか。IFTTTやmythingsといったウェブサービスと連携して様々な通知を受け取ることができるLINEのサービスです。前回のブログで”LINE Notify”という固有名詞は出しませんでしたがこれもLINE Notifyを使って通知を送っています。

LINE notifyでは開発者向けにAPIを提供していてウェブサービスを連携しなくても通知を送ることができます。今回はPythonを使って通知を送るところまで紹介します。次回のブログではこれを応用し、スクレイピング結果をLINEで通知するプログラムを書きたいと思います。

使用した環境、モジュール

  • MacBook Air Early 2015 Sierra 10.12.6
  • Python 3.6.2
  • iTerm2(コマンドプロント)
  • requests(モジュール pip install requests でインストール)
  • アクセストークン

アクセストークンを取得する

1, 以下のリンクでアクセストークンを取得します。

https://notify-bot.line.me/my/

2, トークンを発行するを選択

f:id:lisbeths:20180110005528p:plain

3, 通知を行う方法を選択します。

"1:1でLINE Notifyから通知を受け取る"を選択するとLINE Notifyから直接通知が来ます。それ以外のグループを選択するとグループを通して通知が来ます。(グループを選択した場合はLINE Notifyをそのグループに招待する必要があります)トークン名を記入して(なんでもいい)発行するを選びましょう。

f:id:lisbeths:20180109212556p:plain


ちなみにトークン名は通知本文上部の”これ” です。

f:id:lisbeths:20180110003229p:plain

4, 発行されました。

このページから...二度と発行されませんと書いてありますが表示されたコードはという意味でいくらでも再発行は可能です。スクショするなりメモするなりしておきましょう。

f:id:lisbeths:20180110003628p:plain

コード

import requests

def line(Me):
    line_notify_token = 'アクセストークン' #先程発行したコードを貼ります
    line_notify_api = 'https://notify-api.line.me/api/notify'
    message = '\n' + Me 
    #変数messageに文字列をいれて送信します トークン名の隣に文字が来てしまうので最初に改行しました
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token}
    line_notify = requests.post(line_notify_api, data=payload, headers=headers)

line('Hello World!!') #関数lineの引数に任意の文字列を入れます

実行するとアクセストークン作成時の画像のようにメッセージが送信されます。今回は通知を送るところまでです。次回は電車の遅延情報をスクレイピングしてLINEに通知を送る実践活用方法をご紹介します。

www.pypi.cf

おまけ

さっきのコードにおまけ機能として複数のアクセストークンを扱うコードを作ってみました。第二引数に変数numを代入して指定したアクセストークンから通知を送るものです。私は天気予報や電車の運行情報などでグループを作りグループごとにアクセストークンを発行しました。

import requests

def line(Me,num):
    if num == 0:
        line_notify_token = 'アセストークン1'
    if num == 1:
        line_notify_token = 'アセストークン2'
    if num == 2:
        line_notify_token = 'アセストークン3'
    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)

【仮想通貨】取引所間の差額で貪欲に儲けるアービトラージに向けて【Python】

アービトラージ(裁定取引)とは

取引所によってコインの価格が違い、一番安く買える取引所で買い、一番高く売れるとろこで売ることによって差額で利益を得る手法のこと。取引所間の送金に多少の時間がかかるものの、価格が大きく変動する前に行えるため確実性が高いのが特徴。

今回やること

今回はpythonを使い各取引所の1BTCあたりの価格(ビットコイン)を取得し最適な取引所を出して差額でどのくらいの利益が出るのかを出してみます。対象となる取引所は日本国内のみ、8箇所(bitFlyer CoinCheck Zaif BTCBOX bitbank kraken QUOINEX FISCO)となります。国内には20近くの取引所がありますが今回はapiを提供している取引所に絞りました。非公式でモジュールを作っている方もいらっしゃいますが(pybitflyerなど)価格のみを取得できれば十分なのと記述方法をできるだけ統一したかったので使いませんでした。

使用した環境とモジュール

・MacBook Air Early 2015 Sierra 10.12.6
・Python 3.6.2
・iTerm2(コマンドプロント)
・requests(モジュール pip install requests でインストール)

実践

では早速やってみましょう。使うモジュールはrequestsのみです。tickerをrequestsを使いjson形式でレスポンスを得ますが、jsonはインポートしなくても使えたので下記コードには記述してません。まずは各取引所の価格を取得します。なるべく記述方法は統一しました。

import requests 

#ticker = getリクエストでjson形式でtickerが返ってきます
#price = 買値と売値を格納します 2000000.00のよう返ってくるのでintで小数点以下を切ります
#return 戻り値として上記の変数priceをタプルで戻します
#krakenの場合、文字列としての小数点が返ってくるので数値のfloatにしてからintで.0以下を切り離します

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 
    
def coincheck():
    URL = 'https://coincheck.com/api/ticker'
    ticker = requests.get(URL).json() 
    price = int(ticker['ask']),int(ticker['bid'])
    return price

def zaif():
    url = 'https://api.zaif.jp/api/1/ticker/btc_jpy'
    ticker = requests.get(url).json()
    price = int(ticker['ask']),int(ticker['bid'])
    return price
    
def btcbox():
    url = 'https://www.btcbox.co.jp/api/v1/ticker'
    ticker = requests.get(url).json()
    price = int(ticker['buy']),int(ticker['sell'])
    return price

def bitbank():
    URL = 'https://public.bitbank.cc/btc_jpy/ticker'
    ticker = requests.get(URL).json()['data']
    price = int(ticker['buy']),int(ticker['sell'])
    return price

def kraken():
    url = 'https://api.kraken.com/0/public/Ticker?pair=XXBTZJPY'
    ticker = requests.get(url).json()['result']['XXBTZJPY']
    price = int(float(ticker['a'][0])),int(float(ticker['b'][0]))
    return price

def quoinex():
    url = 'https://api.quoine.com/products/5'
    ticker = requests.get(url).json()
    price = int(ticker['market_ask']),int(ticker['market_bid'])
    return price

def fisco():
    url = 'https://api.fcce.jp/api/1/ticker/btc_jpy'
    ticker = requests.get(url).json()
    price = int(ticker['ask']),int(ticker['bid'])
    return price


取引所ごとに関数を作りました。まとめて出力するとこんな感じ。買値と売値が格納された変数priceが戻り値とします。戻り値が複数あるのでタプルとして戻ります。

f:id:lisbeths:20180108231051p:plain


x = [bitflyer(),coincheck(),zaif(),btcbox(),bitbank(),kraken(),quoinex(),fisco()]
store = ['bitflyer','coincheck','zaif','btcbox','bitbank','kraken','quoinex','fisco']

#変数xに全ての取引所の買値と売値をリストで格納します
#変数storeには全ての取引所の名前をリストで格納します 

ask,bid = [],[]

#リストaskとリストbidを定義しておきます

for i in x:
    ask.append(i[0])
    bid.append(i[1])

#askとbidにxに格納した買値と売値を追加していきます

リストaskとbidを出力させてみました。見づらいですが、買値と売値に振り分けられていることがわかります。

f:id:lisbeths:20180108231741p:plain

dic = {} #辞書dicを定義
count = 0 #カウンター用の変数countに数値0を代入
for i in store: 
    dic.update({ask[count]:i}) 
    #辞書dicに買値が格納された変数askをキーとして前に定義してあった変数storeを順番に値としていきます
    #これにより価格と取引所の名前が紐付きました
    count += 1 #askのリストを順番に出すためのカウンターです 
ask_num = sorted(ask)[0] #変数ask_numにはリストaksを昇順ソートし最前にきたものを格納
best_ask = dic[ask_num] #変数ask_numをdicのキーとして入れると買値が一番安い取引所が出力されます 

#同じように売値でも
dic = {}
count = 0
for i in store:
    dic.update({bid[count]:i})
    count += 1
bid_num = sorted(bid,reverse=True)[0] #降順でソートし最前のものを格納
best_bid = dic[bid_num]

最適価格とその取引所名がわかりました。最後に計算をして終わります。

#文字列として一番安く買える取引所と一番安く高く売れる取引所を出力
#最高価格の売値と最低価格の買値を引いて区切り点をつけるフォーマットをしました
print(best_ask + ' で買い ' + best_bid + ' で売ると ' + str("¥{:,d}".format(bid_num - ask_num)) + ' の利益')

実行してみました。価格は売買手数料や送金手数料を加味していません。現在1BTCあたりの価格が200万前後なのでこの額でアビトラして単純計算でこのくらいになるよ〜というものです。

f:id:lisbeths:20180108234154p:plain

今回使用したコードはgithubにアップしておいたので、こっちを貼り付けて実行するほうがはやいです。

ビットコインの最適価格を出すやつ(アビトラ用)

PythonでMastodonのAPIをいじる【導入編〜tootまで】

最近話題のTwitterライクなSNS、Mastodon。Twitterとの使い道の線引が微妙なやつですが、Pythonのモジュールが公開されていたので遊んでみました。なにはともあれモジュールをインストールしていきます。

使用した環境

・MacBook Air Early 2015 Sierra 10.12.6

・Python 3.6.2

・iTerm2

インストール

pip3 install Mastodon.py

コード

>|python|
from mastodon import Mastodon

#URLの部分はインスタンスURLです ご自身のインスタンスのURLに変えて下さい
# 変数nameはクライアント名を入力して下さい。(自由記述)

url = "https://mstdn.jp"
name = input('クライアント名\n> ') 

#Mastodonのアプリ登録を行ないます。

Mastodon.create_app(name,
    api_base_url = url,
    to_file = "app_key.txt"
)
print('api_key作成完了!')  

#メールアドレスの入力
#パスワードの入力

mail = input('メールアドレス\n> ') 
passwd = input('パスワード\n> ') 

#生成されたapp.keyをしてしてログインします。

mastodon = Mastodon(
    client_id="app_key.txt",
    api_base_url = url)

mastodon.log_in(
    mail,
    passwd,
    to_file = "user_key.txt")
print('user_key作成完了!') 

MastodonのSetupするやつ

導入

最初にMastodon用のディレクトリを作っておくことをおすすめします。(生成されたkyeファイルを使うため)この中に上記のコードををそのままメモ帳やエディタにコピーして拡張子を.pyにして保存してください。

f:id:lisbeths:20180105223043p:plain

次にコマンドプロンプトで、Mastodonのディレクトリに移動します。私はデスクトップ上にMastodonディレクトリをおいたのでこのように打ちます。

 cd desktop/mastodon

そしてプログラムを起動させて...

python3 CreateKyes.py

このようにapp_keyとuser_keyが生成されたら成功です!(CreateKyes.pyは消しても構いません)

f:id:lisbeths:20180105223658p:plain

Tootする

最後にトゥートしてみましょう。Twitterでいうツイートですね。以下のコードをコピーして拡張子.pyで先程のmastodonディレクトリに入れて下さい。

from mastodon import Mastodon

while True:
    toot = input('> ',)
    
    mastodon = Mastodon(
    client_id="app_key.txt",
    access_token="user_key.txt",
    url = "https://mstdn.jp")

つーとするやつ

whileで無限ループさせてあるので文字を入力してreturnを押すとtootされ次のtootができるようになります。

 python3 toot.py

f:id:lisbeths:20180105233818g:plain

トゥートされました!

次回はMastodonのAPIを使って遊んでいきたいと思います〜

【Python】落合陽一氏もやっているエゴサbotをPythonで作った【Tweepy】

先日このようなツイートを見つけました。 

最近の情熱大陸で一躍有名になった(?)(自分はこれで知った)落合陽一氏ですが、番組が面白かったのでフォローしていました。そこで「Pythonでできんじゃね?」と思ったので、つくってみました。

準備

使うモジュールはTweepyのみです。

無い方は

pip3 install tweepy

でインストールしてください。

前回の記事の「各種キーの取得」の手順に沿って「Consumer Kye」、「Consumer Secret」、「Access Token」、「Access Secret」をそれぞれ発行して、コードをメモっておいて下さい。

www.pypi.cf

コード

コード自体はとても簡単で、前回のブログで使用したソースコードを流用します。いわゆるこれがエゴサ段階で、ツイートの識別番号を取得してあるのであとは識別番号を引数としてretweet()に代入してあげればいいだけです。

 

s4t.hatenablog.com

 

コード

下記コードをそのままコピーして。searchメソッドではapiの仕様上15件までしか取得できないようなので、実行する間隔を狭めるなりして調整して下さい。(crontabなどを使用して定期実行することが前提となっています。)

 

import tweepy

def api(): 
    consumer_key = 'consumer_key'
    consumer_secret = 'consumer_secret'
    access_key = 'access_key'
    access_secret = 'access_secret'
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    return api

dic = {} 

for tweet in api().search('仮想通貨'):
	if tweet.retweeted == False: 
		text = tweet.text 
		id = tweet.id
		dic.update({id:text}) 
		if '@' in dic[id]: 
			pass
		else:
			api().retweet(id) 

特定の文字列を含むツイートをリツイートするやつ

こちらは最初からリプライを含むツイートは除外しています。Twitterのbotについては自動化ルール をしっかり読んだ上でお使い下さい。

 

 

【IFTTT】地震速報をLINEに送信する

IFTTTを使って地震速報を受信する方法を紹介します。

 

Twitterでこのアカウントをフォローしている方も多いと思います。

twitter.com

 

今回はこちらのアカウントが呟いた内容をIFTTTに渡して、LINEに送信するという簡単なものになってます。

 

完成するとこのような通知が来ます。全国の地震速報が送信されるので、通知を切って後でまとめて読むことが多いです。(速報の意味)それとつぶやかれてから、2,3分ほどのしてから拾うようなので(速報性は)ないです。

f:id:lisbeths:20180101001603p:plain

 

何はともあれ作って行きましょう。書いてる最中に気がついたのですがそういえばIFTTTってレシピ(制作物)を公開できることを完全に忘れていました。

とりあえずレシピのリンクを張っておきました。IFTTTのアカウントを持ていない方は取得しておいてください。取得してから、リンク先へ移動すると各種アカウント(LINE、Twitter)の連携を催されるで指示に従い設定していきましょう。

 

https://ifttt.com/applets/66596467d-twitter-line

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

あ、あけおめ

 

 

【Python】特定の単語を含むツイートを自動でふぁぼるbotを作った

 Tweepyを使って自動お気に入り登録ツールを作ってみました。これは指定した文字列に反応して、その単語が含まれているツイートを見つけたら自動的にお気に入り登録するというものです。

例えば、自分の名前やブログ名が入っているツイートを見つけたらお気に入り登録する、自動でエゴサしてくれるツールとなっているので、なにかと応用してみると面白そうです。

今回は、「仮想通貨」という文字列に反応するbotを作ってみました。

使用した環境

・MacBook Air Early 2015 Sierra 10.12.6 Python 3.6.2

必要なもの

tweepy

 使用するモジュールはtweepyのみです。無い方はインストールしておいてください。 

pip3 install tweepy

アクセストークン等のキー

以下の記事の「各種キーの取得」という項目に沿って「Consumer Key」、「Consumer Secret」、「Access Key」、「Access Secret」をそれぞれ発行してメモしておいて下さい。

www.pypi.cf

コード

import tweepy

def api():
    consumer_key = 'consumer_key'
    consumer_secret = 'consumer_secret'
    access_key = 'access_key'
    access_secret = 'access_secret'
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    return api

#ふぁぼりたい対象の単語をSearchメソットの引数部分に文字列として代入 for tweet in api().search('ビットコイン'): id = tweet.id api().create_favorite(id)

特定の文字列を含むツイートを自動でふぁぼるやつ

これではお気に入りに登録する対象を特定の文字列の「リプライを含む全ての」ツイートとなってしまい、不快に思われる方がいらっしゃるかもしれません。なのでリプライを除く処理を追加してみました。

for tweet in api().search('仮想通貨'): 
    text = tweet.text 
    id = tweet.id 
    dic.update({id:text}) 
    if '@' in dic[id]: 
        pass
    else:
        api().create_favorite(id)

関数api以下のfor文から下の処理を差し替えてお使い下さい。

使い方

上記のソースコードをそのままコピーして「TweetFav.py」で保存しました。

先程メモしたキーをソースコードの該当箇所に代入して下さい。以上で作業は完了なので動かしてみます。

python3 TweetFav.py
起動!

f:id:lisbeths:20180129144422p:plain

できていますね〜。筆者はcrontabで自動化して日々情報収集に励んでおります。

Twitterのbotについては自動化ルールをしっかりとお読みになった上でお使い下さい。
www.pypi.cf

 

【Python】ビットコインの価格を定期的にツイートするbotを作った【Application Managementの使い方も記載】

今回は、Pythonを使ったビットコインの価格を取得して自動で定期ツイートしてれるbotを作成しました。

構造としては

1,BeautifulSoupで価格データのスクレイピング 

2,Tweepyを使ってツイート

3,crontabを使ってbot化

となっています。 

スクレイピングの対象となるbitFlyerのサイトのHTMLをBeautifulSoupで抜き出し、正規表現で文字列を抽出してTweepyを使ってツイートする簡単なものです。Raspberry Piを使ってcrontabでbot化しましたが、今回はツイートするところまでを紹介していきます。

完成品はこちらです。10分毎にツイートするbotとなっています。

bitFlyerの専用のAPIがありますが、今回は公式サイトのスクレイピング結果をツイートするbotとなっています。

f:id:lisbeths:20171227011828p:plain

今回のプログラミングで使用した端末

・MacBook Air Early 2015 Sierra 10.12.6 Python 3.6.2

使用したモジュール

・re
・urllib
・tweepy
・datetime
・BeautifulSoup

 tweepyとbeautifulsoupは新しくインストールする必要があるので、pipでインストールします。 

pip3 install beautifulsoup4
pip3 install tweepy

各種キーの取得

tweepyを使うためにOAuth認証を行ないます。

こちらに移動し、ご自身のTwitterアカウンでログインします。注意点として、予め電話番号とアカウントととの紐付けが必要です。

1,「Create New App」を選択。 

f:id:lisbeths:20180128140130p:plain

 2, 「Application Details」の"Name" 、"Description" 、"Website" をそれぞれ入力。完了したら「Create your Twitter application」を選択。

f:id:lisbeths:20180128140254p:plain

 3, 無事作成できたらこの画面になる。「Keys and Access Tokens」を選択。

f:id:lisbeths:20180128140513p:plain

 4, 「Create my Access token」を選択。

f:id:lisbeths:20180128140813p:plain

 5, "Consumer Kye"、"Consumer Secret"、"Access Token"、"Access Token Secret" をそれぞれメモっておく。

f:id:lisbeths:20180128140935p:plain

コード 

以下のソースコードをそのままコピペして拡張子.pyで保存して下さい。先程メモした、キーを"consumer_key"、"consumer_secret"、"access_key"、"access_secret"にそれぞれ代入して下さい。 

import re
import urllib
import tweepy
import datetime
from bs4 import BeautifulSoup as b4

todaydetail = datetime.datetime.today()
today = todaydetail.strftime("%m/%d %H:%M")

def Tweet(text):
    consumer_key = 'consumer_key'
    consumer_secret = 'consumer_secret'
    access_key = 'access_key'
    access_secret = 'access_secret'
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)
    api.update_status(text)

def BTC():
    url = 'https://bitflyer.jp/' 
    headers = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"} #UserAgentを変更します。
    req = urllib.request.Request(url,None,headers)
    res = urllib.request.urlopen(req)
    soup = b4(res,"html.parser")
    soup = str(soup)
    pa = 'none;">(.+)</div>' 
    ma = re.findall(pa,soup) 
    x = today + ' 現在のビットコインの価格\nBTC/JPY ' + 'ask: '  + ma[0] + ' / ' + 'bid: ' + ma[1] 
    return x

if __name__ == '__main__':
    Tweet(BTC()

#BTC()の戻り値を代入してツイートします。crontabで時間指定してbot化しました。

bitFlyerをスクレイピングしてビットコインの価格をツイートするやつ

 〆

以上のプログラムをcrotnabで実行すると完成品のようになります。関数BTCをご自身の好きなものに変えれば、立派なTwitterbotの完成です。

Twitterのbotについては自動化ルールをしっかりとお読みになった上でお使い下さい。このプログラム自体はルールに準じていますが、違反が確認されると、アカウントのロック、又は凍結される場合があります。