GoogleAppEngineの仕様変更に伴って
学会タイマーオンラインのメンテナンスができなくなったので,別の場所に再設置.
プレゼンタイマーオンライン
MacでもWindowsでもAndroidでも,アプリのインストール無しに使えます.
青岸
7 年前
ソーシャルメディアとか人狼とか計算社会科学を研究している研究者による適当なブログ.
$ sqlite3 oauth.db sqlite> CREATE TABLE oauth (oauth_token text primary key,oauth_token_secret text); sqlite> CREATE TABLE user (id integer primary key, consumer_key text, consumer_secret text, access_token text, access_token_secret text, screen_name text, image_url text, time datetime); sqlite> .exitとして,データベースを作成しておく. 次に,TwitterLogin.pyを作成.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import site
site.addsitedir('/home/username/lib/python')
import os
import cgi
import cgitb
import oauth2 as oauth
import sqlite3
import twitter
import datetime
from Cookie import SimpleCookie
from twitter import TwitterError
request_token_url = 'https://api.twitter.com/oauth/request_token'
access_token_url = 'https://api.twitter.com/oauth/access_token'
authenticate_url = 'https://api.twitter.com/oauth/authorize'
class TwitterLogin:
def __init__(self, db_name, consumer_key, consumer_secret):
self.db_name = db_name
self.consumer_key = consumer_key
self.consumer_secret = consumer_secret
def getOAuth(self):
consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret)
client = oauth.Client(consumer)
# reqest_token
resp, content = client.request(request_token_url, 'GET')
request_token = dict(self.parse_qsl(content))
#call_back="http://torix.sakura.ne.jp/twitter/signin.cgi"
# request_token
con = sqlite3.connect(self.db_name)
con.execute(u'insert into oauth values (?, ?)', (request_token['oauth_token'], request_token['oauth_token_secret']))
con.commit()
con.close()
#
url = '%s?oauth_token=%s' % (authenticate_url, request_token['oauth_token'])
print 'Content-type: text/html; charset: utf-8\n\n'
print
print '' % url
def getApi(self):
access_token, access_token_secret, screen_name, image_url = self.loadAccessToken()
self.screen_name = screen_name
self.image_url = image_url
if not access_token == None:
# Cookieを使った認証
api = twitter.Api(consumer_key=self.consumer_key,
consumer_secret=self.consumer_secret,
access_token_key=access_token,
access_token_secret=access_token_secret)
return api
elif 'QUERY_STRING' in os.environ:
# CallBackを使った認証
query = cgi.parse_qs(os.environ['QUERY_STRING'])
if len(query) == 0:
return None
# oauth_token_secret を取得
con = sqlite3.connect(self.db_name)
oauth_token_secret = con.execute(
u'select oauth_token_secret from oauth where oauth_token = ?'
, [query['oauth_token'][0]]).fetchone()[0]
con.close()
if oauth_token_secret == None:
return None
# Access_token と access_token_secret を取得
consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret)
token = oauth.Token(query['oauth_token'][0], query['oauth_verifier'][0])
client = oauth.Client(consumer, token)
resp, content = client.request(
access_token_url, "POST", body="oauth_verifier=%s" % query['oauth_verifier'][0])
access_token = dict(self.parse_qsl(content))
# access_tokenの保存
api = twitter.Api(consumer_key=self.consumer_key,
consumer_secret=self.consumer_secret,
access_token_key=access_token['oauth_token'],
access_token_secret=access_token['oauth_token_secret'])
try:
user = api.VerifyCredentials()
uid = user.GetId()
self.screen_name = user.screen_name
self.image_url = user.profile_image_url
self.saveAccessToken(uid, access_token['oauth_token'], access_token['oauth_token_secret'], self.screen_name, self.image_url)
except TwitterError:
return None
return api
else:
return None
#save access token to db
def saveAccessToken(self, uid, access_token, access_token_secret, screen_name, image_url):
con = sqlite3.connect(self.db_name)
c = con.cursor()
#print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
c.execute(u"replace into user (id, consumer_key, consumer_secret, access_token, access_token_secret, screen_name, image_url, time) values (?, ?, ?, ?, ?, ?, ?, datetime(?))", [uid, self.consumer_key, self.consumer_secret, access_token, access_token_secret, screen_name, image_url, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")])
con.commit()
c.close()
ck = SimpleCookie()
ck.load(os.environ.get("HTTP_COOKIE",""))
ck["id"] = uid
ck["token"] = access_token
now_date = datetime.datetime.now()
expires = now_date
expires = expires + datetime.timedelta(seconds=+(60*60*24))
expires = expires.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
ck["id"]["expires"] = expires
ck["token"]["expires"] = expires
print ck.output(["id", "expires"])
print ck.output(["token", "expires"])
#load data from data base
def loadAccessToken(self):
ck = SimpleCookie()
ck.load(os.environ.get("HTTP_COOKIE",""))
if ck.has_key("id") and ck.has_key("token"):
id = int(ck["id"].value)
token = ck["token"].value
access_token = None
con = sqlite3.connect(self.db_name)
c = con.cursor()
c.execute(u'select access_token, access_token_secret, screen_name, image_url from user where id=%d'% id)
for row in c:
access_token = row[0]
access_token_secret = row[1]
self.screen_name = row[2]
self.image_url = row[3]
con.close()
if not access_token == None and access_token == token:
return access_token, access_token_secret, self.screen_name, self.image_url
else:
return None, None, None, None
else:
return None, None, None, None
def parse_qsl(url):
param = {}
for i in url.split('&'):
_p = i.split('=')
param.update({_p[0]: _p[1]})
return param
def parse_qsl(self, url):
param = {}
for i in url.split('&'):
_p = i.split('=')
param.update({_p[0]: _p[1]})
return param
getOAuthで,OAuth認証を行うページに飛ばして,callbackで戻ってきたときにgetApiで捕まえる.#!/usr/bin/env python
# -*- coding: utf-8 -*-
import site
site.addsitedir('/home/username/lib/python')
from TwitterLogin import TwitterLogin
consumer_key = 'consumer_key'
consumer_secret = 'consumer_secret'
if __name__ == '__main__':
twitter = TwitterLogin('oauth.db', consumer_key, consumer_secret)
api = twitter.getApi()
print 'Content-type: text/html; charset: utf-8\n\n'
if api == None:
print 'Fail to login'
else:
user = api.VerifyCredentials()
print user.screen_name
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import site
site.addsitedir('/home/username/lib/python')
import sys
import twitter
print ('Content-type: text/html; charset=UTF-8\n\n')
CONSUMER_KEY = '' # Consumer Key
CONSUMER_SECRET = '' # Consumer Secret
ACCESS_TOKEN = '' # Access Token
ACCESS_TOKEN_SECRET = '' # Accesss Token Secert
api = twitter.Api(consumer_key=CONSUMER_KEY,
consumer_secret=CONSUMER_SECRET,
access_token_key=ACCESS_TOKEN,
access_token_secret=ACCESS_TOKEN_SECRET)
tlAry = api.GetSearch(term="keyword",count=100)
tweetlist=[]
for s in tlAry:
if not s.text.startswith('RT @'):
tweetlist.append(s.text)
print s.text.encode('utf-8')
これで,keywordを含むツイートを取得可能.import site
site.addsitedir('/home/username/lib/python')
の部分.
C:\hdp\hadoop-2.4.0.2.1.3.0-1981>bin\hadoop version Hadoop 2.4.0.2.1.3.0-1981 Subversion git@github.com:hortonworks/hadoop-monarch.git -r 3c481b5d3c117181c4be 3d3a25697e2e0574f972 Compiled by jenkins on 2014-07-15T14:23Z Compiled with protoc 2.5.0 From source with checksum 8a8b83aa11aad760f2a019f4cea188c This command was run using /C:/hdp/hadoop-2.4.0.2.1.3.0-1981/share/hadoop/common /hadoop-common-2.4.0.2.1.3.0-1981.jar
$ cd /usr/local/lib $ tar zxvf hadoop-2.3.0-cdh5.1.3.tar.gz $ ln -s hadoop-2.3.0-cdh5.1.3 hadoop $ ln -s /cygdrive/c/Program\ Files\ /Java/jdk1.7.0_60/ jdk1.7 $ ln -s jdk1.7 java
HADOOP_HOME:C:\usr\cygwin\usr\local\lib\hadoop PATH:...;%HADOOP_HOME%\bin
# the root of the Hadoop installation
if [ -z "$HADOOP_HOME" ]; then
export HADOOP_HOME=`dirname "$this"`/..
else
export HADOOP_HOME=$(cygpath -u "$HADOOP_HOME")
fi
hadoopにも以下を追記.
#cygwin=false cygwin=true # some Java parameters export JAVA_HOME=/usr/local/lib/java
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>C:\tmp\hadoop</value>
</property>
</configuration>
etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>local</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>