PivotalTrackerのAcceptを呟くbotを作った。

先日、ギー沖住人の@が#gokidea というハッシュタグでつぶやくと、それがギークハウス沖縄のPivotalTrackerのiceboxに追加されるスクリプトをRubyで書いてた。

require 'twitter'
require 'pivotal-tracker'
Twitter.configure do |c|
c.consumer_key = "your consumer key"
c.consumer_secret = "your consumer secret key"
c.oauth_token = "oauth token"
c.oauth_token_secret = "oauth token secret"
end
PivotalTracker::Client.token = "your pivotal tracker accesstoken"
project = PivotalTracker::Project.find(your_project_id)
gokidea = Twitter.search("#your_hash_tag", lang: "ja", rpp: 100).results.map(&:text).reject {|t| t =~ /^RT /}
icebox = project.stories.all.map(&:name)
(gokidea - icebox).each {|t|
project.stories.create(name: t, story_type: "feature")
}
view raw icebox.rb hosted with ❤ by GitHub

せっかくだし、AcceptされたStoryをギークハウス沖縄のbot(@)につぶやかせたいなと思って、作成した。

#!/usr/bin/env python
# coding: utf-8
import pivotal
import tweepy
from bs4 import BeautifulSoup
import datetime as d
from dateutil.parser import parse
import pytz
TOKEN = 'YOUR_TOKEN'
PROJECT_ID = 'PROJECT_ID'
pv = pivotal.Pivotal(TOKEN)
response, content = pv.projects(PROJECT_ID).stories(filter='state:accepted').get()
#get xml tags state accepted
soup = BeautifulSoup(content)
word = soup.findAll('name')
time = soup.findAll('accepted_at')
#pickup each name and accepted_at
times = []
for i in time:
times.append(parse(i.string))
words = []
for i in word:
j = i.string
words.append(j.replace('#gokidea',''))
#TODO accepted_time compere to now time.
#get now time
now = d.datetime.now(pytz.timezone('Asia/Tokyo'))
tweet = []
for i in zip(words,times):
n, t = i
if (now - t).total_seconds() <= 10 * 60:
tweet.append(n)
#tweet(accepted time and story name)
CONSUMER_KEY = "YOUR_CONSUMER_KEY"
CONSUMER_SECRET = "YOUR_SECRET_KEY
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"
ACCESS_TOKEN_SECRET = "YOUR_ACCESS_TOKEN_SECRET"
auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth_handler = auth)
for i in tweet:
api.update_status(i + u"を完了しました")
view raw pivtweet.py hosted with ❤ by GitHub

参考資料

⇨PivotaltrackerのAPIの説明。ここにだいたい書いてある。基本的に、ユーザーアカウントがもってるTokenとプロジェクト単位で割り当てられるproject_id があればアクセスできるっぽい。

 ⇨これをimportしたら、xmlのタグが簡単に取れるみたい。似たようなものは他にもあったけど、うまくいかなかったけど。

 ⇨生まれて初めてパースというものに挑戦することになったので、これを使って抜き出した。簡単に抜き出せたのでびっくり。パースって面白いからもっと使いそう。
 ⇨使い方とか Beautiful SoupでHTMLやXMLをparseしよう - そこはかとなく書くよ。

 ⇨今回のプログラムは前回つぶやいてから、10分以内にAcceptedされたStoryを探してつぶやくために、現在時間とAcceptedされた時間を引く工程が必要だった。そのためにAcceptedされた時間をdatetimeに変換するものが必要だった。
 ⇨あと、ここだとタイムゾーンまで表示されるので、現在時刻を表示するときに、タイムゾーンを指定してあげなきゃいけない。そのときは、pytz - World Timezone Definitions for Python — pytz v2010e documentationタイムゾーンを指定してあげる。

Groove Labo » Blog Archive » pytz – Pythonでタイムゾーンを扱うライブラリ

  • zip関数の使用

 ⇨Story名とAcceptedの時間をひとつのグループにまとめるために使った。テキストでしか見たことなくて利点とかよく分からなかったけど、今回を通して便利だなと納得。

zip()関数 - バリケンのPython日記 - pythonグループ

  • herokuでPythonのコードを動かす

 ⇨Python Dependencies via Pip | Heroku Dev Center

pip freeze

で出てきたインストールしてるモジュールとバージョンで、herokuに乗せるコードに必要なやつを requirement.txtに書くこと。

今回の反省

  • リスト内包表記が全然できてない

 ⇨関数型言語に触れる。appendを禁止にするのはどうか。変数の中身を変える、変数の再代入もなし。

  • 完成した作品を晒してダメ出し

 ⇨@さんがいいんじゃないか。
 ⇨ちょこっとコードレビューしてもらったけど、すごいよかった。またやりたいなー@

小さな目標だけど、できるだけ、動くコードを作るようにします。